element-web-synapse01pim.gr.jp

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

687.js.map (7571252B)


      1 {"version":3,"file":"bundles/12c8185ea2689492c07b/687.js","mappings":"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ADA,6BACA,QAEA,QAAAzB,KAAA7a,OAAAuI,KAAAnF,KAAAqX,YACAG,EAAAE,aAAAD,EAAAzX,KAAAqX,WAAAI,IAEA,OAAAD,CACA,CACA,QAAA5C,GACA,IAAAC,EAAA,QACA,QAAA4C,KAAA7a,OAAAuI,KAAAnF,KAAAqX,YACAxC,GAAA,IAAA4C,EAAA,KAAqC/M,EAAM1K,KAAAqX,WAAAI,IAAA,IAG3C,OADA5C,GAAA,IAEA,EAsBA,IAGA0E,GAAA,CACA,eACA,iBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,0BACA,yBACA,yBACA,yBACA,yBACA,8BACA,yBACA,8BACA,yBACA,yBACA,yBACA,yBACA,yBACA,oBACA,yBACA,yBACA,yBACA,0BACA,kBACA,wBACA,+BACA,0BACA,0BACA,yBACA,uBACA,yBACA,uBACA,+BACA,gCACA,yBACA,2BACA,2BACA,2BACA,2BACA,2BACA,2BACA,2BACA,6BACA,6BACA,4BACA,4BACA,2BACA,2BACA,iCACA,iCACA,sBACA,sBACA,kCACA,4BACA,uBACA,uBACA,sBACA,sBACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,wBACA,wBACA,wBACA,gCACA,wBACA,gCACA,2BACA,2BACA,4BACA,4BACA,4BACA,2BACA,2BACA,4BACA,4BACA,4BACA,qBACA,2BACA,gCACA,2BACA,6BACA,gCACA,gCACA,2BACA,2BACA,2BACA,gCACA,gCACA,gCACA,gCACA,4BACA,2BACA,2BACA,iCACA,iCACA,iCACA,iCACA,gCACA,iCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,2BACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,4BACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,6BACA,6BACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,yBACA,yBACA,yBACA,yBACA,2BACA,2BACA,2BACA,2BACA,2BACA,2BACA,2BACA,gCACA,gCACA,gCACA,gCACA,4BACA,gCACA,gCACA,gCACA,2BACA,gCACA,gCACA,gCACA,2BACA,2BACA,iCACA,2BACA,2BACA,gCACA,gCACA,2BACA,2BACA,2BACA,8BACA,8BACA,iCACA,iCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,uBACA,uBACA,uBACA,uBACA,gCACA,gCACA,yBACA,yBACA,2BACA,2BACA,gCACA,2BACA,2BACA,gCACA,gCACA,gCACA,4BACA,4BACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,kCAEA,uBACA,iBACA,8BACA,mCACA,mCACA,mCACA,mCACA,mCACA,uCACA,mCACA,8BACA,wCACA,mCACA,8BACA,8BACA,mCACA,mCACA,mCACA,mCACA,6BACA,iCACA,8BACA,mCACA,8BACA,mCACA,kCACA,wCACA,mCACA,mBAEA,mBACA,iBACA,yBACA,yBACA,yBACA,yBACA,8BACA,8BACA,yBACA,8BACA,yBACA,8BACA,yBACA,8BACA,yBACA,yBACA,yBACA,8BACA,8BACA,8BACA,yBACA,8BACA,yBACA,8BACA,yBACA,8BACA,+BACA,yBACA,wBACA,yBACA,yBACA,yBACA,yBACA,8BACA,yBACA,6BACA,yBACA,8BACA,yBACA,yBACA,0BACA,yBACA,yBACA,8BACA,8BACA,yBACA,yBACA,yBACA,yBACA,yBACA,0BACA,yBACA,8BACA,8BACA,8BACA,8BACA,yBACA,yBACA,yBACA,yBACA,0BACA,0BACA,+BACA,8BACA,+BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,+BACA,+BACA,0BACA,0BACA,0BACA,yBACA,yBACA,0BACA,+BACA,+BACA,+BACA,kBACA,2BACA,2BACA,4BACA,2BACA,iCACA,iCACA,iCACA,4BACA,4BACA,6BAEA,aACA,iBACA,sBACA,yBACA,8BACA,yBACA,2BACA,yBACA,yBACA,wBACA,wBACA,oBACA,8BACA,8BACA,yBACA,yBACA,sBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,yBACA,8BACA,8BACA,+BACA,8BACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,qBACA,yBACA,yBACA,yBACA,yBACA,0BACA,qBACA,yBACA,yBACA,8BACA,wBACA,yBACA,qBACA,yBACA,8BACA,+BACA,yBACA,8BACA,yBACA,wBACA,sBACA,wBACA,uBACA,8BACA,yBACA,yBACA,yBACA,0BACA,0BACA,+BACA,kCACA,0BACA,0BACA,+BACA,0BACA,0BACA,0BACA,0BACA,wBACA,+BACA,+BACA,0BACA,0BACA,0BACA,0BACA,+BACA,+BACA,0BACA,oCACA,0BACA,uBACA,yBACA,uBACA,0BACA,kBACA,0BACA,wBACA,0BACA,0BACA,+BACA,0BACA,2BACA,+BACA,+BACA,0BACA,0BACA,+BACA,6BACA,0BACA,2BACA,0BACA,+BACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,0BACA,0BACA,wBACA,wBACA,0BACA,0BACA,0BACA,0BACA,0BACA,sBACA,0BACA,0BACA,0BACA,0BACA,0BACA,8BACA,iCACA,2BACA,2BACA,2BACA,2BACA,gCACA,gCACA,2BACA,8BACA,2BACA,2BACA,2BACA,gCACA,2BACA,2BACA,kCACA,8BACA,kCACA,8BACA,kCACA,wBACA,iCACA,iCACA,iCACA,iCACA,kCACA,kCACA,kCACA,kCACA,kCACA,gCACA,kCACA,gCACA,kCACA,0BACA,2BACA,gCACA,2BACA,2BACA,2BACA,gCACA,gCACA,gCACA,gCACA,wBACA,wBACA,+BACA,+BACA,+BACA,0BACA,2BACA,4BACA,2BACA,0BACA,wBACA,2BACA,2BACA,2BACA,2BACA,qCACA,iCACA,gCACA,gCACA,0BACA,gCACA,gCACA,gCACA,gCACA,gCACA,iCACA,iCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,2BACA,gCACA,gCACA,2BACA,2BACA,gCACA,gCACA,gCACA,gCACA,gCACA,2BACA,2BACA,2BACA,2BACA,+BACA,iCACA,+BACA,0BACA,0BACA,0BACA,0BACA,kCACA,kCACA,iCACA,+BACA,iCACA,+BACA,iCACA,gCACA,gCACA,gCACA,gCACA,wBACA,gCACA,gCACA,2BACA,2BACA,wBACA,iCACA,iCACA,6BAEA,mBACA,iBACA,8BACA,8BACA,mCACA,gCACA,8BACA,8BACA,6BACA,6BACA,2BACA,mCACA,8BACA,8BACA,yBACA,6BACA,8BACA,8BACA,8BACA,8BACA,mCACA,8BACA,8BACA,mCACA,8BACA,8BACA,8BACA,mCACA,oCACA,8BACA,8BACA,yBACA,6BACA,8BACA,8BACA,8BACA,8BACA,8BACA,6BACA,8BACA,4BACA,8BACA,yBACA,+BACA,6BACA,8BACA,6BACA,mCACA,8BACA,8BACA,6BACA,8BACA,8BACA,+BACA,8BACA,8BACA,8BACA,4BACA,6BACA,8BACA,gCACA,8BACA,8BACA,8BACA,+BACA,6BACA,gCACA,kCACA,+BACA,+BACA,mCACA,+BACA,+BACA,+BACA,+BACA,+BACA,oCACA,kCACA,+BACA,+BACA,6BACA,+BACA,+BACA,+BACA,+BACA,kCACA,+BACA,iCACA,kBACA,+BACA,0BACA,0BACA,gCACA,oCACA,kCACA,6BACA,oCACA,+BACA,gCACA,6BACA,kCACA,+BACA,+BACA,+BACA,+BACA,0BACA,+BACA,+BACA,0BACA,+BACA,+BACA,+BACA,0BACA,+BACA,0BACA,+BACA,8BACA,+BACA,+BACA,+BACA,+BACA,8BACA,gCACA,iCACA,gCACA,gCACA,gCACA,iCAEA,eACA,iBACA,8BACA,8BACA,mCACA,gCACA,8BACA,8BACA,6BACA,6BACA,2BACA,mCACA,8BACA,8BACA,yBACA,6BACA,8BACA,8BACA,8BACA,8BACA,mCACA,8BACA,8BACA,mCACA,8BACA,8BACA,6BACA,kCACA,oCACA,6BACA,8BACA,yBACA,8BACA,8BACA,4BACA,8BACA,8BACA,8BACA,8BACA,8BACA,4BACA,8BACA,yBACA,8BACA,8BACA,8BACA,8BACA,mCACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,4BACA,6BACA,8BACA,gCACA,8BACA,2BACA,2BACA,+BACA,4BACA,oCACA,iCACA,+BACA,8BACA,oCACA,4BACA,+BACA,+BACA,+BACA,+BACA,oCACA,iCACA,+BACA,+BACA,+BACA,+BACA,4BACA,+BACA,+BACA,oCACA,+BACA,iCACA,kBACA,+BACA,0BACA,uBACA,+BACA,oCACA,oCACA,+BACA,oCACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,0BACA,+BACA,+BACA,0BACA,+BACA,8BACA,+BACA,0BACA,+BACA,0BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,gCACA,iCACA,gCACA,gCACA,+BACA,gCACA,4BAEA,gBACA,iBACA,yBACA,qBACA,8BACA,uBACA,2BACA,yBACA,yBACA,wBACA,wBACA,kBACA,8BACA,8BACA,yBACA,yBACA,oBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,yBACA,8BACA,4BACA,+BACA,4BACA,yBACA,yBACA,sBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,sBACA,yBACA,yBACA,yBACA,uBACA,yBACA,sBACA,yBACA,yBACA,8BACA,yBACA,yBACA,yBACA,sBACA,2BACA,+BACA,sBACA,yBACA,yBACA,wBACA,oBACA,wBACA,qBACA,4BACA,qBACA,yBACA,yBACA,0BACA,0BACA,+BACA,gCACA,0BACA,0BACA,+BACA,0BACA,0BACA,0BACA,0BACA,sBACA,+BACA,+BACA,0BACA,0BACA,0BACA,0BACA,+BACA,+BACA,0BACA,oCACA,0BACA,qBACA,yBACA,qBACA,wBACA,kBACA,0BACA,+BACA,sBACA,0BACA,uBACA,+BACA,+BACA,0BACA,0BACA,+BACA,+BACA,sBACA,0BACA,+BACA,2BACA,0BACA,2BACA,0BACA,+BACA,sBACA,sBACA,sBACA,sBACA,sBACA,sBACA,0BACA,uBACA,sBACA,sBACA,wBACA,0BACA,0BACA,0BACA,0BACA,uBACA,0BACA,0BACA,0BACA,0BACA,0BACA,4BACA,2BACA,2BACA,2BACA,uBACA,uBACA,gCACA,gCACA,wBACA,yBACA,4BACA,2BACA,2BACA,gCACA,qCACA,2BACA,2BACA,4BACA,4BACA,4BACA,4BACA,4BACA,sBACA,2BACA,2BACA,2BACA,2BACA,uBACA,2BACA,2BACA,4BACA,4BACA,4BACA,4BACA,uBACA,4BACA,gCACA,4BACA,gCACA,4BACA,0BACA,2BACA,oCACA,2BACA,yBACA,2BACA,8BACA,8BACA,gCACA,gCACA,sBACA,sBACA,6BACA,6BACA,6BACA,wBACA,2BACA,sBACA,2BACA,0BACA,sBACA,2BACA,2BACA,2BACA,2BACA,qCACA,iCACA,gCACA,iCACA,2BACA,iCACA,iCACA,2BACA,iCACA,gCACA,gCACA,yBACA,yBACA,8BACA,8BACA,8BACA,8BACA,gCACA,gCACA,2BACA,gCACA,gCACA,2BACA,2BACA,gCACA,gCACA,gCACA,gCACA,gCACA,2BACA,2BACA,2BACA,2BACA,yBACA,6BACA,iCACA,6BACA,wBACA,yBACA,2BACA,0BACA,0BACA,0BACA,0BACA,0BACA,4BACA,4BACA,0BACA,0BACA,gCACA,6BACA,gCACA,6BACA,2BACA,gCACA,gCACA,gCACA,gCACA,wBACA,gCACA,gCACA,2BACA,2BACA,2BACA,2BACA,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,yBACA,iCACA,iCACA,6BAEA,mBACA,iBACA,uBACA,uBACA,uBACA,4BACA,4BACA,4BACA,uBACA,4BACA,uBACA,4BACA,yBACA,6BACA,8BACA,8BACA,8BACA,8BACA,yBACA,8BACA,8BACA,8BACA,8BACA,yBACA,+BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,+BACA,8BACA,8BACA,8BACA,yBACA,yBACA,yBACA,0BACA,0BACA,oCACA,mCACA,0BACA,yBACA,mCACA,8BACA,8BACA,0BACA,0BACA,0BACA,+BACA,oCACA,8BACA,0BACA,0BACA,0BACA,+BACA,+BACA,0BACA,oCACA,+BACA,kBACA,+BACA,0BACA,+BACA,0BACA,+BACA,+BACA,+BACA,+BACA,0BACA,+BACA,8BACA,0BACA,oCACA,oCACA,+BACA,0BACA,oCACA,gCACA,8BACA,0BACA,0BACA,0BACA,+BACA,+BACA,oCACA,0BACA,+BACA,8BACA,oCACA,+BACA,+BACA,+BACA,+BACA,+BACA,oCACA,+BACA,0BACA,8BACA,6BACA,+BACA,2BACA,4BACA,kCAEA,eACA,iBACA,qBACA,qBACA,qBACA,0BACA,0BACA,0BACA,qBACA,0BACA,qBACA,0BACA,2BACA,mCACA,mCACA,mCACA,kCACA,mCACA,8BACA,mCACA,mCACA,mCACA,mCACA,8BACA,mCACA,mCACA,mCACA,mCACA,mCACA,mCACA,kCACA,mCACA,mCACA,8BACA,8BACA,mCACA,8BACA,mCACA,yBACA,yBACA,8BACA,+BACA,+BACA,yCACA,yCACA,0BACA,0BACA,oCACA,8BACA,oCACA,0BACA,0BACA,+BACA,oCACA,yCACA,oCACA,+BACA,+BACA,+BACA,oCACA,oCACA,+BACA,yCACA,oCACA,kBACA,oCACA,+BACA,oCACA,+BACA,oCACA,oCACA,oCACA,oCACA,+BACA,iCACA,mCACA,kCACA,yCACA,oCACA,oCACA,+BACA,wCACA,yCACA,oCACA,+BACA,0BACA,0BACA,oCACA,oCACA,wCACA,+BACA,+BACA,oCACA,yCACA,+BACA,mCACA,oCACA,oCACA,oCACA,yCACA,+BACA,+BACA,oCACA,+BACA,qCACA,+BACA,iCACA,uCAEA,kBACA,iBACA,yBACA,yBACA,8BACA,wBACA,4BACA,yBACA,yBACA,wBACA,wBACA,mBACA,8BACA,8BACA,yBACA,yBACA,qBACA,sBACA,sBACA,sBACA,sBACA,sBACA,sBACA,sBACA,sBACA,sBACA,sBACA,yBACA,8BACA,+BACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,8BACA,yBACA,yBACA,yBACA,yBACA,8BACA,+BACA,yBACA,6BACA,yBACA,wBACA,wBACA,sBACA,6BACA,uBACA,yBACA,yBACA,0BACA,0BACA,+BACA,iCACA,0BACA,0BACA,+BACA,0BACA,0BACA,0BACA,0BACA,uBACA,+BACA,+BACA,+BACA,0BACA,0BACA,0BACA,2BACA,+BACA,sBACA,gCACA,0BACA,yBACA,kBACA,uBACA,0BACA,uBACA,0BACA,0BACA,+BACA,uBACA,uBACA,uBACA,uBACA,0BACA,0BACA,uBACA,uBACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,6BACA,iCACA,2BACA,2BACA,2BACA,4BAEA,oBACA,iBACA,8BACA,0BACA,mCACA,4BACA,gCACA,8BACA,8BACA,6BACA,6BACA,uBACA,mCACA,4BACA,8BACA,yBACA,yBACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,8BACA,iCACA,8BACA,8BACA,8BACA,yBACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,yBACA,4BACA,8BACA,8BACA,8BACA,iCACA,8BACA,8BACA,8BACA,6BACA,6BACA,6BACA,8BACA,8BACA,8BACA,6BACA,6BACA,yBACA,4BACA,8BACA,8BACA,8BACA,+BACA,+BACA,+BACA,gCACA,+BACA,+BACA,oCACA,+BACA,+BACA,+BACA,+BACA,2BACA,mCACA,oCACA,+BACA,8BACA,+BACA,+BACA,+BACA,+BACA,+BACA,oCACA,+BACA,6BACA,kBACA,2BACA,0BACA,0BACA,+BACA,oCACA,0BACA,2BACA,2BACA,2BACA,sBACA,2BACA,+BACA,0BACA,2BACA,2BACA,+BACA,0BACA,+BACA,0BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,4BACA,2BACA,gCACA,gCACA,4BACA,6BAEA,qBACA,iBACA,yBACA,qBACA,8BACA,uBACA,2BACA,yBACA,yBACA,wBACA,wBACA,kBACA,8BACA,4BACA,yBACA,yBACA,oBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,yBACA,4BACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,uBACA,yBACA,yBACA,yBACA,4BACA,yBACA,yBACA,yBACA,wBACA,8BACA,8BACA,yBACA,4BACA,yBACA,wBACA,wBACA,qBACA,4BACA,yBACA,yBACA,yBACA,0BACA,0BACA,+BACA,gCACA,0BACA,0BACA,+BACA,0BACA,0BACA,0BACA,0BACA,sBACA,+BACA,+BACA,+BACA,0BACA,0BACA,0BACA,+BACA,+BACA,0BACA,oCACA,0BACA,wBACA,kBACA,sBACA,0BACA,0BACA,0BACA,+BACA,sBACA,sBACA,sBACA,sBACA,sBACA,sBACA,0BACA,0BACA,sBACA,sBACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,4BACA,2BACA,2BACA,2BACA,uBACA,wBAEA,kBACA,iBACA,0BACA,0BACA,yBACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,gCACA,0BACA,0BACA,2BACA,wBACA,0BACA,2BACA,0BACA,uBACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,yBACA,yBACA,mBAEA,iBACA,iBACA,2BACA,2BACA,2BACA,2BACA,2BACA,2BACA,4BACA,4BACA,kBACA,0BACA,0BACA,0BACA,0BACA,8BACA,0BACA,0BACA,0BACA,0BACA,6BACA,6BACA,8BACA,wBACA,+BACA,+BACA,mCACA,iCACA,iCACA,mCACA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,8BACA,8BACA,8BACA,+BACA,+BACA,+BACA,8BACA,+BAEA,iBACA,iBACA,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,6BACA,6BACA,kBACA,kBACA,kBACA,kBACA,kBACA,+BACA,+BACA,+BACA,yBACA,mCACA,iCACA,iCACA,mCACA,+BACA,+BACA,+BACA,+BACA,8BACA,8BACA,8BACA,8BACA,+BACA,+BACA,gCACA,gCACA,gCACA,gCACA,iCAEA,iBACA,iBACA,4BACA,4BACA,6BACA,4BACA,6BACA,4BACA,0BACA,0BACA,kBACA,wBACA,wBACA,wBACA,wBACA,yBACA,8BACA,8BACA,8BACA,8BACA,4BACA,6BAEA,iBACA,iBACA,6BACA,6BACA,8BACA,6BACA,8BACA,6BACA,8BACA,8BACA,kBACA,wBACA,wBACA,wBACA,wBACA,0BACA,+BACA,+BACA,+BACA,+BACA,6BACA,wBACA,6BACA,6BACA,wBACA,6BACA,+BACA,8BACA,+BACA,+BACA,8BACA,+BACA,0BACA,8BACA,2BACA,uBACA,0BACA,8BACA,2BACA,+BACA,gCACA,gCACA,iCACA,iCACA,sBACA,sBACA,sBACA,uBAEA,sBACA,kBACA,uBACA,uBACA,uBACA,4BACA,4BACA,uBACA,uBACA,4BACA,4BACA,uBACA,6BACA,0BACA,6BACA,qBACA,4BACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,4BACA,6BACA,6BACA,6BACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,4BACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,4BACA,4BACA,4BACA,uBACA,uBACA,uBACA,uBACA,uBACA,uBACA,wBACA,wBACA,wBACA,6BACA,wBACA,wBACA,6BACA,wBACA,wBACA,wBACA,wBACA,wBACA,6BACA,6BACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,6BACA,wBACA,6BACA,6BACA,6BACA,wBACA,wBACA,mBACA,wBACA,wBACA,wBACA,6BACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,yBACA,yBACA,yBACA,gCAiCAC,GAAA,CACAC,MAAA,cAEAC,MAAA,QAEAC,QAAA,QAEAC,OAAA,QAEAjD,QAAA,iBAEAC,KAAA,gBAEAiD,WAAA,QAEAC,KAAA,iBAEAC,KAAA,iBAEAC,KAAA,iBAEAC,OAAA,kBAEAC,OAAA,iBAEAC,KAAA,iBAEAC,KAAA,iBAEAC,KAAA,iBAEAC,KAAA,cAEAC,KAAA,eAEAC,QAAA,iBAEAC,QAAA,cAEAC,OAAA,gBAEAC,OAAA,kBAEAC,WAAA,cAOAC,qBAAA,gBAEAC,cAAA,iBAEAC,cAAA,iBAEAC,cAAA,WAEAC,cAAA,eAEAC,cAAA,eAIAC,kBAAA,cAKA7E,QAAA,WAGA8E,cAAA,WAGAC,eAAA,cAEAC,QAAA,WAEAC,SAAA,eASAC,GAAA,CAEA,MACA,MACA,MACA,MACA,MACA,MAEA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAgBA,SAAAC,GAAAC,EAAAC,EAAAC,GACA,IAAArC,GAAAoC,GACA,UAAAvb,MAAA,oCAAAub,EAAA,KAEA,IAAAE,EAAAH,EAAA/C,WAAA,GACAmD,EAAAvC,GAAAoC,GAAAE,GAkBA,IAjBAC,GAAAJ,EAAA,KAAAF,KACAK,EAAAL,GAAAE,EAAA,IAAA/C,WAAA,GACAmD,EAAAvC,GAAAoC,GAAAE,IAEAC,GAAA,SAAAF,GASAjM,EAAAkM,KACAC,EAAAvC,GAAAoC,GAAA,KAGAG,EACA,OACA7H,MAAA6H,EAAA,GACApd,OAAAod,EAAA,GACAjE,OAAAiE,EAAA,GACAxD,KAAAwD,EAAA,GACArd,MAAAqd,EAAA,GAGA,CACA,IAAAC,GAAA,GA2CA,IAAAC,GAAA,CACAC,KAAA,GACA9a,KAAA,IAGA,SAAA+a,GAAAN,EAAAD,EAAA7Q,EAAAjD,EAAA5F,EAAAka,GACAH,GAAAJ,GAAA3Z,GAAA,CACA0Z,OACA7Q,QACAjD,WAEAsU,GAAAtU,IACAmU,GAAAJ,GAAA/T,GAAAmU,GAAAJ,GAAA3Z,GAEA,CAIA,IAAAga,GAAA,OACIG,GAAI,OAERC,GAAA,OACAC,GAAA,MAEAC,GAAA,eACAC,GAAA,MACIC,GAAK,QACTC,GAAA,QACAC,GAAA,UACAC,GAAA,WACIC,GAAI,OACRC,GAAA,QACAC,GAAA,MACAC,GAAA,UACAC,GAAA,UAGAf,GAAAD,GAAAI,GAAAU,GAAA,kBACAb,GAAAD,GAAAI,GAAAU,GAAA,iBACAb,GAAAD,GAAAI,GAAAU,GAAA,iBACAb,GAAAD,GAAAI,GAAAU,GAAA,gBACAb,GAAAD,GAAAI,GAAAU,GAAA,cACAb,GAAAD,GAAAI,GAAAU,GAAA,mBACAb,GAAAD,GAAAI,GAAAU,GAAA,mBACAb,GAAAD,GAAAI,GAAAU,GAAA,kBACAb,GAAAD,GAAAI,GAAAU,GAAA,gBACAb,GAAAD,GAAAI,GAAAU,GAAA,eACAb,GAAAD,GAAAI,GAAAU,GAAA,eACAb,GAAAD,GAAAI,GAAAU,GAAA,kBACAb,GAAAD,GAAAI,GAAAU,GAAA,kBACAb,GAAAD,GAAAI,GAAAU,GAAA,mBACAb,GAAAD,GAAAI,GAAAU,GAAA,kBACAb,GAAAD,GAAAI,GAAAU,GAAA,uBACAb,GAAAD,GAAAI,GAAAU,GAAA,uBACAb,GAAAD,GAAAI,GAAAU,GAAA,kBACAb,GAAAD,GAAAI,GAAAU,GAAA,kBACAb,GAAAD,GAAAI,GAAAU,GAAA,eACAb,GAAAD,GAAAI,GAAAU,GAAA,mBACAb,GAAAD,GAAAI,GAAAU,GAAA,kBACAb,GAAAD,GAAAI,GAAAU,GAAA,kBACAb,GAAAD,GAAAI,GAAAU,GAAA,cAEAb,GAAAD,GAAAI,GAAAS,GAAA,eACAZ,GAAAD,GAAAI,GAAAS,GAAA,eAGAZ,GAAAD,GAAAI,GAAAS,GAAA,SACAZ,GAAaE,GAAIC,GAAAY,GAAA,SAEjBf,GAAAD,GAAAI,GAAAY,GAAA,WACAf,GAAaE,GAAIC,GAAAY,GAAA,WACjBf,GAAAD,GAAAI,GAAAY,GAAA,WACAf,GAAaE,GAAIC,GAAAY,GAAA,WACjBf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,mBACAf,GAAAD,GAAAI,GAAAY,GAAA,iBACAf,GAAAD,GAAAI,GAAAY,GAAA,mBACAf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,iBACAf,GAAAD,GAAAI,GAAAY,GAAA,gBACAf,GAAAD,GAAAI,GAAAY,GAAA,oBACAf,GAAAD,GAAAI,GAAAY,GAAA,qBACAf,GAAAD,GAAAI,GAAAY,GAAA,eACAf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,wBACAf,GAAAD,GAAAI,GAAAY,GAAA,eACAf,GAAAD,GAAAI,GAAAY,GAAA,sBACAf,GAAAD,GAAAI,GAAAY,GAAA,eACAf,GAAAD,GAAAI,GAAAY,GAAA,sBACAf,GAAAD,GAAAI,GAAAY,GAAA,cACAf,GAAaE,GAAIC,GAAAY,GAAA,WACjBf,GAAAD,GAAAI,GAAAY,GAAA,cACAf,GAAaE,GAAIC,GAAAY,GAAA,WAEjBf,GAAAD,GAAAI,GAAAY,GAAA,aACAf,GAAaE,GAAIC,GAAAY,GAAA,aACjBf,GAAaE,GAAIC,GAAAY,GAAA,oBACjBf,GAAAD,GAAAI,GAAAY,GAAA,cACAf,GAAaE,GAAIC,GAAAY,GAAA,cACjBf,GAAaE,GAAIC,GAAAY,GAAA,uBAEjBf,GAAAD,GAAAI,GAAyBI,GAAK,uBAC9BP,GAAAD,GAAAI,GAAyBQ,GAAI,uBAC7BX,GAAAD,GAAAI,GAAyBI,GAAK,mBAC9BP,GAAAD,GAAAI,GAAyBQ,GAAI,mBAE7BX,GAAAD,GAAAI,GAAAG,GAAA,eACAN,GAAAD,GAAAI,GAAAG,GAAA,mBACAN,GAAAD,GAAAI,GAAAG,GAAA,kBACAN,GAAAD,GAAAI,GAAAG,GAAA,kBACAN,GAAAD,GAAAI,GAAAG,GAAA,aACAN,GAAAD,GAAAI,GAAAG,GAAA,kBACAN,GAAAD,GAAAI,GAAAG,GAAA,oBACAN,GAAAD,GAAAI,GAAAG,GAAA,mBACAN,GAAAD,GAAAI,GAAAG,GAAA,iBACAN,GAAAD,GAAAI,GAAAG,GAAA,eACAN,GAAAD,GAAAI,GAAAG,GAAA,eACAN,GAAAD,GAAAI,GAAAG,GAAA,aAEAN,GAAAD,GAAAI,GAAAU,GAAA,0BACAb,GAAAD,GAAAI,GAAAU,GAAA,sBACAb,GAAAD,GAAAI,GAAAU,GAAA,0BACAb,GAAAD,GAAAI,GAAAU,GAAA,2BACAb,GAAAD,GAAAI,GAAAU,GAAA,uBACAb,GAAAD,GAAAI,GAAAU,GAAA,2BACAb,GAAAD,GAAAI,GAAAU,GAAA,2BACAb,GAAAD,GAAAI,GAAAU,GAAA,+BACAb,GAAAD,GAAAI,GAAAU,GAAA,2BACAb,GAAAD,GAAAI,GAAAU,GAAA,+BACAb,GAAAD,GAAAI,GAAAU,GAAA,mBACAb,GAAAD,GAAAI,GAAAU,GAAA,uBACAb,GAAAD,GAAAI,GAAAU,GAAA,oBACAb,GAAAD,GAAAI,GAAAU,GAAA,0BACAb,GAAAD,GAAAI,GAAAU,GAAA,2BACAb,GAAAD,GAAAI,GAAAU,GAAA,oBACAb,GAAAD,GAAAI,GAAAU,GAAA,0BACAb,GAAAD,GAAAI,GAAAU,GAAA,2BACAb,GAAAD,GAAAI,GAAAU,GAAA,oBACAb,GAAAD,GAAAI,GAAAU,GAAA,4BACAb,GAAAD,GAAAI,GAAAU,GAAA,6BACAb,GAAAD,GAAAI,GAAAU,GAAA,oBACAb,GAAAD,GAAAI,GAAAU,GAAA,8BAEAb,GAAAD,GAAAK,GAAAS,GAAA,kBAEAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,gBACAb,GAAAD,GAAAK,GAAAS,GAAA,iBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBAEAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,iBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,iBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,4BACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,iBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,gBACAb,GAAAD,GAAAK,GAAAS,GAAA,iBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBAEAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBAEAb,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAK,GAAAS,GAAA,yBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,6BACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAE,GAAA,eACAN,GAAAD,GAAAK,GAAAE,GAAA,eAEAN,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,4BACAb,GAAAD,GAAAK,GAAAS,GAAA,4BAEAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAW,GAAA,gBACAf,GAAAD,GAAAK,GAAAW,GAAA,sBACAf,GAAAD,GAAAK,GAAAW,GAAA,iBACAf,GAAAD,GAAAK,GAAAW,GAAA,kBACAf,GAAAD,GAAAK,GAAAW,GAAA,kBACAf,GAAaE,GAAIE,GAAAW,GAAA,kBACjBf,GAAAD,GAAAK,GAAAW,GAAA,0BACAf,GAAAD,GAAAK,GAAAW,GAAA,iBACAf,GAAAD,GAAAK,GAAAW,GAAA,aACAf,GAAAD,GAAAK,GAAAW,GAAA,iBACAf,GAAAD,GAAAK,GAAAW,GAAA,iBACAf,GAAAD,GAAAK,GAAAW,GAAA,mBACAf,GAAAD,GAAAK,GAAAW,GAAA,uBACAf,GAAAD,GAAAK,GAAAW,GAAA,2BACAf,GAAAD,GAAAK,GAAAW,GAAA,qBACAf,GAAAD,GAAAK,GAAAW,GAAA,sBACAf,GAAAD,GAAAK,GAAAW,GAAA,iBACAf,GAAAD,GAAAK,GAAAW,GAAA,2BACAf,GAAAD,GAAAK,GAAAW,GAAA,uBAEAf,GAAAD,GAAAK,GAAAW,GAAA,gBACAf,GAAaE,GAAIC,GAAAY,GAAA,SACjBf,GAAAD,GAAAK,GAAAW,GAAA,gBACAf,GAAAD,GAAAK,GAAAW,GAAA,kBACAf,GAAAD,GAAAK,GAAAW,GAAA,gBACAf,GAAAD,GAAAK,GAAAW,GAAA,aACAf,GAAAD,GAAAK,GAAAW,GAAA,iBAEAf,GAAAD,GAAAK,GAAAW,GAAA,gBACAf,GAAaE,GAAIE,GAAAW,GAAA,gBACjBf,GAAAD,GAAAK,GAAAW,GAAA,sBACAf,GAAaE,GAAIE,GAAAW,GAAA,mBAEjBf,GAAAD,GAAAK,GAAAW,GAAA,iBACAf,GAAAD,GAAAK,GAAAW,GAAA,mBACAf,GAAAD,GAAAK,GAAAW,GAAA,kBAEAf,GAAAD,GAAAK,GAAAW,GAAA,oBACAf,GAAAD,GAAAK,GAAAW,GAAA,kBAEAf,GAAAD,GAAAK,GAAwBO,GAAI,sBAC5BX,GAAAD,GAAAK,GAAwBG,GAAK,sBAC7BP,GAAAD,GAAAK,GAAwBO,GAAI,sBAC5BX,GAAAD,GAAAK,GAAwBG,GAAK,sBAE7BP,GAAAD,GAAAK,GAAAS,GAAA,iBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAE,GAAA,iBACAN,GAAAD,GAAAK,GAAAS,GAAA,gBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAK,GAAAS,GAAA,yBACAb,GAAAD,GAAAK,GAAAS,GAAA,0BACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,yBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,iBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAE,GAAA,gBACAN,GAAAD,GAAAK,GAAAS,GAAA,gBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,0BACAb,GAAAD,GAAAK,GAAAS,GAAA,yBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,mBACAb,GAAAD,GAAAK,GAAAS,GAAA,2BAGAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,4BAGAb,GAAAD,GAAAK,GAAAS,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,gBACAb,GAAAD,GAAAK,GAAAS,GAAA,eACAb,GAAAD,GAAAK,GAAAE,GAAA,aACAN,GAAAD,GAAAK,GAAAE,GAAA,aACAN,GAAAD,GAAAK,GAAAS,GAAA,kBACAb,GAAAD,GAAAI,GAAAU,GAAA,cACAb,GAAAD,GAAAK,GAAAS,GAAA,kBAEAb,GAAAD,GAAAK,GAAAE,GAAA,oBACAN,GAAAD,GAAAK,GAAAE,GAAA,uBACAN,GAAAD,GAAAK,GAAAE,GAAA,gBACAN,GAAAD,GAAAK,GAAAE,GAAA,gBACAN,GAAAD,GAAAK,GAAAE,GAAA,2BACAN,GAAAD,GAAAK,GAAAE,GAAA,qBACAN,GAAAD,GAAAK,GAAAE,GAAA,oBACAN,GAAAD,GAAAK,GAAAE,GAAA,0BACAN,GAAAD,GAAAK,GAAAE,GAAA,mBACAN,GAAAD,GAAAK,GAAAE,GAAA,mBACAN,GAAAD,GAAAK,GAAAE,GAAA,2BACAN,GAAAD,GAAAK,GAAAE,GAAA,4BACAN,GAAAD,GAAAK,GAAAE,GAAA,uBACAN,GAAAD,GAAAK,GAAAE,GAAA,qBACAN,GAAAD,GAAAK,GAAAE,GAAA,wBACAN,GAAAD,GAAAK,GAAAE,GAAA,uBACAN,GAAAD,GAAAK,GAAAE,GAAA,mBACAN,GAAAD,GAAAK,GAAAE,GAAA,qBACAN,GAAAD,GAAAK,GAAAE,GAAA,mBACAN,GAAAD,GAAAK,GAAAE,GAAA,mBACAN,GAAAD,GAAAK,GAAAE,GAAA,qBAIAN,GAAAD,GAAAK,GAAAS,GAAA,2BAEAb,GAAAD,GAAAK,GAAAS,GAAA,0BACAb,GAAAD,GAAAK,GAAAS,GAAA,2BACAb,GAAAD,GAAAK,GAAAS,GAAA,4BACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,6BACAb,GAAAD,GAAAK,GAAAS,GAAA,0BACAb,GAAAD,GAAAK,GAAAS,GAAA,0BACAb,GAAAD,GAAAK,GAAAS,GAAA,8BACAb,GAAAD,GAAAK,GAAAS,GAAA,2BAEAb,GAAAD,GAAAK,GAAAS,GAAA,4BACAb,GAAAD,GAAAK,GAAAS,GAAA,gBACAb,GAAAD,GAAAK,GAAAS,GAAA,uBACAb,GAAAD,GAAAK,GAAAS,GAAA,0BACAb,GAAAD,GAAAK,GAAAS,GAAA,4BACAb,GAAAD,GAAAI,GAAAU,GAAA,mBACAb,GAAAD,GAAAI,GAAAU,GAAA,oBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,gCACAb,GAAAD,GAAAK,GAAAS,GAAA,6BACAb,GAAAD,GAAAK,GAAAS,GAAA,4BACAb,GAAAD,GAAAK,GAAAS,GAAA,8BACAb,GAAAD,GAAAK,GAAAS,GAAA,2BACAb,GAAAD,GAAAK,GAAAS,GAAA,2BACAb,GAAAD,GAAAK,GAAAS,GAAA,4BAEAb,GAAAD,GAAAK,GAAAS,GAAA,6BACAb,GAAAD,GAAAK,GAAAS,GAAA,gBACAb,GAAAD,GAAAK,GAAAS,GAAA,2BACAb,GAAAD,GAAAK,GAAAS,GAAA,2BACAb,GAAAD,GAAAK,GAAAS,GAAA,6BACAb,GAAAD,GAAAK,GAAAS,GAAA,4BACAb,GAAAD,GAAAK,GAAAS,GAAA,iBACAb,GAAAD,GAAAK,GAAAS,GAAA,wBACAb,GAAAD,GAAAK,GAAAS,GAAA,qBACAb,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,WACAf,GAAaE,GAAIC,GAAAY,GAAA,WACjBf,GAAaE,GAAIC,GAAAY,GAAA,oBACjBf,GAAAD,GAAAI,GAAAY,GAAA,WACAf,GAAaE,GAAIC,GAAAY,GAAA,WACjBf,GAAAD,GAAAI,GAAAY,GAAA,WACAf,GAAaE,GAAIC,GAAAY,GAAA,WACjBf,GAAaE,GAAIC,GAAAY,GAAA,wBACjBf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,eACAf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,mBACAf,GAAAD,GAAAI,GAAAY,GAAA,eACAf,GAAAD,GAAAI,GAAAY,GAAA,eACAf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,oBACAf,GAAAD,GAAAI,GAAAY,GAAA,gBACAf,GAAAD,GAAAI,GAAAY,GAAA,gBACAf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,gBACAf,GAAAD,GAAAI,GAAAY,GAAA,cACAf,GAAAD,GAAAI,GAAAY,GAAA,aACAf,GAAAD,GAAAI,GAAAY,GAAA,aACAf,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAAD,GAAAK,GAAAW,GAAA,oBACAf,GAAAD,GAAAI,GAAAM,GAAA,kBACAT,GAAAD,GAAAI,GAAAM,GAAA,iBACAT,GAAAD,GAAAI,GAAAM,GAAA,kBACAT,GAAAD,GAAAI,GAAAM,GAAA,kBACAT,GAAAD,GAAAI,GAAAM,GAAA,oBACAT,GAAAD,GAAAI,GAAAM,GAAA,iBACAT,GAAAD,GAAAI,GAAAM,GAAA,gBACAT,GAAAD,GAAAI,GAAAM,GAAA,kBACAT,GAAAD,GAAAI,GAAAM,GAAA,iBACAT,GAAAD,GAAAI,GAAAM,GAAA,kBACAT,GAAAD,GAAAI,GAAAM,GAAA,mBACAT,GAAAD,GAAAI,GAAAM,GAAA,eACAT,GAAAD,GAAAI,GAAAM,GAAA,eACAT,GAAAD,GAAAI,GAAAM,GAAA,eACAT,GAAAD,GAAAI,GAAAM,GAAA,oBACAT,GAAAD,GAAAI,GAAAM,GAAA,eACAT,GAAAD,GAAAI,GAAAM,GAAA,gBACAT,GAAAD,GAAAI,GAAAM,GAAA,kBACAT,GAAAD,GAAAI,GAAAM,GAAA,gBACAT,GAAAD,GAAAI,GAAAM,GAAA,oBACAT,GAAAD,GAAAI,GAAAM,GAAA,gBACAT,GAAAD,GAAAI,GAAAM,GAAA,gBACAT,GAAAD,GAAAI,GAAAM,GAAA,gBACAT,GAAAD,GAAAI,GAAAM,GAAA,kBACAT,GAAAD,GAAAI,GAAAM,GAAA,uBACAT,GAAAD,GAAAI,GAAAM,GAAA,qBACAT,GAAAD,GAAAI,GAAAM,GAAA,kBACAT,GAAAD,GAAAI,GAAAM,GAAA,mBACAT,GAAAD,GAAAI,GAAAM,GAAA,qBACAT,GAAAD,GAAAI,GAAAM,GAAA,mBACAT,GAAAD,GAAAI,GAAAG,GAAA,YACAN,GAAAD,GAAAI,GAAAG,GAAA,SACAN,GAAAD,GAAAI,GAAAG,GAAA,YACAN,GAAAD,GAAAI,GAAAG,GAAA,iBACAN,GAAAD,GAAAI,GAAAG,GAAA,iBACAN,GAAAD,GAAAI,GAAAG,GAAA,gBACAN,GAAAD,GAAAI,GAAAG,GAAA,eACAN,GAAAD,GAAAI,GAAAG,GAAA,kBACAN,GAAAD,GAAAI,GAAAG,GAAA,gBACAN,GAAAD,GAAAI,GAAAG,GAAA,gBACAN,GAAAD,GAAAI,GAAAG,GAAA,qBACAN,GAAAD,GAAAI,GAAAG,GAAA,cACAN,GAAAD,GAAAI,GAAAG,GAAA,aACAN,GAAAD,GAAAI,GAAAG,GAAA,kBACAN,GAAAD,GAAAI,GAAAG,GAAA,gBACAN,GAAAD,GAAAI,GAAAY,GAAA,cACAf,GAAAD,GAAAI,GAAyBQ,GAAI,mBAC7BX,GAAAD,GAAAI,GAAyBQ,GAAI,eAC7BX,GAAAD,GAAAI,GAAyBQ,GAAI,eAC7BX,GAAAD,GAAAI,GAAyBI,GAAK,SAC9BP,GAAAD,GAAAI,GAAyBI,GAAK,SAC9BP,GAAAD,GAAAI,GAAyBI,GAAK,mBAC9BP,GAAAD,GAAAI,GAAyBI,GAAK,eAC9BP,GAAAD,GAAAI,GAAyBI,GAAK,eAC9BP,GAAAD,GAAAI,GAAAU,GAAA,SACAb,GAAAD,GAAAI,GAAAU,GAAA,SACAb,GAAAD,GAAAI,GAAAU,GAAA,mBACAb,GAAAD,GAAAI,GAAAU,GAAA,iBACAb,GAAAD,GAAAI,GAAAU,GAAA,YACAb,GAAAD,GAAAI,GAAAU,GAAA,gBACAb,GAAAD,GAAAI,GAAAU,GAAA,cACAb,GAAAD,GAAAI,GAAAU,GAAA,eACAb,GAAAD,GAAAI,GAAAU,GAAA,eACAb,GAAAD,GAAAI,GAAAU,GAAA,cACAb,GAAAD,GAAAI,GAAAU,GAAA,mBACAb,GAAAD,GAAAI,GAAAU,GAAA,mBACAb,GAAAD,GAAAI,GAAAU,GAAA,qBACAb,GAAAD,GAAAI,GAAAU,GAAA,qBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAK,GAAAS,GAAA,sBACAb,GAAAD,GAAAI,GAAAU,GAAA,gBACAb,GAAAD,GAAAI,GAAAU,GAAA,sBACAb,GAAAD,GAAAI,GAAAU,GAAA,YACAb,GAAAD,GAAAI,GAAAU,GAAA,gBACAb,GAAAD,GAAAI,GAAAU,GAAA,eACAb,GAAAD,GAAAI,GAAAU,GAAA,uBACAb,GAAAD,GAAAI,GAAAU,GAAA,YACAb,GAAAD,GAAAK,GAAAS,GAAA,iBACAb,GAAAD,GAAAK,GAAAS,GAAA,iBACAb,GAAAD,GAAAI,GAAAW,GAAA,WACAd,GAAAD,GAAAI,GAAAW,GAAA,eAEAd,GAAAD,GAAAI,GAAAW,GAAA,sBACAd,GAAaE,GAAIC,GAAAW,GAAA,WACjBd,GAAaE,GAAIC,GAAAW,GAAA,SACjBd,GAAaE,GAAIC,GAAAW,GAAA,eACjBd,GAAaE,GAAIC,GAAAW,GAAA,sBACjBd,GAAAD,GAAAI,GAAAW,GAAA,gBACAd,GAAAD,GAAAI,GAAAW,GAAA,mBACAd,GAAAD,GAAAI,GAAAS,GAAA,SACAZ,GAAAD,GAAAI,GAAAS,GAAA,IAAkC,KAClCZ,GAAAD,GAAAK,GAAAE,GAAA,qBACAN,GAAAD,GAAAK,GAAAE,GAAA,mBACAN,GAAAD,GAAAI,GAAAG,GAAA,iBACAN,GAAAD,GAAAI,GAAAG,GAAA,kBACAN,GAAAD,GAAAI,GAAAG,GAAA,mBACAN,GAAAD,GAAAI,GAAAY,GAAA,oBACAf,GAAAD,GAAAI,GAAAG,GAAA,mBACAN,GAAAD,GAAAK,GAAAE,GAAA,wBACAN,GAAAD,GAAAK,GAAAE,GAAA,mBACAN,GAAAD,GAAAI,GAAAG,GAAA,uBACAN,GAAAD,GAAAI,GAAAG,GAAA,yBACAN,GAAAD,GAAAI,GAAAG,GAAA,gBACAN,GAAAD,GAAAI,GAAAG,GAAA,iBACAN,GAAAD,GAAAI,GAAAG,GAAA,cACAN,GAAAD,GAAAI,GAAAG,GAAA,sBACAN,GAAAD,GAAAI,GAAAG,GAAA,uBACAN,GAAAD,GAAAI,GAAyBQ,GAAI,IAAI,OACjCX,GAAaE,GAAIC,GAAAY,GAAA,IAAmB,OACpCf,GAAaE,GAAIC,GAAAY,GAAA,IAAmB,mBACpCf,GAAAD,GAAAI,GAAyBI,GAAK,IAAI,OAClCP,GAAaE,GAAIC,GAAAY,GAAA,IAAmB,OACpCf,GAAaE,GAAIC,GAAAY,GAAA,IAAmB,oBACpCf,GAAAD,GAAAI,GAAyBQ,GAAI,IAAI,YACjCX,GAAAD,GAAAI,GAAyBI,GAAK,IAAI,YAClCP,GAAAD,GAAAI,GAAyBQ,GAAI,mBAC7BX,GAAaE,GAAIC,GAAAY,GAAA,mBACjBf,GAAAD,GAAAI,GAAyBI,GAAK,mBAC9BP,GAAaE,GAAIC,GAAAY,GAAA,mBACjBf,GAAAD,GAAAI,GAAyBQ,GAAI,mBAC7BX,GAAAD,GAAAI,GAAyBI,GAAK,mBAC9BP,GAAaE,GAAIC,GAAAY,GAAA,qBACjBf,GAAaE,GAAIC,GAAAY,GAAA,wBACjBf,GAAAD,GAAAI,GAAyBQ,GAAI,mBAC7BX,GAAAD,GAAAI,GAAyBI,GAAK,mBAC9BP,GAAAD,GAAAI,GAAyBQ,GAAI,kBAC7BX,GAAAD,GAAAI,GAAyBI,GAAK,kBAC9BP,GAAAD,GAAAI,GAAAY,GAAA,oBACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,cACAf,GAAaE,GAAIC,GAAAY,GAAA,oBACjBf,GAAAD,GAAAI,GAAAY,GAAA,WACAf,GAAAD,GAAAI,GAAAY,GAAA,cACAf,GAAaE,GAAIC,GAAAY,GAAA,oBACjBf,GAAaE,GAAIC,GAAAY,GAAA,wBACjBf,GAAaE,GAAIC,GAAAY,GAAA,wBACjBf,GAAaE,GAAIC,GAAAY,GAAA,yBACjBf,GAAAD,GAAAI,GAAAU,GAAA,oBACAb,GAAAD,GAAAI,GAAAU,GAAA,oBACAb,GAAAD,GAAAI,GAAAU,GAAA,sBACAb,GAAAD,GAAAI,GAAAU,GAAA,sBACAb,GAAAD,GAAAI,GAAAU,GAAA,wBACAb,GAAAD,GAAAI,GAAAU,GAAA,wBACAb,GAAAD,GAAAI,GAAAO,GAAA,gBACAV,GAAAD,GAAAI,GAAAO,GAAA,gBACAV,GAAAD,GAAAI,GAAAO,GAAA,kBACAV,GAAAD,GAAAI,GAAAO,GAAA,kBACAV,GAAAD,GAAAI,GAAAO,GAAA,gBACAV,GAAAD,GAAAI,GAAAO,GAAA,gBACAV,GAAAD,GAAAI,GAAAO,GAAA,aACAV,GAAAD,GAAAI,GAAAO,GAAA,eACAV,GAAAD,GAAAI,GAAAO,GAAA,cACAV,GAAAD,GAAAI,GAAAO,GAAA,eACAV,GAAAD,GAAAI,GAAAO,GAAA,cACAV,GAAAD,GAAAI,GAAAO,GAAA,aACAV,GAAAD,GAAAI,GAAAO,GAAA,mBACAV,GAAAD,GAAAI,GAAAO,GAAA,kBACAV,GAAAD,GAAAI,GAAAO,GAAA,iBACAV,GAAAD,GAAAI,GAAAO,GAAA,cACAV,GAAAD,GAAAI,GAAAO,GAAA,eACAV,GAAAD,GAAAI,GAAAO,GAAA,gBACAV,GAAAD,GAAAI,GAAAO,GAAA,kBACAV,GAAAD,GAAAI,GAAAO,GAAA,kBACAV,GAAaE,GAAIC,GAAAK,GAAA,sBACjBR,GAAAD,GAAAI,GAAAK,GAAA,sBACAR,GAAaE,GAAIC,GAAAK,GAAA,kBACjBR,GAAAD,GAAAI,GAAAK,GAAA,kBACAR,GAAAD,GAAAI,GAAAK,GAAA,mBACAR,GAAAD,GAAAI,GAAAK,GAAA,kBAEAR,GAAAD,GAAAI,GAAAY,GAAA,kBACAf,GAAaE,GAAIC,GAAAY,GAAA,kBACjBf,GAAAD,GAAAI,GAAAE,GAAA,eACAL,GAAAD,GAAAI,GAAAE,GAAA,eACAL,GAAAD,GAAAI,GAAAE,GAAA,cACAL,GAAAD,GAAAI,GAAAE,GAAA,eACAL,GAAAD,GAAAI,GAAAE,GAAA,aACAL,GAAAD,GAAAI,GAAAE,GAAA,eACAL,GAAAD,GAAAI,GAAAE,GAAA,eACAL,GAAAD,GAAAI,GAAAE,GAAA,aACAL,GAAAD,GAAAI,GAAAE,GAAA,aACAL,GAAAD,GAAAI,GAAAE,GAAA,aACAL,GAAAD,GAAAI,GAAAE,GAAA,kBAEAL,GAAAD,GAAAI,GAAAM,GAAA,gBACAT,GAAAD,GAAAI,GAAAM,GAAA,gBACAT,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAAD,GAAAI,GAAAY,GAAA,SACAf,GAAaE,GAAIC,GAAAY,GAAA,cACjBf,GAAaE,GAAIC,GAAAY,GAAA,cACjBf,GAAaE,GAAIC,GAAAY,GAAA,eACjBf,GAAaE,GAAIC,GAAAY,GAAA,eACjBf,GAAaE,GAAIC,GAAAY,GAAA,eACjBf,GAAaE,GAAIC,GAAAY,GAAA,cACjBf,GAAaE,GAAIC,GAAAY,GAAA,eACjBf,GAAaE,GAAIC,GAAAY,GAAA,eACjBf,GAAaE,GAAIC,GAAAY,GAAA,cACjBf,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,WACjBL,GAAaE,GAAIC,GAAAE,GAAA,qBAEjB,IAAAW,GAAA,CACA,QACA,SACA,QACA,SAEAhB,GAAaE,GAAIC,GAAAY,GAAA,aACjBf,GAAaE,GAAIC,GAAAY,GAAA,oBACjBf,GAAaE,GAAIC,GAAAY,GAAA,cACjBf,GAAaE,GAAIC,GAAAY,GAAA,oBACjBf,GAAaE,GAAIC,GAAAY,GAAA,YACjBf,GAAaE,GAAIC,GAAAY,GAAA,uBACjBf,GAAaE,GAAIC,GAAAY,GAAA,YACjBf,GAAaE,GAAIC,GAAAY,GAAA,wBACjBf,GAAaE,GAAIC,GAAAY,GAAA,aACjBf,GAAaE,GAAIC,GAAAY,GAAA,0BACjBf,GAAaE,GAAIC,GAAAY,GAAA,aACjBf,GAAaE,GAAIC,GAAAY,GAAA,2BAEjBf,GAAAD,GAAAI,GAAAY,GAAA,mBACAf,GAAaE,GAAIC,GAAAY,GAAA,gBAEjBf,GAAaE,GAAIC,GAAAY,GAAA,uBAGjBf,GAAAD,GAAAI,GAAAY,GAAA,gBACAf,GAAAD,GAAAI,GAAAY,GAAA,yBACAf,GAAaE,GAAIC,GAAAY,GAAA,gBACjBf,GAAaE,GAAIC,GAAAY,GAAA,yBACjBf,GAAAD,GAAAK,GAAAW,GAAA,iBACAf,GAAaE,GAAIE,GAAAW,GAAA,iBAIjB,IADA,IAAAE,GAAA,iBACAtZ,GAAA,EAAgBA,GAAAsZ,GAA4BtZ,KAAA,CAC5C,IAAAgY,GAAAsB,GAAAlZ,OAAAJ,IACAqY,GAAAD,GAAAI,GAAAY,GAAApB,GAAAA,GACA,CAGA,IADA,IAAAuB,GAAA,4BACA5E,GAAA,EAAiBA,GAAA4E,GAAyB5E,KAAA,CAC1C,IAAA6E,GAAAD,GAAAnZ,OAAAuU,IACA0D,GAAeE,GAAIC,GAAAY,GAAAI,GAAAA,GACnB,CAGA,IADA,IA4BAC,GA5BAC,GAAA,uDACAC,GAAA,EAAkBA,GAAAD,GAAsBC,KAAA,CACxC,IAAAC,GAAAF,GAAAtZ,OAAAuZ,IACAtB,GAAAD,GAAAI,GAAAM,GAAAc,GAAAA,IACAvB,GAAeE,GAAIC,GAAAY,GAAAQ,GAAAA,GACnB,CAEAvB,GAAAD,GAAAK,GAAAW,GAAA,SACAf,GAAaE,GAAIE,GAAAW,GAAA,SACjBf,GAAAD,GAAAK,GAAAW,GAAA,SACAf,GAAaE,GAAIE,GAAAW,GAAA,SACjBf,GAAAD,GAAAK,GAAAW,GAAA,SACAf,GAAaE,GAAIE,GAAAW,GAAA,SACjBf,GAAAD,GAAAK,GAAAW,GAAA,SACAf,GAAaE,GAAIE,GAAAW,GAAA,SACjBf,GAAAD,GAAAK,GAAAW,GAAA,SACAf,GAAaE,GAAIE,GAAAW,GAAA,SACjBf,GAAAD,GAAAK,GAAAW,GAAA,SACAf,GAAaE,GAAIE,GAAAW,GAAA,SACjBf,GAAAD,GAAAK,GAAAW,GAAA,SACAf,GAAaE,GAAIE,GAAAW,GAAA,SACjBf,GAAAD,GAAAI,GAAAM,GAAA,SACAT,GAAaE,GAAIC,GAAAM,GAAA,SAOjB,QAAAe,GAAA,EAAkBA,GAAAH,GAAsBG,KAAA,CACxC,IAAAC,GAAAJ,GAAAtZ,OAAAyZ,IAKAxB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAeE,GAAIC,GAAAY,GAAAU,GAAAL,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAeE,GAAIC,GAAAY,GAAAU,GAAAL,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAeE,GAAIC,GAAAY,GAAAU,GAAAL,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAeE,GAAIC,GAAAY,GAAAU,GAAAL,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAeE,GAAIC,GAAAY,GAAAU,GAAAL,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAeE,GAAIC,GAAAY,GAAAU,GAAAL,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAeE,GAAIC,GAAAY,GAAAU,GAAAL,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAeE,GAAIC,GAAAY,GAAAU,GAAAL,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAeE,GAAIC,GAAAY,GAAAU,GAAAL,IACnBI,GAAA,KAIAxB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAiBE,GAAIC,GAAAY,GAAAU,GAAAL,IAErBpB,GAAAD,GAAAI,GAAAM,GAAAgB,GADAL,GAAA3S,OAAAiT,aAAA,YAAAF,KAEAxB,GAAiBE,GAAIC,GAAAY,GAAAU,GAAAL,IAGrB,CAGApB,GAAAD,GAAAI,GAAAM,GAAA,IADAW,GAAA3S,OAAAiT,aAAA,cAEA1B,GAAaE,GAAIC,GAAAY,GAAA,IAAAK,IAEjB,QAAAO,GAAA,EAAkBA,GAAA,GAAUA,KAAA,CAC5B,IAAAC,GAAAD,GAAAE,WAEA7B,GAAAD,GAAAI,GAAAM,GAAAmB,GADAR,GAAA3S,OAAAiT,aAAA,YAAAC,KAEA3B,GAAeE,GAAIC,GAAAY,GAAAa,GAAAR,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAmB,GADAR,GAAA3S,OAAAiT,aAAA,YAAAC,KAEA3B,GAAeE,GAAIC,GAAAY,GAAAa,GAAAR,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAmB,GADAR,GAAA3S,OAAAiT,aAAA,YAAAC,KAEA3B,GAAeE,GAAIC,GAAAY,GAAAa,GAAAR,IAEnBpB,GAAAD,GAAAI,GAAAM,GAAAmB,GADAR,GAAA3S,OAAAiT,aAAA,YAAAC,KAEA3B,GAAeE,GAAIC,GAAAY,GAAAa,GAAAR,GACnB,CAMA,IADA,IAAAU,GAAA,MACAC,GAAA,EAAkBA,GAAAD,EAAyBC,KAAA,CAC3C,IAAAC,GAAAF,GAAA/Z,OAAAga,IACA/B,GAAAD,GAAAI,GAAAM,GAAAuB,GAAAA,IACAhC,GAAeE,GAAIC,GAAAY,GAAAiB,GAAAA,GACnB,CASA,IAAAC,GAAA,CACAC,UAAA,SACAC,UAAA,SACA1C,KAAA,aAEA9D,GAAA,CACAuG,UAAA,aACAC,UAAA,SACA1C,KAAA,eAEA2C,GAAA,CACAF,UAAA,aACAC,UAAA,aACA1C,KAAA,mBAOA4C,GAAA,CACAH,UAAA,GACAC,UAAA,GACA1C,KAAA,IAEA6C,GAAA,CACAJ,UAAA,WACAC,UAAA,WACA1C,KAAA,mBAEA8C,GAAA,CACAL,UAAA,SACAC,UAAA,SACA1C,KAAA,eAEA+C,GAAA,CACAN,UAAA,eACAC,UAAA,eACA1C,KAAA,mBAEAgD,GAAA,CACAP,UAAA,SACAC,UAAA,SACA1C,KAAA,qBAEAiD,GAAA,CACAR,UAAA,aACAC,UAAA,aACA1C,KAAA,kBAEAkD,GAAA,CACAT,UAAA,WACAC,UAAA,WACA1C,KAAA,oBAEAmD,GAAA,CACAV,UAAA,SACAC,UAAA,SACA1C,KAAA,sBAWAoD,GAAA,CAAAZ,GAAAA,GAEAtG,GAAAA,GAEAyG,GAAAA,GA1DA,CACAF,UAAA,UACAC,UAAA,UACA1C,KAAA,kBA2DA4C,GAEAA,GAAAA,GAEAC,GAAAA,GAEAC,GAAAA,GAGAC,GAAAA,GAEAC,GAAAA,GAEAC,GAAAA,GAEAC,GAAAA,GAEAN,GAAAA,GAEAO,GAAAA,IAEAE,GAAA,CAAAb,GAEAI,GAEAI,GAEAC,GAEAE,IAiCAG,GAAA,SAAApW,EAAAqW,EAAAtD,GAEA,GAAAI,GAAAJ,GAAA/S,GAAA,CACA,IAAAsW,EAAAnD,GAAAJ,GAAA/S,GAAAhB,QACAsX,IACAtW,EAAAsW,EAEA,CACA,OACAtW,QACAiT,QAAAL,GAAA5S,EAAAqW,EAAAtD,GAEA,EAWAwD,GAAA,SAAAvW,EAAAqW,EAAAtD,EAAApO,EAAAwG,GACA,IAGAqL,EAHAC,EAAAL,GAAApW,EAAAqW,EAAAtD,GACAE,EAAAwD,EAAAxD,QAGA,GAFAjT,EAAAyW,EAAAzW,MAEAiT,EAAA,CACA,IAAAjE,EAAAiE,EAAAjE,QACA,SAAA+D,GAAApO,GAAA,WAAAA,EAAAmO,QACA9D,EAAA,GAEAwH,EAAA,IAAAhH,EAAAxP,EAAAiT,EAAApd,OAAAod,EAAA7H,MAAA4D,EAAAiE,EAAAxD,KAAAwD,EAAArd,MAAAuV,EACA,KAEA,oBAAAlG,SAAAA,QAAAC,KAAA,6BAAAlF,EAAA,eAAAqW,EAAA,eAAAtD,EAAA,KACAyD,EAAA,IAAAhH,EAAAxP,EAAA,UAAAmL,GAEA,GAAAxG,EAAA,CACA6R,EAAAnL,YAAA1G,EAAA+I,eACA/I,EAAA2G,MAAAjF,WACAmQ,EAAArL,QAAArS,KAAA,UAEA,IAAAqK,EAAAwB,EAAA8J,WACAtL,IACAqT,EAAAlL,MAAAnI,MAAAA,EAEA,CACA,OAAAqT,CACA,EAKAE,GAAA,SAAA1W,EAAA+S,EAAApO,EAAAwG,GAWA,YAVA,IAAAA,IACAA,EAAA,IASA,eAAAxG,EAAAmO,MAAAsD,GAAApW,EAAA,YAAA+S,GAAAE,QACAsD,GAAAvW,EAAA,YAAA+S,EAAApO,EAAAwG,EAAAwL,OAAA,aACI,OAAA3W,GAAA,SAAAmT,GAAAJ,GAAA/S,GAAA8S,KACJyD,GAAAvW,EAAA,eAAA+S,EAAApO,EAAAwG,GAEAoL,GAAAvW,EAAA,cAAA+S,EAAApO,EAAAwG,EAAAwL,OAAA,WAEA,EAyBAC,GAAA,SAAA3U,EAAA0C,GAEA,IAAAnL,EAAA,YAAAyI,EAAAzI,KAAA,oBACAuZ,EAAA9Q,EAAA8Q,KACAza,EAAA2J,EAAA3J,KACA6S,EAAA,UACA2H,KACAA,EAAA+D,WACAA,EAAAC,WACAA,EAAAC,UACAA,GACIpS,EAEJqS,EAAA,SAAAjE,GAAA,SAAAA,KAAAD,EACAmE,EAAAD,EAAAlE,EAAA+D,EACAK,EAAA,GACAC,EAAA,GACA,WAAA7e,EAAAwX,WAAA,IACA,IAAAsH,EAnJA3C,KAEA,IAEA4C,EAAA,MAFA5C,EAAA3E,WAAA,GAEA,QADA2E,EAAA3E,WAAA,GACA,aACA,WAAAuH,GAAAA,EAAA,QAGA,IAAArc,EAAAK,KAAAC,OAAA+b,EAAA,YACA,OAAAnB,GAAAlb,EACA,CAAI,WAAAqc,GAAAA,GAAA,QAEJ,IAAA1H,EAAAtU,KAAAC,OAAA+b,EAAA,YACA,OAAAlB,GAAAxG,EACA,CAAI,YAAA0H,GAAA,SAAAA,EAEJ,OAAAnB,GAAA,GACI,UAAAmB,GAAAA,EAAA,OAEJ,OAAA3B,GAGA,UAAAhV,EAAA,0BAAA+T,IA6HA6C,CAAAhf,GACA4e,EAAAE,EAAAtE,KACAqE,EAAAC,EAAArE,EAAA,QACA,CACA,GAAAmE,EAEA,OAAAX,GAAAje,EAAA4e,EAAAnE,EAAApO,EAAAwG,EAAAwL,OAAAQ,IACI,GAAAF,EAAA,CACJ,IAAAZ,EACAkB,EACA,kBAAAN,EAAA,CACA,IAAAO,EA/CA,SAAAxX,EAAA+S,EAAAvZ,GACA,kBAAAA,GAAA4c,GAAApW,EAAA,kBAAA+S,GAAAE,QACA,CACAoD,SAAA,kBACAoB,UAAA,cAKA,CACApB,SAAA,YACAoB,UAAA,SAGA,CAiCAC,CAAApf,EAAAya,EAAAvZ,GACA6c,EAAAmB,EAAAnB,SACAkB,EAAA,CAAAC,EAAAC,UACA,MAAMT,GACNX,EAAAsB,GAAA7E,GAAAuD,SACAkB,EAAA,CAAAzE,KAEAuD,EAAAuB,GAAAf,EAAAC,EAAAC,GACAQ,EAAA,CAAAV,EAAAC,EAAAC,IAEA,GAAAX,GAAA9d,EAAA+d,EAAAtD,GAAAE,QACA,OAAAsD,GAAAje,EAAA+d,EAAAtD,EAAApO,EAAAwG,EAAAwL,OAAAY,IACM,GAAAlD,GAAA7f,eAAA8D,IAAA,eAAA+d,EAAAxb,MAAA,OAGN,IADA,IAAAgd,EAAA,GACA7c,EAAA,EAAsBA,EAAA1C,EAAAjE,OAAiB2G,IACvC6c,EAAA/e,KAAAyd,GAAAje,EAAA0C,GAAAqb,EAAAtD,EAAApO,EAAAwG,EAAAwL,OAAAY,KAEA,OAAAO,GAAAD,EACA,CACA,CAEA,eAAAre,EACA,OAAA+c,GAAAje,EAAA,cAAAya,EAAApO,EAAAwG,EAAAwL,OAAA,iBACI,eAAAnd,EAAA,CACJ,IAAAue,EAAA5E,GAAAJ,GAAAza,IAAA6a,GAAAJ,GAAAza,GAAAwa,KACA,WAAAiF,EAAA,CACA,IAAAC,EAAAJ,GAAA,QAAAd,EAAAC,GACA,OAAAR,GAAAje,EAAA0f,EAAAjF,EAAApO,EAAAwG,EAAAwL,OAAA,QAAAG,EAAAC,GACA,CAAM,YAAAgB,GAAAA,EAGA,CAEN,IAAAE,EAAAL,GAAAG,EAAAjB,EAAAC,GAEA,OAAAR,GAAAje,EAAA2f,EAAAlF,EAAApO,EAAAwG,EAAAwL,OAAAsB,EAAAnB,EAAAC,GACA,CAPA,IAAAmB,EAAAN,GAAA,SAAAd,EAAAC,GACA,OAAAR,GAAAje,EAAA4f,EAAAnF,EAAApO,EAAAwG,EAAAwL,OAAAG,EAAAC,GAOA,CACA,UAAAxf,MAAA,oBAAAiC,EAAA,cAEA,EAMA2e,GAAA,CAAAC,EAAAC,KACA,GAAAlK,EAAAiK,EAAAjN,WAAAgD,EAAAkK,EAAAlN,UAAAiN,EAAA3I,OAAA4I,EAAA5I,MAAA2I,EAAA/M,cAAAgN,EAAAhN,aAAA,IAAA+M,EAAApJ,QAAAoJ,EAAA7M,SAAA,cACA,SAIA,OAAA6M,EAAAjN,QAAA9W,OAAA,CACA,IAAA+Z,EAAAgK,EAAAjN,QAAA,GACA,YAAAiD,GAAA,SAAAA,EACA,QAEA,CACA,QAAAE,KAAAva,OAAAuI,KAAA8b,EAAA9M,OACA,GAAA8M,EAAA9M,MAAAgD,KAAA+J,EAAA/M,MAAAgD,GACA,SAGA,QAAAgK,KAAAvkB,OAAAuI,KAAA+b,EAAA/M,OACA,GAAA8M,EAAA9M,MAAAgN,KAAAD,EAAA/M,MAAAgN,GACA,SAGA,UAMAC,GAAAC,IACA,QAAAxd,EAAA,EAAkBA,EAAAwd,EAAAnkB,OAAA,EAAsB2G,IAAA,CACxC,IAAAod,EAAAI,EAAAxd,GACAqd,EAAAG,EAAAxd,EAAA,GACAod,aAAA5I,GAAA6I,aAAA7I,GAAA2I,GAAAC,EAAAC,KACAD,EAAA9f,MAAA+f,EAAA/f,KACA8f,EAAAviB,OAAAwF,KAAAqI,IAAA0U,EAAAviB,OAAAwiB,EAAAxiB,QACAuiB,EAAAhN,MAAA/P,KAAAqI,IAAA0U,EAAAhN,MAAAiN,EAAAjN,OAIAgN,EAAApJ,OAAAqJ,EAAArJ,OACAwJ,EAAAC,OAAAzd,EAAA,KACAA,IAEA,CACA,OAAAwd,GAMAE,GAAA,SAAAC,GAIA,IAHA,IAAA9iB,EAAA,EACAuV,EAAA,EACAC,EAAA,EACArQ,EAAA,EAAkBA,EAAA2d,EAAAzN,SAAA7W,OAA0B2G,IAAA,CAC5C,IAAAkR,EAAAyM,EAAAzN,SAAAlQ,GACAkR,EAAArW,OAAAA,IACAA,EAAAqW,EAAArW,QAEAqW,EAAAd,MAAAA,IACAA,EAAAc,EAAAd,OAEAc,EAAAb,YAAAA,IACAA,EAAAa,EAAAb,YAEA,CACAsN,EAAA9iB,OAAAA,EACA8iB,EAAAvN,MAAAA,EACAuN,EAAAtN,YAAAA,CACA,EASAuN,GAAA,SAAAzN,EAAAD,EAAAvG,EAAA2G,GACA,IAAA0E,EAAA,IAAAjB,EAAA5D,EAAAD,EAAAvG,EAAA2G,GAEA,OADAoN,GAAA1I,GACAA,CACA,EAGA6I,GAAA,CAAA1N,EAAAD,EAAAvG,EAAA2G,IAAA,IAAAyD,EAAA5D,EAAAD,EAAAvG,EAAA2G,GACAwN,GAAA,SAAAtN,EAAA7G,EAAAoU,GACA,IAAAC,EAAAJ,GAAA,CAAApN,GAAA,GAAA7G,GAIA,OAHAqU,EAAAnjB,OAAAwF,KAAAqI,IAAAqV,GAAApU,EAAA6I,cAAAwE,qBAAArN,EAAAnB,kBACAwV,EAAA1N,MAAA2N,kBAAA/K,EAAA8K,EAAAnjB,QACAmjB,EAAA3N,YAAA,EACA2N,CACA,EAaAlB,GAAA,SAAA5M,GACA,IAAAgO,EAAA,IAAAjO,EAAAC,GAEA,OADAwN,GAAAQ,GACAA,CACA,EAKAC,GAAA,SAAAlX,EAAA0C,GACA,OAAA1C,aAAAgJ,EACA2N,GAAA,IAAA3W,GAAA0C,GAEA1C,CACA,EAgEAmX,GAAA,SAAAC,EAAA1U,GAaA,IAZA,IAAAuG,SACAA,EAAAE,MACAA,GA9DA,SAAAiO,GACA,uBAAAA,EAAAC,aAAA,CAOA,IANA,IAAAC,EAAAF,EAAAnO,SACAA,EAAA,CAAAqO,EAAA,IAGAC,GAAAD,EAAA,GAAAE,MAAAF,EAAA,GAAAZ,KAAAvN,MACAsO,EAAAF,EACAxe,EAAA,EAAoBA,EAAAue,EAAAllB,OAAwB2G,IAAA,CAC5C,IAAA2e,GAAAJ,EAAAve,GAAAye,MAAAC,EAAAH,EAAAve,GAAA2d,KAAAvN,MACAxF,EAAA+T,GAAAJ,EAAAve,EAAA,GAAA2d,KAAA9iB,OAAA0jB,EAAAve,EAAA,GAAA2d,KAAAvN,OACAsO,GAAAC,EACAzO,EAAApS,KAAA,CACAU,KAAA,OACAoM,SAEAsF,EAAApS,KAAAygB,EAAAve,GACA,CACA,OACAkQ,WACAE,MAAAoO,EAEA,CACA,IAAApO,EACA,WAAAiO,EAAAC,aAAA,CAIA,IADA,IAAAM,EAAAP,EAAAQ,aACAlK,EAAA,EAAqBA,EAAA0J,EAAAnO,SAAA7W,OAA6Bsb,IAAA,CAClD,IAAAzD,EAAAmN,EAAAnO,SAAAyE,GACAiK,GAAA,SAAA1N,EAAA1S,KAAA0S,EAAAtG,KAAAsG,EAAAyM,KAAA9iB,OAAAqW,EAAAyM,KAAAvN,KACA,CACAA,EAAAwO,CACA,MAAI,cAAAP,EAAAC,aACJlO,GAAAiO,EAAAQ,iBACI,CACJ,IAAAC,EAAAT,EAAAnO,SAAA,GACA,YAAA4O,EAAAtgB,KACA,UAAAjC,MAAA,sCAEA,aAAA8hB,EAAAC,aACAlO,GAAA0O,EAAAnB,KAAAvN,MAAAiO,EAAAQ,iBACM,sBAAAR,EAAAC,aAGN,UAAA/hB,MAAA,wBAAA8hB,EAAAC,aAAA,KAFAlO,GAAA0O,EAAAnB,KAAAvN,KAGA,CACA,CACA,OACAF,SAAAmO,EAAAnO,SACAE,QAEA,CAWI2O,CAAAV,GAQJW,EAAA,EACAhf,EAAA,EAAkBA,EAAAkQ,EAAA7W,OAAqB2G,IAAA,CACvC,IAAAkR,EAAAhB,EAAAlQ,GACA,YAAAkR,EAAA1S,KAAA,CACA,IAAAmf,EAAAzM,EAAAyM,KACAqB,EAAA3e,KAAAqI,IAAAsW,EAAArB,EAAAtN,YAAAsN,EAAA9iB,OACA,CACA,CACAmkB,GAAA,EACA,IAAAC,EAAArB,GAAA,eACAqB,EAAA3O,MAAAzV,OAAAqY,EAAA8L,GAMA,IAJA,IAAAE,EAAA,GACAC,EAAA/O,EACAgP,EAAAhP,EACAsO,EAAAtO,EACAuJ,EAAA,EAAoBA,EAAAzJ,EAAA7W,OAAuBsgB,IAAA,CAC3C,IAAA0F,EAAAnP,EAAAyJ,GACA,YAAA0F,EAAA7gB,KACAkgB,GAAAW,EAAAzU,SACM,CACN,IAAA0U,EAAAD,EAAA1B,KACAxN,EAAAkP,EAAAE,gBAAA,GACAjP,EAAA+O,EAAAG,cAAA,GACAC,EAAA7B,GAAAzN,EAAA,CAAA8O,EAAAK,QAAAzhB,EAAAyS,GACAmP,EAAAnP,MAAAoP,IAAAxM,GAAA8L,EAAAN,EAAAY,EAAAlP,OACAiP,EAAAM,aACAF,EAAAnP,MAAAqP,WAAAN,EAAAM,YAEAN,EAAApK,cACAwK,EAAAnP,MAAA2E,YAAAoK,EAAApK,aAEAiK,EAAAphB,KAAA2hB,GACAf,GAAAY,EAAAzkB,OAAAykB,EAAAlP,KACA,CACA+O,EAAA9e,KAAA2S,IAAAmM,EAAAT,GACAU,EAAA/e,KAAAqI,IAAA0W,EAAAV,EACA,CAIA,IAGAkB,EAHAC,EAAAjC,GAAA,UAAAsB,GAIA,GAHAW,EAAAvP,MAAAzV,OAAAqY,EAAAkM,GAGAD,EAAA,GAMA,IAAAW,EAAAlC,GAAA,OACAmC,EAAAnC,GAAA,WAAAkC,IACAC,EAAAzP,MAAAzV,OAAAqY,GAAAiM,GAGA,IAAAa,EAAApC,GAAA,iBAAApJ,EAAA,OACAoL,EAAA,CAAAhC,GAAA,aAAAiC,EAAAG,IAAApC,GAAA,aAAAmC,IACA,MACAH,EAAA,CAAAhC,GAAA,aAAAiC,KAEA,IAAAI,EAAArC,GAAA,YAAAgC,GAMA,OALA,IAAAA,EAAAvmB,QACA4mB,EAAA9P,QAAArS,KAAA,YAEAmiB,EAAAplB,OAAAukB,EACAa,EAAA7P,OAAA+O,EACAc,CACA,EAIAC,GAAA,CAAAC,EAAAxW,KAEA,IAAAyW,EAAAxC,GAAA,cAAAjU,GACAiB,EAAAyH,EAAA8N,EAAAxW,GAEA,OADAyW,EAAA9P,MAAA2E,YAAA/B,EAAAtI,GACAwV,GAGAxD,GAAA,CAAAf,EAAAC,EAAAC,KACA,IAAAsE,EAEA,OAAAxE,GACA,YACAwE,EAAA,MACA,MACA,aACAA,EAAA,OACA,MACA,aACAA,EAAA,YACA,MACA,aACAA,EAAA,aACA,MACA,QACAA,EAAAxE,EAYA,OAAAwE,EAAA,KATA,WAAAvE,GAAA,WAAAC,EACA,aACI,WAAAD,EACJ,OACI,WAAAC,EACJ,SAEA,YAUAY,GAAA,CAEA2D,OAAA,CACAC,QAAA,OACAlF,SAAA,aAEAmF,OAAA,CACAD,QAAA,SACAlF,SAAA,gBAEAoF,OAAA,CACAF,QAAA,SACAlF,SAAA,eAEAqF,OAAA,CACAH,QAAA,SACAlF,SAAA,eAEAsF,WAAA,CACAJ,QAAA,SACAlF,SAAA,eAEAuF,SAAA,CACAL,QAAA,oBACAlF,SAAA,oBAMAwF,OAAA,CACAN,QAAA,gBACAlF,SAAA,eAEAyF,QAAA,CACAP,QAAA,SACAlF,SAAA,uBAEA0F,SAAA,CACAR,QAAA,UACAlF,SAAA,mBAEA2F,QAAA,CACAT,QAAA,SACAlF,SAAA,kBAEA4F,OAAA,CACAV,QAAA,aACAlF,SAAA,qBAEA6F,OAAA,CACAX,QAAA,YACAlF,SAAA,uBAGA8F,GAAA,CAEAjS,IAAA,kBAEAxB,WAAA,yBAEAC,WAAA,0BACAC,YAAA,2BACAC,YAAA,2BAEAuT,GAAA,SAAApc,EAAA2E,GAEA,IAAA4L,EAAA3a,EAAAC,GAAAsmB,GAAAnc,GACAqH,EAAA,IAAAiJ,GAAAC,GACA8L,EAAA,IAAAjM,GAAA,CAAA/I,GAAA,CACAzR,MAAAsY,EAAAtY,GACAC,OAAAqY,EAAArY,GAEAyV,MAAA,SAAA4C,EAAAtY,GACAX,QAAA,WAAAW,EAAA,QAAAC,EACAymB,oBAAA,aAEAtM,EAAA6I,GAAA,aAAAwD,GAAA1X,GAIA,OAHAqL,EAAAna,OAAAA,EACAma,EAAA1E,MAAAzV,OAAAqY,EAAArY,GACAma,EAAA1E,MAAA1V,MAAAsY,EAAAtY,GACAoa,CACA,EAKAuM,GAAA,CACAtO,OAAA,EACAb,KAAA,MAEAoP,GAAA,CACAvO,OAAA,EACAb,KAAA,MAEAqP,GAAA,CACAxO,OAAA,EACAb,KAAA,MAGAsP,GAAA,CACAC,KAAA,CACAC,IAAAL,GACAM,KAAAL,GACAM,KAAAL,GACAM,OAAAR,IAEAK,IAAA,CACAD,KAAAJ,GACAK,IAAAL,GACAO,KAAAL,GACAM,OAAAR,IAEAM,KAAA,CACAF,KAAAH,GACAI,IAAAJ,GACAQ,MAAAR,GACAO,OAAAP,IAEAM,KAAA,CACAH,KAAAF,GACAG,IAAAH,GACAO,MAAAP,GACAM,OAAAN,IAEAO,MAAA,GACAC,OAAA,CACAL,IAAAL,GACAM,KAAAL,GACAM,KAAAL,GACAM,OAAAR,IAEAW,OAAA,CACAP,KAAAJ,GACAK,IAAAL,GACAO,KAAAL,GACAO,MAAAT,GACAU,OAAAV,GACAW,OAAAX,GACAQ,OAAAR,IAEAQ,OAAA,CACAJ,KAAAJ,GACAK,IAAAL,GACAM,KAAAL,GACAM,KAAAL,GACAO,MAAAT,GACAW,OAAAX,GACAQ,OAAAR,KAIAY,GAAA,CACAR,KAAA,CACAC,IAAAL,IAEAK,IAAA,CACAD,KAAAJ,GACAK,IAAAL,IAEAM,KAAA,GACAC,KAAA,GACAE,MAAA,GACAC,OAAA,CACAL,IAAAL,IAEAW,OAAA,GACAH,OAAA,CACAH,IAAAL,KASAa,GAAA,GAWAC,GAAA,GAMAC,GAAA,GACA,SAAAC,GAAAC,GAOA,IANA,IAAAhkB,KACAA,EAAAikB,MACAA,EAAAC,YACAA,EAAAC,cACAA,GACIH,EACJxiB,EAAA,EAAkBA,EAAAyiB,EAAAppB,SAAkB2G,EAIpCoiB,GAAAK,EAAAziB,IAAAwiB,EAEAhkB,IACAkkB,IACAL,GAAA7jB,GAAAkkB,GAEAC,IACAL,GAAA9jB,GAAAmkB,GAGA,CAMA,SAAAC,GAAAC,GACA,IAAArkB,KACAA,EAAAkkB,YACAA,EAAAC,cACAA,GACIE,EACJH,IACAL,GAAA7jB,GAAAkkB,GAEAC,IACAL,GAAA9jB,GAAAmkB,EAEA,CACA,IAAAG,GAAA,SAAAC,GACA,mBAAAA,EAAAvkB,MAAA,IAAAukB,EAAArlB,KAAArE,OAAA0pB,EAAArlB,KAAA,GAAAqlB,CACA,EAGAC,GAAA,SAAAD,GACA,mBAAAA,EAAAvkB,KAAAukB,EAAArlB,KAAA,CAAAqlB,EACA,EAWAE,GAAA,IAAA9b,IAAA,mDACA+b,GAAA,IAAA/b,IAAA,wCACAgc,GAAA,CACAC,QAAA9X,EAAAC,QACAjO,KAAAgO,EAAAE,KACAkJ,OAAApJ,EAAAG,OACA4X,aAAA/X,EAAAI,cAEA4X,GAAA,CACA3B,KAAA,OACAC,IAAA,MACAC,KAAA,OACAC,KAAA,OACAE,MAAA,QACAC,OAAA,SACAC,OAAA,SACAH,OAAA,UAUAwB,GAAA,SAAAC,EAAA7Z,EAAA8Z,EAAAC,QACA,IAAAA,IACAA,EAAA,aAIA,IADA,IAAAC,EAAA,GACA3jB,EAAA,EAAkBA,EAAAwjB,EAAAnqB,OAAuB2G,IAAA,CACzC,IAAA0H,EAAAkc,GAAAJ,EAAAxjB,GAAA2J,GACA,GAAAjC,aAAAuI,EAAA,CACA,IAAAC,EAAAxI,EAAAwI,SACAyT,EAAA7lB,QAAAoS,EACA,MACAyT,EAAA7lB,KAAA4J,EAEA,CAKA,GAHA6V,GAAAoG,IAGAF,EACA,OAAAE,EAEA,IAAAE,EAAAla,EACA,OAAA6Z,EAAAnqB,OAAA,CACA,IAAAsa,EAAA6P,EAAA,GACA,WAAA7P,EAAAnV,KACAqlB,EAAAla,EAAAma,WAAAnQ,EAAA/I,MACM,YAAA+I,EAAAnV,OACNqlB,EAAAla,EAAAkJ,YAAAsQ,GAAAxP,EAAArD,QAEA,CAIA,IAAAyT,EAAAnG,GAAA,CAAA8F,EAAA,mBAAA/Z,GACAqa,EAAApG,GAAA,CAAA8F,EAAA,oBAAA/Z,GAMAsa,EAAA,SAAAR,EAyBA,OAxBAS,GAAAP,EAAA,CAAAhQ,EAAAyJ,KACA,IAAA+G,EAAA/G,EAAAjN,QAAA,GACA3R,EAAAmV,EAAAxD,QAAA,GACA,SAAAgU,GAAAjB,GAAA7b,IAAA7I,GACA4e,EAAAjN,QAAA,UACM,SAAA3R,GAAAykB,GAAA5b,IAAA8c,KACNxQ,EAAAxD,QAAA,YAEG,CACHwD,KAAAoQ,GACGC,EAAAC,GACHC,GAAAP,EAAA,CAAAhQ,EAAAyJ,KACA,IAAAgH,EAAAC,EACAF,EAAAG,GAAAlH,GACA5e,EAAA8lB,GAAA3Q,GAEAkC,EAAAsO,GAAA3lB,EAAAmV,EAAApD,SAAA,iBAAA6T,EAAAjC,GAAAgC,SAAA,EAAAC,EAAA5lB,GAAA,OAAA6lB,EAAA3C,GAAAyC,SAAA,EAAAE,EAAA7lB,GAAA,KACA,GAAAqX,EAEA,OAAAqK,GAAArK,EAAAgO,IAEG,CACHlQ,KAAAoQ,GACGC,EAAAC,GACHN,CACA,EAMAO,GAAA,SAAAK,EAAAC,EAAApH,EAAAC,EAAA4G,GACA5G,GAEAkH,EAAAzmB,KAAAuf,GAGA,IADA,IAAArd,EAAA,EACSA,EAAAukB,EAAAlrB,OAAkB2G,IAAA,CAC3B,IAAA2T,EAAA4Q,EAAAvkB,GACAykB,EAAAC,GAAA/Q,GACA,GAAA8Q,EAIAP,GAAAO,EAAAvU,SAAAsU,EAAApH,EAAA,KAAA6G,OAJA,CASA,IAAAU,GAAAhR,EAAApD,SAAA,UACA,GAAAoU,EAAA,CACA,IAAAxpB,EAAAqpB,EAAA7Q,EAAAyJ,EAAAzJ,MACAxY,IACAiiB,EAAAwH,YACAxH,EAAAwH,YAAAzpB,IAGAopB,EAAAM,QAAA1pB,GACA6E,KAGA,CACA2kB,EACAvH,EAAAzJ,KAAAA,EACMsQ,GAAAtQ,EAAApD,SAAA,aACN6M,EAAAzJ,KAAAiK,GAAA,eAEAR,EAAAwH,YAAA,CAAAE,GAAA5rB,IACAqrB,EAAA9G,OAAAqH,EAAA,IAAA5rB,GACA8G,KAFA,CAGKA,EAxBL,CAyBA,CACAqd,GACAkH,EAAAQ,KAEA,EAEAL,GAAA,SAAA/Q,GACA,OAAAA,aAAA1D,GAAA0D,aAAAO,GAAAP,aAAAI,GAAAJ,EAAApD,SAAA,aACAoD,EAEA,IACA,EAEAqR,GAAA,SAAArR,EAAAsR,GACA,IAAAR,EAAAC,GAAA/Q,GACA,GAAA8Q,EAAA,CACA,IAAAvU,EAAAuU,EAAAvU,SACA,GAAAA,EAAA7W,OAAA,CACA,aAAA4rB,EACA,OAAAD,GAAA9U,EAAAA,EAAA7W,OAAA,YACQ,YAAA4rB,EACR,OAAAD,GAAA9U,EAAA,UAEA,CACA,CACA,OAAAyD,CACA,EAGA2Q,GAAA,SAAA3Q,EAAAsR,GACA,IAAAtR,EACA,YAEAsR,IACAtR,EAAAqR,GAAArR,EAAAsR,IAIA,IAAAzU,EAAAmD,EAAAxD,QAAA,GACA,OAAAmT,GAAA9S,IAAA,IACA,EACA0U,GAAA,SAAAvb,EAAAwG,GACA,IAAAgV,EAAA,kBAAAxJ,OAAAhS,EAAAyb,qBACA,OAAAxH,GAAAzN,EAAAwL,OAAAwJ,GACA,EAMAvB,GAAA,SAAA3c,EAAA0C,EAAA0b,GACA,IAAApe,EACA,OAAA2W,KAEA,GAAAyE,GAAApb,EAAAzI,MAAA,CAGA,IAAA8mB,EAAAjD,GAAApb,EAAAzI,MAAAyI,EAAA0C,GAGA,GAAA0b,GAAA1b,EAAAiB,OAAAya,EAAAza,KAAA,CACA0a,EAAA1H,GAAAjU,EAAA4b,cAAAF,GAAA,CAAAC,GAAA3b,GACA,IAAA6b,EAAA7b,EAAA+I,eAAA2S,EAAA3S,eACA4S,EAAAzqB,QAAA2qB,EACAF,EAAAlV,OAAAoV,CACA,CACA,OAAAF,CACA,CACA,UAAA5f,EAAA,+BAAAuB,EAAAzI,KAAA,IAEA,EAOA,SAAAinB,GAAAvV,EAAAvG,GAEA,IAAAjM,EAAAkgB,GAAA,SAAA1N,EAAAvG,GAIA+b,EAAA9H,GAAA,WAMA,OALA8H,EAAApV,MAAAzV,OAAAqY,EAAAxV,EAAA7C,OAAA6C,EAAA0S,OACA1S,EAAA0S,QACAsV,EAAApV,MAAAqV,cAAAzS,GAAAxV,EAAA0S,QAEA1S,EAAAwS,SAAA2U,QAAAa,GACAhoB,CACA,CAKA,SAAAkoB,GAAAC,EAAAlc,GAEA,IAAAmc,EAAA,KACA,IAAAD,EAAAxsB,QAAA,QAAAwsB,EAAA,GAAArnB,OACAsnB,EAAAD,EAAA,GAAAC,IACAD,EAAAA,EAAA,GAAAnoB,MAGA,IACAqoB,EADAvC,EAAAD,GAAAsC,EAAAlc,EAAA,QAEA,IAAA6Z,EAAAnqB,QAAAmqB,EAAA,GAAAjT,SAAA,SAEAwV,EAAAvC,EAAAuB,OAUA,IARA,IAyCAiB,EAzCA9V,EAAA,GAOA2M,EAAA,GACA7c,EAAA,EAAkBA,EAAAwjB,EAAAnqB,OAAuB2G,IAEzC,GADA6c,EAAA/e,KAAA0lB,EAAAxjB,IACAwjB,EAAAxjB,GAAAuQ,SAAA,SAAAiT,EAAAxjB,GAAAuQ,SAAA,SAAAiT,EAAAxjB,GAAAuQ,SAAA,eAIA,IADA,IAAA0V,GAAA,EACAjmB,EAAAwjB,EAAAnqB,OAAA,GAAAmqB,EAAAxjB,EAAA,GAAAuQ,SAAA,YAAAiT,EAAAxjB,EAAA,GAAAuQ,SAAA,YACAvQ,IACA6c,EAAA/e,KAAA0lB,EAAAxjB,IACAwjB,EAAAxjB,GAAAuQ,SAAA,aACA0V,GAAA,GAIAA,IACA/V,EAAApS,KAAA2nB,GAAA5I,EAAAlT,IACAkT,EAAA,GAEA,MAAM2G,EAAAxjB,GAAAuQ,SAAA,aAENsM,EAAAkI,MACAlI,EAAAxjB,OAAA,IACA6W,EAAApS,KAAA2nB,GAAA5I,EAAAlT,IACAkT,EAAA,IAGA3M,EAAApS,KAAA0lB,EAAAxjB,KAGA6c,EAAAxjB,OAAA,GACA6W,EAAApS,KAAA2nB,GAAA5I,EAAAlT,IAIAmc,IACAE,EAAAP,GAAAlC,GAAAuC,EAAAnc,GAAA,GAAAA,IACAwG,QAAA,QACAD,EAAApS,KAAAkoB,IACID,GACJ7V,EAAApS,KAAAioB,GAEA,IAAAG,EAAAtI,GAAA,eAAA1N,GAIA,GAHAgW,EAAArS,aAAA,sBAGAmS,EAAA,CACA,IAAAN,EAAAM,EAAA9V,SAAA,GACAwV,EAAApV,MAAAzV,OAAAqY,EAAAgT,EAAArrB,OAAAqrB,EAAA9V,OACA8V,EAAA9V,QACAsV,EAAApV,MAAAqV,cAAAzS,GAAAgT,EAAA9V,OAEA,CACA,OAAA8V,CACA,CAWA,SAAAC,GAAAjW,GACA,WAAAD,EAAAC,EACA,CAMA,MAAAkW,GACA,WAAAnqB,CAAAuC,EAAA0R,EAAAC,GACAhU,KAAAqC,UAAA,EACArC,KAAAqX,gBAAA,EACArX,KAAA+T,cAAA,EACA/T,KAAAgU,aAAA,EACAhU,KAAAqC,KAAAA,EACArC,KAAAqX,WAAA,GACArX,KAAA+T,SAAAA,GAAA,GACA/T,KAAAgU,QAAAA,GAAA,EACA,CAKA,YAAA0D,CAAAzV,EAAA4G,GACA7I,KAAAqX,WAAApV,GAAA4G,CACA,CAIA,YAAAqhB,CAAAjoB,GACA,OAAAjC,KAAAqX,WAAApV,EACA,CAIA,MAAAsS,GACA,IAAAiD,EAAA/C,SAAAyE,gBAAA,qCAAAlZ,KAAAqC,MACA,QAAAoV,KAAAzX,KAAAqX,WACAza,OAAAuN,UAAA9M,eAAAC,KAAA0C,KAAAqX,WAAAI,IACAD,EAAAE,aAAAD,EAAAzX,KAAAqX,WAAAI,IAGAzX,KAAAgU,QAAA9W,OAAA,IACAsa,EAAAnD,UAAA2C,EAAAhX,KAAAgU,UAEA,QAAAnQ,EAAA,EAAoBA,EAAA7D,KAAA+T,SAAA7W,OAA0B2G,IAG9C,GAAA7D,KAAA+T,SAAAlQ,aAAAsmB,IAAAnqB,KAAA+T,SAAAlQ,EAAA,aAAAsmB,GAAA,CAEA,IADA,IAAAhpB,EAAAnB,KAAA+T,SAAAlQ,GAAAiR,SAAA9U,KAAA+T,WAAAlQ,GAAAiR,SACA9U,KAAA+T,SAAAlQ,EAAA,aAAAsmB,IACAhpB,GAAAnB,KAAA+T,WAAAlQ,GAAAiR,SAEA0C,EAAA7C,YAAA,IAAAwV,GAAAhpB,GAAAoT,SACA,MACAiD,EAAA7C,YAAA3U,KAAA+T,SAAAlQ,GAAA0Q,UAGA,OAAAiD,CACA,CAIA,QAAA5C,GACA,IAAAC,EAAA,IAAA7U,KAAAqC,KAEA,QAAAoV,KAAAzX,KAAAqX,WACAza,OAAAuN,UAAA9M,eAAAC,KAAA0C,KAAAqX,WAAAI,KACA5C,GAAA,IAAA4C,EAAA,KACA5C,GAAkBnK,EAAM1K,KAAAqX,WAAAI,IACxB5C,GAAA,KAGA7U,KAAAgU,QAAA9W,OAAA,IACA2X,GAAA,YAA+BnK,EAAMsM,EAAAhX,KAAAgU,UAAA,KAErCa,GAAA,IACA,QAAAhR,EAAA,EAAoBA,EAAA7D,KAAA+T,SAAA7W,OAA0B2G,IAC9CgR,GAAA7U,KAAA+T,SAAAlQ,GAAA+Q,WAGA,OADAC,GAAA,KAAA7U,KAAAqC,KAAA,GAEA,CAIA,MAAAyS,GACA,OAAA9U,KAAA+T,SAAApQ,IAAAoR,GAAAA,EAAAD,UAAAhR,KAAA,GACA,EAKA,MAAAqmB,GACA,WAAArqB,CAAAqB,GACAnB,KAAAmB,UAAA,EACAnB,KAAAmB,KAAAA,CACA,CAIA,MAAAoT,GACA,OAAAE,SAAAmE,eAAA5Y,KAAAmB,KACA,CAKA,QAAAyT,GACA,OAAWlK,EAAM1K,KAAA8U,SACjB,CAKA,MAAAA,GACA,OAAA9U,KAAAmB,IACA,EAMA,MAAAipB,GAIA,WAAAtqB,CAAArB,GACAuB,KAAAvB,WAAA,EACAuB,KAAA0b,eAAA,EACA1b,KAAAvB,MAAAA,EAMAuB,KAAA0b,UADAjd,GAAA,QAAAA,GAAA,OACA,IACMA,GAAA,OAAAA,GAAA,MACN,IACMA,GAAA,OAAAA,GAAA,MACN,IACMA,GAAA,OAAAA,GAAA,MACN,KACMA,IAAA,QAAAA,IAAA,OACN,KACMA,IAAA,OAAAA,IAAA,MACN,KACMA,IAAA,OAAAA,IAAA,MACN,KACMA,IAAA,OAAAA,IAAA,MACN,KAEA,IAEA,CAIA,MAAA8V,GACA,GAAAvU,KAAA0b,UACA,OAAAjH,SAAAmE,eAAA5Y,KAAA0b,WAEA,IAAAlE,EAAA/C,SAAAyE,gBAAA,+CAEA,OADA1B,EAAAE,aAAA,QAAAX,EAAA/W,KAAAvB,QACA+Y,CAEA,CAIA,QAAA5C,GACA,OAAA5U,KAAA0b,UACA,UAAA1b,KAAA0b,UAAA,WAEA,kBAAA3E,EAAA/W,KAAAvB,OAAA,KAEA,CAIA,MAAAqW,GACA,OAAA9U,KAAA0b,UACA1b,KAAA0b,UAEA,GAEA,EAQA,IAAA2O,GAAA,IAAArf,IAAA,uBACAsf,GAAA,IAAAtf,IAAA,mBAKAuf,GAAA,SAAAppB,EAAAya,EAAApO,GAIA,OAHAwO,GAAAJ,GAAAza,KAAA6a,GAAAJ,GAAAza,GAAA0G,SAAA,QAAA1G,EAAAwX,WAAA,IAAAuE,GAAA7f,eAAA8D,IAAAqM,IAAAA,EAAAkS,YAAA,OAAAlS,EAAAkS,WAAAhc,MAAA,MAAA8J,EAAAmO,MAAA,OAAAnO,EAAAmO,KAAAjY,MAAA,QACAvC,EAAA6a,GAAAJ,GAAAza,GAAA0G,SAEA,IAAAsiB,GAAAhpB,EACA,EAKAqpB,GAAA,SAAAjpB,GACA,WAAAA,EAAArE,OACAqE,EAAA,GAEA,IAAA0oB,GAAA,OAAA1oB,EAEA,EACAkpB,GAAA,CACAlG,OAAA,SACAmG,WAAA5f,GAAA,YAAAA,EAAAzI,KAAA,qBACA8hB,OAAA,OACAO,OAAA,gBACAD,SAAA,oBACAG,SAAA,UACAC,QAAA,SACAF,QAAA,SACAG,OAAA,aACAC,OAAA,aAKA4F,GAAA,CAAA7f,EAAA0C,KAIA,YAAA1C,EAAA8Q,KAAA,CACA,cAAApO,EAAAkS,WACA,kBACM,cAAAlS,EAAAkS,WACN,iBAAAlS,EAAAoS,WAAA,WAAApS,EAAAmS,WACA,yBACQ,WAAAnS,EAAAoS,UACR,oBACQ,WAAApS,EAAAmS,WACR,kBAEA,aAEM,cAAAnS,EAAAoS,WAAA,WAAApS,EAAAmS,WACN,oBACM,cAAAnS,EAAAoS,UACN,eACM,cAAApS,EAAAmS,WACN,YAEA,CACA,IAAAhE,EAAAnO,EAAAmO,KACA,IAAAA,GAAA,eAAAA,EACA,YAEA,IAAAC,EAAA9Q,EAAA8Q,KACAgP,EAAAH,GAAA9O,GACA,GAAAiP,EACA,yBAAAA,EAAAA,EAAA9f,GAAA8f,EAEA,IAAAzpB,EAAA2J,EAAA3J,KACA,GAAAkpB,GAAAnf,IAAA/J,GACA,YAEA,GAAA6a,GAAAJ,GAAAza,GAAA,CACA,IAAAge,EAAAnD,GAAAJ,GAAAza,GAAA0G,QACAsX,IACAhe,EAAAge,EAEA,CAEA,OAAA1D,GAAAta,EADAqf,GAAA7E,GAAAuD,SACAtD,GACA4E,GAAA7E,GAAAyI,QAEA,MAOA,SAAAyG,GAAA/f,GACA,IAAAA,EACA,SAEA,UAAAA,EAAAzI,MAAA,IAAAyI,EAAAiJ,SAAA7W,OAAA,CACA,IAAA6X,EAAAjK,EAAAiJ,SAAA,GACA,OAAAgB,aAAAoV,IAAA,MAAApV,EAAA5T,IACA,CAAI,UAAA2J,EAAAzI,MAAA,IAAAyI,EAAAiJ,SAAA7W,QAAA,SAAA4N,EAAAof,aAAA,sBAAApf,EAAAof,aAAA,mBAAApf,EAAAof,aAAA,WACJ,IAAAhH,EAAApY,EAAAiJ,SAAA,GACA,OAAAmP,aAAAiH,IAAA,MAAAjH,EAAA/hB,IACA,CACA,QAEA,CAMA,IAAA2pB,GAAA,SAAAzD,EAAA7Z,EAAAud,GACA,OAAA1D,EAAAnqB,OAAA,CACA,IAAA4N,EAAAkgB,GAAA3D,EAAA,GAAA7Z,GAOA,OANAud,GAAAjgB,aAAAmf,IAAA,OAAAnf,EAAAzI,OAGAyI,EAAA4M,aAAA,gBACA5M,EAAA4M,aAAA,iBAEA,CAAA5M,EACA,CAGA,IAFA,IACAmgB,EADAzD,EAAA,GAEA3jB,EAAA,EAAkBA,EAAAwjB,EAAAnqB,OAAuB2G,IAAA,CACzC,IAAAqnB,EAAAF,GAAA3D,EAAAxjB,GAAA2J,GACA,GAAA0d,aAAAjB,IAAAgB,aAAAhB,GAAA,CAEA,aAAAiB,EAAA7oB,MAAA,UAAA4oB,EAAA5oB,MAAA6oB,EAAAhB,aAAA,iBAAAe,EAAAf,aAAA,gBACAe,EAAAlX,SAAApS,QAAAupB,EAAAnX,UACA,QAEA,CAAQ,UAAAmX,EAAA7oB,MAAA,OAAA4oB,EAAA5oB,KAAA,CACR4oB,EAAAlX,SAAApS,QAAAupB,EAAAnX,UACA,QAEA,CAAQ,GAAA8W,GAAAK,IAAA,OAAAD,EAAA5oB,KAAA,CACR4oB,EAAAlX,SAAApS,QAAAupB,EAAAnX,UACA,QAEA,CAAQ,UAAAmX,EAAA7oB,MAAAwoB,GAAAI,GACRC,EAAAnX,SAAA,IAAAkX,EAAAlX,YAAAmX,EAAAnX,UACAyT,EAAAoB,WAGQ,aAAAsC,EAAA7oB,MAAA,SAAA6oB,EAAA7oB,OAAA6oB,EAAAnX,SAAA7W,QAAA,WAAA+tB,EAAA5oB,MAAAwoB,GAAAI,IAAA,CACR,IAAAE,EAAAD,EAAAnX,SAAA,GACAoX,aAAAlB,IAAA,OAAAkB,EAAA9oB,OACA8oB,EAAApX,SAAA,IAAAkX,EAAAlX,YAAAoX,EAAApX,UACAyT,EAAAoB,MAGA,MAAQ,UAAAqC,EAAA5oB,MAAA,IAAA4oB,EAAAlX,SAAA7W,OAAA,CACR,IAAAkuB,EAAAH,EAAAlX,SAAA,GACA,GAAAqX,aAAAjB,IAAA,MAAAiB,EAAAjqB,OAAA,OAAA+pB,EAAA7oB,MAAA,OAAA6oB,EAAA7oB,MAAA,OAAA6oB,EAAA7oB,MAAA,CACA,IAAA0S,EAAAmW,EAAAnX,SAAA,GACAgB,aAAAoV,IAAApV,EAAA5T,KAAAjE,OAAA,IAEA6X,EAAA5T,KAAA4T,EAAA5T,KAAAuC,MAAA,SAAAqR,EAAA5T,KAAAuC,MAAA,GACA8jB,EAAAoB,MAEA,CACA,CACA,CACApB,EAAA7lB,KAAAupB,GACAD,EAAAC,CACA,CACA,OAAA1D,CACA,EAKA6D,GAAA,SAAAhE,EAAA7Z,EAAAud,GACA,OAAAP,GAAAM,GAAAzD,EAAA7Z,EAAAud,GACA,EAKAC,GAAA,SAAAlgB,EAAA0C,GACA,IAAA1C,EACA,WAAAmf,GAAA,QAEA,GAAA9D,GAAArb,EAAAzI,MAIA,OAAA8jB,GAAArb,EAAAzI,MAAAyI,EAAA0C,GAEA,UAAAjE,EAAA,+BAAAuB,EAAAzI,KAAA,IAEA,EASA,SAAAipB,GAAA5B,EAAA6B,EAAA/d,EAAAge,EAAAC,GACA,IAOAC,EAPArE,EAAAyD,GAAApB,EAAAlc,GASAke,EADA,IAAArE,EAAAnqB,QAAAmqB,EAAA,aAAA4C,IAAAK,GAAApf,IAAAmc,EAAA,GAAAhlB,MACAglB,EAAA,GAEA,IAAA4C,GAAA,OAAA5C,GAGA,IAAAsE,EAAA,IAAA1B,GAAA,kBAAAE,GAAAoB,KACAI,EAAAjU,aAAA,gCACA,IAAAkU,EAAA,IAAA3B,GAAA,aAAAyB,EAAAC,IACA1P,EAAA,IAAAgO,GAAA,QAAA2B,IAcA,OAbA3P,EAAAvE,aAAA,8CACA8T,GACAvP,EAAAvE,aAAA,mBAWA+J,GAAA,CADAgK,EAAA,wBACA,CAAAxP,GACA,CAQA,IAAA4P,GAAA,CAGA,QAEA,QAEA,QAEA,QAEA,QAEA,QAEA,QAEA,QAEA,QAEA,SAEA,WAEAC,GAAA,CAGA,6CACAC,GAAA,SAAAtd,EAAA0F,GACA,OAAAA,EAAA1F,KAAA,EAAAA,EAAAod,GAAApd,EAAA,GAAA0F,EAAA1F,KAAA,EACA,EAQA,MAAAud,GACA,WAAAlsB,CAAAumB,GACArmB,KAAAmU,WAAA,EACAnU,KAAAgM,WAAA,EACAhM,KAAAyO,UAAA,EACAzO,KAAAisB,cAAA,EACAjsB,KAAAksB,aAAA,EAIAlsB,KAAA2b,UAAA,EACA3b,KAAA0f,gBAAA,EACA1f,KAAA2f,gBAAA,EACA3f,KAAA4f,eAAA,EACA5f,KAAAuW,oBAAA,EACAvW,KAAA4M,aAAA,EACA5M,KAAAqM,sBAAA,EACArM,KAAAmsB,kBAAA,EACAnsB,KAAAmU,MAAAkS,EAAAlS,MACAnU,KAAAgM,MAAAqa,EAAAra,MACAhM,KAAAyO,KAAA4X,EAAA5X,MAAAud,GAAAI,SACApsB,KAAAisB,SAAA5F,EAAA4F,UAAAjsB,KAAAyO,KACAzO,KAAAksB,UAAA7F,EAAA6F,QACAlsB,KAAA2b,KAAA0K,EAAA1K,MAAA,GACA3b,KAAA0f,WAAA2G,EAAA3G,YAAA,GACA1f,KAAA2f,WAAA0G,EAAA1G,YAAA,GACA3f,KAAA4f,UAAAyG,EAAAzG,WAAA,GACA5f,KAAAuW,eAAAuV,GAAA9rB,KAAAyO,KAAA,GACAzO,KAAA4M,QAAAyZ,EAAAzZ,QACA5M,KAAAqM,iBAAAga,EAAAha,iBACArM,KAAAmsB,kBAAAzqB,CACA,CAKA,MAAA2qB,CAAAC,GACA,IAAAjG,EAAA,CACAlS,MAAAnU,KAAAmU,MACA1F,KAAAzO,KAAAyO,KACAwd,SAAAjsB,KAAAisB,SACAjgB,MAAAhM,KAAAgM,MACAkgB,QAAAlsB,KAAAksB,QACAvQ,KAAA3b,KAAA2b,KACA+D,WAAA1f,KAAA0f,WACAC,WAAA3f,KAAA2f,WACAC,UAAA5f,KAAA4f,UACAhT,QAAA5M,KAAA4M,QACAP,iBAAArM,KAAAqM,kBAGA,OADAzP,OAAAC,OAAAwpB,EAAAiG,GACA,IAAAN,GAAA3F,EACA,CAKA,WAAA3P,CAAAvC,GACA,OAAAnU,KAAAmU,QAAAA,EACAnU,KAEAA,KAAAqsB,OAAA,CACAlY,MAAAA,EACA1F,KAAAsd,GAAA/rB,KAAAisB,SAAA9X,IAGA,CAKA,kBAAAoY,GACA,OAAAvsB,KAAA0W,YAAA1W,KAAAmU,MAAAnF,QACA,CAKA,UAAA2Y,CAAAlZ,GACA,OAAAzO,KAAAyO,OAAAA,GAAAzO,KAAAisB,WAAAxd,EACAzO,KAEAA,KAAAqsB,OAAA,CACAlY,MAAAnU,KAAAmU,MAAAhT,OACAsN,KAAAA,EACAwd,SAAAxd,EACA8H,eAAAuV,GAAArd,EAAA,IAGA,CAKA,eAAA+d,CAAArY,GACAA,EAAAA,GAAAnU,KAAAmU,MAAAhT,OACA,IAAAsrB,EAAAV,GAAAC,GAAAI,SAAAjY,GACA,OAAAnU,KAAAyO,OAAAge,GAAAzsB,KAAAisB,WAAAD,GAAAI,UAAApsB,KAAAmU,QAAAA,EACAnU,KAEAA,KAAAqsB,OAAA,CACAlY,MAAAA,EACA1F,KAAAge,GAGA,CAKA,gBAAAC,GACA,IAAAje,EACA,OAAAzO,KAAAmU,MAAA3V,IACA,OACA,OACAiQ,EAAA,EACA,MACA,OACA,OACAA,EAAA,EACA,MACA,QACAA,EAAA,EAGA,OAAAzO,KAAAqsB,OAAA,CACAlY,MAAAnU,KAAAmU,MAAAhT,OACAsN,KAAAA,GAEA,CAIA,SAAAke,CAAA3gB,GACA,OAAAhM,KAAAqsB,OAAA,CACArgB,MAAAA,GAEA,CAIA,WAAA4gB,GACA,OAAA5sB,KAAAqsB,OAAA,CACAH,SAAA,GAEA,CAKA,QAAAW,CAAAlR,GACA,OAAA3b,KAAAqsB,OAAA,CACA1Q,QAEA,CAIA,kBAAAmR,CAAApN,GACA,OAAA1f,KAAAqsB,OAAA,CACA3M,aACA/D,KAAA,IAEA,CAIA,kBAAAoR,CAAApN,GACA,OAAA3f,KAAAqsB,OAAA,CACA1M,aACAhE,KAAA,IAEA,CAIA,iBAAAqR,CAAApN,GACA,OAAA5f,KAAAqsB,OAAA,CACAzM,YACAjE,KAAA,IAEA,CAKA,aAAAyN,CAAA6D,GACA,OAAAA,EAAAxe,OAAAzO,KAAAyO,KACA,uBAAAwe,EAAAxe,KAAA,OAAAzO,KAAAyO,MAEA,EAEA,CAKA,iBAAAwa,GACA,OAAAjpB,KAAAyO,OAAAud,GAAAI,SACA,uBAAApsB,KAAAyO,KAAA,OAAAud,GAAAI,UAEA,EAEA,CAIA,WAAA/V,GAIA,OAHArW,KAAAmsB,eACAnsB,KAAAmsB,aApqFA,SAAA1d,GACA,IAAAye,EAQA,IAAAnR,GANAmR,EADAze,GAAA,EACA,EACIA,GAAA,EACJ,EAEA,GAEA,CACA,IAAAqN,EAAAC,GAAAmR,GAAA,CACA1W,WAAAgD,GAAA5C,KAAAsW,GAAA,IAEA,QAAA/V,KAAAqC,GACAA,GAAAnc,eAAA8Z,KACA2E,EAAA3E,GAAAqC,GAAArC,GAAA+V,GAGA,CACA,OAAAnR,GAAAmR,EACA,CAgpFAC,CAAAntB,KAAAyO,OAEAzO,KAAAmsB,YACA,CAIA,QAAA7U,GACA,OAAAtX,KAAAksB,QACA,cAEAlsB,KAAAgM,KAEA,EAKAggB,GAAAI,SAAA,EAEA,IAAAgB,GAAA,SAAAC,GACA,WAAArB,GAAA,CACA7X,MAAAkZ,EAAAjiB,YAAA+D,EAAAC,QAAAD,EAAAE,KACAzC,QAAAygB,EAAAzgB,QACAP,iBAAAghB,EAAAhhB,kBAEA,EACAihB,GAAA,SAAA9V,EAAA6V,GACA,GAAAA,EAAAjiB,YAAA,CACA,IAAA4I,EAAA,kBACAqZ,EAAA5hB,OACAuI,EAAArS,KAAA,SAEA0rB,EAAA3hB,OACAsI,EAAArS,KAAA,SAEA6V,EAAAiK,GAAAzN,EAAA,CAAAwD,GACA,CACA,OAAAA,CACA,EA4BA+V,GAAA,CACAC,QAAA,IACAC,UAAA,IACAC,UAAA,IACAC,OAAA,IACAC,cAAA,IACAC,eAAA,IACAC,WAAA,IACAC,eAAA,IACAC,gBAAA,IACAC,YAAA,IACAC,WAAA,IACAC,UAAA,IACAC,aAAA,IACAC,YAAA,IACAC,UAAA,IACAC,WAAA,IACAC,mBAAA,IACAC,oBAAA,IACAC,gBAAA,IACAC,eAAA,IACAC,YAAA,IACAC,gBAAA,IACAC,eAAA,IACAC,iBAAA,IACAC,gBAAA,IACAC,WAAA,IACAC,gBAAA,IACAC,eAAA,IACAC,gBAAA,IACAC,QAAA,IACAC,kBAAA,IACAC,iBAAA,IACAC,mBAAA,IACAC,mBAAA,IACAC,kBAAA,IACAC,mBAAA,IACAC,WAAA,IACAC,QAAA,IACAC,iBAAA,IACAC,kBAAA,IAEAC,iBAAA,IAEA,qBACA,oBACA,qBAEAC,GAAA,SAAAC,GACA,IAAA1Y,EAAA,IAAAyS,GAAA,UAAAE,GAAAoD,GAAA2C,EAAAroB,QAAA,cAEA,OADA2P,EAAAE,aAAA,mBACAF,CACA,EACA2Y,GAAA,CAEApC,eAAA,qCACAH,cAAA,oCACAI,gBAAA,qCACAH,eAAA,oCACAI,YAAA,sCACA,mDAEAH,WAAA,qCACA,iDACAa,eAAA,2CACAC,YAAA,4CACAK,WAAA,2CACAJ,gBAAA,sCACAC,eAAA,sCACAS,iBAAA,0CACAR,iBAAA,uCACAC,gBAAA,uCACAM,kBAAA,2CACAM,WAAA,oCACA,iDACAF,kBAAA,2CACAC,mBAAA,4CACAnB,mBAAA,sCACAL,UAAA,gDACAD,WAAA,+DACAO,oBAAA,sCACAC,gBAAA,sCACAQ,gBAAA,kDACAM,mBAAA,sDACAC,mBAAA,sDACAN,eAAA,qCACAC,gBAAA,qCACAgB,gBAAA,kDACAC,iBAAA,kDACAhC,YAAA,iDACAD,aAAA,mDACAE,UAAA,sCACAC,WAAA,gDACAc,QAAA,sCACAQ,QAAA,wCAKAC,iBAAA,sDACAC,kBAAA,oEACAC,iBAAA,qEAEAM,GAAA,IAAAtlB,IAAA,8CACAulB,GAAA,SAAAzlB,EAAA0C,GAuGA,IAAAqL,KACAA,EAAA2X,SACAA,EAAA9xB,OACAA,GAxGA,WACA,IAAA+xB,EAAA,IACAP,EAAAplB,EAAAolB,MAAAxsB,MAAA,GACA,GAAA4sB,GAAAplB,IAAAglB,IAAA,SAAAplB,EAAA,CAGA,IACA4lB,EACAtX,EACAuX,EAHAC,EAAA,aAAA9lB,EAAAqgB,KAAA9oB,KAAAyI,EAAAqgB,KAAA5pB,KAAArE,OAAA,EAIA,GAAA0zB,EAAA,EACA,YAAAV,GAAA,cAAAA,GACAQ,EAAA,IACAD,EAAA,KACAE,EAAA,IACAvX,EAAA8W,EAAA,MAEAQ,EAAA,IACAD,EAAA,KACAE,EAAA,IACAvX,EAAA,cAEQ,CACR,IAAAyX,EAAA,cAAAD,GACA,YAAAV,GAAA,cAAAA,GACAO,EAAA,wBAAAI,GACAH,EAAA,oBAAAG,GACAF,EAAA,sBAAAE,GACAzX,EAAA8W,EAAAW,IAEAJ,EAAA,uBAAAI,GACAH,EAAA,oBAAAG,GACAF,EAAA,yBAAAE,GACAzX,EAAA,QAAAyX,EAEA,CACA,IAAA3gB,EAAA,IAAAiJ,GAAAC,GACA8L,EAAA,IAAAjM,GAAA,CAAA/I,GAAA,CACAzR,MAAA,OACAC,OAAAqY,EAAA4Z,GACA7yB,QAAA,OAAA2yB,EAAA,IAAAC,EACAvL,oBAAA,SAEA,OACAtM,KAAA6I,GAAA,IAAAwD,GAAA1X,GACAgjB,SAAA,EACA9xB,OAAAiyB,EAEA,CACA,IAAAG,EAAA,GACAzK,EAAA8J,GAAAD,GACA,IAAA7J,EACA,UAAAjmB,MAAA,oBAAA8vB,EAAA,MAEA,IAGAa,EACAC,GAJAC,EAAAC,EAAAC,GAAA9K,EACA+K,EAAAD,EAAA,IACAE,EAAAJ,EAAA/zB,OAGA,OAAAm0B,EAAA,CACA,OAAAhL,EAAAnpB,OACA,UAAAkD,MAAA,8CAAA8vB,EAAA,MAEAa,EAAA,cACAC,EAAA,CAAA3K,EAAA,GACA,MAAQ,OAAAgL,EACRN,EAAA,qCACAC,EAAA,4BACQ,QAAAK,EAIR,UAAAjxB,MAAA,+EAAAixB,EAAA,cAHAN,EAAA,4CACAC,EAAA,kCAGA,CACA,QAAAntB,EAAA,EAAsBA,EAAAwtB,EAAoBxtB,IAAA,CAC1C,IAAAtH,EAAA,IAAA4c,GAAA8X,EAAAptB,IACAytB,EAAA,IAAArY,GAAA,CAAA1c,GAAA,CACAkC,MAAA,QACAC,OAAAqY,EAAAqa,GACAtzB,QAAA,OAAA2yB,EAAA,IAAAU,EACAhM,oBAAA6L,EAAAntB,GAAA,WAEA0tB,EAAA7P,GAAA,CAAAqP,EAAAltB,IAAA,CAAAytB,GAAA9jB,GACA,OAAA6jB,EACA,OACAxY,KAAA0Y,EACAf,SAAAU,EACAxyB,OAAA0yB,GAGAG,EAAApd,MAAAzV,OAAAqY,EAAAqa,GACAN,EAAAnvB,KAAA4vB,EAEA,CACA,OACA1Y,KAAA4I,GAAA,aAAAqP,EAAAtjB,GACAgjB,SAAAU,EACAxyB,OAAA0yB,EAGA,CAKII,GAQJ,OALA3Y,EAAAna,OAAAA,EACAma,EAAA1E,MAAAzV,OAAAqY,EAAArY,GACA8xB,EAAA,IACA3X,EAAA1E,MAAAqc,SAAAzZ,EAAAyZ,IAEA3X,CACA,EAwDA4Y,GAAA,CACAjV,IAAA,EACAkV,MAAA,EACAhV,MAAA,EACAiV,KAAA,EACA7U,MAAA,EACAC,IAAA,GAEA6U,GAAA,CACA,iBACAjV,QAAA,EACA,aACAK,QAAA,EACAC,QAAA,GAUA,SAAA4U,GAAAra,EAAAnV,GACA,IAAAmV,GAAAA,EAAAnV,OAAAA,EACA,UAAAjC,MAAA,yBAAAiC,EAAA,cAAAmV,EAAA,gBAAAA,EAAAnV,KAAAsI,OAAA6M,KAEA,OAAAA,CACA,CAKA,SAAAsa,GAAAta,GACA,IAAAua,EAAAC,GAAAxa,GACA,IAAAua,EACA,UAAA3xB,MAAA,gDAAAoX,EAAA,gBAAAA,EAAAnV,KAAAsI,OAAA6M,KAEA,OAAAua,CACA,CAKA,SAAAC,GAAAxa,GACA,OAAAA,IAAA,SAAAA,EAAAnV,MAAAuvB,GAAAv0B,eAAAma,EAAAnV,OACAmV,EAEA,IACA,CAEA,IAAAya,GAAAnnB,IACA,OAAAA,aAAAuN,EACAvN,IAl0KA0M,EAo0KA1M,aAp0KA8M,GAAAJ,aAAAO,GAAAP,aAAA1D,IAo0KA,IAAAhJ,EAAAiJ,SAAA7W,OACA+0B,GAAAnnB,EAAAiJ,SAAA,SADA,EAp0KAyD,OA00KA0a,GAAA,CAAAC,EAAA3kB,KAEA,IAAA2d,EACArgB,EACAsnB,EACAD,GAAA,WAAAA,EAAA9vB,MAWA8oB,GAFArgB,EAAA+mB,GAAAM,EAAAhH,KAAA,WAEAA,KAEAgH,EAAAhH,KAAAA,EAGAiH,EA52KA,SAAAtnB,GACA,GAAAA,aAAA8M,EACA,OAAA9M,EAEA,UAAA1K,MAAA,sCAAAuK,OAAAG,GAAA,IAEA,CAs2KAunB,CAAA5K,GAAA0K,EAAA3kB,IAEA2kB,EAAAhH,KAAArgB,GAGAqgB,GADArgB,EAAA+mB,GAAAM,EAAA,WACAhH,KAGA,IAUAmH,EAAAC,EAVAhxB,EAAAkmB,GAAA0D,EAAA3d,EAAA+e,sBAQAjU,EAAA,EANAxN,EAAA0nB,UAAAvnB,EAAAkgB,KAWA7S,EAAA,OAAAga,EAAA,OAAAC,EAAAN,GAAA1wB,SAAA,EAAAgxB,EAAAja,MAAAga,EAAA,GAEA,IAIAG,EAJAC,EAAA,QAAA5nB,EAAAolB,MAEAyC,EAAAD,EAAAnxB,EAAA7C,OAAA6C,EAAA0S,MAAA/P,KAAA2S,IAAAtV,EAAA7C,OAAA8O,EAAA6I,cAAAM,SAGA,GAAA7L,EAAA8nB,WAgEAH,EAAAlC,GAAAzlB,EAAA0C,GACAilB,EAAAxQ,GAAA,CACAE,aAAA,gBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAAjgB,GACO,CACPc,KAAA,OACAmf,KAAAiR,EACArP,eAAA,cACAC,aAAA/K,EAAA,GACA7Z,MAAA,eAAAsY,EAAA,EAAAuB,GAAA,IACAkL,WAAAzM,EAAA,EAAAuB,SACU5W,UA7EV,CACA,IAAA6a,EACA9d,EACA,UAAAqM,EAAAolB,OAMA3T,EAAA0I,GAAA,MAAAzX,GACA/O,EAAAumB,GAAAjS,IAAA,KAOAwJ,EAh6KA,SAAAzR,GACA,GAAAA,aAAAuN,EACA,OAAAvN,EAEA,UAAA1K,MAAA,+BAAAuK,OAAAG,GAAA,IAEA,CA05KA+nB,CALAtW,EAAAkD,GAAA,CACApd,KAAA,UACAuZ,KAAA9Q,EAAA8Q,KACAza,KAAA2J,EAAAolB,OACO1iB,IAIP+O,EAAA1E,OAAA,EACApZ,EAAA8d,EAAA9d,MACAi0B,IACAC,GAAApW,EAAAtI,QAGAwe,EAAAhR,GAAA,iBAAAlF,IAIA,IAAAuW,EAAA,kBAAAhoB,EAAAolB,MACA4C,IACAL,EAAAze,QAAArS,KAAA,eACAgxB,EAAApxB,EAAA7C,QAGA,IAAAq0B,EAAAza,EAKAwa,IACAC,GAAAt0B,EAAA,GAEAg0B,EAAAte,MAAA4e,KAAAhc,EAAAgc,GAGA,kBAAAjoB,EAAAolB,QACAuC,EAAAte,MAAAoP,IAAA,QAEAkP,EAAAxQ,GAAA,CACAE,aAAA,gBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAAjgB,GACO,CACPc,KAAA,OACAoM,MAAAkkB,GACO,CACPtwB,KAAA,OACAmf,KAAAiR,KAGA,CAkBA,IAAAO,EAAAvR,GAAA,mBAAAgR,GAAAjlB,GACA,OAAA4kB,GAGAA,EAAAre,SAAA,GAAAif,EAGAZ,EAAA1zB,OAAAwF,KAAAqI,IAAAymB,EAAAt0B,OAAA0zB,EAAA1zB,QAEA0zB,EAAApe,QAAA,UACAoe,GAEAY,GASAC,GAAA,IAAAC,OAAA,0GAAAvvB,IAAA4Y,GAAA,KAAAA,GAAAzY,KAAA,MAEAsiB,GAAA,CACA/jB,KAAA,SACAikB,MAAA,4SACA6M,QAAA,EACAC,QAAA,CAAA/pB,EAAAgqB,KACA,IAAAlI,EAAAxE,GAAA0M,EAAA,IACAT,GAAAK,GAAA5kB,KAAAhF,EAAAiqB,UACAd,GAAAI,GAAA,cAAAvpB,EAAAiqB,UAAA,gBAAAjqB,EAAAiqB,UAAA,gBAAAjqB,EAAAiqB,SACA,OACAjxB,KAAA,SACAuZ,KAAAvS,EAAAkqB,OAAA3X,KACAsU,MAAA7mB,EAAAiqB,SACAV,WAAAA,EACAJ,SAAAA,EACArH,KAAAA,IAGA5E,YAAA2L,GACA1L,cA1BA,CAAA1b,EAAA0C,KACA,IAAAgmB,EAAA1oB,EAAA8nB,WAAA3C,GAAAnlB,EAAAolB,OAAA,IAAAjG,GAAA,MAAAM,GAAAzf,EAAAolB,MAAAplB,EAAA8Q,QACApE,EAAA,IAAAyS,GAAA,SAAAe,GAAAlgB,EAAAqgB,KAAA3d,GAAAgmB,IAEA,OADAhc,EAAAE,aAAA,iBACAF,KAyBA4O,GAAA,CACA/jB,KAAA,SACAikB,MAAA,0FACA6M,QAAA,EACAM,eAAA,EACAC,eAAA,EAEAC,SAAA,cACAP,QAAA,CAAA/pB,EAAAgqB,KACA,IAAAlI,EAAAkI,EAAA,GACAzX,EAAAvS,EAAAkqB,OAAA3X,KAKA,MAJA,SAAAA,IACAvS,EAAAkqB,OAAAlG,SAAA1f,gBAAA,sCAAAtE,EAAAiqB,SAAA,4BACA1X,EAAA,QAEA,CACAvZ,KAAA,SACAuZ,KAAAA,EACAsU,MAAA7mB,EAAAiqB,SACAV,YAAA,EACAJ,UAAA,EACArH,KAAAA,MAMA/E,GAAA,CACA/jB,KAAA,cACAikB,MAAA,gHACA6M,QAAA,EACAC,QAAA,CAAA1M,EAAA2M,KACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACNyE,EAAAkI,EAAA,GACA,OACAhxB,KAAA,cACAuZ,KAAA2X,EAAA3X,KACAsU,MAAAoD,EACAnI,KAAAA,IAGA5E,YAAA,CAAAzb,EAAA0C,KAEA,IAAAomB,EAAAnM,GAAA3c,EAAAqgB,KAAA3d,GACAilB,EAAAlC,GAAAzlB,EAAA0C,GACAqmB,EAAA,aAAA/oB,EAAAolB,MAAA,MAEAxM,EAAAzB,GAAA,CACAE,aAAA,MACAO,aAAAkR,EAAAl1B,OACAqV,SAAA,EACA1R,KAAA,OACAmf,KAAAiR,EACArP,eAAA,eACO,CACP/gB,KAAA,OACAoM,KAAAolB,GACO,CACPxxB,KAAA,OACAmf,KAAAoS,MAGA,OAAAnS,GAAA,wBAAAiC,GAAAlW,IAEAgZ,cAAA,CAAA1b,EAAA0C,KACA,IAAAgmB,EAAAvD,GAAAnlB,EAAAolB,OACA1Y,EAAA,IAAAyS,GAAA,UAAAe,GAAAlgB,EAAAqgB,KAAA3d,GAAAgmB,IAEA,OADAhc,EAAAE,aAAA,sBACAF,KAKA,IAAAsc,GAAAhpB,IACA,IAAA0M,EAAA,IAAAyS,GAAA,UAAAnf,EAAA,CAAAA,GAAA,IAGA,OAFA0M,EAAAE,aAAA,kBACAF,EAAAE,aAAA,kBACAF,GAGA4O,GAAA,CACA/jB,KAAA,SACAikB,MAAA,kWAGA,gEAEA,wDACA6M,QAAA,EACAY,gBAAA,EACA,OAAAX,CAAA1M,EAAA2M,EAAAW,GACA,IAAAT,OACAA,EAAAD,SACAA,GACM5M,EACN,OACArkB,KAAA,SACAuZ,KAAA2X,EAAA3X,KACAsU,MAAAoD,EACA/xB,KAAA8xB,EAAA,GACAY,MAAAD,EAAA,GAEA,EACA,WAAAzN,CAAAzb,EAAA0C,GACA,IASA0mB,EATA/f,EAAA3G,EAAA2G,MAKAggB,EAAA3mB,EAAAkJ,YAAAvC,EAAAxF,OACAylB,EAAApS,GAAAyF,GAAA3c,EAAAvJ,KAAA4yB,EAAA3mB,GAAAA,GACA6mB,EAAA,QAAAvpB,EAAAolB,MAAAxsB,MAAA,cACA0wB,EAAApgB,QAAArS,KAAA0yB,EAAA,cAEAvpB,EAAAmpB,QAEAE,EAAA3mB,EAAAkJ,YAAAvC,EAAAtF,QACAqlB,EAAAlS,GAAAyF,GAAA3c,EAAAmpB,MAAAE,EAAA3mB,GAAAA,IACAwG,QAAArS,KAAA0yB,EAAA,eAEA,IAUA3Q,EAVA4Q,EAAA/D,GAAAzlB,EAAA0C,GAGA+mB,GAAA/mB,EAAA6I,cAAAuE,WAAA,GAAA0Z,EAAA51B,OAEA81B,GAAAhnB,EAAA6I,cAAAuE,WAAA,GAAA0Z,EAAA51B,OAAA,KAMA,IALA01B,EAAAngB,MAAA,4BAAAnJ,EAAAolB,SACAsE,GAAAJ,EAAAngB,OAIAigB,EAAA,CACA,IAAAO,GAAAjnB,EAAA6I,cAAAuE,WAAAsZ,EAAAx1B,OAAA,GAAA41B,EAAA51B,OAAA,KACAglB,EAAAzB,GAAA,CACAE,aAAA,kBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAA4S,EACA9R,MAAAkS,GACS,CACTnyB,KAAA,OACAmf,KAAA8S,EACAhS,MAAAiS,EACAnR,eAAA,eACS,CACT/gB,KAAA,OACAmf,KAAA0S,EACA5R,MAAAmS,KAGA,MACA/Q,EAAAzB,GAAA,CACAE,aAAA,kBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAA4S,EACA9R,MAAAkS,GACS,CACTnyB,KAAA,OACAmf,KAAA8S,EACAhS,MAAAiS,EACAnR,eAAA,kBAIA,OAAA3B,GAAA,oBAAAiC,GAAAlW,EACA,EACA,aAAAgZ,CAAA1b,EAAA0C,GACA,IAEAgK,EAFAkd,EAAAzE,GAAAnlB,EAAAolB,OAGA,GAFAwE,EAAAhd,aAAA,gBAAA5M,EAAAolB,MAAAjsB,OAAA,qBAEA6G,EAAAvJ,KAAA,CACA,IAAAozB,EAAAb,GAAA9I,GAAAlgB,EAAAvJ,KAAAiM,IACA,GAAA1C,EAAAmpB,MAAA,CACA,IAAAW,EAAAd,GAAA9I,GAAAlgB,EAAAmpB,MAAAzmB,IACAgK,EAAA,IAAAyS,GAAA,cAAAyK,EAAAE,EAAAD,GACA,MACAnd,EAAA,IAAAyS,GAAA,SAAAyK,EAAAC,GAEA,MAAM,GAAA7pB,EAAAmpB,MAAA,CACN,IAAAY,EAAAf,GAAA9I,GAAAlgB,EAAAmpB,MAAAzmB,IACAgK,EAAA,IAAAyS,GAAA,UAAAyK,EAAAG,GACA,MAGArd,EAAAsc,KACAtc,EAAA,IAAAyS,GAAA,SAAAyK,EAAAld,IAEA,OAAAA,CACA,IA4CA4O,GAAA,CACA/jB,KAAA,SACAikB,MAAA,6FACA6M,QAAA,EACA2B,WAAA,EACA,OAAA1B,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACNnlB,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,SACAuZ,KAAA2X,EAAA3X,KACAmZ,OAAA,IAAAzB,EAAA5vB,MAAA,GACAnC,KAAAslB,GAAAtlB,GACA0J,eAAAA,EAAA1J,GAEA,EACAglB,YA5DA,SAAAzb,EAAA0C,GACA,IAAAwnB,EAAA5N,GAAAtc,EAAAvJ,KAAAiM,GAAA,GACA,OAAAiU,GAAA,CAAA3W,EAAAiqB,QAAAC,EAAAxnB,EACA,EA0DAgZ,cAzDA,SAAA1b,EAAA0C,GACA,IAAAgK,EACAkF,EAAAoO,GAAAhgB,EAAAvJ,KAAAiM,GAgCA,MA/BA,WAAA1C,EAAAiqB,OACAvd,EAAA,IAAAyS,GAAA,UAAAvN,GACI,SAAA5R,EAAAiqB,OACJjqB,EAAAG,gBACAuM,EAAAkF,EAAA,IACAra,KAAA,KAEAmV,EAAA,IAAAyS,GAAA,KAAAvN,IAGA5R,EAAAG,gBACAuM,EAAAkF,EAAA,IACAra,KAAA,KAEAmV,EAAA,IAAAyS,GAAA,KAAAvN,GAIA,SAAA5R,EAAAiqB,QACAvd,EAAAH,WAAA4d,OAAA,SACAzd,EAAAH,WAAA6d,OAAA,UACM,WAAApqB,EAAAiqB,QACNvd,EAAAH,WAAA4d,OAAA,MACAzd,EAAAH,WAAA6d,OAAA,UACM,UAAApqB,EAAAiqB,QAAA,WAAAjqB,EAAAiqB,SACNvd,EAAAH,WAAA4d,OAAA,MACAzd,EAAAH,WAAA6d,OAAA,QAKA1d,CACA,IAwBA,IAAA2d,GAAAvO,IAKA,IAAAwO,EAAA,aAAAxO,EAAAvkB,MAAAukB,EAAArlB,KAAArE,OAAA0pB,EAAArlB,KAAA,GAAAqlB,EACA,eAAAwO,EAAA/yB,MAAA,QAAA+yB,EAAAC,QAAA,QAAAD,EAAAC,OAGA,OAFA,IAAAD,EAAAC,QAOAjP,GAAA,CACA/jB,KAAA,SACAikB,MAAA,cACA6M,QAAA,EACA,OAAAC,CAAAkC,EAAAjC,GACA,IAAAE,OACAA,GACM+B,EACN,OACAjzB,KAAA,SACAuZ,KAAA2X,EAAA3X,KACAmZ,OAAAI,GAAA9B,EAAA,IACA9xB,KAAAslB,GAAAwM,EAAA,IACApoB,eAAAA,EAAAooB,EAAA,IAEA,IAGAjN,GAAA,CACA/jB,KAAA,SACAikB,MAAA,wCACA6M,QAAA,EACA,OAAAC,CAAAmC,EAAAlC,GACA,IAMA0B,GANAxB,OACAA,EAAAD,SACAA,GACMiC,EACNC,EAAAnC,EAAA,GACAoC,EAAApC,EAAA,GAIA0B,EAFA,eAAAzB,EAEA6B,GAAAK,GAEA,OAEA,IAAAE,EAAA,CACArzB,KAAA,KACAuZ,KAAA4Z,EAAA5Z,KACA+Z,QAAA,EACAC,oBAAA,EACAC,gBAAA,EACAC,QAAA,EACAC,kBAAA,eAAAzC,EACA/xB,KAAAslB,GAAA2O,IAEAQ,EAAA,eAAA1C,EAAA,CACAjxB,KAAA,SACAuZ,KAAA6Z,EAAA7Z,KACAuP,KAAAuK,EACA7mB,IAAA4mB,GACM,CACNpzB,KAAA,SACAuZ,KAAA6Z,EAAA7Z,KACAuP,KAAAuK,EACA/mB,IAAA8mB,GAEA,OACApzB,KAAA,SACAuZ,KAAA2X,EAAA3X,KACAmZ,SACAxzB,KAAA,CAAAy0B,GACA/qB,eAAAA,EAAA+qB,GAEA,IAOA5P,GAAA,CACA/jB,KAAA,MACAikB,MAAA,UACA6M,QAAA,EACAM,eAAA,EACA,OAAAL,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,GACM7M,EACN,OACArkB,KAAA,MACAuZ,KAAA2X,EAAA3X,KACAmZ,OAAAI,GAAA9B,EAAA,IACA9xB,KAAAslB,GAAAwM,EAAA,IAEA,EACA,WAAA9M,CAAAzb,EAAA0C,GACA,IAAAwnB,EAAA5N,GAAAtc,EAAAvJ,KAAAiM,GAAA,GACAgK,EAAAiK,GAAA,CAAA3W,EAAAiqB,QAAAC,EAAAxnB,GAEA,OADAgK,EAAArD,MAAA8hB,WAAA,uBACAze,CACA,EACA,aAAAgP,CAAA1b,EAAAqJ,GACA,IAAAuI,EAAAoO,GAAAhgB,EAAAvJ,KAAA4S,GAEAqD,EAAA,IAAAyS,GAAA,SAAAvN,GAEA,OADAlF,EAAAE,aAAA,6CACAF,CACA,IAGA,IAAA0e,GAAA,CACA,uBACA,sBACA,sBACAC,EAAA,YACAC,EAAA,cACA,aACA,gBAEAC,GAAA,KAKA,CACAh0B,KAAA,UACAd,KAAA,GACAqa,KAAA,OACAzH,MAAA,UACAmiB,WAAA,IAGAC,GAAA/e,GACA,YAAAA,EAAAnV,MAAA,MAAAmV,EAAArW,KAEAq1B,GAAA,CAAAhf,EAAAif,KACA,YAAAjf,EAAAnV,MAAA,SAAAmV,EAAAnV,OAAAmV,EAAArW,OAAAs1B,EAEA,SAAAC,GAAAC,EAAAC,EAAArD,GAGA,IAAAD,EAAA4C,GAAAS,GACA,OAAArD,GACA,uBACA,sBACA,OAAAC,EAAAsD,aAAAvD,EAAA,CAAAsD,EAAA,KAAAA,EAAA,KACA,gBACA,kBAEA,IACAE,EAAA,CACAz0B,KAAA,OACAlB,KAAAmyB,EACA1X,KAAA,OACAyZ,OAAA,OAIA0B,EAAA,CACA10B,KAAA,WACAuZ,KAAA,OACAra,KAAA,CAZAgyB,EAAAsD,aAAA,cAAAD,EAAA,QAOArD,EAAAsD,aAAA,SAAAC,GAAA,IACAvD,EAAAsD,aAAA,eAAAD,EAAA,UAMA,OAAArD,EAAAsD,aAAA,gBAAAE,GAAA,IAEA,sBACA,OAAAxD,EAAAsD,aAAA,yBACA,aAOA,OAAAtD,EAAAsD,aAAA,SALA,CACAx0B,KAAA,UACAlB,KAAA,SACAya,KAAA,SAEA,IAEA,QACA,OACAvZ,KAAA,UACAlB,KAAA,IACAya,KAAA,QAGA,CA+IAwK,GAAA,CACA/jB,KAAA,UACAikB,MAAA,6BACA6M,QAAA,EACA,OAAAC,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACN,OACArkB,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAkN,KAAAwK,EAAA5vB,MAAA,GACAwsB,MAAAmD,EAAA,GAEA,EACA,WAAA9M,CAAAzb,EAAA0C,GACA,IAAA2mB,EAAA3mB,EAAAkJ,YAAAlJ,EAAA2G,MAAAxF,OACAuhB,EAAAlO,GAAAyF,GAAA3c,EAAAolB,MAAAiE,EAAA3mB,GAAAA,GAOA,OANA0iB,EAAAlc,QAAArS,KAAA,YAAAmJ,EAAAge,MACAoH,EAAA/b,MAAAsO,OAAA1L,EAAA,GAAAmZ,EAAAjc,OAGAic,EAAAxxB,OAAA,EACAwxB,EAAAjc,MAAA,EACAic,CACA,EACA,aAAA1J,CAAA1b,EAAA0C,GACA,IAAA0iB,EAAA,IAAAjG,GAAA,QAAAe,GAAAlgB,EAAAolB,MAAA1iB,KAYA,OAXA0iB,EAAA,IAAAjG,GAAA,WAAAiG,KACAxY,aAAA,aACA,SAAA5M,EAAAge,MACAoH,EAAAxY,aAAA,oBAIAwY,EAAAxY,aAAA,oBACAwY,EAAA,IAAAjG,GAAA,UAAAiG,KACAxY,aAAA,wBACAwY,EAAAxY,aAAA,mBACAwY,CACA,IAEA9J,GAAA,CACA/jB,KAAA,gBACAikB,MAAA,iBACA6M,QAAA,EACA,OAAAC,CAAAkC,EAAAjC,GACA,IAAAE,OACAA,GACM+B,EACN,OACAjzB,KAAA,gBACAuZ,KAAA2X,EAAA3X,KACAmG,SAAAsR,EAAA,GAEA,EACA,WAAA9M,CAAAzb,EAAA0C,GAIA,IAAAwpB,EAAAhV,GAAAyF,GAAA3c,EAAAiX,SAAAvU,GAAAA,GAEA,OADAwpB,EAAAhjB,QAAArS,KAAA,iBACAq1B,CACA,EACAxQ,cAAA,CAAA1b,EAAA0C,IACA,IAAAyc,GAAA,QAAAe,GAAAlgB,EAAAiX,SAAAvU,OAOA4Y,GAAA,CACA/jB,KAAA,UACAikB,MAAA,YACA6M,QAAA,EACAM,eAAA,EACA,OAAAL,CAAA1M,EAAA2M,GAOA,IANA,IAAAE,OACAA,GACM7M,EAEN5b,EADA+mB,GAAAwB,EAAA,eACA9xB,KACAuV,EAAA,GACAjT,EAAA,EAAoBA,EAAAiH,EAAA5N,OAAkB2G,IAAA,CAEtCiT,GADA+a,GAAA/mB,EAAAjH,GAAA,WACA1C,IACA,CACA,IACAA,EADA81B,EAAAlqB,SAAA+J,GAEA,GAAAogB,MAAAD,GACA,UAAA1tB,EAAA,oCAAAuN,GAGM,GAAAmgB,EAAA,GAAAA,GAAA,QACN,UAAA1tB,EAAA,mCAAAuN,GAQA,OAPMmgB,GAAA,MACN91B,EAAAwJ,OAAAiT,aAAAqZ,IAGAA,GAAA,MACA91B,EAAAwJ,OAAAiT,aAAA,OAAAqZ,GAAA,gBAAAA,KAEA,CACA50B,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAza,KAAAA,EAEA,IAiBAilB,GAAA,CACA/jB,KAAA,QACAikB,MAAA,gBACA6M,QAAA,EACAM,eAAA,EACAE,SAAA,qBACA,OAAAP,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,GACM7M,EACN1a,EAAA6lB,GAAAwB,EAAA,kBAAArnB,MACAzK,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,QACAuZ,KAAA2X,EAAA3X,KACA5P,QACAzK,KAAAslB,GAAAtlB,GAEA,EACAglB,YAjCA,CAAAzb,EAAA0C,KACA,IAAAwnB,EAAA5N,GAAAtc,EAAAvJ,KAAAiM,EAAAmf,UAAA7hB,EAAAkB,QAAA,GAKA,OAAA2U,GAAAqU,IA4BAxO,cA1BA,CAAA1b,EAAA0C,KACA,IAAAkP,EAAAoO,GAAAhgB,EAAAvJ,KAAAiM,EAAAmf,UAAA7hB,EAAAkB,QACAwL,EAAA,IAAAyS,GAAA,SAAAvN,GAEA,OADAlF,EAAAE,aAAA,YAAA5M,EAAAkB,OACAwL,KAwBA4O,GAAA,CACA/jB,KAAA,QACAikB,MAAA,YACA6M,QAAA,EACAM,eAAA,EACAE,SAAA,UACA,OAAAP,CAAAkC,EAAAjC,GACA,IAAAE,OACAA,EAAA4D,iBACAA,GACM7B,EACNtpB,EAAA6lB,GAAAwB,EAAA,kBAAArnB,MAKAunB,EAAA6D,OAAAnrB,OAAAorB,IAAA,kBAAArrB,GAEA,IAAAzK,EAAAgyB,EAAA+D,iBAAA,EAAAH,GACA,OACA90B,KAAA,QACAuZ,KAAA2X,EAAA3X,KACA5P,QACAzK,OAEA,IAKA6kB,GAAA,CACA/jB,KAAA,KACAikB,MAAA,SACA6M,QAAA,EACAY,gBAAA,EACAN,eAAA,EACA,OAAAL,CAAA1M,EAAA2M,EAAAW,GACA,IAAAT,OACAA,GACM7M,EACNjY,EAAA,MAAA8kB,EAAA6D,OAAAG,SAAAp2B,KAAAoyB,EAAAiE,gBAAA,QACAC,GAAAlE,EAAAlG,SAAAjiB,cAAAmoB,EAAAlG,SAAArf,kBAAA,mFACA,OACA3L,KAAA,KACAuZ,KAAA2X,EAAA3X,KACA6b,UACAhpB,KAAAA,GAAAojB,GAAApjB,EAAA,QAAA5F,MAEA,EAGA,WAAA0d,CAAAzb,EAAA0C,GACA,IAAAqL,EAAA4I,GAAA,cAAAjU,GAOA,OANA1C,EAAA2sB,UACA5e,EAAA7E,QAAArS,KAAA,WACAmJ,EAAA2D,OACAoK,EAAA1E,MAAAujB,UAAA3gB,EAAAb,EAAApL,EAAA2D,KAAAjB,MAGAqL,CACA,EACA,aAAA2N,CAAA1b,EAAA0C,GACA,IAAAgK,EAAA,IAAAyS,GAAA,UAOA,OANAnf,EAAA2sB,UACAjgB,EAAAE,aAAA,uBACA5M,EAAA2D,MACA+I,EAAAE,aAAA,SAAAX,EAAAb,EAAApL,EAAA2D,KAAAjB,MAGAgK,CACA,IAGA,IAAAmgB,GAAA,CACA,sBACA,0BACA,kCACA,iBACA,kBACA,kBACA,kBACA,wBACA,kCAEAC,GAAAC,IACA,IAAA51B,EAAA41B,EAAA12B,KACA,2BAAgBkN,KAAApM,GAChB,UAAAsH,EAAA,8BAAAsuB,GAEA,OAAA51B,GAcA61B,GAAA,CAAAvE,EAAAtxB,EAAA41B,EAAAE,KACA,IAAAC,EAAAzE,EAAA6D,OAAAnrB,OAAAgsB,IAAAJ,EAAA12B,MACA,MAAA62B,IAGAH,EAAAK,UAAA,EACAF,EAAA,CACAG,OAAA,CAAAN,GACA1E,QAAA,EAEAiF,cAAA7E,EAAA6D,OAAAiB,aAAAR,EAAA12B,QAGAoyB,EAAA6D,OAAAnrB,OAAAorB,IAAAp1B,EAAA+1B,EAAAD,IAMA3R,GAAA,CACA/jB,KAAA,WACAikB,MAAA,uCAEA6M,QAAA,EACAM,eAAA,EACA,OAAAL,CAAA1M,GACA,IAAA6M,OACAA,EAAAD,SACAA,GACM5M,EACN6M,EAAA+E,gBACA,IAAA9uB,EAAA+pB,EAAAgF,QACA,GAAAZ,GAAAnuB,EAAArI,MAKA,MAHA,aAAAmyB,GAAA,mBAAAA,IACA9pB,EAAArI,KAAAw2B,GAAAnuB,EAAArI,OAEA0wB,GAAA0B,EAAAiF,gBAAA,YAEA,UAAAjvB,EAAA,mCAAAC,EACA,IAMA4c,GAAA,CACA/jB,KAAA,WACAikB,MAAA,qCACA6M,QAAA,EACAM,eAAA,EACAqB,WAAA,EACA,OAAA1B,CAAAkC,GACA,IAAA/B,OACAA,EAAAD,SACAA,GACMgC,EACNuC,EAAAtE,EAAA6D,OAAAqB,WACAx2B,EAAA41B,EAAA12B,KACA,2BAAkBkN,KAAApM,GAClB,UAAAsH,EAAA,8BAAAsuB,GAMA,IAJA,IACAa,EADAvF,EAAA,EAEAwF,EAAA,KAEA,MAAApF,EAAA6D,OAAAG,SAAAp2B,MAEA,UADA02B,EAAAtE,EAAA6D,OAAAqB,YACAt3B,KAAA,CAKA,SAAAoyB,EAAA6D,OAAAG,SAAAp2B,KAA8C,CAC9Cu3B,EAAAnF,EAAA6D,OAAAG,SACAoB,EAAAxF,GAAAxxB,KAAA,KACA,KACA,CAIA,GADAk2B,EAAAtE,EAAA6D,OAAAqB,YACA,UAAApqB,KAAAwpB,EAAA12B,MACA,UAAAoI,EAAA,4BAAAsuB,EAAA12B,KAAA,KAEA,GAAA4L,SAAA8qB,EAAA12B,QAAAgyB,EAAA,EACA,UAAA5pB,EAAA,oBAAAsuB,EAAA12B,KAAA,kBAEAgyB,IACAwF,EAAAh3B,KAAA,GACA,KAAQ,YAAAk2B,EAAA12B,KACR,UAAAoI,EAAA,+BAEAovB,EAAAxF,GAAAxxB,KAAAk2B,EAAA12B,KACA,CAGA,IAAAg3B,OACAA,GACM5E,EAAA6D,OAAAwB,aAcN,OAbAF,GACAP,EAAAzP,QAAAgQ,GAEA,WAAApF,GAAA,WAAAA,IACA6E,EAAA5E,EAAA6D,OAAAyB,aAAAV,IACAW,UAGAvF,EAAA6D,OAAAnrB,OAAAorB,IAAAp1B,EAAA,CACAk2B,SACAhF,UACAwF,cACKrF,IAAAqE,GAAArE,IACL,CACAjxB,KAAA,WACAuZ,KAAA2X,EAAA3X,KAEA,IAMAwK,GAAA,CACA/jB,KAAA,WACAikB,MAAA,0BAEA6M,QAAA,EACAM,eAAA,EACAqB,WAAA,EACA,OAAA1B,CAAAmC,GACA,IAAAhC,OACAA,EAAAD,SACAA,GACMiC,EACNtzB,EAAA21B,GAAArE,EAAA6D,OAAAqB,YACAlF,EAAA6D,OAAAkB,gBACA,IAAAT,EApJAtE,KACA,IAAAsE,EAAAtE,EAAA6D,OAAAqB,WASA,MARA,MAAAZ,EAAA12B,MAGA,OADA02B,EAAAtE,EAAA6D,OAAAqB,YACAt3B,OAEA02B,EAAAtE,EAAA6D,OAAAqB,YAGAZ,GA0IAkB,CAAAxF,GAEA,OADAuE,GAAAvE,EAAAtxB,EAAA41B,EAAA,kBAAAvE,GACA,CACAjxB,KAAA,WACAuZ,KAAA2X,EAAA3X,KAEA,IAGAwK,GAAA,CACA/jB,KAAA,WACAikB,MAAA,mCAEA6M,QAAA,EACAM,eAAA,EACAqB,WAAA,EACA,OAAA1B,CAAA4F,GACA,IAAAzF,OACAA,EAAAD,SACAA,GACM0F,EACN/2B,EAAA21B,GAAArE,EAAA6D,OAAAqB,YACAQ,EAAA1F,EAAA6D,OAAAqB,WACAZ,EAAAtE,EAAA6D,OAAAqB,WAIA,OAHAX,GAAAvE,EAAAtxB,EAAA41B,EAAA,qBAAAvE,GACAC,EAAA6D,OAAA8B,UAAArB,GACAtE,EAAA6D,OAAA8B,UAAAD,GACA,CACA52B,KAAA,WACAuZ,KAAA2X,EAAA3X,KAEA,IA4BA,IAAAud,GAAA,SAAArD,EAAAna,EAAAC,GACA,IACAE,EAAAL,GADAO,GAAAC,KAAA6Z,IAAA9Z,GAAAC,KAAA6Z,GAAAjuB,SACAiuB,EAAAna,EAAAC,GACA,IAAAE,EACA,UAAA1b,MAAA,sBAAA01B,EAAA,kBAAAna,EAAA,KAEA,OAAAG,CACA,EAKAsd,GAAA,SAAAC,EAAAC,EAAA9rB,EAAAwG,GACA,IAAAmgB,EAAA3mB,EAAAgf,gBAAA8M,GACAzgB,EAAA4I,GAAAzN,EAAAwL,OAAA2U,EAAA/K,cAAA5b,IAAA,CAAA6rB,GAAA7rB,GACA+rB,EAAApF,EAAA5d,eAAA/I,EAAA+I,eAIA,OAHAsC,EAAAna,QAAA66B,EACA1gB,EAAA5E,OAAAslB,EACA1gB,EAAA3E,YAAAigB,EAAA5d,eACAsC,CACA,EACA2gB,GAAA,SAAA3gB,EAAArL,EAAA2G,GACA,IAAAggB,EAAA3mB,EAAAgf,gBAAArY,GACAmO,GAAA,EAAA9U,EAAA+I,eAAA4d,EAAA5d,gBAAA/I,EAAA6I,cAAAuE,WACA/B,EAAA7E,QAAArS,KAAA,eACAkX,EAAA1E,MAAAoP,IAAAxM,EAAAuL,GACAzJ,EAAAna,QAAA4jB,EACAzJ,EAAA5E,OAAAqO,CACA,EAwBAmX,GAAA,SAAAJ,EAAA5qB,EAAAirB,EAAAlsB,EAAAoO,EAAA5H,GACA,IAAA0I,EARA,SAAA7T,EAAA4F,EAAAmN,EAAApO,GACA,OAAA4R,GAAAvW,EAAA,OAAA4F,EAAA,WAAAmN,EAAApO,EACA,CAMAmsB,CAAAN,EAAA5qB,EAAAmN,EAAApO,GACAqL,EAAAugB,GAAA3X,GAAA,sBAAAhT,GAAA,CAAAiO,GAAAlP,GAAA2B,EAAAE,KAAA7B,EAAAwG,GAIA,OAHA0lB,GACAF,GAAA3gB,EAAArL,EAAA2B,EAAAE,MAEAwJ,CACA,EAKA+gB,GAAA,SAAA9D,EAAAna,EAAAC,GAWA,OACAvZ,KAAA,OACAmf,KALAC,GAAA,oBALA,kBAAA9F,EACA,cAEA,eAEA,CAAA8F,GAAA,IAAArC,GAAA0W,EAAAna,EAAAC,OAOA,EACAie,GAAA,SAAAhe,EAAAnd,EAAA8O,GAEA,IAAA/O,EAAA8a,GAAA,iBAAAsC,EAAAlD,WAAA,IAAAY,GAAA,iBAAAsC,EAAAlD,WAAA,OAAAY,GAAA,iBAAAsC,EAAAlD,WAAA,OACAzI,EAAA,IAAAiJ,GAAA,QAxzOA,SAAAlX,EAAAvD,GAEA,OAAAuD,GACA,QACA,OAAA8N,EAAA,gBAAArR,EAAA,UACA,QACA,OAAAqR,EAAA,gBAAArR,EAAA,UACA,QACA,OAAAqR,EAAA,gBAAArR,EAAA,UAAAqR,EAAA,gBAAArR,EAAA,UACA,QACA,OAAAqR,EAAA,gBAAArR,EAAA,UACA,QACA,OAAAqR,EAAA,gBAAArR,EAAA,UACA,QACA,OAAAqR,EAAA,gBAAArR,EAAA,UACA,QACA,OAAAqR,EAAA,gBAAArR,EAAA,UACA,QACA,OAAAqR,EAAA,gBAAArR,EAAA,UACA,QACA,OAAAqR,EAAA,gBAAArR,EAAA,UAAAqR,EAAA,gBAAArR,EAAA,UACA,QACA,SAEA,CAgyOAo7B,CAAAje,EAAA3X,KAAA4E,MAAA,IAAApK,KACAwmB,EAAA,IAAAjM,GAAA,CAAA/I,GAAA,CACAzR,MAAAsY,EAAAtY,GACAC,OAAAqY,EAAArY,GAEAyV,MAAA,SAAA4C,EAAAtY,GACAX,QAAA,WAAAW,EAAA,IAAAyF,KAAA4E,MAAA,IAAApK,GACAymB,oBAAA,aAEAtM,EAAA6I,GAAA,IAAAwD,GAAA1X,GAIA,OAHAqL,EAAAna,OAAAA,EACAma,EAAA1E,MAAAzV,OAAAqY,EAAArY,GACAma,EAAA1E,MAAA1V,MAAAsY,EAAAtY,GACA,CACA4D,KAAA,OACAmf,KAAA3I,EAEA,EAGAkhB,GAAA,CACA13B,KAAA,OACAoM,MAAA,MAEAurB,GAAA,IAAAhvB,IAAA,oCACAivB,GAAA,IAAAjvB,IAAA,sCAKAkvB,GAAA,SAAAb,EAAAc,EAAAT,EAAAlsB,EAAAoO,EAAA5H,GAGA,IAAAuP,EACA0V,EACAmB,EACA3X,EACA4X,EAAA,GACA5J,EAAA,EACAlN,EAAA6W,EAAA3X,EAAA4W,EACAJ,EAAA,KAEA,IAAAtd,EAAA,gBAIA,cAAA0d,EACAe,EAAA3X,EAAA,IACI,cAAA4W,EACJe,EAAA3X,EAAA,IACI,gBAAA4W,EACJ9V,EAAA6W,EAAA,IACI,gBAAAf,EACJ9V,EAAA6W,EAAA,IACI,kBAAAf,GACJ9V,EAAA,YACA6W,EAAA,IACA3X,EAAA,eACI,kBAAA4W,GACJ9V,EAAA,YACA6W,EAAA,IACA3X,EAAA,eACIuX,GAAA9uB,IAAAmuB,IACJe,EAAA,IACAC,EAAA,OACA5J,EAAA,KACIwJ,GAAA/uB,IAAAmuB,IACJe,EAAA,IACAC,EAAA,aACA5J,EAAA,KACI,MAAA4I,GAAA,aAAAA,GACJ9V,EAAA,IACA6W,EAAA,IACA3X,EAAA,IACA9G,EAAA,gBACA0e,EAAA,SACA5J,EAAA,KACI,MAAA4I,GAAA,aAAAA,GACJ9V,EAAA,IACA6W,EAAA,IACA3X,EAAA,IACA9G,EAAA,gBACA0e,EAAA,SACA5J,EAAA,KACI,aAAA4I,GAAA,MAAAA,GACJe,EAAA7W,EAAA,IACAd,EAAA,IACA9G,EAAA,gBACA0e,EAAA,SACA5J,EAAA,KACI,YAAA4I,GAAA,MAAAA,GACJ9V,EAAA,IACA6W,EAAA3X,EAAA,IACA9G,EAAA,gBACA0e,EAAA,QACA5J,EAAA,KACI,aAAA4I,GAAA,MAAAA,GACJe,EAAA7W,EAAA,IACAd,EAAA,IACA9G,EAAA,gBACA0e,EAAA,SACA5J,EAAA,KACI,YAAA4I,GAAA,MAAAA,GACJ9V,EAAA,IACA6W,EAAA3X,EAAA,IACA9G,EAAA,gBACA0e,EAAA,QACA5J,EAAA,KACI,MAAA4I,GAAA,aAAAA,GACJ9V,EAAA,IACA6W,EAAA,IACA3X,EAAA,IACA9G,EAAA,gBACA0e,EAAA,SACA5J,EAAA,KACI,MAAA4I,GAAA,aAAAA,GACJ9V,EAAA,IACA6W,EAAA,IACA3X,EAAA,IACA9G,EAAA,gBACA0e,EAAA,SACA5J,EAAA,KACI,QAAA4I,GAAuB,aAAAA,GAC3B9V,EAAA,IACA0V,EAAA,IACAxW,EAAA,IACA2X,EAAA,IACAze,EAAA,iBACI,QAAA0d,GAAuB,aAAAA,GAC3B9V,EAAA,IACA0V,EAAA,IACAxW,EAAA,IACA2X,EAAA,IACAze,EAAA,iBACI,aAAA0d,GAAA,MAAAA,GACJ9V,EAAA,IACAd,EAAA,IACA2X,EAAA,IACAze,EAAA,iBACI,aAAA0d,GAAA,MAAAA,GACJ9V,EAAA,IACAd,EAAA,IACA2X,EAAA,IACAze,EAAA,iBACI,iBAAA0d,GAAA,MAAAA,GACJ9V,EAAA,IACAd,EAAA,IACA2X,EAAA,IACAze,EAAA,iBACI,iBAAA0d,GAAA,MAAAA,IACJ9V,EAAA,IACAd,EAAA,IACA2X,EAAA,IACAze,EAAA,iBAGA,IAAA2e,EAAAnB,GAAA5V,EAAA5H,EAAAC,GACA2e,EAAAD,EAAA57B,OAAA47B,EAAArmB,MACAumB,EAAArB,GAAAiB,EAAAze,EAAAC,GACA6e,EAAAD,EAAA97B,OAAA87B,EAAAvmB,MACAymB,EAAAvB,GAAA1W,EAAA9G,EAAAC,GACA+e,EAAAD,EAAAh8B,OAAAg8B,EAAAzmB,MACA2mB,EAAA,EACAC,EAAA,EACA,UAAA5B,EAAA,CACA,IAAA6B,EAAA3B,GAAAF,EAAAtd,EAAAC,GACAgf,EAAAE,EAAAp8B,OAAAo8B,EAAA7mB,MACA4mB,EAAA,CACA,CAGA,IAAAE,EAAAR,EAAAI,EAAAC,EAIAI,EAAAD,EAFA72B,KAAAqI,IAAA,EAAArI,KAAA+2B,MAAAd,EAAAY,IAAAF,EAAAJ,KAEAI,EAAAJ,EAKA7f,EAAApN,EAAA6I,cAAAuE,WACA8e,IACA9e,GAAApN,EAAA+I,gBAGA,IAAAtC,EAAA+mB,EAAA,EAAApgB,EAGAsgB,EAAA,GACA,GAAAb,EAAAn9B,OAAA,GAGA,IAAAi+B,EAAAH,EAAAT,EAAAI,EACAjK,EAAAxsB,KAAA4E,MAAA,IAAAkyB,GACAI,EA/4OA,SAAAlL,EAAAiL,GACA,OAAAjL,GACA,aACA,2CAAAiL,EAAA,wDAAAA,EAAA,kBACA,aACA,yCAAAA,EAAA,iDAAAA,EAAA,cACA,WACA,uBAAAA,EAAA,kEAAAA,EAAA,sFAAAA,EAAA,aACA,iBACA,uBAAAA,EAAA,kEAAAA,EAAA,sFAAAA,EAAA,6BAAAA,EAAA,kEAAAA,EAAA,sFAAAA,EAAA,aACA,aACA,gCAAAA,EAAA,kDAAAA,EAAA,eACA,aACA,gCAAAA,EAAA,iDAAAA,EAAA,eACA,YACA,2CAAAA,EAAA,wCAAAA,EAAA,aACA,YACA,yCAAAA,EAAA,wCAAAA,EAAA,aACA,aACA,0KAAAA,EAAA,yRAAAA,EAAA,0HACA,aACA,oMAAAA,EAAA,6UAAAA,EAAA,+HACA,QAEA,UAAA/6B,MAAA,+BAEA,CAq3OAi7B,CAAAhB,EAAAn2B,KAAA4E,MAAA,IAAAqyB,IACAjrB,EAAA,IAAAiJ,GAAAkhB,EAAAe,GACA38B,EAAAsY,EAAA0Z,EAAA,KACA/xB,EAAAqY,EAAA2Z,EAAA,KACA4K,EAAA,IAAAriB,GAAA,CAAA/I,GAAA,CACAzR,MAAAA,EACAC,OAAAA,EACAZ,QAAA,OAAA2yB,EAAA,IAAAC,IAEAhF,EAAAhK,GAAA,IAAA4Z,GAAA9tB,GACAke,EAAAhtB,OAAAgyB,EAAA,IACAhF,EAAAvX,MAAA1V,MAAAA,EACAitB,EAAAvX,MAAAzV,OAAAA,EACAw8B,EAAAv5B,KAAA,CACAU,KAAA,OACAmf,KAAAkK,GAEA,KAAI,CAKJ,GAFAwP,EAAAv5B,KAAAi4B,GAAAnX,EAAA9G,EAAAC,IACAsf,EAAAv5B,KAAAo4B,IACA,OAAAd,EAAA,CAGA,IAAAsC,EAAAP,EAAAT,EAAAI,EAAA,KACAO,EAAAv5B,KAAAk4B,GAAAO,EAAAmB,EAAA/tB,GACA,KAAM,CAGN,IAAAguB,GAAAR,EAAAT,EAAAI,EAAAC,GAAA,OACAM,EAAAv5B,KAAAk4B,GAAAO,EAAAoB,EAAAhuB,IAEA0tB,EAAAv5B,KAAAo4B,IACAmB,EAAAv5B,KAAAi4B,GAAAX,EAAAtd,EAAAC,IACAsf,EAAAv5B,KAAAo4B,IACAmB,EAAAv5B,KAAAk4B,GAAAO,EAAAoB,EAAAhuB,GACA,CAEA0tB,EAAAv5B,KAAAo4B,IACAmB,EAAAv5B,KAAAi4B,GAAArW,EAAA5H,EAAAC,GACA,CAEA,IAAAuY,EAAA3mB,EAAAgf,gBAAArd,EAAAE,MACAqN,EAAAuF,GAAA,CACAE,aAAA,SACAO,aAAAzO,EACAF,SAAAmnB,IAEA,OAAA9B,GAAA3X,GAAA,wBAAA/E,GAAAyX,GAAAhlB,EAAAE,KAAA7B,EAAAwG,EACA,EAIAynB,GAAA,IACAC,GAAA,SAAAC,EAAAj9B,EAAAgyB,EAAAkL,EAAApuB,GACA,IAAA0C,EA1kPA,SAAAzB,EAAAmtB,EAAAlL,GACAkL,GAAA,IACA,IAAA1rB,EAAA,GACA,OAAAzB,GACA,eACAyB,EArCA,SAAA0rB,EAAA3rB,GAEA,kBAAA2rB,EAAA3rB,GAAA,sSAAA2rB,EAAA,WAAAA,EAAA,0CAAAA,GAAA,8IAAAA,GAAA,IAAA3rB,EAAA,eAAA2rB,GAAA,WACA,CAkCAC,CAAAD,EAAA3rB,GACA,MACA,gBACAC,EApCA,SAAA0rB,EAAA3rB,GAEA,mBAAA2rB,EAAA3rB,GAAA,+HAAA2rB,EAAA,WAAAA,EAAA,yCAAAA,GAAA,qUAAAA,GAAA,IAAA3rB,EAAA,eAAA2rB,GAAA,WACA,CAiCAE,CAAAF,EAAA3rB,GACA,MACA,gBACAC,EAnCA,SAAA0rB,EAAA3rB,GAEA,kBAAA2rB,EAAA3rB,GAAA,MAAA2rB,EAAA,UAAAA,EAAA,uCAAAA,GAAA,kaAAAA,GAAA,IAAA3rB,EAAA,eAAA2rB,GAAA,WACA,CAgCAG,CAAAH,EAAA3rB,GACA,MACA,gBACAC,EAlCA,SAAA0rB,EAAA3rB,GAEA,oBAAA2rB,EAAA3rB,GAAA,mUAAA2rB,EAAA,WAAAA,EAAA,uCAAAA,GAAA,4HAAAA,GAAA,IAAA3rB,EAAA,iBAAA2rB,GAAA,WACA,CA+BAI,CAAAJ,EAAA3rB,GACA,MACA,gBACAC,EAjCA,SAAA0rB,EAAA3rB,GAEA,oBAAA2rB,EAAA3rB,GAAA,2CAAA2rB,EAAA,WAAAA,EAAA,0CAAAA,GAAA,iWAAAA,GAAA,IAAA3rB,EAAA,eAAA2rB,GAAA,UACA,CA8BAK,CAAAL,EAAA3rB,GACA,MACA,eACAC,EA5BA,SAAA0rB,EAAA3rB,EAAAygB,GAMA,eAAAkL,EAAA3rB,GAAA,cAAA2rB,GAAA,WADAlL,EAAA,GAAAzgB,EAAA2rB,GACA,sOAAA3rB,EAAA,eAAA2rB,GAAA,OACA,CAqBAM,CAAAN,EAAA3rB,EAAAygB,GAEA,OAAAxgB,CACA,CAmjPAisB,CAAAR,EAAAC,EAAAlL,GACA0L,EAAA,IAAAjjB,GAAAwiB,EAAAzrB,GACAorB,EAAA,IAAAriB,GAAA,CAAAmjB,GAAA,CAEA39B,MAAA,QACAC,OAAAqY,EAAArY,GACAZ,QAAA,cAAA4yB,EACAvL,oBAAA,mBAEA,OAAAzD,GAAA,eAAA4Z,GAAA9tB,EACA,EAuEA6uB,GAAA,IAAArxB,IAAA,mEAA4G,iBAAmB,gFAE/HsxB,GAAA,IAAAtxB,IAAA,+NAEAuxB,GAAA,IAAAvxB,IAAA,iEAIAwxB,GAAA,kBAIAC,GAAA,SAAApD,EAAA5qB,EAAAjB,EAAAoO,EAAA5H,GAQA,GANA,MAAAqlB,GAAA,SAAAA,GAAA,MAAAA,EACAA,EAAA,WACI,MAAAA,GAAA,SAAAA,GAAA,MAAAA,IACJA,EAAA,YAGAgD,GAAAnxB,IAAAmuB,IAAAkD,GAAArxB,IAAAmuB,GACA,OAAAI,GAAAJ,EAAA5qB,GAAA,EAAAjB,EAAAoO,EAAA5H,GACI,GAAAsoB,GAAApxB,IAAAmuB,GACJ,OAAAa,GAAAb,EAAAmD,GAAA/tB,IAAA,EAAAjB,EAAAoO,EAAA5H,GAEA,UAAAzK,EAAA,uBAAA8vB,EAAA,IAEA,EAEAqD,GAAA,EACAr6B,KAAA,QACA8R,MAAAhF,EAAAI,cACC,CACDlN,KAAA,QACA8R,MAAAhF,EAAAG,QACC,CACDjN,KAAA,QACA8R,MAAAhF,EAAAE,MACC,CACDhN,KAAA,QACAoM,KAAA,GACC,CACDpM,KAAA,QACAoM,KAAA,GACC,CACDpM,KAAA,QACAoM,KAAA,GACC,CACDpM,KAAA,QACAoM,KAAA,IAGAkuB,GAAA,EACAt6B,KAAA,QACA8R,MAAAhF,EAAAI,cACC,CACDlN,KAAA,QACA8R,MAAAhF,EAAAG,QACC,CACDjN,KAAA,QACA8R,MAAAhF,EAAAE,MACC,CACDhN,KAAA,UAIAu6B,GAAA,EACAv6B,KAAA,QACA8R,MAAAhF,EAAAI,cACC,CACDlN,KAAA,QACA8R,MAAAhF,EAAAG,QACC,CACDjN,KAAA,QACA8R,MAAAhF,EAAAE,MACC,CACDhN,KAAA,QACAoM,KAAA,GACC,CACDpM,KAAA,QACAoM,KAAA,GACC,CACDpM,KAAA,QACAoM,KAAA,GACC,CACDpM,KAAA,QACAoM,KAAA,GACC,CACDpM,KAAA,UAMAw6B,GAAA,SAAAx6B,GACA,aAAAA,EAAAA,KACA,qBACI,aAAAA,EAAAA,KACJ,aAAAA,EAAAoM,KAAA,WACI,aAAApM,EAAAA,KACJ,sBAEA,IAAAy6B,EAAAz6B,EAAAA,KACA,UAAAjC,MAAA,+BAAA08B,EAAA,UAEA,EAKAC,GAAA,SAAA1D,EAAA36B,EAAAs+B,EAAAxvB,GAMA,IADA,IACA3J,EADAK,KAAA2S,IAAA,IAAArJ,EAAA2G,MAAA1F,MACsB5K,EAAAm5B,EAAA9/B,OAAqB2G,IAAA,CAC3C,IAAAo5B,EAAAD,EAAAn5B,GACA,aAAAo5B,EAAA56B,KAEA,MAEA,IAAAyZ,EAAAqd,GAAAE,EAAAwD,GAAAI,GAAA,QACAC,EAAAphB,EAAApd,OAAAod,EAAA7H,MAGA,aAAAgpB,EAAA56B,KAEA66B,GADA1vB,EAAAgf,gBAAAyQ,EAAA9oB,OACAoC,eAGA,GAAA2mB,EAAAx+B,EACA,OAAAu+B,CAEA,CAEA,OAAAD,EAAAA,EAAA9/B,OAAA,EACA,EAKAigC,GAAA,SAAA9D,EAAA36B,EAAAg7B,EAAAlsB,EAAAoO,EAAA5H,GAOA,IAAAgpB,EANA,MAAA3D,GAAA,SAAAA,GAAA,MAAAA,EACAA,EAAA,WACI,MAAAA,GAAA,SAAAA,GAAA,MAAAA,IACJA,EAAA,YAKA2D,EADAT,GAAArxB,IAAAmuB,GACAqD,GACIL,GAAAnxB,IAAAmuB,GACJuD,GAEAD,GAGA,IAAAM,EAAAF,GAAA1D,EAAA36B,EAAAs+B,EAAAxvB,GAIA,gBAAAyvB,EAAA56B,KA9hBA,SAAAg3B,EAAAllB,EAAAulB,EAAAlsB,EAAAoO,EAAA5H,GACA,IAAA7S,EAAAie,GAAAia,EAAA,eAAAzd,EAAApO,GACAqL,EAAAugB,GAAAj4B,EAAAgT,EAAA3G,EAAAwG,GAIA,OAHA0lB,GACAF,GAAA3gB,EAAArL,EAAA2G,GAEA0E,CACA,CAwhBAukB,CAAA/D,EAAA4D,EAAA9oB,MAAAulB,EAAAlsB,EAAAoO,EAAA5H,GACI,UAAAipB,EAAA56B,KACJo3B,GAAAJ,EAAA4D,EAAAxuB,KAAAirB,EAAAlsB,EAAAoO,EAAA5H,GAEAkmB,GAAAb,EAAA36B,EAAAg7B,EAAAlsB,EAAAoO,EAAA5H,EAEA,EAKAqpB,GAAA,SAAAhE,EAAA36B,EAAAuV,EAAAzG,EAAAoO,EAAA5H,GAEA,IAAA4G,EAAApN,EAAA6I,cAAAuE,WAAApN,EAAA+I,eAGA+mB,EAAA,EAAA9vB,EAAA6I,cAAAC,QACAinB,EAAAr5B,KAAAqI,IAAA7N,EAAAkc,EAAA3G,EAAA2G,GACA4iB,EAAAt5B,KAAAqI,IAUAgxB,EAAA,IAbA,IAaA,EAAAA,EAAAD,GAGA,OAAAH,GAAA9D,EAAAmE,GAAA,EAAAhwB,EAAAoO,EAAA5H,EACA,EAGAypB,GAAA,CACA,UACA1I,OAAA,QACAtmB,KAAA,GAEA,UACAsmB,OAAA,QACAtmB,KAAA,GAEA,WACAsmB,OAAA,QACAtmB,KAAA,GAEA,WACAsmB,OAAA,QACAtmB,KAAA,GAEA,UACAsmB,OAAA,SACAtmB,KAAA,GAEA,UACAsmB,OAAA,SACAtmB,KAAA,GAEA,WACAsmB,OAAA,SACAtmB,KAAA,GAEA,WACAsmB,OAAA,SACAtmB,KAAA,GAEA,UACAsmB,OAAA,OACAtmB,KAAA,GAEA,UACAsmB,OAAA,OACAtmB,KAAA,GAEA,WACAsmB,OAAA,OACAtmB,KAAA,GAEA,WACAsmB,OAAA,OACAtmB,KAAA,GAEA,SACAsmB,OAAA,OACAtmB,KAAA,GAEA,SACAsmB,OAAA,OACAtmB,KAAA,GAEA,UACAsmB,OAAA,OACAtmB,KAAA,GAEA,UACAsmB,OAAA,OACAtmB,KAAA,IAGAkqB,GAAA,IAAA3tB,IAAA,mEAAkG,iBAAmB,6WACrH,SAAA0yB,GAAAlmB,GACA,mBAAAA,CACA,CAEA,SAAAmmB,GAAAtE,EAAAhwB,GACA,IAAAu0B,EAAA5L,GAAAqH,GACA,GAAAuE,GAAAjF,GAAAztB,IAAA0yB,EAAAz8B,MACA,OAAAy8B,EACI,MACJ,IAAAr0B,EADIq0B,EACJ,sBAAAA,EAAAz8B,KAAA,YAAAkI,EAAAiqB,SAAA,IAEA,2BAAA+F,EAAAh3B,KAAA,IAFAg3B,EAIA,CA8CA,SAAAwE,GAAA/yB,GACA,IAAAA,EAAAvJ,KACA,UAAAnB,MAAA,oDAEA,CAjDAgmB,GAAA,CACA/jB,KAAA,cACAikB,MAAA,sJACA6M,QAAA,EACAQ,SAAA,cACAP,QAAA,CAAA/pB,EAAAgqB,KACA,IAAAgG,EAAAsE,GAAAtK,EAAA,GAAAhqB,GACA,OACAhH,KAAA,cACAuZ,KAAAvS,EAAAkqB,OAAA3X,KACAnN,KAAAgvB,GAAAp0B,EAAAiqB,UAAA7kB,KACAsmB,OAAA0I,GAAAp0B,EAAAiqB,UAAAyB,OACAsE,MAAAA,EAAAl4B,OAGAolB,YAAA,CAAAzb,EAAA0C,IACA,MAAA1C,EAAAuuB,MAGA5X,GAAA,CAAA3W,EAAAiqB,SAEA0H,GAAA3xB,EAAAuuB,MAAAvuB,EAAA2D,KAAAjB,EAAA1C,EAAA8Q,KAAA,CAAA9Q,EAAAiqB,SAEAvO,cAAA1b,IACA,IAAAiJ,EAAA,GACA,MAAAjJ,EAAAuuB,OACAtlB,EAAApS,KAAA4oB,GAAAzf,EAAAuuB,MAAAvuB,EAAA8Q,OAEA,IAAApE,EAAA,IAAAyS,GAAA,KAAAlW,GACA,UAAAjJ,EAAAiqB,QAAA,WAAAjqB,EAAAiqB,OAGAvd,EAAAE,aAAA,gBAIAF,EAAAE,aAAA,iBAEAF,EAAAE,aAAA,mBACA,IAAAjJ,EAAAsI,EAAAylB,GAAA1xB,EAAA2D,OAGA,OAFA+I,EAAAE,aAAA,UAAAjJ,GACA+I,EAAAE,aAAA,UAAAjJ,GACA+I,KAQA4O,GAAA,CACA/jB,KAAA,kBACAikB,MAAA,YACA6M,QAAA,EACA2B,WAAA,EACA1B,QAAA,CAAA/pB,EAAAgqB,KAIA,IAAArnB,EAAA3C,EAAAkqB,OAAA6D,OAAAnrB,OAAAgsB,IAAA,mBACA,GAAAjsB,GAAA,iBAAAA,EACA,UAAAzC,EAAA,gDAEA,OACAlH,KAAA,kBACAuZ,KAAAvS,EAAAkqB,OAAA3X,KACAyd,MAAAsE,GAAAtK,EAAA,GAAAhqB,GAAAlI,KACA6K,YAIAoa,GAAA,CACA/jB,KAAA,YACAikB,MAAA,WACA6M,QAAA,EACA2B,WAAA,EACA1B,QAAA,CAAA/pB,EAAAgqB,KACA,IAAAgG,EAAAsE,GAAAtK,EAAA,GAAAhqB,GACAkqB,EAAAlqB,EAAAkqB,SAEAA,EAAAuK,eAEA,IAAAv8B,EAAAgyB,EAAA+D,iBAAA,KACA/D,EAAAuK,eAEAvK,EAAAwK,OAAA,cACA,IAAAC,EAAAnM,GAAA0B,EAAAiF,gBAAA,mBACA,OACAn2B,KAAA,YACAuZ,KAAA2X,EAAA3X,KACAra,OACAwxB,KAAAsG,EAAAl4B,KACA68B,MAAAA,EAAA3E,MACA4E,WAAAD,EAAAhyB,QAGAua,YAAA,CAAAzb,EAAA0C,KACAqwB,GAAA/yB,GAOA,IALA,IAmBAozB,EAsBAC,EAzCAzhB,EAAA0K,GAAAtc,EAAAvJ,KAAAiM,GAAA,sBACA+tB,EAAA,EACA6C,EAAA,EACAC,GAAA,EAEAx6B,EAAA,EAAoBA,EAAA6Y,EAAAxf,OAAkB2G,IAAA,CAEtC65B,GADAhhB,EAAA7Y,IAEAw6B,GAAA,GAEA9C,EAAAr3B,KAAAqI,IAAAmQ,EAAA7Y,GAAAnF,OAAA68B,GACA6C,EAAAl6B,KAAAqI,IAAAmQ,EAAA7Y,GAAAoQ,MAAAmqB,GAEA,CAkBA,GAdA7C,GAAA/tB,EAAA+I,eACA6nB,GAAA5wB,EAAA+I,eAIA2nB,EAFA,MAAApzB,EAAAioB,KAEAhK,GAAAvb,EAAA,WAIA6vB,GAAAvyB,EAAAioB,KAAAwI,EAAA6C,EAAA5wB,EAAA1C,EAAA8Q,KAAA,WAGAc,EAAAgM,QAAAwV,GAEAG,EACA,QAAA7lB,EAAA,EAAuBA,EAAAkE,EAAAxf,OAAmBsb,IAAA,CAC1C,IAAA8lB,EAAA5hB,EAAAlE,GACA,GAAAklB,GAAAY,GAAA,CACA,IAAAC,EAAAD,EAAAC,SAEA7hB,EAAAlE,GAAA6kB,GAAAkB,EAAAlF,MAAAkC,EAAA6C,EAAAG,EAAA/wB,QAAA1C,EAAA8Q,KAAA,GACA,CACA,CAIA,SAAA9Q,EAAAkzB,MACAG,EAAApV,GAAAvb,EAAA,gBACM,CACN,IAAAgxB,EAAA1zB,EAAAmzB,WAAAzwB,EAAAmf,UAAA7hB,EAAAmzB,YAAAzwB,EACA2wB,EAAAd,GAAAvyB,EAAAkzB,MAAAzC,EAAA6C,EAAAI,EAAA1zB,EAAA8Q,KAAA,WACA,CAGA,OADAc,EAAA/a,KAAAw8B,GACA1c,GAAA,WAAA/E,EAAAlP,IAEAgZ,cAAA,CAAA1b,EAAA0C,KACAqwB,GAAA/yB,GACA,IAAA4R,EAAAoO,GAAAhgB,EAAAvJ,KAAAiM,GACA,SAAA1C,EAAAioB,KAAA,CACA,IAAA0L,EAAA,IAAAxU,GAAA,MAAAM,GAAAzf,EAAAioB,KAAAjoB,EAAA8Q,QACA6iB,EAAA/mB,aAAA,gBACAgF,EAAAgM,QAAA+V,EACA,CACA,SAAA3zB,EAAAkzB,MAAA,CACA,IAAAU,EAAA,IAAAzU,GAAA,MAAAM,GAAAzf,EAAAkzB,MAAAlzB,EAAA8Q,QACA8iB,EAAAhnB,aAAA,gBACA5M,EAAAmzB,YACAS,EAAAhnB,aAAA,YAAA5M,EAAAmzB,YAEAvhB,EAAA/a,KAAA+8B,EACA,CACA,OAAAlU,GAAA9N,MAGA0J,GAAA,CACA/jB,KAAA,SACAikB,MAAA,aACA6M,QAAA,EACA2B,WAAA,EACA1B,QAAA,CAAA/pB,EAAAgqB,KACA,IAAAgG,EAAAsE,GAAAtK,EAAA,GAAAhqB,GACA,IAAAA,EAAAkqB,OAAAuK,eACA,UAAAv0B,EAAA,oCAAA8vB,GAEA,OACAh3B,KAAA,SACAuZ,KAAAvS,EAAAkqB,OAAA3X,KACAyd,MAAAA,EAAAl4B,OAGAolB,YAAA,CAAAzb,EAAA0C,KACA,IAAA8wB,EAcA,MAbA,MAAAxzB,EAAAuuB,MACAiF,EAAAvV,GAAAvb,EAAA,KAEA8wB,EAAA7B,GAAA3xB,EAAAuuB,MAAA,EAAA7rB,EAAA1C,EAAA8Q,KAAA,KAKA2iB,SAAA,CACAlF,MAAAvuB,EAAAuuB,MACA7rB,WAGA8wB,GAEA9X,cAAA,CAAA1b,EAAA0C,KAKA,IAAAmxB,EAAA,WAAA7zB,EAAAuuB,OAAA,MAAAvuB,EAAAuuB,MAAA9O,GAAA,YAAAA,GAAAzf,EAAAuuB,MAAAvuB,EAAA8Q,MACAgjB,EAAA,IAAA3U,GAAA,MAAA0U,IAMA,OALAC,EAAAlnB,aAAA,gBAGAknB,EAAAlnB,aAAA,mBACAknB,EAAAlnB,aAAA,mBACAknB,KAgMAxY,GAAA,CACA/jB,KAAA,UACAikB,MAAA,eACA6M,QAAA,EACAM,eAAA,EACAE,SAAA,iBACA,OAAAP,CAAA1M,EAAA2M,EAAAW,GACA,IAAAT,OACAA,EAAAD,SACAA,GACM5M,EACN1a,EAAA6lB,GAAAwB,EAAA,kBAAArnB,MACAzK,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAsU,MAAAoD,EACAuL,gBAAA7yB,EACAzK,OAEA,EACAglB,YAjNA,CAAAzb,EAAA0C,KAIA,IAGAsxB,EACAC,EAlqQAngC,EAwvQA8kB,EA1FAhH,EAAAsF,GAAAyF,GAAA3c,EAAAvJ,KAAAiM,GAAAA,GACA0iB,EAAAplB,EAAAolB,MAAAxsB,MAAA,GACA0S,EAAA5I,EAAA+I,eAQAyoB,EAAA/zB,EAAAH,EAAAvJ,MACA,YAAA2uB,GACA4O,EAAArd,GAAA,sBACA/iB,OAAA8O,EAAA6I,cAAAwE,qBAAAzE,EACA2oB,GAAA,GAAAvxB,EAAA6I,cAAAM,aACI,aAAAuZ,EAAA,CAEJ,IAAA+O,EAAA/oB,EAAA,CACAY,OAAA,GACAb,KAAA,MACKzI,GACLmlB,EAAAzc,EAAA,CACAY,OAAA,IACAb,KAAA,MACKzI,GAGL4I,GADA5I,EAAAkf,mBACAnW,eACA,IAAA2oB,EAAAxiB,EAAAhe,OAAAge,EAAAzI,MAAAgrB,EAAAtM,EAEAjW,EAAAvI,MAAAgrB,YAAApoB,EAAAmoB,EAAA,EAAAD,GAEA,IAAAvO,EAAAxsB,KAAAC,MAAA,IAAA+6B,EAAA9oB,GACAlG,EA7rQA,YAFAtR,EA+rQA8xB,GA7rQA,QADA9xB,EAAA,EACA,mBAAAA,EAAA,gBA8rQAsmB,EAAA,IAAAjM,GAAA,KAAAE,GAAA,QAAAjJ,IAAA,CACAzR,MAAA,QACAC,OAAAqY,EAAA2Z,EAAA,KACA5yB,QAAA,cAAA4yB,EACAvL,oBAAA,oBAGA2Z,EAAApd,GAAA,eAAAwD,GAAA1X,IACA2G,MAAAzV,OAAAqY,EAAAmoB,GACAH,EAAAriB,EAAAzI,MAAAgrB,EAAAtM,CACA,KAAI,CAYJ,IAAAyM,EACAC,EAXA,SAAAhxB,KAAA6hB,GACA8O,GACAtiB,EAAA1I,QAAArS,KAAA,cAEM,SAAAuuB,EACNxT,EAAA1I,QAAArS,KAAA,WAEA+a,EAAA1I,QAAArS,KAAA,UAKA,IAAA29B,EAAA,EAEA,MAAAjxB,KAAA6hB,IACAoP,EAAAp7B,KAAAqI,IAAAiB,EAAA6I,cAAAkF,SAEA/N,EAAAnB,kBAEAgzB,EADAD,EAAA5xB,EAAA6I,cAAAiF,SAAA,aAAA4U,EAAA,EAAAoP,IAEM,SAAApP,GAENkP,EAAA,GADAE,EAAAp7B,KAAAqI,IAAAiB,EAAA6I,cAAAwE,qBAAArN,EAAAnB,mBAEAgzB,EAAAn7B,KAAAqI,IAAA,MAAAmQ,EAAAzI,QAGAorB,EADAD,EAAAJ,EAAA,KAGAF,EA7wEA,SAAApiB,EAAAwT,EAAAkP,EAAAC,EAAA7xB,GAEA,IAAAsxB,EACAtB,EAAA9gB,EAAAhe,OAAAge,EAAAzI,MAAAmrB,EAAAC,EACA,qBAAAhxB,KAAA6hB,IAEA,GADA4O,EAAArd,GAAA,YAAAyO,GAAA,GAAA1iB,GACA,SAAA0iB,EAAA,CACA,IAAAlkB,EAAAwB,EAAAxB,OAAAwB,EAAA8J,WACAtL,IACA8yB,EAAA3qB,MAAAorB,YAAAvzB,EAEA,MACI,CAIJ,IAAAwzB,EAAA,GACA,eAAAnxB,KAAA6hB,IACAsP,EAAA79B,KAAA,IAAA2X,GAAA,CACAmmB,GAAA,IACAC,GAAA,IACAC,GAAA,OACAC,GAAA,OACA,4BAGA,aAAAvxB,KAAA6hB,IACAsP,EAAA79B,KAAA,IAAA2X,GAAA,CACAmmB,GAAA,IACAC,GAAA,OACAC,GAAA,OACAC,GAAA,IACA,4BAGA,IAAA1a,EAAA,IAAAjM,GAAAumB,EAAA,CACA/gC,MAAA,OACAC,OAAAqY,EAAAymB,KAEAsB,EAAApd,GAAA,IAAAwD,GAAA1X,EACA,CAGA,OAFAsxB,EAAApgC,OAAA8+B,EACAsB,EAAA3qB,MAAAzV,OAAAqY,EAAAymB,GACAsB,CACA,CAiuEAe,CAAAnjB,EAAAwT,EAAAkP,EAAAC,EAAA7xB,GACA,uBAAAa,KAAA6hB,IACA4O,EAAA3qB,MAAA2rB,YAAA,QACAhB,EAAA3qB,MAAA4rB,YAAAhpB,EAAAuoB,IACM,SAAApP,GAAA,OAAAoP,IACNR,EAAA3qB,MAAA6rB,eAAAjpB,EAAAuoB,GACAR,EAAA3qB,MAAA8rB,iBAAAlpB,EAAAuoB,IAEAP,EAAAriB,EAAAzI,MAAAorB,EACAv0B,EAAA+zB,kBACAC,EAAA3qB,MAAA0qB,gBAAA/zB,EAAA+zB,gBACA/zB,EAAAy0B,cACAT,EAAA3qB,MAAAorB,YAAAz0B,EAAAy0B,aAGA,CAEA,GAAAz0B,EAAA+zB,gBACAnb,EAAAzB,GAAA,CACAE,aAAA,kBACApO,SAAA,CAEA,CACA1R,KAAA,OACAmf,KAAAsd,EACAxc,MAAAyc,GACO,CACP18B,KAAA,OACAmf,KAAA9E,EACA4F,MAAA,UAGI,CACJ,IAAAtO,EAAA,eAAA3F,KAAA6hB,GAAA,iBACAxM,EAAAzB,GAAA,CACAE,aAAA,kBACApO,SAAA,CAEA,CACA1R,KAAA,OACAmf,KAAA9E,EACA4F,MAAA,GACO,CACPjgB,KAAA,OACAmf,KAAAsd,EACAxc,MAAAyc,EACA3b,eAAApP,KAGA,CAOA,MANA,SAAA3F,KAAA6hB,KAGAxM,EAAAhlB,OAAAge,EAAAhe,OACAglB,EAAAzP,MAAAyI,EAAAzI,OAEA,SAAA5F,KAAA6hB,KAAA8O,EAEAvd,GAAA,uBAAAiC,GAAAlW,GAEAiU,GAAA,UAAAiC,GAAAlW,IAwEAgZ,cArEA,CAAA1b,EAAA0C,KACA,IAAA8N,EACA9D,EAAA,IAAAyS,GAAAnf,EAAAolB,MAAA5b,SAAA,kCAAA0W,GAAAlgB,EAAAvJ,KAAAiM,KACA,OAAA1C,EAAAolB,OACA,eACA1Y,EAAAE,aAAA,+BACA,MACA,gBACAF,EAAAE,aAAA,iCACA,MACA,cACAF,EAAAE,aAAA,0BACA,MACA,aACAF,EAAAE,aAAA,+BACA,MACA,aACAF,EAAAE,aAAA,kBACA,MACA,aACAF,EAAAE,aAAA,wBACA,MACA,kBACA,iBAQA,GALA4D,EAAA9N,EAAA6I,cAAAiF,QAAA9N,EAAA6I,cAAAC,QACAkB,EAAAE,aAAA,cAAA4D,EAAA,MACA9D,EAAAE,aAAA,eAAA4D,EAAA,MACA9D,EAAAE,aAAA,SAAA4D,EAAA,MACA9D,EAAAE,aAAA,UAAA4D,EAAA,MACA,gBAAAxQ,EAAAolB,MAAA,CACA,IAAAgQ,EAAAh8B,KAAAqI,IAAAiB,EAAA6I,cAAAkF,SAEA/N,EAAAnB,kBACAmL,EAAAE,aAAA,mBAAAX,EAAAmpB,GAAA,UAAAp1B,EAAAy0B,YACA,CACA,MACA,gBACA/nB,EAAAE,aAAA,kDAMA,OAHA5M,EAAA+zB,iBACArnB,EAAAE,aAAA,iBAAA5M,EAAA+zB,iBAEArnB,KA0BA4O,GAAA,CACA/jB,KAAA,UACAikB,MAAA,gBACA6M,QAAA,EACAM,eAAA,EACAE,SAAA,yBACA,OAAAP,CAAAkC,EAAAjC,EAAAW,GACA,IAAAT,OACAA,EAAAD,SACAA,GACMgC,EACNiK,EAAA1N,GAAAwB,EAAA,kBAAArnB,MACA6yB,EAAAhN,GAAAwB,EAAA,kBAAArnB,MACAzK,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAsU,MAAAoD,EACAuL,kBACAU,cACAh+B,OAEA,IAEA6kB,GAAA,CACA/jB,KAAA,UACAikB,MAAA,WACA6M,QAAA,EACAQ,SAAA,SACAF,eAAA,EACA,OAAAL,CAAAmC,EAAAlC,GACA,IAAAE,OACAA,GACMgC,EACN,OACAlzB,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAsU,MAAA,SACA3uB,KAAA8xB,EAAA,GAEA,IAEAjN,GAAA,CACA/jB,KAAA,UACAikB,MAAA,+CACA6M,QAAA,EACA,OAAAC,CAAA4F,EAAA3F,GACA,IAAAE,OACAA,EAAAD,SACAA,GACM0F,EACNz3B,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAsU,MAAAoD,EACA/xB,OAEA,IAEA6kB,GAAA,CACA/jB,KAAA,UACAikB,MAAA,WACA6M,QAAA,EACAM,eAAA,EACA,OAAAL,CAAA+M,EAAA9M,GACA,IAAAE,OACAA,EAAAD,SACAA,GACM6M,EACN,SAAA5M,EAAA3X,MACA2X,EAAAlG,SAAA1f,gBAAA,uDAEA,IAAApM,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAsU,MAAAoD,EACA/xB,OAEA,IAEA6kB,GAAA,CACA/jB,KAAA,UACAikB,MAAA,WACA6M,QAAA,EACAQ,SAAA,SACAF,eAAA,EACA,OAAAL,CAAAgN,EAAA/M,GACA,IAAAE,OACAA,GACM6M,EACN,OACA/9B,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAsU,MAAA,SACA3uB,KAAA8xB,EAAA,GAEA,IAQA,IAAAgN,GAAA,GACA,SAAAC,GAAA5Z,GAiBA,IAhBA,IAAArkB,KACAA,EAAAikB,MACAA,EAAA7oB,MACAA,EAAA21B,QACAA,EAAA7M,YACAA,EAAAC,cACAA,GACIE,EAEJL,EAAA,CACAhkB,OACA8wB,QAAA11B,EAAA01B,SAAA,EACAM,eAAA,EACAM,gBAAA,EACAX,WAEAvvB,EAAA,EAAkBA,EAAAyiB,EAAAppB,SAAkB2G,EAIpCw8B,GAAA/Z,EAAAziB,IAAAwiB,EAEAE,IACAL,GAAA7jB,GAAAkkB,GAEAC,IACAL,GAAA9jB,GAAAmkB,EAEA,CAOA,IAAA+Z,GAAA,GAEA,SAAAC,GAAAv+B,EAAAV,GACAg/B,GAAAt+B,GAAAV,CACA,CAMA,MAAAk/B,GAEA,WAAA3gC,CAAAgK,EAAAL,EAAAC,GAEA1J,KAAA8J,WAAA,EAEA9J,KAAAyJ,WAAA,EAEAzJ,KAAA0J,SAAA,EACA1J,KAAA8J,MAAAA,EACA9J,KAAAyJ,MAAAA,EACAzJ,KAAA0J,IAAAA,CACA,CASA,YAAAg3B,CAAAC,EAAAj6B,GACA,OAAAA,EAEMi6B,GAAAA,EAAA/2B,KAAAlD,EAAAkD,KAAA+2B,EAAA/2B,IAAAE,QAAApD,EAAAkD,IAAAE,MAGN,IAAA22B,GAAAE,EAAA/2B,IAAAE,MAAA62B,EAAA/2B,IAAAH,MAAA/C,EAAAkD,IAAAF,KAFA,KAFAi3B,GAAAA,EAAA/2B,GAMA,EAgBA,MAAAg3B,GAEA,WAAA9gC,CAAAqB,EAEAyI,GACA5J,KAAAmB,UAAA,EACAnB,KAAA4J,SAAA,EACA5J,KAAAk4B,cAAA,EAEAl4B,KAAA6gC,kBAAA,EACA7gC,KAAAmB,KAAAA,EACAnB,KAAA4J,IAAAA,CACA,CAKA,KAAA82B,CAAAI,EAEA3/B,GACA,WAAAy/B,GAAAz/B,EAAAs/B,GAAAC,MAAA1gC,KAAA8gC,GACA,EAIA,SAAAC,GAAAxN,GAGA,IAAAyN,EAAA,GACAzN,EAAA+E,gBACA,IAAA2I,EAAA1N,EAAAgF,QAAAp3B,KAOA,IANA,YAAA8/B,IAEA1N,EAAA2N,UACA3N,EAAA+E,gBACA2I,EAAA1N,EAAAgF,QAAAp3B,MAEA,YAAA8/B,GAAA,gBAAAA,GACA1N,EAAA2N,UACAF,EAAAr/B,KAAA,gBAAAs/B,GACA1N,EAAA+E,gBACA2I,EAAA1N,EAAAgF,QAAAp3B,KAEA,OAAA6/B,CACA,CACA,IAAAG,GAAA93B,IAEA,IADAA,EAAAkqB,OAAAlG,SACAjiB,YACA,UAAA7B,EAAA,IAA2BF,EAAA+3B,QAA3B,wCAGAC,GAAA,IAAAr2B,IAAA,sBAMA,SAAAs2B,GAAAr/B,GACA,IAAAA,EAAAqS,SAAA,MACA,OAAArS,EAAAqS,SAAA,IAGA,CAOA,SAAAitB,GAAAhO,EAAA7M,EAAAvS,GACA,IAAAqtB,oBACAA,EAAAC,OACAA,EAAAC,KACAA,EAAAC,aACAA,EAAAC,kBACAA,EAAAC,QACAA,EAAAC,UACAA,EAAAC,eACAA,EAAAC,WACAA,EAAAv2B,MACAA,GACIib,EAQJ,GAPA6M,EAAA6D,OAAA6K,aACAH,GAGAvO,EAAA6D,OAAAnrB,OAAAorB,IAAA,uBAGAsK,EAAA,CACA,IAAAhoB,EAAA4Z,EAAA6D,OAAA8K,kBAAA,kBACA,SAAAvoB,EAEAgoB,EAAA,OAGA,KADAA,EAAAn1B,WAAAmN,KACAgoB,EAAA,EACA,UAAAp4B,EAAA,2BAAAoQ,EAGA,CAEA4Z,EAAA6D,OAAA6K,aACA,IAAAE,EAAA,GACA5gC,EAAA,CAAA4gC,GACAC,EAAA,GACAC,EAAA,GACAC,EAAA,MAAAT,EAAA,QAAAngC,EAIA,SAAA6gC,IACAV,GACAtO,EAAA6D,OAAAnrB,OAAAorB,IAAA,kBAEA,CACA,SAAAmL,IACAF,IACA/O,EAAA6D,OAAAnrB,OAAAgsB,IAAA,aACAqK,EAAA3gC,KAAA4xB,EAAAkP,SAAA,KAAA7B,GAAA,eACArN,EAAA6D,OAAAnrB,OAAAorB,IAAA,gBAAA31B,GAAA,IAEA4gC,EAAA3gC,KAAA4M,QAAAszB,IAAA,MAAAtO,EAAA6D,OAAAnrB,OAAAgsB,IAAA,aAGA,CAIA,IAHAsK,IAEAF,EAAA1gC,KAAAo/B,GAAAxN,MACA,CAEA,IAAAmP,EAAAnP,EAAA+D,iBAAA,EAAAwK,EAAA,gBACAvO,EAAA6D,OAAAuL,WACApP,EAAA6D,OAAA6K,aACA,IAAAW,EAAA,CACAvgC,KAAA,WACAuZ,KAAA2X,EAAA3X,KACAra,KAAAmhC,GAEAvuB,IACAyuB,EAAA,CACAvgC,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAzH,QACAmiB,WAAA,EACA/0B,KAAA,CAAAqhC,KAGAT,EAAAxgC,KAAAihC,GACA,IAAA1hB,EAAAqS,EAAAgF,QAAAp3B,KACA,SAAA+f,EAAA,CACA,GAAA8gB,GAAAG,EAAAjlC,SAAA8kC,EAAA,CACA,GAAAF,GAAAF,EAEA,UAAAr4B,EAAA,6BAAAgqB,EAAAsP,WAGAtP,EAAAlG,SAAA1f,gBAAA,sEAEA,CACA4lB,EAAA2N,SACA,KAAM,cAAAhgB,EAAA,CACNshB,IAKA,IAAAL,EAAAjlC,QAAA,YAAA0lC,EAAAvgC,MAAA,IAAAugC,EAAArhC,KAAArE,QAAA,aAAA0lC,EAAArhC,KAAA,GAAAc,MAAA,IAAAugC,EAAArhC,KAAA,GAAAA,KAAArE,SAAAqE,EAAArE,OAAA,IAAA6kC,IACAxgC,EAAAqnB,MAEAyZ,EAAAnlC,OAAAqE,EAAArE,OAAA,GACAmlC,EAAA1gC,KAAA,IAEA,KACA,CAAM,YAAAuf,EAmBN,UAAA3X,EAAA,sCAAAgqB,EAAAsP,WAlBAtP,EAAA2N,UACA,IAAAzyB,OAAA,EAMA,MAAA8kB,EAAA6D,OAAAG,SAAAp2B,OACAsN,EAAA8kB,EAAAiE,gBAAA,IAEA4K,EAAAzgC,KAAA8M,EAAAA,EAAA5F,MAAA,MACA25B,IAEAH,EAAA1gC,KAAAo/B,GAAAxN,IACA4O,EAAA,GACA5gC,EAAAI,KAAAwgC,GACAI,GAGA,CACA,CAKA,OAHAhP,EAAA6D,OAAAuL,WAEApP,EAAA6D,OAAAuL,WACA,CACAtgC,KAAA,QACAuZ,KAAA2X,EAAA3X,KACA6lB,SACAE,eACApgC,OACAmgC,OACAU,UACAZ,sBACAa,kBACAT,oBACAU,OACA72B,QAEA,CAGA,SAAAq3B,GAAA1B,GACA,YAAAA,EAAA19B,MAAA,KACA,UAEA,MAEA,CACA,IAAAq/B,GAAA,SAAAj4B,EAAA0C,GACA,IAAApQ,EACA4lC,EACAC,EAAAn4B,EAAAvJ,KAAArE,OACAmlC,EAAAv3B,EAAAu3B,gBACA5sB,EAAA,EACAlU,EAAA,IAAAN,MAAAgiC,GACAC,EAAA,GACA5D,EAAAp7B,KAAAqI,IAEAiB,EAAA6I,cAAAgF,eAAA7N,EAAAnB,kBAEA4I,EAAA,EAAAzH,EAAA6I,cAAAC,QACA6sB,EAAA,EAAAluB,EACAnK,EAAA82B,mBAAA,UAAA92B,EAAA82B,oBAOAuB,EADA31B,EAAAkJ,YAAAvH,EAAAG,QAAAiH,eACA/I,EAAA+I,eAAA,OAGA,IAAA6sB,EAAA,OAAAt4B,EAAA82B,kBAAA1rB,EAAA,CACAY,OAAA,EACAb,KAAA,MACGzI,GAAA,GAAAyH,EAGHouB,EAAA,EAAApuB,EACAquB,EAAAx4B,EAAA62B,aAAAyB,EACAG,EAAA,GAAAD,EACAE,EAAA,GAAAF,EACA9F,EAAA,EAEA,SAAAiG,EAAAC,GACA,QAAA7/B,EAAA,EAAoBA,EAAA6/B,EAAAxmC,SAAwB2G,EAC5CA,EAAA,IACA25B,GAAA,KAEA0F,EAAAvhC,KAAA,CACAgiC,IAAAnG,EACAoG,SAAAF,EAAA7/B,IAGA,CAEA,IADA4/B,EAAApB,EAAA,IACAjlC,EAAA,EAAcA,EAAA0N,EAAAvJ,KAAArE,SAAuBE,EAAA,CACrC,IAAAymC,EAAA/4B,EAAAvJ,KAAAnE,GACAsB,EAAA6kC,EACAtvB,EAAAuvB,EACA/tB,EAAAouB,EAAA3mC,SACAuY,EAAAouB,EAAA3mC,QAEA,IAAA4mC,EAAA,CACAC,MAAA,IAAA9iC,MAAA4iC,EAAA3mC,QACAwB,OAAA,EACAuV,MAAA,EACA0vB,IAAA,GAEA,IAAAX,EAAA,EAAgBA,EAAAa,EAAA3mC,SAAkB8lC,EAAA,CAClC,IAAAgB,EAAAvc,GAAAoc,EAAAb,GAAAx1B,GACAyG,EAAA+vB,EAAA/vB,QACAA,EAAA+vB,EAAA/vB,OAEAvV,EAAAslC,EAAAtlC,SACAA,EAAAslC,EAAAtlC,QAEAolC,EAAAC,MAAAf,GAAAgB,CACA,CACA,IAAAC,EAAAn5B,EAAAs3B,QAAAhlC,GACA8mC,EAAA,EACAD,IACAC,EAAAhuB,EAAA+tB,EAAAz2B,IACA,IAGAyG,GADAiwB,GAAAV,KAEAvvB,EAAAiwB,GAEAA,EAAA,GAOAp5B,EAAA22B,QAAArkC,EAAA0N,EAAAvJ,KAAArE,OAAA,IACA+W,GAAAovB,GAEAS,EAAAplC,OAAAA,EACAolC,EAAA7vB,MAAAA,EACAupB,GAAA9+B,EACAolC,EAAAH,IAAAnG,EACAA,GAAAvpB,EAAAiwB,EACA3iC,EAAAnE,GAAA0mC,EAEAL,EAAApB,EAAAjlC,EAAA,GACA,CACA,IAGA+mC,EACAC,EAJAC,EAAA7G,EAAA,EAAAhwB,EAAA6I,cAAAuE,WACA0pB,EAAAx5B,EAAA42B,MAAA,GACAA,EAAA,GAGA6C,EAAA,GACA,GAAAz5B,EAAAw3B,MAAAx3B,EAAAw3B,KAAAkC,KAAA7a,GAAAA,GAGA,IAAAvsB,EAAA,EAAgBA,EAAA6lC,IAAQ7lC,EAAA,CACxB,IAAAqnC,EAAAljC,EAAAnE,GACAklB,EAAAmiB,EAAAd,IAAAU,EACA1a,EAAA7e,EAAAw3B,KAAAllC,GACAsnC,OAAA,GAGAA,GAFA,IAAA/a,EAEAlI,GAAA,eAAAjU,GAGAiU,GAAA,IAFQ,IAAAkI,EAER,GAGAvC,GAAAuC,EAAAnc,GAAA,GAHAA,IAKAyG,MAAAwwB,EAAAxwB,MACAywB,EAAAhmC,OAAA+lC,EAAA/lC,OACA6lC,EAAA5iC,KAAA,CACAU,KAAA,OACAmf,KAAAkjB,EACApiB,SAEA,CAEA,IAAA0gB,EAAA,EAAAoB,EAAA,EAGApB,EAAAvtB,GAAA2uB,EAAAE,EAAApnC,SAAkD8lC,IAAAoB,EAAA,CAIlD,IAHA,IAAAO,EACAC,EAAAN,EAAAF,GACAS,GAAA,EACA,sBAAAC,EAAAF,QAAA,EAAAE,EAAAziC,OAAA,CACA,IAAAyiC,EAQA,GALAD,KACAV,EAAA1iB,GAAA,qBACAtN,MAAA1V,MAAAsY,EAAAvJ,EAAA6I,cAAA+E,eACAsmB,EAAA//B,KAAAwiC,IAEA,MAAAS,EAAAG,WAAA,MAAAH,EAAAG,UAaA,UAAAx7B,EAAA,2BAAAq7B,EAAAG,WAZA,IAAAC,EAAA,MAAAJ,EAAAG,UAAA,iBACAA,EAAAtjB,GAAA,0BAAAjU,GACAu3B,EAAA5wB,MAAAzV,OAAAqY,EAAAymB,GACAuH,EAAA5wB,MAAA8rB,iBAAAlpB,EAAAuoB,GACAyF,EAAA5wB,MAAA8wB,iBAAAD,EACAD,EAAA5wB,MAAA+wB,OAAA,KAAAnuB,GAAAuoB,EAAA,GACA,IAAA6F,EAAA3H,EAAA6G,EACAc,IACAJ,EAAA5wB,MAAAqV,cAAAzS,GAAAouB,IAEAzD,EAAA//B,KAAAojC,GAKAH,EAAAN,IADAF,GAEAS,GAAA,CACA,CACA,KAAA7B,GAAAvtB,GAAA,CAGA,IAEA2vB,EAAAC,EAFAC,OAAA,EACA,GAAAtC,EAAA,GAAAl4B,EAAA02B,oBAGA,KADA8D,EAAA,OAAAF,EAAA,OAAAC,EAAAT,QAAA,EAAAS,EAAAE,QAAAH,EAAAjC,MAEAgB,EAAA1iB,GAAA,qBACAtN,MAAA1V,MAAAsY,EAAAuuB,GACA5D,EAAA//B,KAAAwiC,IAGA,IAAAqB,EAAA,GACA,IAAApoC,EAAA,EAAgBA,EAAA6lC,IAAQ7lC,EAAA,CACxB,IAAA+kC,EAAA5gC,EAAAnE,GACAokB,EAAA2gB,EAAA4B,MAAAf,GACA,GAAAxhB,EAAA,CAGA,IAAAikB,EAAAtD,EAAAwB,IAAAU,EACA7iB,EAAAvN,MAAAkuB,EAAAluB,MACAuN,EAAA9iB,OAAAyjC,EAAAzjC,OACA8mC,EAAA7jC,KAAA,CACAU,KAAA,OACAmf,KAAAA,EACAc,MAAAmjB,GAPA,CASA,CACA,IAOAC,GAAAC,GAPAC,GAAA3jB,GAAA,CACAE,aAAA,kBACApO,SAAAyxB,IAEAK,GAAApkB,GAAA,uBAAAkjB,EAAAC,QAAA,EAAAD,EAAAmB,QAAA,OAAAF,KAEA,GADAlE,EAAA//B,KAAAkkC,IACA7C,EAAAvtB,EAAA,GAAA3K,EAAA02B,oBAGA,KADA8D,EAAA,OAAAI,GAAA,OAAAC,GAAAf,QAAA,EAAAe,GAAAI,SAAAL,GAAAvC,MAEAgB,EAAA1iB,GAAA,qBACAtN,MAAA1V,MAAAsY,EAAAuuB,GACA5D,EAAA//B,KAAAwiC,GAvCA,CA0CA,CACA,IAAA6B,GAAAvkB,GAAA,WAAAigB,GAEA,GAAAwB,EAAAhmC,OAAA,GAQA,IAPA,IAAA2kB,GAAAF,GAAA,QAAAnU,EAAA8xB,GACA2G,GAAAtkB,GAAA,YAAAnU,EAAA8xB,GACA4G,GAAA,EACA7jC,KAAA,OACAmf,KAAAwkB,GACA1jB,MAAA,IAEA4gB,EAAAhmC,OAAA,IACA,IAAAipC,GAAAjD,EAAAta,MACAwd,GAAAD,GAAAxC,IAAAU,EACA8B,GAAAvC,SACAsC,GAAAvkC,KAAA,CACAU,KAAA,OACAmf,KAAAykB,GACA3jB,MAAA8jB,KAGAF,GAAAvkC,KAAA,CACAU,KAAA,OACAmf,KAAAK,GACAS,MAAA8jB,IAGA,CACAJ,GAAA/jB,GAAA,CACAE,aAAA,kBACApO,SAAAmyB,IAEA,CACA,OAAA3B,EAAArnC,OACA,OAAAukB,GAAA,UAAAukB,IAAAx4B,GAEA,IAAA64B,GAAApkB,GAAA,CACAE,aAAA,kBACApO,SAAAwwB,IAEA+B,GAAA7kB,GAAA,SAAA4kB,IAAA74B,GACA,OAAAmT,GAAA,CAAAqlB,GAAAM,IAEA,EACAC,GAAA,CACAvD,EAAA,UACAwD,EAAA,QACAppC,EAAA,UAEAqpC,GAAA,SAAA37B,EAAA0C,GAIA,IAHA,IAAAk5B,EAAA,GACAC,EAAA,IAAA1c,GAAA,uBACAN,EAAA,IAAAM,GAAA,0BACApmB,EAAA,EAAkBA,EAAAiH,EAAAvJ,KAAArE,OAAuB2G,IAAA,CAGzC,IAFA,IAAA4gC,EAAA35B,EAAAvJ,KAAAsC,GACAs+B,EAAA,GACAyE,EAAA,EAAoBA,EAAAnC,EAAAvnC,OAAe0pC,IACnCzE,EAAAxgC,KAAA,IAAAsoB,GAAA,OAAAe,GAAAyZ,EAAAmC,GAAAp5B,MAEA1C,EAAAw3B,MAAAx3B,EAAAw3B,KAAAz+B,KACAs+B,EAAAzZ,QAAAie,GACAxE,EAAAxgC,KAAAglC,GACA77B,EAAAW,MACA02B,EAAAzZ,QAAAiB,GAEAwY,EAAAxgC,KAAAgoB,IAGA+c,EAAA/kC,KAAA,IAAAsoB,GAAA,MAAAkY,GACA,CACA,IAAA0E,EAAA,IAAA5c,GAAA,SAAAyc,GAWAxC,EAAA,KAAAp5B,EAAA62B,aAAA,GACA,IAAA72B,EAAA62B,aAAA,GAAA72B,EAAA22B,OAAA,OACAoF,EAAAnvB,aAAA,aAAAX,EAAAmtB,IAGA,IAAA4C,EAAA,GACAhB,EAAA,GACA,GAAAh7B,EAAA42B,MAAA52B,EAAA42B,KAAAxkC,OAAA,GAEA,IAAAwkC,EAAA52B,EAAA42B,KACAqF,EAAA,GACAC,GAAA,EACAC,EAAA,EACAC,EAAAxF,EAAAxkC,OACA,cAAAwkC,EAAA,GAAAr/B,OACAykC,GAAA,OACAG,EAAA,GAEA,cAAAvF,EAAAA,EAAAxkC,OAAA,GAAAmF,OACAykC,GAAA,UACAI,GAAA,GAEA,QAAA1uB,EAAAyuB,EAA0BzuB,EAAA0uB,EAAW1uB,IAAA,CACrC,IAAA2uB,EAAAzF,EAAAlpB,GACA,UAAA2uB,EAAA9kC,MACAyjC,GAAAS,GAAAY,EAAArB,OACAkB,IACAD,GAAA,SAEAC,GAAA,GACQ,cAAAG,EAAA9kC,MAGR2kC,IACAD,GAAA,MAAAI,EAAApC,UAAA,mBACAiC,GAAA,EAGA,CACAH,EAAAnvB,aAAA,cAAAouB,EAAAsB,QACA,OAAA/4B,KAAA04B,IACAF,EAAAnvB,aAAA,cAAAqvB,EAAAK,OAEA,CAEA,aAAAt8B,EAAA82B,kBAAA,CAGA,IAFA,IAAAyF,EAAAv8B,EAAA42B,MAAA,GACA1kB,EAAA,GACAQ,EAAA,EAAsBA,EAAA6pB,EAAAnqC,OAAoBsgB,IAC1CR,GAAAQ,EAAA,gBAEAqpB,EAAAnvB,aAAA,gBAAAsF,EAAAoqB,OACA,KAAI,YAAAt8B,EAAA82B,mBAAA,WAAA92B,EAAA82B,kBACJiF,EAAAnvB,aAAA,uBACI,UAAA5M,EAAA82B,kBACJiF,EAAAnvB,aAAA,4BACI,OAAA5M,EAAA82B,kBACJiF,EAAAnvB,aAAA,yBAEAmvB,EAAAnvB,aAAA,uBAGA,IAAA4vB,EAAA,GACApE,EAAAp4B,EAAAu3B,gBACAyE,GAAA5D,EAAA,GAAAhmC,OAAA,aACA4pC,GAAA5D,EAAAA,EAAAhmC,OAAA,GAAAA,OAAA,cACA,QAAAwgB,EAAA,EAAoBA,EAAAwlB,EAAAhmC,OAAA,EAAyBwgB,IAC7C4pB,GAAA,IAAApE,EAAAxlB,GAAAxgB,OAAA,QAEAgmC,EAAAxlB,GAAA,sBAcA,MAZA,OAAArP,KAAAi5B,IACAT,EAAAnvB,aAAA,WAAA4vB,EAAAF,QAEA,KAAAN,IACAD,EAAA,IAAA5c,GAAA,YAAA4c,KACAnvB,aAAA,WAAAovB,EAAAM,QAEAt8B,EAAA62B,cAAA72B,EAAA62B,aAAA,IAEAkF,EAAA,IAAA5c,GAAA,UAAA4c,KACAnvB,aAAA,mBAEAmvB,CACA,EAEAU,GAAA,SAAAl+B,EAAAgqB,GACAhqB,EAAA+3B,QAAA9sB,SAAA,OACA6sB,GAAA93B,GAEA,IAAAq4B,EAAA,GACA8F,EAAA,UAAAn+B,EAAA+3B,QACAqG,EAAAlG,GAAAl4B,EAAAkqB,OAAA,CACAmO,OACAD,QAAA,EACAI,QAAA2F,OAAA9lC,EAAA4/B,GAAAj4B,EAAA+3B,SACAW,gBAAA,EACAH,kBAAAv4B,EAAA+3B,QAAA9sB,SAAA,wBACA0tB,WAAAwF,EAAA,OAAA9lC,EACA+J,MAAApC,EAAAkqB,OAAAlG,SAAA5hB,OACG,WAUHi8B,EAAA,EACAC,EAAA,EACAC,EAAA,CACAvlC,KAAA,WACAuZ,KAAAvS,EAAAuS,KACAra,KAAA,IAEA,GAAA8xB,EAAA,iBAAAA,EAAA,GAAAhxB,KAAA,CAEA,IADA,IAAAwlC,EAAA,GACAhkC,EAAA,EAAoBA,EAAAwvB,EAAA,GAAA9xB,KAAArE,OAAyB2G,IAAA,CAE7CgkC,GADAhW,GAAAwB,EAAA,GAAA9xB,KAAAsC,GAAA,WACA1C,IACA,CACAumC,EAAApkC,OAAAukC,GACAF,EAAA,EAAAD,CACA,CACA,IAAAI,GAAAH,EACAF,EAAAlmC,KAAAsO,QAAA,SAAAsyB,GACA,QAAAtkB,EAAA,EAAsBA,EAAAskB,EAAAjlC,OAAkB2gB,GAAA,GAExC,IAAAkqB,EAAAlW,GAAAsQ,EAAAtkB,GAAA,WACAgU,GAAAkW,EAAAxmC,KAAA,eACAA,KAAAmnB,QAAAkf,EACA,CACA,GAAAE,EAMMH,EAAAxF,EAAAjlC,SAENyqC,EAAAxF,EAAAjlC,YARA,CAEA,IAAA8qC,EAAA7F,EAAAjlC,OAAA,EACA,GAAAwqC,EAAAM,EACA,UAAAz+B,EAAA,oCAAAm+B,EAAA,aAAAM,EAAA7F,EAAA,GAEA,CAIA,GAIA,QAAAlkB,EAAA,EAAoBA,EAAA0pB,IAAe1pB,EAAA,CACnC,IAAA6nB,EAAA,IACAP,EAAA,EACAtnB,EAAA,KACA6nB,EAAA,IACM7nB,EAAA,GAAA6pB,IAENvC,EAAA,GAEA7D,EAAAzjB,GAAA,CACA5b,KAAA,QACAyjC,MAAAA,EACAP,OAAAA,EACAQ,QAAA,EAEA,CAEA,OADA0B,EAAA7F,kBAAAkG,EAAA,kBACAL,CACA,EAKAnH,GAAA,CACAj+B,KAAA,QACAikB,MAAA,mBACA7oB,MAAA,CACA01B,QAAA,GAEA,OAAAC,CAAA/pB,EAAAgqB,GAKA,IAEAqO,GAFA1P,GAAAqB,EAAA,IACA,CAAAA,EAAA,IAAAxB,GAAAwB,EAAA,eAAA9xB,MACAoC,IAAA,SAAAskC,GACA,IACAC,EADApW,GAAAmW,GACA9mC,KACA,SAAAmT,SAAA4zB,GACA,OACA7lC,KAAA,QACAyjC,MAAAoC,GAEQ,SAAAA,EACR,OACA7lC,KAAA,YACA0iC,UAAA,KAEQ,SAAAmD,EACR,OACA7lC,KAAA,YACA0iC,UAAA,KAGA,UAAAx7B,EAAA,6BAAA2+B,EAAAD,EACA,GACAR,EAAA,CACA/F,OACAF,qBAAA,EAEAQ,WAAAN,EAAAxkC,QAEA,OAAAqkC,GAAAl4B,EAAAkqB,OAAAkU,EAAA3E,GAAAz5B,EAAA+3B,SACA,EACA7a,YAAAwc,GACAvc,cAAAigB,KAMAnG,GAAA,CACAj+B,KAAA,QACAikB,MAAA,8HACA7oB,MAAA,CACA01B,QAAA,GAEA,OAAAC,CAAA/pB,GACA,IAAAsvB,EAAA,CACAwP,OAAA,KACAC,QAAA,UACAC,QAAA,UACAC,QAAA,OAAsB,OACtBC,QAAA,UACAC,QAAA,qBACKn/B,EAAA+3B,QAAAv5B,QAAA,SAEL4gC,EAAA,IACAC,EAAA,CACAlH,qBAAA,EACAE,KAAA,EACAr/B,KAAA,QACAyjC,MAAA2C,KAGA,SAAAp/B,EAAA+3B,QAAAn9B,OAAAoF,EAAA+3B,QAAAlkC,OAAA,IAGA,IAAAq2B,EAAAlqB,EAAAkqB,OAEA,GADAA,EAAA+E,gBACA,MAAA/E,EAAAgF,QAAAp3B,KAAA,CAIA,GAHAoyB,EAAA2N,UACA3N,EAAA+E,gBACAmQ,EAAAlV,EAAAgF,QAAAp3B,MACA,MAAAmT,SAAAm0B,GACA,UAAAl/B,EAAA,uBAAAgqB,EAAAsP,WAEAtP,EAAA2N,UACA3N,EAAA+E,gBACA/E,EAAAwK,OAAA,KACAxK,EAAA2N,UACAwH,EAAAhH,KAAA,EACAr/B,KAAA,QACAyjC,MAAA2C,GAEA,CACA,CACA,IAAAhB,EAAAlG,GAAAl4B,EAAAkqB,OAAAmV,EAAA5F,GAAAz5B,EAAA+3B,UAEAuG,EAAAzjC,KAAAqI,IAAA,KAAAk7B,EAAAlmC,KAAAoC,IAAAw+B,GAAAA,EAAAjlC,SAKA,OAJAuqC,EAAA/F,KAAA,IAAAzgC,MAAA0mC,GAAA3pC,KAAA,CACAqE,KAAA,QACAyjC,MAAA2C,IAEA9P,EAAA,CACAt2B,KAAA,YACAuZ,KAAAvS,EAAAuS,KACAra,KAAA,CAAAkmC,GACA1U,KAAA4F,EAAA,GACAqF,MAAArF,EAAA,GACAsF,gBAAAv8B,GACM+lC,CACN,EACAlhB,YAAAwc,GACAvc,cAAAigB,KAEAnG,GAAA,CACAj+B,KAAA,QACAikB,MAAA,gBACA7oB,MAAA,CACA01B,QAAA,GAEA,OAAAC,CAAA/pB,GACA,IAGAo+B,EAAAlG,GAAAl4B,EAAAkqB,OAHA,CACAoO,aAAA,IAEA,UAEA,OADA8F,EAAA7F,kBAAA,QACA6F,CACA,EACAlhB,YAAAwc,GACAvc,cAAAigB,KAEAnG,GAAA,CACAj+B,KAAA,QACAikB,MAAA,aACA7oB,MAAA,CACA01B,QAAA,GAEA,OAAAC,CAAA/pB,EAAAgqB,GAEA,IAEAqO,GAFA1P,GAAAqB,EAAA,IACA,CAAAA,EAAA,IAAAxB,GAAAwB,EAAA,eAAA9xB,MACAoC,IAAA,SAAAskC,GACA,IACAC,EADApW,GAAAmW,GACA9mC,KAEA,QAAAmT,SAAA4zB,GACA,OACA7lC,KAAA,QACAyjC,MAAAoC,GAGA,UAAA3+B,EAAA,6BAAA2+B,EAAAD,EACA,GACA,GAAAvG,EAAAxkC,OAAA,EACA,UAAAqM,EAAA,0CAEA,IAAAm/B,EAAA,CACAhH,OACAF,qBAAA,EACAG,aAAA,IAEA8F,EAAAlG,GAAAl4B,EAAAkqB,OAAAmV,EAAA,UACA,GAAAjB,EAAAlmC,KAAArE,OAAA,GAAAuqC,EAAAlmC,KAAA,GAAArE,OAAA,EACA,UAAAqM,EAAA,0CAEA,OAAAk+B,CACA,EACAlhB,YAAAwc,GACAvc,cAAAigB,KAQAnG,GAAA,CACAj+B,KAAA,QACAikB,MAAA,sCACA7oB,MAAA,CACA01B,QAAA,GAEA,OAAAC,CAAA/pB,GACA,IAkBAo+B,EAAAlG,GAAAl4B,EAAAkqB,OAlBA,CACAoO,aAAA,IACAD,KAAA,EACAr/B,KAAA,QACAyjC,MAAA,IACAP,OAAA,EAKAQ,QAAA,GACO,CACP1jC,KAAA,QACAyjC,MAAA,IACAP,OAAA,EACAQ,QAAA,KAGAjD,GAAAz5B,EAAA+3B,UACA,OACA/+B,KAAA,YACAuZ,KAAAvS,EAAAuS,KACAra,KAAA,CAAAkmC,GACA1U,KAAA1pB,EAAA+3B,QAAA9sB,SAAA,eACA0pB,MAAA30B,EAAA+3B,QAAA9sB,SAAA,WAAiD,IACjD2pB,gBAAAv8B,EAEA,EACA6kB,YAAAwc,GACAvc,cAAAigB,KAQAnG,GAAA,CACAj+B,KAAA,QACAikB,MAAA,qCACA7oB,MAAA,CACA01B,QAAA,GAEAC,QAAAmU,GACAhhB,YAAAwc,GACAvc,cAAAigB,KAKAnG,GAAA,CACAj+B,KAAA,QACAikB,MAAA,gCACA7oB,MAAA,CACA01B,QAAA,GAEA,OAAAC,CAAA/pB,GACAg4B,GAAAn2B,IAAA7B,EAAA+3B,UACAD,GAAA93B,GAEA,IAAAo+B,EAAA,CACA/F,KAAA,EACAr/B,KAAA,QACAyjC,MAAA,MAEArE,QAAA,EACAG,kBAAA,SACAC,QAAAP,GAAAj4B,EAAA+3B,SACAW,gBAAA,EACAt2B,MAAApC,EAAAkqB,OAAAlG,SAAA5hB,OAEA,OAAA81B,GAAAl4B,EAAAkqB,OAAAkU,EAAA,UACA,EACAlhB,YAAAwc,GACAvc,cAAAigB,KAKAnG,GAAA,CACAj+B,KAAA,QACAikB,MAAA,mCACA7oB,MAAA,CACA01B,QAAA,GAEAC,QAAAmU,GACAhhB,YAAAwc,GACAvc,cAAAigB,KAEAnG,GAAA,CACAj+B,KAAA,QACAikB,MAAA,yBACA7oB,MAAA,CACA01B,QAAA,GAEA,OAAAC,CAAA/pB,GACA83B,GAAA93B,GACA,IAAAo+B,EAAA,CACA5F,QAAAP,GAAAj4B,EAAA+3B,SACAW,gBAAA,EACAD,WAAA,EACAE,WAAA,EACAv2B,MAAApC,EAAAkqB,OAAAlG,SAAA5hB,OAEA,OAAA81B,GAAAl4B,EAAAkqB,OAAAkU,EAAA,UACA,EACAlhB,YAAAwc,GACAvc,cAAAigB,KAEAnG,GAAA,CACAj+B,KAAA,QACAikB,MAAA,OACA7oB,MAAA,CACA01B,QAAA,GAEAC,QAAA/pB,IACA83B,GAAA93B,GAl1FA,SAAAkqB,GAEA,IAAAoV,EAAA,GAIA,IAHApV,EAAA6D,OAAA6K,aACA1O,EAAA6D,OAAAnrB,OAAAorB,IAAA,sBACA9D,EAAA6D,OAAA6K,eACA,CAEA0G,EAAAhnC,KAAA4xB,EAAA+D,iBAAA,WACA/D,EAAA6D,OAAAuL,WACApP,EAAA6D,OAAA6K,aACA,IAAA/gB,EAAAqS,EAAAgF,QAAAp3B,KACA,SAAA+f,GAAA,SAAAA,EAEM,cAAAA,EAAA,CACN,IAAAynB,EAAAA,EAAAzrC,OAAA,GAAAA,QACAyrC,EAAA/f,MAEA,KACA,CACA,UAAArf,EAAA,iCAAAgqB,EAAAsP,UACA,CARAtP,EAAA2N,SASA,CAIA,IAHA,IAAAiB,EAAA,GACA5gC,EAAA,CAAA4gC,GAEAt+B,EAAA,EAAkBA,EAAA8kC,EAAAzrC,OAAuB2G,IAAA,CAKzC,IAHA,IAAA+kC,EAAAD,EAAA9kC,GAEA++B,EAAAvM,KACAuQ,EAAA,EAAoBA,EAAAgC,EAAA1rC,OAAqB0pC,IACzC,GAAArQ,GAAAqS,EAAAhC,IAGQ,CAGRzE,EAAAxgC,KAAAihC,GAIA,IAAAjM,EAAA7E,GAAA8W,EADAhC,GAAA,IACAzlC,KAEAy1B,EAAA,IAAA31B,MAAA,GAYA,GAXA21B,EAAA,IACAv0B,KAAA,WACAuZ,KAAA,OACAra,KAAA,IAEAq1B,EAAA,IACAv0B,KAAA,WACAuZ,KAAA,OACAra,KAAA,IAGA,MAAA+S,SAAAqiB,QAAyC,YAAAriB,SAAAqiB,GAwBzC,UAAAptB,EAAA,oCAAAq/B,EAAAhC,IAnBA,QAAAiC,EAAA,EAAiCA,EAAA,EAAcA,IAAA,CAE/C,IADA,IAAAC,GAAA,EACAC,EAAAnC,EAAA,EAAgCmC,EAAAH,EAAA1rC,OAAqB6rC,IAAA,CACrD,GAAAvS,GAAAoS,EAAAG,GAAApS,GAAA,CACAmS,GAAA,EACAlC,EAAAmC,EACA,KACA,CACA,GAAAxS,GAAAqS,EAAAG,IACA,UAAAx/B,EAAA,aAAAotB,EAAA,qCAAAiS,EAAAG,IAEAnS,EAAAiS,GAAAtnC,KAAAI,KAAAinC,EAAAG,GACA,CACA,GAAAD,EAEA,UAAAv/B,EAAA,aAAAotB,EAAA,qCAAAiS,EAAAhC,GAEA,CAGA,CAEA,IAGAoC,EAAA,CACA3mC,KAAA,UACAd,KAAA,CALAm1B,GAAAC,EAAAC,EAAArD,IAMA3X,KAAA,OACAzH,MAAA,UAEAmiB,WAAA,GAEA6L,EAAAxgC,KAAAqnC,GAIApG,EAAAvM,IACA,MAjEAuM,EAAArhC,KAAAI,KAAAinC,EAAAhC,IAmEA/iC,EAAA,KAGAs+B,EAAAxgC,KAAAihC,GAIAT,EAAA7f,QAEA6f,EAAA,GACA5gC,EAAAI,KAAAwgC,EACA,CAaA,OAXA5O,EAAA6D,OAAAuL,WAEApP,EAAA6D,OAAAuL,WASA,CACAtgC,KAAA,QACAuZ,KAAA,OACAra,OACAogC,aAAA,EACAF,QAAA,EACAW,QAAA,OACAV,KAdA,IAAAzgC,MAAAM,EAAA,GAAArE,QAAAc,KAAA,CACAqE,KAAA,QACAyjC,MAAA,IACAP,OAAA,IAEAQ,QAAA,MAUAnE,kBAAA,KACAS,gBAAA,IAAAphC,MAAAM,EAAArE,OAAA,GAAAc,KAAA,IAEA,CA2sFAirC,CAAA5/B,EAAAkqB,SAEAhN,YAAAwc,GACAvc,cAAAigB,KAEAjG,GAAA,kCACAA,GAAA,wBAEApa,GAAA,CACA/jB,KAAA,OAEAikB,MAAA,0BACA6M,QAAA,EACAM,eAAA,EACAC,eAAA,EACA,OAAAN,CAAA/pB,EAAAgqB,GACA,UAAA9pB,EAAAF,EAAAiqB,SAAA,uCACA,IAGA,IAAA4V,GAAA7I,GAIAja,GAAA,CACA/jB,KAAA,cACAikB,MAAA,oBACA6M,QAAA,EACAQ,SAAA,SACA,OAAAP,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACNyiB,EAAA9V,EAAA,GACA,gBAAA8V,EAAA9mC,KACA,UAAAkH,EAAA,2BAAA4/B,GAGA,IADA,IAAA/H,EAAA,GACAv9B,EAAA,EAAoBA,EAAAslC,EAAA5nC,KAAArE,SAA2B2G,EAC/Cu9B,GAAAvP,GAAAsX,EAAA5nC,KAAAsC,GAAA,WAAA1C,KAEA,eAAAmyB,EAAA,CAEA,IAAA4V,GAAA7rC,eAAA+jC,GACA,UAAA73B,EAAA,wBAAA63B,EAAA+H,GAIA,IAAAC,EAAAF,GAAA9H,IAEA/N,KAAAgW,EAAArV,QACAA,GACQT,EAAA+V,eAAA,WAAiClI,EAAA,IAAgBgI,GACzD//B,EAAA,CACAuS,KAAA2X,EAAA3X,KACAwlB,UACA7N,UAEAv0B,EAAAoqC,EAAAhW,QAAA/pB,EAAAggC,EAAArV,GACAT,EAAAwK,OAAA,YACA,IAAAwL,EAAAhW,EAAAsP,UACAn5B,EAAAmoB,GAAA0B,EAAAiF,gBAAA,eACA,GAAA9uB,EAAAzH,OAAAm/B,EACA,UAAA73B,EAAA,qBAAgD63B,EAAA,sBAAkC13B,EAAAzH,KAAA,IAAiBsnC,GAMnG,OAAAvqC,CACA,CACA,OACAqD,KAAA,cACAuZ,KAAA2X,EAAA3X,KACA3Z,KAAAm/B,EACA+H,YAEA,IAIA,IAUAK,GAAA,CACA,mBACA,oBACA,uBAEApjB,GAAA,CACA/jB,KAAA,OACAikB,MAAA,CAEA,6DAEA,sEAEA,2BACA6M,QAAA,EACAsW,mBAAA,EACArW,QAAA,CAAA1M,EAAA2M,KACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACNnlB,EAAAolB,GAAA0M,EAAA,IACAqW,EAAApW,KAAAkW,GAAAA,GAAAlW,GAAAA,EACA,OACAjxB,KAAA,OACAuZ,KAAA2X,EAAA3X,KACAD,KAAA+tB,EAAAhmC,MAAA,GACAnC,SAGAglB,YAxCA,CAAAzb,EAAA0C,KACA,IAAAmO,EAAA7Q,EAAA6Q,KACAwY,EAAA3mB,EAAAqf,SAAAlR,GACA,OAAA8L,GAAA3c,EAAAvJ,KAAA4yB,IAsCA3N,cApCA,CAAA1b,EAAA0C,KACA,IAAAmO,EAAA7Q,EAAA6Q,KACAwY,EAAA3mB,EAAAqf,SAAAlR,GACA,OAAAqP,GAAAlgB,EAAAvJ,KAAA4yB,MAmCA/N,GAAA,CACA/jB,KAAA,SACAikB,MAAA,wBACA6M,QAAA,EACAC,QAAA,CAAAkC,EAAAjC,KACA,IAAAE,OACAA,GACM+B,EACN/zB,EAAA8xB,EAAA,GAGA,OACAhxB,KAAA,SACAuZ,KAAA2X,EAAA3X,KACAmZ,OAAAI,GAAA5zB,GACAA,KAAA,EACAc,KAAA,OACAuZ,KAAA2X,EAAA3X,KACAD,KAAA,aACApa,SAEA0J,eAAAA,EAAA1J,OAKA6kB,GAAA,CACA/jB,KAAA,OACAikB,MAAA,6CACA6M,QAAA,EACAM,eAAA,EACAL,QAAA,CAAAmC,EAAAlC,KACA,IAAAE,OACAA,EAAAD,SACAA,EAAA6D,iBACAA,GACM5B,GACN3Z,KACAA,GACM2X,EACNhyB,EAAAgyB,EAAA+D,iBAAA,EAAAH,GACA,OACA90B,KAAA,OACAuZ,KAAAA,EACAD,KAAA,OAAA2X,EAAA5vB,MAAA,GACAnC,KAAA,CACAc,KAAA,WACAuZ,KAAA2X,EAAA3X,KACAra,YAMA,IA+JAooC,GAAA,CAAAC,EAAAz1B,IACAA,EAGA,CACA9R,KAAA,UACAuZ,KAAAguB,EAAAhuB,KACAzH,QACA5S,KAAA,CAAAqoC,IANAA,EAWAxjB,GAAA,CACA/jB,KAAA,UACAikB,MAAA,uFAEA,iCAEA6M,QAAA,EACAsW,mBAAA,EACArW,QAAA,CAAA1M,EAAA2M,KACA,IAMAwW,GANAtW,OACAA,EAAAD,SACAA,GACM5M,EACNojB,EAAAzW,EAAA,GACA0W,EAAA1W,EAAA,GAEA6K,EAAA,KACAC,EAAA,KACA,OAAA7K,GACA,cACA,cACA,aACA,cACAuW,GAAA,EACA,MACA,mBACAA,GAAA,EACA,MACA,eACA,cACA,eACAA,GAAA,EACA3L,EAAA,IACAC,EAAA,IACA,MACA,oBACA0L,GAAA,EACA3L,EAAA,MACAC,EAAA,MACA,MACA,oBACA0L,GAAA,EACA3L,EAAA,IACAC,EAAA,IACA,MACA,QACA,UAAA/9B,MAAA,gCAEA,IAAA4pC,EAAA,YAAA1W,EACAnf,EAAA,KAMA,OALA61B,GAAA1W,EAAA2W,WAAA,OACA91B,EAAA,UACMmf,EAAA2W,WAAA,SACN91B,EAAA,QAEAw1B,GAAA,CACAtnC,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAkuB,QACAC,QACAC,YACAH,aACA3L,YACAC,aACA+L,QAAA,MACK/1B,IAELoS,YA/OA,CAAAzb,EAAA0C,KAEA,IAGA2mB,EAHAhgB,EAAA3G,EAAA2G,MACAg2B,EAAAh2B,EAAArF,UACAs7B,EAAAj2B,EAAApF,UAEAolB,EAAA3mB,EAAAkJ,YAAAyzB,GACA,IAAAE,EAAA5iB,GAAA3c,EAAAg/B,MAAA3V,EAAA3mB,GACA,GAAA1C,EAAAk/B,UAAA,CAGA,IAAAM,EAAA,IAAA98B,EAAA6I,cAAAC,QACAi0B,EAAA,IAAA/8B,EAAA6I,cAAAC,QACA+zB,EAAA3rC,OAAA2rC,EAAA3rC,OAAA4rC,EAAAA,EAAAD,EAAA3rC,OACA2rC,EAAAp2B,MAAAo2B,EAAAp2B,MAAAs2B,EAAAA,EAAAF,EAAAp2B,KACA,CACAkgB,EAAA3mB,EAAAkJ,YAAA0zB,GACA,IACAnmB,EACAumB,EACAC,EAgBAC,EACA/X,EACAgY,EAmBAf,EAqDAgB,EAQA1M,EACAC,EAtGA0M,EAAApjB,GAAA3c,EAAAi/B,MAAA5V,EAAA3mB,GAyCA,GArCA1C,EAAA++B,YACA/+B,EAAAo/B,SACAM,EAAAt0B,EAAApL,EAAAo/B,QAAA18B,GACAyW,EAAAtC,GAAA,YAAAnU,EAAAg9B,IAEAvmB,EAAAtC,GAAA,YAAAnU,GAEAg9B,EAAAvmB,EAAAvlB,OACA+rC,EAAAxmB,EAAAvlB,SAEAulB,EAAA,KACAumB,EAAA,EACAC,EAAAj9B,EAAA6I,cAAAwE,sBAMA1G,EAAA1F,OAAAU,EAAAC,QAAAX,MACAi8B,EAAAl9B,EAAA6I,cAAAyD,KAEA6Y,EADA6X,EAAA,EACA,EAAAC,EAEA,EAAAA,EAEAE,EAAAn9B,EAAA6I,cAAA4D,SAEAuwB,EAAA,GACAE,EAAAl9B,EAAA6I,cAAA0D,KACA4Y,EAAA8X,IAEAC,EAAAl9B,EAAA6I,cAAA2D,KACA2Y,EAAA,EAAA8X,GAEAE,EAAAn9B,EAAA6I,cAAA6D,QAGA+J,EAmBI,CAEJ,IAAArJ,EAAApN,EAAA6I,cAAAuE,WACA8vB,EAAAL,EAAAp2B,OAAA2G,EAAA,GAAA4vB,GAAA7X,IACA+X,GAAA/X,GAAA+X,EAAAL,EAAAp2B,OAAA2G,EAAA,GAAA4vB,KAEA5vB,EAAA,GAAA4vB,GAAAK,EAAAnsC,OAAAisC,GAAAhY,IACAgY,GAAAhY,GAAA/X,EAAA,GAAA4vB,GAAAK,EAAAnsC,OAAAisC,KAGAf,EAAA3nB,GAAA,CACAE,aAAA,kBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAAqpB,EACAvoB,MAAAqoB,GACO,CACPtoC,KAAA,OACAmf,KAAAyC,EACA3B,QAVA1H,EAAA,GAAA4vB,IAWO,CACPnoC,KAAA,OACAmf,KAAA6oB,EACA/nB,OAAAooB,KAGA,KA7CA,CAEA,IAAAI,EAAAJ,EAAAL,EAAAp2B,OAAA42B,EAAAnsC,OAAAisC,GACAG,EAAAnY,IACA+X,GAAA,IAAA/X,EAAAmY,GACAH,GAAA,IAAAhY,EAAAmY,IAEAlB,EAAA3nB,GAAA,CACAE,aAAA,kBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAAqpB,EACAvoB,MAAAqoB,GACO,CACPtoC,KAAA,OACAmf,KAAA6oB,EACA/nB,OAAAooB,KAGA,CAuDA,OA1BAvW,EAAA3mB,EAAAkJ,YAAAvC,GACAy1B,EAAAlrC,QAAAy1B,EAAA5d,eAAA/I,EAAA+I,eACAqzB,EAAA31B,OAAAkgB,EAAA5d,eAAA/I,EAAA+I,eAIAq0B,EADAz2B,EAAA1F,OAAAU,EAAAC,QAAAX,KACAjB,EAAA6I,cAAAqE,OACIvG,EAAA1F,OAAAU,EAAAI,aAAAd,KACJjB,EAAAkJ,YAAAvH,EAAAG,QAAA+G,cAAAsE,OAEAnN,EAAA6I,cAAAsE,OAKAujB,EADA,MAAApzB,EAAAozB,UACAnV,GAAAvb,EAAA,WAEA2vB,GAAAryB,EAAAozB,UAAA0M,GAAA,EAAAp9B,EAAAkJ,YAAAvC,GAAArJ,EAAA8Q,KAAA,WAGAuiB,EADArzB,EAAAk/B,UACAvoB,GAAA,IACI,MAAA3W,EAAAqzB,WACJpV,GAAAvb,EAAA,YAEA2vB,GAAAryB,EAAAqzB,WAAAyM,GAAA,EAAAp9B,EAAAkJ,YAAAvC,GAAArJ,EAAA8Q,KAAA,YAEA6F,GAAA,SAAAjC,OAAA2U,EAAA/K,cAAA5b,IAAA,CAAA0wB,EAAAzc,GAAA,WAAAmoB,IAAAzL,GAAA3wB,IA4GAgZ,cA1GA,CAAA1b,EAAA0C,KACA,IAAAgK,EAAA,IAAAyS,GAAA,SAAAe,GAAAlgB,EAAAg/B,MAAAt8B,GAAAwd,GAAAlgB,EAAAi/B,MAAAv8B,KACA,GAAA1C,EAAA++B,YAEI,GAAA/+B,EAAAo/B,QAAA,CACJ,IAAAM,EAAAt0B,EAAApL,EAAAo/B,QAAA18B,GACAgK,EAAAE,aAAA,gBAAAX,EAAAyzB,GACA,OAJAhzB,EAAAE,aAAA,uBAKA,SAAA5M,EAAAozB,WAAA,MAAApzB,EAAAqzB,WAAA,CACA,IAAA4M,EAAA,GACA,SAAAjgC,EAAAozB,UAAA,CACA,IAAA8M,EAAA,IAAA/gB,GAAA,UAAAE,GAAArf,EAAAozB,UAAAr2B,QAAA,YACAmjC,EAAAtzB,aAAA,gBACAqzB,EAAAppC,KAAAqpC,EACA,CAEA,GADAD,EAAAppC,KAAA6V,GACA,MAAA1M,EAAAqzB,WAAA,CACA,IAAA8M,EAAA,IAAAhhB,GAAA,UAAAE,GAAArf,EAAAqzB,WAAAt2B,QAAA,YACAojC,EAAAvzB,aAAA,gBACAqzB,EAAAppC,KAAAspC,EACA,CACA,OAAAzgB,GAAAugB,EACA,CACA,OAAAvzB,KAuFA4O,GAAA,CACA/jB,KAAA,QACAikB,MAAA,mDACA6M,QAAA,EACA+X,OAAA,EACA,OAAA9X,CAAAkC,GACA,IAKA6V,GALA5X,OACAA,EAAAD,SACAA,EAAA9pB,MACAA,GACM8rB,EAEN,OAAAhC,GACA,aACA6X,EAAA,SACA,MACA,eACAA,EAAA,UACA,MACA,aACAA,EAAA,eACA,MACA,cACAA,EAAA,gBACA,MACA,cACAA,EAAA,gBACA,MACA,QACA,UAAA/qC,MAAA,sCAEA,OACAiC,KAAA,QACAuZ,KAAA2X,EAAA3X,KACAuvB,cACA3hC,QAEA,IAEA,IAAA4hC,GAAA,2CACAC,GAAA,SAAAC,GACA,IAAAjS,EAAA,KAKA,OAJAiS,EAAApuC,OAAA,IAEAm8B,EAAA,OADAA,EAAAiS,GACA,KAAAjS,GAEAA,CACA,EACAjT,GAAA,CACA/jB,KAAA,UACAikB,MAAA,cACA6M,QAAA,EACAsW,mBAAA,EACA9V,SAAA,4CACA,OAAAP,CAAAmC,EAAAlC,GACA,IAWAwW,GAXAtW,OACAA,GACMgC,EACNuU,EAAAzW,EAAA,GACA0W,EAAA1W,EAAA,GAEAoL,EAAA9X,GAAA0M,EAAA,IACA6K,EAAA,SAAAO,EAAAp8B,MAAA,SAAAo8B,EAAApJ,OAAAgW,GAAA5M,EAAAt9B,MAAA,KACAu9B,EAAA/X,GAAA0M,EAAA,IACA8K,EAAA,SAAAO,EAAAr8B,MAAA,UAAAq8B,EAAArJ,OAAAgW,GAAA3M,EAAAv9B,MAAA,KACAoqC,EAAA1Z,GAAAwB,EAAA,WAEA6W,EAAA,KAKAL,IAJA0B,EAAAC,UAMAtB,EAAAqB,EAAA1iC,OACAiO,OAAA,EAGA,IAAArI,EAAA,KACAg9B,EAAApY,EAAA,GACA,gBAAAoY,EAAAppC,MACA,GAAAopC,EAAAlqC,KAAArE,OAAA,GACA,IAAAwuC,EAAA7Z,GAAA4Z,EAAAlqC,KAAA,cACAkN,EAAA28B,GAAA9nC,OAAAooC,EAAAvqC,MACA,OAEAsqC,EAAA5Z,GAAA4Z,EAAA,WACAh9B,EAAA28B,GAAA9nC,OAAAmoC,EAAAtqC,OAEA,OAAAwoC,GAAA,CACAtnC,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAkuB,QACAC,QACAC,WAAA,EACAH,aACAK,UACAhM,YACAC,cACK1vB,EACL,IAGA2X,GAAA,CACA/jB,KAAA,QACAikB,MAAA,YACA6M,QAAA,EACAQ,SAAA,SACAuX,OAAA,EACA,OAAA9X,CAAA4F,EAAA3F,GACA,IAAAE,OACAA,EAAAD,SACAA,EAAA9pB,MACAA,GACMwvB,EACN,OACA32B,KAAA,QACAuZ,KAAA2X,EAAA3X,KACAuvB,YAAA,gBACA18B,KAAAojB,GAAAwB,EAAA,WAAAxqB,MACAW,QAEA,IAEA4c,GAAA,CACA/jB,KAAA,UACAikB,MAAA,kBACA6M,QAAA,EACAQ,SAAA,uBACAP,QAAA,CAAA+M,EAAA9M,KACA,IAAAE,OACAA,EAAAD,SACAA,GACM6M,EACN2J,EAAAzW,EAAA,GACA6W,EAAArY,GAAAwB,EAAA,YAAA5kB,KACA,IAAAy7B,EACA,UAAA9pC,MAAA,wCAAAuK,OAAAu/B,IAEA,IAAAH,EAAA1W,EAAA,GACAwW,EAAAK,EAAApzB,OAAA,EACA,OACAzU,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAkuB,QACAC,QACAC,WAAA,EACAH,aACAK,UACAhM,UAAA,KACAC,WAAA,SAOA,IAAAwN,GAAA,CAAAxZ,EAAA3kB,KACA,IAEA4kB,EACAtnB,EAHAqJ,EAAA3G,EAAA2G,MAIA,WAAAge,EAAA9vB,MAIA+vB,EAAAD,EAAAxjB,IAAA8Y,GAAA0K,EAAAxjB,IAAAnB,EAAAkJ,YAAAvC,EAAAxF,OAAAnB,GAAAia,GAAA0K,EAAAtjB,IAAArB,EAAAkJ,YAAAvC,EAAAtF,OAAArB,GACA1C,EAAA+mB,GAAAM,EAAAhH,KAAA,eAEArgB,EAAA+mB,GAAAM,EAAA,cAGA,IAKAzO,EALAniB,EAAAkmB,GAAA3c,EAAAqgB,KAAA3d,EAAAgf,gBAAArd,EAAAC,UAEAw8B,EAAArb,GAAAzlB,EAAA0C,GAoCA,GA/BAkW,EADA5Y,EAAA+gC,OACA5pB,GAAA,CACAE,aAAA,gBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAAjgB,GACO,CACPc,KAAA,OACAoM,KAAA,IACO,CACPpM,KAAA,OACAmf,KAAAoqB,EACAxoB,eAAA,kBAIAnB,GAAA,CACAE,aAAA,SACAO,aAAAnhB,EAAA0S,MAAA,GAAA23B,EAAAltC,OACAqV,SAAA,EACA1R,KAAA,OACAmf,KAAAoqB,EACAxoB,eAAA,eACO,CACP/gB,KAAA,OACAoM,KAAA,IACO,CACPpM,KAAA,OACAmf,KAAAjgB,MAIA6wB,EAAA,CAQA,IAAA0Z,EAAArqB,GAAA,UAAA3W,EAAA+gC,OAAA,mBAAAnoB,GAAAlW,GAEAkW,EADA5Y,EAAA+gC,OACA5pB,GAAA,CACAE,aAAA,gBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAAsqB,GACS,CACTzpC,KAAA,OACAoM,KAAA,IACS,CACTpM,KAAA,OACAmf,KAAA4Q,MAIAnQ,GAAA,CACAE,aAAA,SACAO,aAAAopB,EAAA73B,MAAA,GAAAme,EAAA1zB,OAAA0zB,EAAAne,MACAF,SAAA,EACA1R,KAAA,OACAmf,KAAA4Q,GACS,CACT/vB,KAAA,OACAoM,KAAA,IACS,CACTpM,KAAA,OACAmf,KAAAsqB,KAIA,CACA,OAAArqB,GAAA,UAAA3W,EAAA+gC,OAAA,mBAAAnoB,GAAAlW,IAOA4Y,GAAA,CACA/jB,KAAA,aACAikB,MAAA,gEACA6M,QAAA,EACA,OAAAC,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACN,OACArkB,KAAA,aACAuZ,KAAA2X,EAAA3X,KACAsU,MAAAoD,EACAuY,OAAAvY,EAAAhf,SAAA,UACA6W,KAAAkI,EAAA,GAEA,EACA9M,YAAAolB,GACAnlB,cAvBA,CAAA1b,EAAA0C,KACA,IAAAgmB,EAAAvD,GAAAnlB,EAAAolB,OACA,WAAAjG,GAAAnf,EAAA+gC,OAAA,kBAAA7gB,GAAAlgB,EAAAqgB,KAAA3d,GAAAgmB,OAwBApN,GAAA,CACA/jB,KAAA,OACAikB,MAAA,WACA6M,QAAA,EACAQ,SAAA,mBACAF,eAAA,EACAL,QAAA,CAAA1M,EAAA2M,KACA,IAAAE,OACAA,GACM7M,EACNnlB,EAAA8xB,EAAA,GACArb,EAAA6Z,GAAAwB,EAAA,UAAAnlB,IACA,OAAAqlB,EAAAlG,SAAApf,UAAA,CACA89B,QAAA,SACA79B,IAAA8J,IAIA,CACA3V,KAAA,OACAuZ,KAAA2X,EAAA3X,KACA5D,OACAzW,KAAAslB,GAAAtlB,IANAgyB,EAAAyY,qBAAA,WASAzlB,YAAA,CAAAzb,EAAA0C,KACA,IAAAwnB,EAAA5N,GAAAtc,EAAAvJ,KAAAiM,GAAA,GACA,OA9+LA,SAAAwK,EAAAhE,EAAAD,EAAAvG,GACA,IAAAy+B,EAAA,IAAAl0B,EAAAC,EAAAhE,EAAAD,EAAAvG,GAEA,OADA+T,GAAA0qB,GACAA,CACA,CA0+LAC,CAAAphC,EAAAkN,KAAA,GAAAgd,EAAAxnB,IAEAgZ,cAAA,CAAA1b,EAAA0C,KACA,IAAAyO,EAAAoP,GAAAvgB,EAAAvJ,KAAAiM,GAKA,OAJAyO,aAAAgO,KACAhO,EAAA,IAAAgO,GAAA,QAAAhO,KAEAA,EAAAvE,aAAA,OAAA5M,EAAAkN,MACAiE,KAGAmK,GAAA,CACA/jB,KAAA,OACAikB,MAAA,UACA6M,QAAA,EACAQ,SAAA,QACAF,eAAA,EACAL,QAAA,CAAAkC,EAAAjC,KACA,IAAAE,OACAA,GACM+B,EACNtd,EAAA6Z,GAAAwB,EAAA,UAAAnlB,IACA,IAAAqlB,EAAAlG,SAAApf,UAAA,CACA89B,QAAA,QACA79B,IAAA8J,IAEA,OAAAub,EAAAyY,qBAAA,SAGA,IADA,IAAA3qB,EAAA,GACAxd,EAAA,EAAoBA,EAAAmU,EAAA9a,OAAiB2G,IAAA,CACrC,IAAAm/B,EAAAhrB,EAAAnU,GACA,MAAAm/B,IACAA,EAAA,oBAEA3hB,EAAA1f,KAAA,CACAU,KAAA,UACAuZ,KAAA,OACAza,KAAA6hC,GAEA,CACA,IAAAzhC,EAAA,CACAc,KAAA,OACAuZ,KAAA2X,EAAA3X,KACAD,KAAA,WACApa,KAAA8f,GAEA,OACAhf,KAAA,OACAuZ,KAAA2X,EAAA3X,KACA5D,OACAzW,KAAAslB,GAAAtlB,OASA6kB,GAAA,CACA/jB,KAAA,OACAikB,MAAA,WACA6M,QAAA,EACAQ,SAAA,SACAF,eAAA,EACAqB,WAAA,EACA,OAAA1B,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,GACM7M,EACN,OACArkB,KAAA,OACAuZ,KAAA2X,EAAA3X,KACAra,KAAAslB,GAAAwM,EAAA,IAEA,EACA,WAAA9M,CAAAzb,EAAA0C,GACA,IAAAwnB,EAAA5N,GAAAtc,EAAAvJ,KAAAiM,EAAAqf,SAAA,QACA,OAAAlM,GAAAqU,EACA,EACAxO,cAAA,CAAA1b,EAAA0C,IACA,IAAAyc,GAAA,OAAAa,GAAAhgB,EAAAvJ,KAAAiM,EAAAqf,SAAA,QAIAzG,GAAA,CACA/jB,KAAA,OACAikB,MAAA,sDACA6M,QAAA,EACAQ,SAAA,mBACAF,eAAA,EACAL,QAAA,CAAA1M,EAAA2M,KACA,IAUA8Y,GAVA5Y,OACAA,EAAAD,SACAA,EAAA9pB,MACAA,GACMkd,EACN7d,EAAAgpB,GAAAwB,EAAA,UAAA+Y,OACA7qC,EAAA8xB,EAAA,GACAE,EAAAlG,SAAA3gB,QACA6mB,EAAAlG,SAAA1f,gBAAA,6DAGA,IAAA0J,EAAA,GACA,OAAAic,GACA,kBACAjc,EAAAg1B,MAAAxjC,EACAsjC,EAAA,CACAJ,QAAA,cACAM,MAAAxjC,GAEA,MACA,eACAwO,EAAA7Y,GAAAqK,EACAsjC,EAAA,CACAJ,QAAA,WACAvtC,GAAAqK,GAEA,MACA,kBACAwO,EAAAlD,MAAAtL,EACAsjC,EAAA,CACAJ,QAAA,cACA53B,MAAAtL,GAEA,MACA,iBAGA,IADA,IAAAwd,EAAAxd,EAAAyjC,MAAA,KACAzoC,EAAA,EAA0BA,EAAAwiB,EAAAnpB,OAAiB2G,IAAA,CAC3C,IAAA0oC,EAAAlmB,EAAAxiB,GACA2oC,EAAAD,EAAAE,QAAA,KACA,GAAAD,EAAA,EACA,UAAAjjC,EAAA,yBAAAgjC,EAAA,yBAEA,IAAAp1B,EAAAo1B,EAAA7oC,MAAA,EAAA8oC,GACAE,EAAAH,EAAA7oC,MAAA8oC,EAAA,GACAn1B,EAAA,QAAAF,EAAAiwB,QAAAsF,CACA,CACAP,EAAA,CACAJ,QAAA,aACA10B,cAEA,MAEA,QACA,UAAAjX,MAAA,6BAEA,OAAAmzB,EAAAlG,SAAApf,UAAAk+B,GAGA,CACA9pC,KAAA,OACAuZ,KAAA2X,EAAA3X,KACAvE,aACA9V,KAAAslB,GAAAtlB,IANAgyB,EAAAyY,qBAAA1Y,IASA/M,YAAA,CAAAzb,EAAA0C,KACA,IAAAwnB,EAAA5N,GAAAtc,EAAAvJ,KAAAiM,GAAA,GACAwG,EAAA,cACAlJ,EAAAuM,WAAAg1B,OACAr4B,EAAArS,QAAAmJ,EAAAuM,WAAAg1B,MAAAjF,OAAAkF,MAAA,QAEA,IAAAzzB,EAAA4I,GAAAzN,EAAAghB,EAAAxnB,GACA,QAAAiK,KAAA3M,EAAAuM,WACA,UAAAI,GAAA3M,EAAAuM,WAAAha,eAAAoa,IACAoB,EAAAnB,aAAAD,EAAA3M,EAAAuM,WAAAI,IAGA,OAAAoB,GAEA2N,cAAA,CAAA1b,EAAA0C,IACA6d,GAAAvgB,EAAAvJ,KAAAiM,KAIA4Y,GAAA,CACA/jB,KAAA,aACAikB,MAAA,kBACA6M,QAAA,EACAsW,mBAAA,EACAhW,eAAA,EACAL,QAAA,CAAA1M,EAAA2M,KACA,IAAAE,OACAA,GACM7M,EACN,OACArkB,KAAA,aACAuZ,KAAA2X,EAAA3X,KACAta,KAAAulB,GAAAwM,EAAA,IACAsZ,OAAA9lB,GAAAwM,EAAA,MAGA9M,YAAA,CAAAzb,EAAA0C,KACA,IAAAwnB,EAAA5N,GAAAtc,EAAAxJ,KAAAkM,GAAA,GACA,OAAAmT,GAAAqU,IAEAxO,cAAA,CAAA1b,EAAA0C,IACA6d,GAAAvgB,EAAA6hC,OAAAn/B,KAIA,IAAAo/B,GAAA,SAAAtiC,GACA,kCAAA+D,KAAA/D,GAGA,OACAwM,QAAAxM,EACA2L,KAAA,MAGA,IAAArL,EAAA,6CAA0DwD,KAAA9D,GAC1D,IAAAM,EACA,UAAArB,EAAA,kBAAAe,EAAA,0BAEA,IAAA+b,EAAA,CACAvP,SAAAlM,EAAA,GAAAA,EAAA,IAEAqL,KAAArL,EAAA,IAEA,IAAAoL,EAAAqQ,GACA,UAAA9c,EAAA,kBAAA8c,EAAApQ,KAAA,2BAEA,OAAAoQ,CAEA,EACAD,GAAA,CACA/jB,KAAA,kBACAikB,MAAA,sBACA6M,QAAA,EACAY,gBAAA,EACAJ,SAAA,cACAF,eAAA,EACAL,QAAA,CAAA1M,EAAA2M,EAAAW,KACA,IAAAT,OACAA,GACM7M,EACNjoB,EAAA,CACAqY,OAAA,EACAb,KAAA,MAEAvX,EAAA,CACAoY,OAAA,GACAb,KAAA,MAEA42B,EAAA,CACA/1B,OAAA,EACAb,KAAA,MAEAkC,EAAA,GACA,GAAA6b,EAAA,GAIA,IAHA,IAEA3c,EAFAwa,GAAAmC,EAAA,UAAAoY,OAEAE,MAAA,KACAzoC,EAAA,EAAsBA,EAAAwT,EAAAna,OAAuB2G,IAAA,CAC7C,IAAAipC,EAAAz1B,EAAAxT,GAAAyoC,MAAA,KACA,OAAAQ,EAAA5vC,OAAA,CACA,IAAAoN,EAAAwiC,EAAA,GAAA1F,OACA,OAAA0F,EAAA,GAAA1F,QACA,UACAjvB,EAAA7N,EACA,MACA,YACA7L,EAAAmuC,GAAAtiC,GACA,MACA,aACA5L,EAAAkuC,GAAAtiC,GACA,MACA,kBACAuiC,EAAAD,GAAAtiC,GACA,MACA,QACA,UAAAf,EAAA,iBAAAujC,EAAA,8BAEA,CACA,CAEA,IAAA50B,EAAA2Z,GAAAwB,EAAA,UAAAnlB,IAOA,MANA,KAAAiK,IAIAA,GADAA,GADAA,EAAAD,GACArQ,QAAA,gBACAklC,UAAA,EAAA50B,EAAA60B,YAAA,OAEAzZ,EAAAlG,SAAApf,UAAA,CACA89B,QAAA,oBACA79B,IAAAgK,IAIA,CACA7V,KAAA,kBACAuZ,KAAA2X,EAAA3X,KACAzD,IAAAA,EACA1Z,MAAAA,EACAC,OAAAA,EACAmuC,YAAAA,EACA30B,IAAAA,GATAqb,EAAAyY,qBAAA,sBAYAzlB,YAAA,CAAAzb,EAAA0C,KACA,IAAA9O,EAAAwX,EAAApL,EAAApM,OAAA8O,GACAyG,EAAA,EACAnJ,EAAA+hC,YAAA/1B,OAAA,IACA7C,EAAAiC,EAAApL,EAAA+hC,YAAAr/B,GAAA9O,GAEA,IAAAD,EAAA,EACAqM,EAAArM,MAAAqY,OAAA,IACArY,EAAAyX,EAAApL,EAAArM,MAAA+O,IAEA,IAAA2G,EAAA,CACAzV,OAAAqY,EAAArY,EAAAuV,IAEAxV,EAAA,IACA0V,EAAA1V,MAAAsY,EAAAtY,IAEAwV,EAAA,IACAE,EAAAqV,cAAAzS,GAAA9C,IAEA,IAAAuD,EAAA,IAAAS,EAAAnN,EAAAoN,IAAApN,EAAAqN,IAAAhE,GAGA,OAFAqD,EAAA9Y,OAAAA,EACA8Y,EAAAvD,MAAAA,EACAuD,GAEAgP,cAAA,CAAA1b,EAAA0C,KACA,IAAAgK,EAAA,IAAAyS,GAAA,aACAzS,EAAAE,aAAA,MAAA5M,EAAAqN,KACA,IAAAzZ,EAAAwX,EAAApL,EAAApM,OAAA8O,GACAyG,EAAA,EAMA,GALAnJ,EAAA+hC,YAAA/1B,OAAA,IACA7C,EAAAiC,EAAApL,EAAA+hC,YAAAr/B,GAAA9O,EACA8Y,EAAAE,aAAA,SAAAX,GAAA9C,KAEAuD,EAAAE,aAAA,SAAAX,EAAArY,EAAAuV,IACAnJ,EAAArM,MAAAqY,OAAA,GACA,IAAArY,EAAAyX,EAAApL,EAAArM,MAAA+O,GACAgK,EAAAE,aAAA,QAAAX,EAAAtY,GACA,CAEA,OADA+Y,EAAAE,aAAA,MAAA5M,EAAAoN,KACAV,KAMA4O,GAAA,CACA/jB,KAAA,OACAikB,MAAA,yCACA6M,QAAA,EACAQ,SAAA,SACAmB,WAAA,EACArB,eAAA,EACA,OAAAL,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACNjY,EAAAojB,GAAAwB,EAAA,WACA,GAAAE,EAAAlG,SAAA3gB,OAAA,CACA,IAAAugC,EAAA,MAAA3Z,EAAA,GACA4Z,EAAA,OAAAz+B,EAAA5F,MAAAoN,KACAg3B,GACAC,GACA3Z,EAAAlG,SAAA1f,gBAAA,6BAAA2lB,EAAA,gCAAA7kB,EAAA5F,MAAAoN,KAAA,UAEA,SAAAsd,EAAA3X,MACA2X,EAAAlG,SAAA1f,gBAAA,6BAAA2lB,EAAA,6BAIA4Z,GACA3Z,EAAAlG,SAAA1f,gBAAA,6BAAA2lB,EAAA,4BAGA,CACA,OACAjxB,KAAA,OACAuZ,KAAA2X,EAAA3X,KACAuxB,UAAA1+B,EAAA5F,MAEA,EACA0d,YAAA,CAAAzb,EAAA0C,IACAuW,GAAAjZ,EAAAqiC,UAAA3/B,GAEA,aAAAgZ,CAAA1b,EAAA0C,GACA,IAAA2/B,EAAAj3B,EAAApL,EAAAqiC,UAAA3/B,GACA,WAAA4c,GAAA+iB,EACA,IAIA/mB,GAAA,CACA/jB,KAAA,MACAikB,MAAA,yCACA6M,QAAA,EACAM,eAAA,EACAL,QAAA,CAAA1M,EAAA2M,KACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACNnlB,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,MACAuZ,KAAA2X,EAAA3X,KACAwxB,UAAA9Z,EAAA5vB,MAAA,GACAnC,SAGAglB,YAAA,CAAAzb,EAAA0C,KAEA,IAAAkP,EACA,SAAA5R,EAAAsiC,WAEA1wB,EAAA+E,GAAA,IAAAgG,GAAA3c,EAAAvJ,KAAAiM,KAEAkP,EAAA+E,GAAA,WAAA/E,GAAAlP,IAEAkP,EAAA+E,GAAA,WAAAgG,GAAA3c,EAAAvJ,KAAAiM,KAEA,IAAA6/B,EAAA5rB,GAAA,YACAjK,EAAAiK,GAAA,CAAA3W,EAAAsiC,WAAA,CAAA1wB,EAAA2wB,GAAA7/B,GAMA+b,EAAA9H,GAAA,WASA,OARA8H,EAAApV,MAAAzV,OAAAqY,EAAAS,EAAA9Y,OAAA8Y,EAAAvD,OACAuD,EAAAvD,QACAsV,EAAApV,MAAAqV,cAAAzS,GAAAS,EAAAvD,QAEAuD,EAAAzD,SAAA2U,QAAAa,GAGA/R,EAAAiK,GAAA,aAAAjK,GAAAhK,GACAiU,GAAA,iBAAAjK,GAAAhK,IAEAgZ,cAAA,CAAA1b,EAAA0C,KAEA,IAAAgK,EAAA,IAAAyS,GAAA,WAAAe,GAAAlgB,EAAAvJ,KAAAiM,KACA,YAAA1C,EAAAsiC,UAAA,CACA,IAAA/I,EAAA,SAAAv5B,EAAAsiC,UAAA,YACA51B,EAAAE,aAAA,SAAA2sB,EAAA,QACA,CAEA,OADA7sB,EAAAE,aAAA,eACAF,KAKA4O,GAAA,CACA/jB,KAAA,UACAikB,MAAA,YACA6M,QAAA,EACAM,eAAA,EACAC,eAAA,EACA,OAAAN,CAAA1M,EAAA2M,GACA,IAAAC,SACAA,EAAAC,OACAA,GACM7M,EACN4mB,EAAA/Z,EAAA3X,KACA2X,EAAAga,WAAA,QACA,IAAA7b,EAAA,QAAA4B,EAAA,UACA/xB,EAAAgyB,EAAA+D,iBAAA,EAAA5F,GAGA,OAFA6B,EAAAwK,OAAArM,GACA6B,EAAAga,WAAAD,GACA,CACAjrC,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAzH,MAAA,OACAmiB,WAAA,EACA/0B,OAEA,IAGA6kB,GAAA,CACA/jB,KAAA,OAEAikB,MAAA,cACA6M,QAAA,EACAM,eAAA,EACAC,eAAA,EACA,OAAAN,CAAA/pB,EAAAgqB,GACA,UAAA9pB,EAAA,cAAAF,EAAAiqB,SACA,IAGA,IAAAka,GAAA,CAAA1iC,EAAA0C,KACA,OAAAA,EAAA2G,MAAA1F,MACA,KAAAU,EAAAC,QAAAX,KACA,OAAA3D,EAAAmc,QACA,KAAA9X,EAAAE,KAAAZ,KACA,OAAA3D,EAAA3J,KACA,KAAAgO,EAAAG,OAAAb,KACA,OAAA3D,EAAAyN,OACA,KAAApJ,EAAAI,aAAAd,KACA,OAAA3D,EAAAoc,aACA,QACA,OAAApc,EAAA3J,OAGAilB,GAAA,CACA/jB,KAAA,aACAikB,MAAA,iBACA6M,QAAA,EACA2B,WAAA,EACA1B,QAAA,CAAA1M,EAAA2M,KACA,IAAAE,OACAA,GACM7M,EACN,OACArkB,KAAA,aACAuZ,KAAA2X,EAAA3X,KACAqL,QAAAJ,GAAAwM,EAAA,IACAlyB,KAAA0lB,GAAAwM,EAAA,IACA9a,OAAAsO,GAAAwM,EAAA,IACAnM,aAAAL,GAAAwM,EAAA,MAGA9M,YAAA,CAAAzb,EAAA0C,KACA,IAAAjM,EAAAisC,GAAA1iC,EAAA0C,GACAwnB,EAAA5N,GAAA7lB,EAAAiM,GAAA,GACA,OAAAmT,GAAAqU,IAEAxO,cAAA,CAAA1b,EAAA0C,KACA,IAAAjM,EAAAisC,GAAA1iC,EAAA0C,GACA,OAAA6d,GAAA9pB,EAAAiM,MAKA,IAAAigC,GAAA,CAAAtiB,EAAAuiB,EAAAC,EAAAngC,EAAA2G,EAAAsF,EAAAm0B,KACAziB,EAAA1J,GAAA,IAAA0J,IACA,IACAtc,EACAF,EAmBAk/B,EArBAC,EAAAH,GAAA1iC,EAAA0iC,GAKA,GAAAD,EAAA,CACA,IAAAlsB,EAAAiG,GAAAimB,EAAAlgC,EAAAkJ,YAAAvC,EAAAxF,OAAAnB,GACAmB,EAAA,CACA6S,OACAqS,KAAA3vB,KAAAqI,IAAAiB,EAAA6I,cAAAyE,cAAAtN,EAAA6I,cAAA2E,cAAAwG,EAAAvN,OAEA,CACA,GAAA05B,EAAA,CACA,IAAAxqB,EAAAsE,GAAAkmB,EAAAngC,EAAAkJ,YAAAvC,EAAAtF,OAAArB,GACAqB,EAAA,CACA2S,KAAA2B,EACA0Q,KAAA3vB,KAAAqI,IAAAiB,EAAA6I,cAAA0E,cAAAvN,EAAA6I,cAAA4E,cAAAkI,EAAAzkB,QAEA,CAIA,GAAAiQ,GAAAE,EAAA,CACA,IAAA4T,EAAAjV,EAAA6I,cAAA6E,cAAArM,EAAA2S,KAAA9iB,OAAAmQ,EAAA2S,KAAAvN,MAAApF,EAAAglB,KAAA1I,EAAAlX,MAAA25B,EACAC,EAAA5rB,GAAA,CACAE,aAAA,SACAO,aAAAD,EACA1O,SAAA,EACA1R,KAAA,OACAoM,KAAAjB,EAAA6I,cAAA6E,eACO,CACP7Y,KAAA,OACAmf,KAAA3S,EAAA2S,KACAgC,WAAAzM,GAAA0C,IACO,CACPpX,KAAA,OACAoM,KAAAI,EAAAglB,MACO,CACPxxB,KAAA,OACAmf,KAAA2J,GACO,CACP9oB,KAAA,OACAoM,KAAAE,EAAAklB,MACO,CACPxxB,KAAA,OACAmf,KAAA7S,EAAA6S,KACAgC,WAAAzM,EAAA0C,IACO,CACPpX,KAAA,OACAoM,KAAAjB,EAAA6I,cAAA6E,iBAGA,MAAI,GAAArM,EAAA,CACJ,IAAA0U,EAAA4H,EAAAzsB,OAAAkvC,EAKAC,EAAA5rB,GAAA,CACAE,aAAA,MACAO,aAAAa,EACAxP,SAAA,EACA1R,KAAA,OACAoM,KAAAjB,EAAA6I,cAAA6E,eACO,CACP7Y,KAAA,OACAmf,KAAA3S,EAAA2S,KACAgC,WAAAzM,GAAA0C,IACO,CACPpX,KAAA,OACAoM,KAAAI,EAAAglB,MACO,CACPxxB,KAAA,OACAmf,KAAA2J,KAGA,KAAI,KAAAxc,EAwBJ,OAAAwc,EAvBA,IAAA4iB,EAAA5iB,EAAAlX,MAAA25B,EACAC,EAAA5rB,GAAA,CACAE,aAAA,SACAO,aAAAqrB,EACAh6B,SAAA,EACA1R,KAAA,OACAmf,KAAA2J,GACO,CACP9oB,KAAA,OACAoM,KAAAE,EAAAklB,MACO,CACPxxB,KAAA,OACAmf,KAAA7S,EAAA6S,KACAgC,WAAAzM,EAAA0C,IACO,CACPpX,KAAA,OACAoM,KAAAjB,EAAA6I,cAAA6E,iBAQA,CACA,IAAAwF,EAAA,CAAAmtB,GACA,GAAAh/B,GAAA,IAAA4K,IAAAq0B,EAAA,CAGA,IAAAE,EAAAvsB,GAAA,cAAAjU,GACAwgC,EAAA75B,MAAA2E,YAAA/B,EAAA0C,GACAiH,EAAAgI,QAAAslB,EACA,CACA,OAAAvsB,GAAA,oBAAAf,EAAAlT,IAKAygC,GAAA,IAAAjjC,IAAA,gBAGAkjC,GAAA,CAAA/b,EAAA3kB,KAEA,IAAAkgC,EACAC,EAEA7iC,EADAqjC,GAAA,EAEA,WAAAhc,EAAA9vB,MAIAqrC,EAAAvb,EAAAxjB,IACAg/B,EAAAxb,EAAAtjB,IACA/D,EAAA+mB,GAAAM,EAAAhH,KAAA,MACAgjB,GAAA,GAEArjC,EAAA+mB,GAAAM,EAAA,MAEA,IAMAhH,EAGAijB,EATAj6B,EAAA3G,EAAA2G,MACAk6B,GAAA,EASA,GARAl6B,EAAA1F,OAAAU,EAAAC,QAAAX,MAAA3D,EAAAgrB,SAAAmY,GAAA/iC,IAAAJ,EAAA7I,QAEAosC,GAAA,GAMAvjC,EAAAgrB,OAAA,CAEA,IAAA5W,EAAAmvB,EAAA,gCACAC,EAAA,GASA,GARA,YAAAxjC,EAAA7I,MAAA,aAAA6I,EAAA7I,OAGAqsC,EAAAxjC,EAAA7I,KAAAyB,MAAA,GACAoH,EAAA7I,KAAA,UAAAqsC,EAAA,oBAGAF,GADAjjB,EAAA/L,GAAAtU,EAAA7I,KAAAid,EAAA,OAAA1R,EAAA,mBAAA6gC,EAAA,yBACAx2B,OACAy2B,EAAApxC,OAAA,GAGA,IAAAqxC,EAAAtpB,GAAAqpB,EAAA,QAAAD,EAAA,SAAA7gC,GACA2d,EAAAlJ,GAAA,CACAE,aAAA,kBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAA2J,EACA7I,MAAA,GACS,CACTjgB,KAAA,OACAmf,KAAA+sB,EACAjsB,MAAA+rB,EAAA,UAGAvjC,EAAA7I,KAAA,KAAAqsC,EACAnjB,EAAAnX,QAAA0U,QAAA,OAGAyC,EAAAtT,OAAAu2B,CACA,CACA,MAAI,GAAAtjC,EAAAvJ,KAAA,CAEJ,IAAAmb,EAAA0K,GAAAtc,EAAAvJ,KAAAiM,GAAA,GACA,IAAAkP,EAAAxf,QAAAwf,EAAA,aAAArE,GACA8S,EAAAzO,EAAA,IACA1I,QAAA,SAEAmX,EAAA1J,GAAA,QAAA/E,EAAAlP,EAEA,KAAI,CAIJ,IADA,IAAAjC,EAAA,GACA1H,EAAA,EAAoBA,EAAAiH,EAAA7I,KAAA/E,OAAuB2G,IAC3C0H,EAAA5J,KAAA4d,GAAAzU,EAAA7I,KAAA4B,GAAAiH,EAAA8Q,KAAApO,IAEA2d,EAAA1J,GAAA,QAAAlW,EAAAiC,EACA,CAEA,IAGAghC,EAHAZ,EAAA,EACAn0B,EAAA,GACA0R,aAAA9S,GAAA,YAAAvN,EAAA7I,MAAA,aAAA6I,EAAA7I,QAAA6I,EAAAirB,oBAQA6X,GAAAziB,EAAAzsB,OAAAysB,EAAAlX,OAAA,EAAAzG,EAAA6I,cAAAuE,WAIAnB,EAAA,OAAA+0B,EAAArjB,EAAAtT,QAAA22B,EAAA,GAEA,OAAAL,EACAV,GAAAtiB,EAAAuiB,EAAAC,EAAAngC,EAAA2G,EAAAsF,EAAAm0B,IAEAA,IACAziB,EAAAhX,MAAAnK,SAAA,WACAmhB,EAAAhX,MAAAoP,IAAAxM,EAAA62B,IAEAziB,IA6BAsjB,GAAA,CACA,aACA,eACA,YACA,iBACA,eACA,eACA,eACA,gBACA,iBACA,kBACA,iBACA,kBAEAroB,GAAA,CACA/jB,KAAA,KACAikB,MAAA,oNACA6M,QAAA,EACAC,QAAA,CAAA1M,EAAA2M,KACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACNgoB,EAAApb,EAIA,OAHA,IAAAob,EAAAxxC,SACAwxC,EAAAD,GAAAC,IAEA,CACArsC,KAAA,KACAuZ,KAAA2X,EAAA3X,KACA+Z,QAAA,EACAE,gBAAA,EACAC,QAAA,EACA7zB,KAAAysC,IAGAnoB,YAAA2nB,GACA1nB,cA/DA,CAAA1b,EAAA0C,KACA,IAAAgK,EACA,GAAA1M,EAAAgrB,OAEAte,EAAA,IAAAyS,GAAA,MAAAM,GAAAzf,EAAA7I,KAAA6I,EAAA8Q,QACAqyB,GAAA/iC,IAAAJ,EAAA7I,OACAuV,EAAAE,aAAA,wBAEI,GAAA5M,EAAAvJ,KAEJiW,EAAA,IAAAyS,GAAA,KAAAa,GAAAhgB,EAAAvJ,KAAAiM,QACI,CAGJgK,EAAA,IAAAyS,GAAA,UAAAE,GAAArf,EAAA7I,KAAAyB,MAAA,MAGA,IAAAirC,EAAA,IAAA1kB,GAAA,MAAAM,GAAA,cAEA/S,EADA1M,EAAA+qB,eACA,IAAA5L,GAAA,QAAAzS,EAAAm3B,IAEA3kB,GAAA,CAAAxS,EAAAm3B,GAEA,CACA,OAAAn3B,KAyCA4O,GAAA,CACA/jB,KAAA,KACAikB,MAAA,aACA6M,QAAA,EACA2B,WAAA,EACA1B,QAAA,CAAAkC,EAAAjC,KACA,IAAAE,OACAA,GACM+B,EACN/zB,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,KACAuZ,KAAA2X,EAAA3X,KACA+Z,QAAA,EACAE,gBAAA,EACAC,QAAA,EACAv0B,KAAAslB,GAAAtlB,OAOA,IAAAqtC,GAAA,CACA,YACA,aACA,cACA,aACA,cACA,gBAGAxoB,GAAA,CACA/jB,KAAA,KACAikB,MAAA,iRACA6M,QAAA,EACA,OAAAC,CAAAmC,GACA,IAAAhC,OACAA,EAAAD,SACAA,GACMiC,EACN,OACAlzB,KAAA,KACAuZ,KAAA2X,EAAA3X,KACA+Z,QAAA,EACAE,gBAAA,EACAC,QAAA,EACA7zB,KAAAqxB,EAEA,IAGAlN,GAAA,CACA/jB,KAAA,KACAikB,MAAA,iEACA6M,QAAA,EACA,OAAAC,CAAA4F,GACA,IAAAzF,OACAA,EAAAD,SACAA,GACM0F,EACN,OACA32B,KAAA,KACAuZ,KAAA2X,EAAA3X,KACA+Z,QAAA,EACAE,gBAAA,EACAC,QAAA,EACA7zB,KAAAqxB,EAEA,IAGAlN,GAAA,CACA/jB,KAAA,KACAikB,MAAA,mFACA6M,QAAA,EACAsW,mBAAA,EACA,OAAArW,CAAA+M,GACA,IAAA5M,OACAA,EAAAD,SACAA,GACM6M,EACNuO,EAAApb,EAIA,OAHA,IAAAob,EAAAxxC,SACAwxC,EAAAE,GAAAF,IAEA,CACArsC,KAAA,KACAuZ,KAAA2X,EAAA3X,KACA+Z,QAAA,EACAE,gBAAA,EACAC,QAAA,EACA7zB,KAAAysC,EAEA,IAMA,IAAAG,GAAA,CAAA1c,EAAA3kB,KAEA,IAAAkgC,EACAC,EAEA7iC,EAYAqgB,EAbAgjB,GAAA,EAcA,GAZA,WAAAhc,EAAA9vB,MAIAqrC,EAAAvb,EAAAxjB,IACAg/B,EAAAxb,EAAAtjB,IACA/D,EAAA+mB,GAAAM,EAAAhH,KAAA,gBACAgjB,GAAA,GAEArjC,EAAA+mB,GAAAM,EAAA,gBAGArnB,EAAAvJ,KAAArE,OAAA,GAeA,IAdA,IAAAqE,GAAAuJ,EAAAvJ,KAAAoC,IAAAoR,IACA,IAAA+5B,EAAA,SAAA/5B,EAAAA,EAAA5T,UAAAO,EACA,uBAAAotC,EACA,CACAzsC,KAAA,UACAuZ,KAAA7G,EAAA6G,KACAza,KAAA2tC,GAGA/5B,KAIAsS,EAAAD,GAAA7lB,EAAAiM,EAAAqf,SAAA,cACAhpB,EAAA,EAAoBA,EAAAwjB,EAAAnqB,OAAuB2G,IAAA,CAC3C,IAAAkR,EAAAsS,EAAAxjB,GACAkR,aAAAsD,IAGAtD,EAAA5T,KAAA4T,EAAA5T,KAAA0G,QAAA,cAAAA,QAAA,cAEA,CACAsjB,EAAA1J,GAAA,QAAA4F,EAAA7Z,EACA,MACA2d,EAAA1J,GAAA,WAAAjU,GAEA,OAAA2gC,EACAV,GAAAtiB,EAAAuiB,EAAAC,EAAAngC,EAAAA,EAAA2G,MAAA,KAEAgX,GAgUA,SAAA4jB,GAAAlmC,EAAA2E,EAAA0b,GAKA,IAJA,IAAAxM,EAAA0K,GAAAve,EAAA2E,GAAA,GACA6b,EAAA7b,EAAA+I,eAAA2S,EAAA3S,eAGA1S,EAAA,EAAkBA,EAAA6Y,EAAAxf,OAAkB2G,IAAA,CACpC,IAAA8/B,EAAAjnB,EAAA7Y,GAAAmQ,QAAAy4B,QAAA,UACA9I,EAAA,EACA1iC,MAAAkJ,UAAAxI,KAAApE,MAAAmf,EAAA7Y,GAAAmQ,QAAAxG,EAAA4b,cAAAF,IACMxM,EAAA7Y,GAAAmQ,QAAA2vB,EAAA,kBAAAn2B,EAAAiB,OAINiO,EAAA7Y,GAAAmQ,QAAA2vB,EAAA,gBAAAza,EAAAza,MAEAiO,EAAA7Y,GAAAnF,QAAA2qB,EACA3M,EAAA7Y,GAAAoQ,OAAAoV,CACA,CACA,OAAA1I,GAAAjE,EACA,CA9RA0J,GAAA,CACA/jB,KAAA,eACAikB,MAAA,+CACA6M,QAAA,EACAC,QAAA,CAAA1M,EAAA2M,KACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACNnlB,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,eACAuZ,KAAA2X,EAAA3X,KACAra,KAAAslB,GAAAtlB,GACAq0B,mBAAA,6BAAAtC,EACAqC,QAAA,EACAE,gBAAA,IAGAtP,YAAAsoB,GACAroB,cAtEA,CAAA1b,EAAA0C,KAKA,IAHA,IAAA6Z,EAAAyD,GAAAhgB,EAAAvJ,KAAAiM,EAAAqf,SAAA,WAEAmiB,GAAA,EACAnrC,EAAA,EAAkBA,EAAAwjB,EAAAnqB,OAAuB2G,IAAA,CACzC,IAAA2T,EAAA6P,EAAAxjB,GACA,GAAA2T,aAAA4S,SAAqC,GAAA5S,aAAAyS,GACrC,OAAAzS,EAAAnV,MACA,SACA,SACA,aACA,YACA,MAEA,SAEA,IAAA0S,EAAAyC,EAAAzD,SAAA,GACA,IAAAyD,EAAAzD,SAAA7W,QAAA6X,aAAAoV,GACApV,EAAA5T,KAAA4T,EAAA5T,KAAA0G,QAAA,cAAAA,QAAA,cAEAmnC,GAAA,EAEA,MAEA,QACAA,GAAA,OAGAA,GAAA,CAEA,CACA,GAAAA,EAAA,CAEA,IAAAC,EAAA5nB,EAAA1jB,IAAA6T,GAAAA,EAAA1C,UAAAhR,KAAA,IACAujB,EAAA,KAAA8C,GAAA8kB,GACA,CACA,IAAAC,EAAA,IAAAjlB,GAAA,KAAA5C,GACA6nB,EAAAx3B,aAAA,wBAGA,IAAAi3B,EAAA,IAAA1kB,GAAA,MAAAM,GAAA,cACA,OAAAzf,EAAA+qB,eACA,IAAA5L,GAAA,QAAAilB,EAAAP,IAEA3kB,GAAA,CAAAklB,EAAAP,OA2BAnO,GAAA,qEAEA/Z,GAAA,CACApkB,KAAA,WACAkkB,YAAA,CAAAzb,EAAA0C,IACA1C,EAAAqkC,WACAxuB,GAAAyG,GAAAtc,EAAAvJ,KAAAiM,GAAA,IAEAiU,GAAA,SAAA2F,GAAAtc,EAAAvJ,KAAAiM,GAAA,GAAAA,GAEAgZ,cAAA,CAAA1b,EAAA0C,IACA6d,GAAAvgB,EAAAvJ,KAAAiM,GAAA,KAIA4Y,GAAA,CACA/jB,KAAA,WACAikB,MAAA,eACA6M,QAAA,EACA,OAAAC,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,GACM7M,EACNnlB,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,WACAuZ,KAAA2X,EAAA3X,KACAra,OAEA,EACA,WAAAglB,CAAAzb,EAAA0C,GAGA,IAAAomB,EAAAnM,GAAA3c,EAAAvJ,KAAAiM,EAAA+e,sBAEA1K,EAAAF,GAAA,gBAAAnU,GAEAqN,EAAArN,EAAA6I,cAAAwE,qBACA6I,EAAAzB,GAAA,CACAE,aAAA,gBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAAoS,GACO,CACPvxB,KAAA,OACAoM,KAAA,EAAAoM,GACO,CACPxY,KAAA,OACAmf,KAAAK,GACO,CACPxf,KAAA,OACAoM,KAAAoM,MAGA,OAAA4G,GAAA,qBAAAiC,GAAAlW,EACA,EACA,aAAAgZ,CAAA1b,EAAA0C,GACA,IAAAmhC,EAAA,IAAA1kB,GAAA,UAAAE,GAAA,OACAwkB,EAAAj3B,aAAA,mBACA,IAAAF,EAAA,IAAAyS,GAAA,SAAAe,GAAAlgB,EAAAvJ,KAAAiM,GAAAmhC,IAEA,OADAn3B,EAAAE,aAAA,iBACAF,CACA,IAGA4O,GAAA,CACA/jB,KAAA,UACAikB,MAAA,cACA6M,QAAA,EACAM,eAAA,EACAL,QAAA,CAAA1M,EAAA2M,KACA,IAAAE,OACAA,GACM7M,EACNnlB,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAra,KAAAslB,GAAAtlB,KAGAglB,YAAA,CAAAzb,EAAA0C,KACA,IAAAwnB,EAAA5N,GAAAtc,EAAAvJ,KAAAiM,EAAAof,eAAA,GAGA,OAAAjM,GAAAqU,IAEAxO,cAAA,CAAA1b,EAAA0C,KACA,IAAAkP,EAAAoO,GAAAhgB,EAAAvJ,KAAAiM,GACA,WAAAyc,GAAA,WAAAvN,MAGA8jB,GAAA,uCACApa,GAAA,CACA/jB,KAAA,WACAikB,MAAA,eACA6M,QAAA,EACAM,eAAA,EACAL,QAAA,CAAAkC,EAAAjC,KACA,IAAAE,OACAA,GACM+B,EACN/zB,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,WACAuZ,KAAA2X,EAAA3X,KACAra,SAGAglB,YAAA,CAAAzb,EAAA0C,KACA,IAAAkP,EAAA+E,GAAA,WAAAgG,GAAA3c,EAAAvJ,KAAAiM,EAAAof,iBACAygB,EAAA5rB,GAAA,YACA,OAAAA,GAAA,iBAAA/E,EAAA2wB,GAAA7/B,IAEAgZ,cAAA,CAAA1b,EAAA0C,KACA,IAAAkP,EAAAoO,GAAAjE,GAAA/b,EAAAvJ,MAAAiM,GACA0e,EAAA,IAAAjC,GAAA,WAAAvN,GACAlF,EAAA,IAAAyS,GAAA,WAAAiC,IAEA,OADA1U,EAAAE,aAAA,eACAF,KAKA4O,GAAA,CACA/jB,KAAA,WACAikB,MAAA,eACA6M,QAAA,EACAQ,SAAA,gBACAF,eAAA,EACA,OAAAL,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,GACM7M,EACN0oB,EAAAvd,GAAAwB,EAAA,WAAAxqB,MACAtH,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,WACAuZ,KAAA2X,EAAA3X,KACA9c,GAAAswC,EACA7tC,OAEA,EACA,WAAAglB,CAAAzb,EAAA0C,GACA,IAAAjM,EAAAkmB,GAAA3c,EAAAvJ,KAAAiM,GACA1O,EAAAoX,EAAApL,EAAAhM,GAAA0O,GACA,OAAAyU,GAAA,CACAE,aAAA,QACAO,cAAA5jB,EACAiV,SAAA,EACA1R,KAAA,OACAmf,KAAAjgB,KAGA,EACA,aAAAilB,CAAA1b,EAAA0C,GACA,IAAAgK,EAAA,IAAAyS,GAAA,WAAAe,GAAAlgB,EAAAvJ,KAAAiM,KACA1O,EAAAgM,EAAAhM,GAAAgY,OAAAhM,EAAAhM,GAAAmX,KAEA,OADAuB,EAAAE,aAAA,UAAA5Y,GACA0Y,CACA,IAGA4O,GAAA,CACA/jB,KAAA,WACAikB,MAAA,YACA6M,QAAA,EACAM,eAAA,EACAgW,mBAAA,EACA,OAAArW,CAAA1M,GACA,IAAA6M,OACAA,GACM7M,EACN,OACArkB,KAAA,WACAuZ,KAAA2X,EAAA3X,KAEA,IAGAwK,GAAA,CACA/jB,KAAA,OACAikB,MAAA,WACA6M,QAAA,EACAY,gBAAA,EACAN,eAAA,EACAC,eAAA,EACAC,SAAA,uBACA,OAAAP,CAAA1M,EAAA2M,EAAAW,GACA,IAAAT,OACAA,GACM7M,EACNpE,EAAA0R,EAAA,GACAv1B,EAAAozB,GAAAwB,EAAA,WACA30B,EAAAmzB,GAAAwB,EAAA,WACA,OACAhxB,KAAA,OACAuZ,KAAA2X,EAAA3X,KACA0G,MAAAA,GAAAuP,GAAAvP,EAAA,QAAAzZ,MACApK,MAAAA,EAAAoK,MACAnK,OAAAA,EAAAmK,MAEA,EACA,WAAA0d,CAAAzb,EAAA0C,GAEA,IAAAyW,EAAAxC,GAAA,mBAAAjU,GAEA/O,EAAAyX,EAAApL,EAAArM,MAAA+O,GACA9O,EAAAwX,EAAApL,EAAApM,OAAA8O,GACA8U,EAAAxX,EAAAwX,MAAApM,EAAApL,EAAAwX,MAAA9U,GAAA,EAaA,OAXAyW,EAAA9P,MAAA8rB,iBAAAlpB,EAAAtY,GACAwlB,EAAA9P,MAAA6rB,eAAAjpB,EAAArY,GACAulB,EAAA9P,MAAAsO,OAAA1L,EAAAuL,GAEA2B,EAAAxlB,MAAAA,EACAwlB,EAAAvlB,OAAAA,EAAA4jB,EACA2B,EAAAhQ,OAAAqO,EAIA2B,EAAA/P,YAAA,MAAAxV,EAAA8O,EAAA+I,eACA0N,CACA,EACA,aAAAuC,CAAA1b,EAAA0C,GACA,IAAA/O,EAAAyX,EAAApL,EAAArM,MAAA+O,GACA9O,EAAAwX,EAAApL,EAAApM,OAAA8O,GACA8U,EAAAxX,EAAAwX,MAAApM,EAAApL,EAAAwX,MAAA9U,GAAA,EACAxB,EAAAwB,EAAAxB,OAAAwB,EAAA8J,YAAA,QACA2M,EAAA,IAAAgG,GAAA,UACAhG,EAAAvM,aAAA,iBAAA1L,GACAiY,EAAAvM,aAAA,QAAAX,EAAAtY,IACAwlB,EAAAvM,aAAA,SAAAX,EAAArY,IACA,IAAAgtB,EAAA,IAAAzB,GAAA,WAAAhG,IAQA,OAPA3B,GAAA,EACAoJ,EAAAhU,aAAA,SAAAX,EAAAuL,KAEAoJ,EAAAhU,aAAA,SAAAX,EAAAuL,IACAoJ,EAAAhU,aAAA,QAAAX,GAAAuL,KAEAoJ,EAAAhU,aAAA,UAAAX,EAAAuL,IACAoJ,CACA,IAuBA,IAAA2jB,GAAA,kIAQAjpB,GAAA,CACA/jB,KAAA,SACAikB,MAAA+oB,GACAlc,QAAA,EACAM,eAAA,EACAL,QAAA,CAAA1M,EAAA2M,KACA,IAAA8D,iBACAA,EAAA7D,SACAA,EAAAC,OACAA,GACM7M,EACNnlB,EAAAgyB,EAAA+D,iBAAA,EAAAH,GACA,OACA90B,KAAA,SACAuZ,KAAA2X,EAAA3X,KAEAnN,KAAA4gC,GAAA5C,QAAAnZ,GAAA,EACA/xB,SAGAglB,YA3BA,CAAAzb,EAAA0C,KAIA,IAAA2mB,EAAA3mB,EAAAma,WAAA7c,EAAA2D,MACA,OAAAsgC,GAAAjkC,EAAAvJ,KAAA4yB,EAAA3mB,IAuBAgZ,cAAA,CAAA1b,EAAA0C,KACA,IAAA2mB,EAAA3mB,EAAAma,WAAA7c,EAAA2D,MACAiO,EAAAoO,GAAAhgB,EAAAvJ,KAAA4yB,GACA3c,EAAA,IAAAyS,GAAA,SAAAvN,GAOA,OADAlF,EAAAE,aAAA,WAAAX,EAAAod,EAAA5d,iBACAiB,KAKA4O,GAAA,CACA/jB,KAAA,QACAikB,MAAA,YACA6M,QAAA,EACAY,gBAAA,EACAN,eAAA,EACAL,QAAA,CAAA1M,EAAA2M,EAAAW,KACA,IAAAT,OACAA,GACM7M,EACN4oB,GAAA,EACAC,GAAA,EACAC,EAAAxb,EAAA,IAAAnC,GAAAmC,EAAA,eACA,GAAAwb,EAKA,IADA,IAAAC,EACA5rC,EAAA,EAAsBA,EAAA2rC,EAAAjuC,KAAArE,SAAuB2G,EAAA,CAG7C,UADA4rC,EAAA3d,GADA0d,EAAAjuC,KAAAsC,IACA1C,MAEAmuC,GAAA,MACU,UAAAG,EAEA,CACVH,GAAA,EACAC,GAAA,EACA,KACA,CALAA,GAAA,CAKA,CACA,MAEAD,GAAA,EACAC,GAAA,EAEA,IAAAhuC,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,QACAuZ,KAAA2X,EAAA3X,KACAra,OACA+tC,cACAC,eAGAhpB,YAAA,CAAAzb,EAAA0C,KACA,IAAAgK,EAAAiK,GAAA,IAAAgG,GAAA3c,EAAAvJ,KAAAiM,KACA,IAAA1C,EAAAwkC,cAAAxkC,EAAAykC,WACA,OAAA/3B,EAQA,GANA1M,EAAAwkC,cACA93B,EAAA9Y,OAAA,GAEAoM,EAAAykC,aACA/3B,EAAAvD,MAAA,GAEAnJ,EAAAwkC,aAAAxkC,EAAAykC,WAEA,OAAA9tB,GAAA,kBAAAjK,GAAAhK,GAIA,GAAAgK,EAAAzD,SACA,QAAAlQ,EAAA,EAAsBA,EAAA2T,EAAAzD,SAAA7W,OAA0B2G,IAChDiH,EAAAwkC,cACA93B,EAAAzD,SAAAlQ,GAAAnF,OAAA,GAEAoM,EAAAykC,aACA/3B,EAAAzD,SAAAlQ,GAAAoQ,MAAA,GAQA,IAAAy7B,EAAAztB,GAAA,CACAE,aAAA,gBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAAhK,MAIA,OAAAiK,GAAA,UAAAiuB,GAAAliC,IAEAgZ,cAAA,CAAA1b,EAAA0C,KACA,IAAAgK,EAAA,IAAAyS,GAAA,WAAAe,GAAAlgB,EAAAvJ,KAAAiM,KAOA,OANA1C,EAAAwkC,aACA93B,EAAAE,aAAA,gBAEA5M,EAAAykC,YACA/3B,EAAAE,aAAA,eAEAF,KAIA4O,GAAA,CACA/jB,KAAA,OACAikB,MAAA,WACA6M,QAAA,EACAY,gBAAA,EACA,OAAAX,CAAA1M,EAAA2M,EAAAW,GACA,IAAAT,OACAA,GACM7M,EACNiC,EAAAqL,EAAA,GACAzyB,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,OACAuZ,KAAA2X,EAAA3X,KACAra,OACAonB,QAEA,EACA,WAAApC,CAAAzb,EAAA0C,GAIA,IAAAkP,EAAA+K,GAAA3c,EAAAvJ,KAAAiM,EAAA+e,sBACA,IAAA7P,EAAAhe,SAEAge,EAAAhe,OAAA8O,EAAA6I,cAAAM,SAIA+F,EAAAsF,GAAAtF,EAAAlP,GAEA,IACAmiC,EADAniC,EAAA6I,cACAwE,qBACA+0B,EAAAD,EACAniC,EAAA2G,MAAA3V,GAAA2Q,EAAAE,KAAA7Q,KACAoxC,EAAApiC,EAAA6I,cAAAM,SAGA,IAAAk5B,EAAAF,EAAAC,EAAA,EACAE,EAAApzB,EAAAhe,OAAAge,EAAAzI,MAAA47B,EAAAF,GAGA92B,KAAAimB,EAAA0L,UACAA,EAAAuF,aACAA,GA/lIA,SAAArxC,EAAA8O,GAGA,IAQAqL,EACAm3B,EACAC,EACAvf,EACAqf,EAZA5b,EAAA3mB,EAAAkf,mBAEA2M,EAAA0D,GAAA,SAAAr+B,EAAAy1B,EAAA5d,eAAAqmB,GAAAzI,GACA5d,EAAA4d,EAAA5d,eAGAqlB,EAAA13B,KAAAqI,IAAA,EAAAiB,EAAAnB,iBAAAmB,EAAA6I,cAAA8E,mBA8CA,MAlCA,UAAAke,EAAAh3B,MAIA3D,EAAA,EACA6X,EAAA,EACM7X,EAAA,MACN6X,EAAA,IAGA05B,GAAA,EAAArU,GAAArlB,GACAsC,EAAA6iB,GAAA,WAFAsU,GAAA,EAAApU,EAAAH,IAAAllB,EANAma,EAAA,QAAAkL,EAzCA,GAiDAA,EAAApuB,IACA2G,MAAAqc,SAAA,UACAuf,EAAA,KAAAx5B,GACI,UAAA8iB,EAAAh3B,MAEJquB,EAAA,KAAA8L,GAAAnD,EAAA5qB,MACAwhC,GAAAzT,GAAAnD,EAAA5qB,MAAAmtB,GAAArlB,EACAy5B,GAAAxT,GAAAnD,EAAA5qB,MAAAmtB,EAAAH,IAAAllB,GACAsC,EAAA6iB,GAAA,WAAArC,EAAA5qB,KAAAuhC,EAAAtf,EAAAkL,EAAApuB,IACA2G,MAAAqc,SAAA,SACAuf,EAAA,EAAAx5B,IAIAy5B,EAAAtxC,EAAAk9B,EAAAH,GACAwU,EAAAvxC,EAAAk9B,EACAlL,EAAAxsB,KAAAC,MAAA,IAAAzF,EAAAk9B,GAjEA,IAkEA/iB,EAAA6iB,GAAA,WAAAsU,EAAAtf,EAAAkL,EAAApuB,IACA2G,MAAAqc,SAAA,UACAuf,EAAA,OAEAl3B,EAAAna,OAAAuxC,EACAp3B,EAAA1E,MAAAzV,OAAAqY,EAAAi5B,GACA,CACAn3B,OACAk3B,eAKAvF,WAAAh9B,EAAA6I,cAAA8E,kBAAAygB,GAAArlB,EAEA,CAgiIM25B,CAAAJ,EAAAtiC,GACN2iC,EAAArR,EAAApgC,OAAA8rC,EAEA2F,EAAAzzB,EAAAhe,OAAAge,EAAAzI,MAAA47B,IACAA,GAAAA,EAAAM,EAAAzzB,EAAAhe,OAAAge,EAAAzI,OAAA,GAGA,IAAA8qB,EAAAD,EAAApgC,OAAAge,EAAAhe,OAAAmxC,EAAArF,EACA9tB,EAAAvI,MAAAgrB,YAAApoB,EAAAg5B,GAEA,IAAAxuC,EAAA0gB,GAAA,CACAE,aAAA,gBACApO,SAAA,EACA1R,KAAA,OACAmf,KAAA9E,EACA0G,eAAA,eACO,CACP/gB,KAAA,OACAoM,OAAAiO,EAAAhe,OAAAqgC,IACO,CACP18B,KAAA,OACAmf,KAAAsd,GACO,CACPz8B,KAAA,OACAoM,KAAA+7B,MAGA,GAAA1/B,EAAA6d,MAEM,CAGN,IAAAwL,EAAA3mB,EAAAkJ,YAAAvH,EAAAI,cACA6gC,EAAA3oB,GAAA3c,EAAA6d,MAAAwL,EAAA3mB,GAGA6iC,EAAA,IAAA9uC,EAAA7C,OAAA6C,EAAA0S,OAEAq8B,EAAAruB,GAAA,CACAE,aAAA,QACAO,cAAA2tB,EACAt8B,SAAA,EACA1R,KAAA,OACAmf,KAAA4uB,MAKAG,EAAA9uB,GAAA,UAAA6uB,IACA,OAAA7uB,GAAA,iBAAA8uB,EAAAhvC,GAAAiM,EACA,CAtBA,OAAAiU,GAAA,iBAAAlgB,GAAAiM,EAuBA,EACA,aAAAgZ,CAAA1b,EAAA0C,GACA,IAAAjM,KACAA,EAAAonB,MACAA,GACM7d,EACN,OAAA6d,EAAA,IAAAsB,GAAA,SAAAe,GAAAzpB,EAAAiM,GAAAwd,GAAArC,EAAAnb,KAAA,IAAAyc,GAAA,SAAAe,GAAAzpB,EAAAiM,IACA,IAGA,IAAAgjC,GAAA,CACAvpB,QAAA9X,EAAAC,QACAjO,KAAAgO,EAAAE,KACAkJ,OAAApJ,EAAAG,OACA4X,aAAA/X,EAAAI,cAKA6W,GAAA,CACA/jB,KAAA,UACAikB,MAAA,uEACA6M,QAAA,EACAM,eAAA,EACAqB,WAAA,EACA,OAAA1B,CAAA1M,EAAA2M,GACA,IAAA8D,iBACAA,EAAA7D,SACAA,EAAAC,OACAA,GACM7M,EAENnlB,EAAAgyB,EAAA+D,iBAAA,EAAAH,GAGAhjB,EAAAmf,EAAA5vB,MAAA,EAAA4vB,EAAAp2B,OAAA,GACA,KAAAiX,KAnBAq8B,IAoBA,UAAApwC,MAAA,kBAAA+T,GAEA,OACA9R,KAAA,UACAuZ,KAAA2X,EAAA3X,KAGAzH,QACA5S,OAEA,EACA,WAAAglB,CAAAzb,EAAA0C,GAEA,IAAAijC,EAAAD,GAAA1lC,EAAAqJ,OACAggB,EAAA3mB,EAAAkJ,YAAA+5B,GAIA,OAHA3lC,EAAAwrB,YACAnC,EAAAA,EAAAtH,SAAA,KAEAkiB,GAAAjkC,EAAAvJ,KAAA4yB,EAAA3mB,EACA,EACA,aAAAgZ,CAAA1b,EAAA0C,GAEA,IAAAijC,EAAAD,GAAA1lC,EAAAqJ,OACAggB,EAAA3mB,EAAAkJ,YAAA+5B,GACA3lC,EAAAwrB,YACAnC,EAAAA,EAAAtH,SAAA,KAEA,IAAAnQ,EAAAoO,GAAAhgB,EAAAvJ,KAAA4yB,GACA3c,EAAA,IAAAyS,GAAA,SAAAvN,GAOAjF,EANA,CACAwP,QAAA,aACA9lB,KAAA,cACAoX,OAAA,cACA2O,aAAA,eAEApc,EAAAqJ,OAGA,OAFAqD,EAAAE,aAAA,cAAAD,EAAA,IACAD,EAAAE,aAAA,eAAAD,EAAA,IACAD,CACA,IAiCAiP,GAAA,CACApkB,KAAA,SACA,WAAAkkB,CAAAzb,EAAA0C,GAKA,IAAAkjC,EA9BA,SAAA5lC,EAAA0C,GACA,IAAA2d,EAAArgB,EAAAqgB,KACA,OAAAA,EAEI,OAAAA,EAAA9oB,KAGJ8oB,EAAAwK,SAAAnoB,EAAA2G,MAAA1F,OAAAU,EAAAC,QAAAX,MAAA0c,EAAAyK,oBACAsY,GAAA,KACI,iBAAA/iB,EAAA9oB,KACJ8oB,EAAAyK,qBAAApoB,EAAA2G,MAAA1F,OAAAU,EAAAC,QAAAX,MAAA0c,EAAAwK,QACAkZ,GAAA,KACI,WAAA1jB,EAAA9oB,KACJ4I,EAAAkgB,EAAAA,MAAA+G,GAAA,KACI,eAAA/G,EAAA9oB,OACJyI,EAAA+D,MACAsc,EAAA0gB,OAAAF,GAEA,KAfA,IAiBA,CAUAgF,CAAA7lC,EAAA0C,GACA,GAAAkjC,EACA,OAAAA,EAAA5lC,EAAA0C,GAEA,IAMAojC,EACAC,EAqBAC,GA3BA3lB,KAAA4lB,EACApiC,IAAAqiC,EACAniC,IAAAoiC,GACMnmC,EACNqgB,EAAA1D,GAAAspB,EAAAvjC,GAGAsO,EAAAtO,EAAA6I,cAEA66B,EAAA,EACAC,EAAA,EACAC,EAAAL,GAAA9lC,EAAA8lC,GACA,GAAAC,EAAA,CACA,IAAA7c,EAAA3mB,EAAAkJ,YAAAlJ,EAAA2G,MAAAxF,OACAiiC,EAAAnpB,GAAAupB,EAAA7c,EAAA3mB,GACA4jC,IACAF,EAAA/lB,EAAAzsB,OAAAy1B,EAAA9d,cAAAmE,QAAA2Z,EAAA5d,eAAA/I,EAAA+I,eAEA,CACA,GAAA06B,EAAA,CACA,IAAAI,EAAA7jC,EAAAkJ,YAAAlJ,EAAA2G,MAAAtF,OACAgiC,EAAAppB,GAAAwpB,EAAAI,EAAA7jC,GACA4jC,IACAD,EAAAhmB,EAAAlX,MAAAo9B,EAAAh7B,cAAAoE,QAAA42B,EAAA96B,eAAA/I,EAAA+I,eAEA,CAIAu6B,EADAtjC,EAAA2G,QAAAhF,EAAAC,QACA0M,EAAA3B,KACM3M,EAAA2G,MAAAzF,QACNoN,EAAAzB,KAEAyB,EAAA1B,KAIA,IAeA4b,EAfA3M,EAAA7b,EAAA+I,eACAuC,EAAA/B,EAAA,GAAA+E,EAAAxF,QAAA+S,GACA7F,EAAA,KACA,GAAAqtB,EAAA,CAIA,IAEArC,EAFA8C,EAAAxmC,EAAAqgB,MAAA,OAAArgB,EAAAqgB,KAAA9oB,MAAAyI,EAAAqgB,KAAAlpB,OAAA,YAAA6I,EAAAqgB,KAAAlpB,MAAA,aAAA6I,EAAAqgB,KAAAlpB,MACA,GAAAkpB,aAAA9S,GAAAi5B,EAIA9tB,EAAAzM,IAAA,OAAAy3B,EAAArjB,EAAAtT,QAAA22B,EAAA,GAEA,CAEA,GAAAoC,GAAAC,EAAA,CACAK,EAAAhtC,KAAAqI,IAAA2kC,EAAAJ,EAAAF,EAAA38B,MAAA,IAAA6H,EAAAnF,SACAw6B,EAAAjtC,KAAAqI,IAAA4kC,EAAAr1B,EAAAvB,MACA,IAEAg3B,EAAA,EAFAz1B,EAAAjB,qBAGA,GAAAq2B,EAAAN,EAAA38B,OAAA48B,EAAAnyC,OAAAyyC,GAAAI,EAAA,CACAJ,EAAAI,GAAAL,EAAAN,EAAA38B,OAAA48B,EAAAnyC,OACA,IAAA8yC,EAAA,GAAA11B,EAAAnF,SAAAu6B,EAAAN,EAAA38B,OACAu9B,EAAA,IACAN,GAAAM,EACAL,GAAAK,EAEA,CAaAxb,EAAA/T,GAAA,CACAE,aAAA,kBACApO,SAdA,EACA1R,KAAA,OACAmf,KAAAqvB,EACAvuB,MAAA6uB,EACAr4B,cACA0K,cACO,CACPnhB,KAAA,OACAmf,KAAAovB,EACAtuB,OAAA4uB,EACAp4B,iBAMA,MAAM,GAAA+3B,EAAA,CAENM,EAAAjtC,KAAAqI,IAAA4kC,EAAAr1B,EAAAxB,KAAAu2B,EAAAnyC,OAAA,GAAAod,EAAAnF,SAOAqf,EAAA/T,GAAA,CACAE,aAAA,QACAO,aAAAyuB,EACAp9B,SATA,EACA1R,KAAA,OACAmf,KAAAqvB,EACArtB,aACA1K,iBAOA,KAAM,KAAA83B,EAaN,UAAAxwC,MAAA,uCAXA8wC,EAAAhtC,KAAAqI,IAAA2kC,EAAAJ,EAAAF,EAAA38B,MAAA,IAAA6H,EAAAnF,SACAqf,EAAA/T,GAAA,CACAE,aAAA,QACAO,cAAAwuB,EACAn9B,SAAA,EACA1R,KAAA,OACAmf,KAAAovB,EACA93B,iBAKA,CAEA,IAAAic,EAAA5M,GAAAgD,EAAA,iBACA,OAAA1J,GAAA,CAAAsT,GAAA,CAAA5J,EAAA1J,GAAA,aAAAuU,KAAAxoB,EACA,EACA,aAAAgZ,CAAA1b,EAAA0C,GAEA,IACAq+B,EADA4F,GAAA,EAGA3mC,EAAAqgB,MAAA,eAAArgB,EAAAqgB,KAAA9oB,QACAyI,EAAA6D,MACA7D,EAAAqgB,KAAA0gB,SACA4F,GAAA,EACA5F,EAAA/gC,EAAAqgB,KAAA0gB,SAGA/gC,EAAAqgB,MAAA,OAAArgB,EAAAqgB,KAAA9oB,MAAA,iBAAAyI,EAAAqgB,KAAA9oB,OACAyI,EAAAqgB,KAAA0K,gBAAA,GAEA,IAOA6b,EAPA39B,EAAA,CAAAiX,GAAAlgB,EAAAqgB,KAAA3d,IAQA,GAPA1C,EAAA+D,KACAkF,EAAApS,KAAAqpB,GAAAlgB,EAAA+D,IAAArB,IAEA1C,EAAA6D,KACAoF,EAAApS,KAAAqpB,GAAAlgB,EAAA6D,IAAAnB,IAGAikC,EACAC,EAAA7F,EAAA,sBACM,GAAA/gC,EAAA+D,IASA,GAAA/D,EAAA6D,IASA,CACN,IAAAgjC,EAAA7mC,EAAAqgB,KAEAumB,EADAC,GAAA,OAAAA,EAAAtvC,MAAAsvC,EAAAhc,QAAAnoB,EAAA2G,QAAAhF,EAAAC,SAEQuiC,GAAA,iBAAAA,EAAAtvC,MAAAsvC,EAAA/b,qBAAApoB,EAAA2G,QAAAhF,EAAAC,SAAAuiC,EAAAhc,QADR,aAIA,SAEA,KAlBM,CACN,IAAAic,EAAA9mC,EAAAqgB,KAEAumB,EADAE,GAAA,OAAAA,EAAAvvC,MAAAuvC,EAAAjc,SAAAnoB,EAAA2G,QAAAhF,EAAAC,SAAAwiC,EAAAhc,qBAEQgc,GAAA,iBAAAA,EAAAvvC,MAAAuvC,EAAAhc,qBAAAgc,EAAAjc,QAAAnoB,EAAA2G,QAAAhF,EAAAC,SADR,SAIA,MAEA,KAlBM,CACN,IAAA+b,EAAArgB,EAAAqgB,KAEAumB,EADAvmB,GAAA,OAAAA,EAAA9oB,MAAA8oB,EAAAwK,SAAAnoB,EAAA2G,QAAAhF,EAAAC,SAAA+b,EAAAyK,qBAEQzK,GAAA,iBAAAA,EAAA9oB,MAAA8oB,EAAAyK,qBAAAzK,EAAAwK,QAAAnoB,EAAA2G,QAAAhF,EAAAC,SADR,QAIA,MAEA,CAmBA,WAAA6a,GAAAynB,EAAA39B,EACA,IAIA0S,GAAA,CACApkB,KAAA,OACAkkB,YAAA,CAAAzb,EAAA0C,IACA+R,GAAAzU,EAAA3J,KAAA2J,EAAA8Q,KAAApO,EAAA,KAAA1C,EAAAuqB,SAEA,aAAA7O,CAAA1b,EAAA0C,GACA,IAAAgK,EAAA,IAAAyS,GAAA,MAAAM,GAAAzf,EAAA3J,KAAA2J,EAAA8Q,QACA,WAAA9Q,EAAAuqB,OAAA,CACA,IAAAjR,EAAAuG,GAAA7f,EAAA0C,GACA,gBAAA4W,GACA5M,EAAAE,aAAA,cAAA0M,EAEA,KAAM,UAAAtZ,EAAAuqB,OACN7d,EAAAE,aAAA,oBACM,SAAA5M,EAAAuqB,QAAA,UAAAvqB,EAAAuqB,QAGN7d,EAAAE,aAAA,oBAEA,OAAAF,CACA,IAKA,IAAAq6B,GAAA,CACAC,GAAA,SACAC,GAAA,SACAnxC,MAAA,UAEA6lB,GAAA,CACApkB,KAAA,UACAkkB,YAAA,CAAAzb,EAAA0C,IACAiS,GAAA3U,EAAA0C,GAEA,aAAAgZ,CAAA1b,EAAA0C,GACA,IAAAgK,EAAA,IAAAyS,GAAA,MAAAM,GAAAzf,EAAA3J,KAAA2J,EAAA8Q,KAAApO,KACA4W,EAAAuG,GAAA7f,EAAA0C,IAAA,SAIA,OAHA4W,IAAAytB,GAAAr6B,EAAAnV,OACAmV,EAAAE,aAAA,cAAA0M,GAEA5M,CACA,IAEAiP,GAAA,CACApkB,KAAA,UACAkkB,YAAA,CAAAzb,EAAA0C,IACAiS,GAAA3U,EAAA0C,GAEA,aAAAgZ,CAAA1b,EAAA0C,GACA,IAEAgK,EAFArW,EAAAopB,GAAAzf,EAAA3J,KAAA2J,EAAA8Q,KAAApO,GACA4W,EAAAuG,GAAA7f,EAAA0C,IAAA,SAcA,OAXAgK,EADA,SAAA1M,EAAA8Q,KACA,IAAAqO,GAAA,SAAA9oB,IACM,QAAAkN,KAAAvD,EAAA3J,MACN,IAAA8oB,GAAA,MAAA9oB,IACM,YAAA2J,EAAA3J,KACN,IAAA8oB,GAAA,MAAA9oB,IAEA,IAAA8oB,GAAA,MAAA9oB,IAEAijB,IAAAytB,GAAAr6B,EAAAnV,OACAmV,EAAAE,aAAA,cAAA0M,GAEA5M,CACA,IAIA,IAAAw6B,GAAA,CACA,sBACA,6BAOAC,GAAA,CACA,OACA,SACA,KACA59B,UAAA,WAEA,aACA,kBACAA,UAAA,YAKAoS,GAAA,CACApkB,KAAA,UACA,WAAAkkB,CAAAzb,EAAA0C,GACA,GAAAykC,GAAA50C,eAAAyN,EAAA3J,MAAA,CACA,IAAAkT,EAAA49B,GAAAnnC,EAAA3J,MAAAkT,WAAA,GAIA,YAAAvJ,EAAA8Q,KAAA,CACA,IAAAs2B,EAAAzyB,GAAA3U,EAAA0C,GAEA,OADA0kC,EAAAl+B,QAAArS,KAAA0S,GACA69B,CACA,CACA,OAAAzwB,GAAA,UAAApN,GAAA,CAAAkL,GAAAzU,EAAA3J,KAAA2J,EAAA8Q,KAAApO,IAAAA,EAEA,CAAM,GAAAwkC,GAAA30C,eAAAyN,EAAA3J,MAEN,OAAAsgB,GAAA,UAAAuwB,GAAAlnC,EAAA3J,OAAA,GAAAqM,GAEA,UAAAjE,EAAA,0BAAAuB,EAAA3J,KAAA,IAEA,EACA,aAAAqlB,CAAA1b,EAAA0C,GAEA,IAAAykC,GAAA50C,eAAAyN,EAAA3J,MAEM,IAAA6wC,GAAA30C,eAAAyN,EAAA3J,MAEN,WAAA8oB,GAAA,UAEA,UAAA1gB,EAAA,0BAAAuB,EAAA3J,KAAA,IACA,CACA,OAPA,IAAA8oB,GAAA,aAAAE,GAAA,MAQA,IAGA,IAAAgoB,GAAA,KACA,IAAAC,EAAA,IAAAnoB,GAAA,UAEA,OADAmoB,EAAA16B,aAAA,eACA06B,GAEA3rB,GAAA,CACApkB,KAAA,MACA,aAAAmkB,CAAA1b,EAAA0C,GACA,IAAAq5B,EAAA,IAAA5c,GAAA,cAAAA,GAAA,OAAAkoB,KAAA,IAAAloB,GAAA,OAAAoB,GAAAvgB,EAAAvJ,KAAAiM,KAAA2kC,KAAA,IAAAloB,GAAA,OAAAoB,GAAAvgB,EAAA6e,IAAAnc,SAEA,OADAq5B,EAAAnvB,aAAA,gBACAmvB,CAQA,IAIA,IAAAwL,GAAA,CACA,cAAA3wC,EACA,oBACA,oBACA,oBACA,yBAEA4wC,GAAA,CACA,oBACA,qBAEAC,GAAA,CACA,oBACA,qBAEAC,GAAA,CAAA1nC,EAAA0C,KACA,IAAAmO,EAAA7Q,EAAA6Q,KAEA,OAAAA,EAEI02B,GAAA12B,GACJnO,EAAAsf,mBAAAulB,GAAA12B,IACI22B,GAAA32B,GACJnO,EAAAuf,mBAAAulB,GAAA32B,IACI,WAAAA,EACJ,WAAAnO,EAAAoS,UAAApS,EAAAwf,kBAAA,UAAAxf,EAAAwf,kBAAA,UAEAxf,EAAAwf,kBAAAulB,GAAA52B,IARAnO,GAUA4Y,GAAA,CACA/jB,KAAA,OACAikB,MAAA,CAEA,yDAEA,sBAEA,gCACA6M,QAAA,EACAQ,SAAA,SACA8V,mBAAA,EACAhW,eAAA,EACA,OAAAL,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,EAAAD,SACAA,GACM5M,EACNnlB,EAAA8xB,EAAA,GACA,OACAhxB,KAAA,OACAuZ,KAAA2X,EAAA3X,KACAra,KAAAslB,GAAAtlB,GACAoa,KAAA2X,EAEA,EACA,WAAA/M,CAAAzb,EAAA0C,GACA,IAAA2mB,EAAAqe,GAAA1nC,EAAA0C,GACAkP,EAAA0K,GAAAtc,EAAAvJ,KAAA4yB,GAAA,GACA,OAAA1S,GAAA,gBAAA/E,EAAAyX,EACA,EACA,aAAA3N,CAAA1b,EAAA0C,GACA,IAAA2mB,EAAAqe,GAAA1nC,EAAA0C,GACA,OAAA6d,GAAAvgB,EAAAvJ,KAAA4yB,EACA,IAGA/N,GAAA,CACA/jB,KAAA,YACAikB,MAAA,gBACA6M,QAAA,EACAM,eAAA,EACA,OAAAL,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,GACM7M,EACN,OACArkB,KAAA,YACAuZ,KAAA2X,EAAA3X,KACAra,KAAA8xB,EAAA,GAEA,EACA,WAAA9M,CAAAzb,EAAA0C,GAGA,IAAAomB,EAAAnM,GAAA3c,EAAAvJ,KAAAiM,GAEAqU,EAAAF,GAAA,iBAAAnU,GAEAqN,EAAArN,EAAA6I,cAAAwE,qBACA6I,EAAAzB,GAAA,CACAE,aAAA,MACAO,aAAAkR,EAAAl1B,OACAqV,SAAA,EACA1R,KAAA,OACAoM,KAAAoM,GACO,CACPxY,KAAA,OACAmf,KAAAK,GACO,CACPxf,KAAA,OACAoM,KAAA,EAAAoM,GACO,CACPxY,KAAA,OACAmf,KAAAoS,MAGA,OAAAnS,GAAA,sBAAAiC,GAAAlW,EACA,EACA,aAAAgZ,CAAA1b,EAAA0C,GACA,IAAAmhC,EAAA,IAAA1kB,GAAA,UAAAE,GAAA,OACAwkB,EAAAj3B,aAAA,mBACA,IAAAF,EAAA,IAAAyS,GAAA,UAAAe,GAAAlgB,EAAAvJ,KAAAiM,GAAAmhC,IAEA,OADAn3B,EAAAE,aAAA,sBACAF,CACA,IAIA4O,GAAA,CACA/jB,KAAA,UACAikB,MAAA,cACA6M,QAAA,EACAQ,SAAA,aAEAF,eAAA,EACA,OAAAL,CAAA1M,EAAA2M,GACA,IAAAE,OACAA,GACM7M,EACN,OACArkB,KAAA,UACAuZ,KAAA2X,EAAA3X,KACAra,KAAA8xB,EAAA,GAEA,EACA,WAAA9M,CAAAzb,EAAA0C,GACA,IAAAjM,EAAAkmB,GAAA3c,EAAAvJ,KAAAiM,GACAoN,EAAApN,EAAA6I,cAAAuE,WACA9b,EAAA,IAAAyC,EAAA7C,OAAAkc,GAAArZ,EAAA0S,MAAA2G,IACA,OAAAqH,GAAA,CACAE,aAAA,QACAO,aAAA5jB,EACAiV,SAAA,EACA1R,KAAA,OACAmf,KAAAjgB,KAGA,EACA,aAAAilB,CAAA1b,EAAA0C,GAKA,IAAAilC,EAAA,IAAAxoB,GAAA,WAAAe,GAAAlgB,EAAAvJ,KAAAiM,IAAA,aACA,WAAAyc,GAAA,QAAAwoB,GACA,IAGArsB,GAAA,CACA/jB,KAAA,OACAikB,MAAA,WACA6M,QAAA,EACAM,eAAA,EACA,OAAAL,CAAA/pB,EAAAgqB,EAAAW,GAKA,UAAAzqB,EAAA,4DACA,EACA,WAAAgd,CAAAzb,EAAA0C,GAKA,IAJA,IAAArM,EAAAuxC,GAAA5nC,GACAvJ,EAAA,GAEA4yB,EAAA3mB,EAAAkJ,YAAAlJ,EAAA2G,MAAAhT,QACA0C,EAAA,EAAoBA,EAAA1C,EAAAjE,OAAiB2G,IAAA,CACrC,IAAAm/B,EAAA7hC,EAAA0C,GACA,MAAAm/B,IACAA,EAAA,oBAEAzhC,EAAAI,KAAAyd,GAAA4jB,EAAA,qBAAAl4B,EAAA8Q,KAAAuY,EAAA,mBACA,CACA,OAAA1S,GAAA,gBAAAjC,OAAA2U,EAAA/K,cAAA5b,IAAA4T,GAAA7f,GAAA4yB,EACA,EACA,aAAA3N,CAAA1b,EAAA0C,GACA,IAAArM,EAAA,IAAAgpB,GAAAuoB,GAAA5nC,IACA0M,EAAA,IAAAyS,GAAA,SAAA9oB,IAEA,OADAqW,EAAAE,aAAA,2BACAF,CACA,IAQA,IAAAk7B,GAAA5nC,GAAAA,EAAAvJ,KAAAsG,QAAA,KAAAiD,EAAA6nC,KAAA,SAGAC,GAAA3sB,GAqCA4sB,GAAA,YAGAC,GAAA,mBAAAD,GAAA,IAEAE,GAAA,QACAC,GAAA,IAAA9f,OAAA6f,GAAA,MACAE,GAAA,IAAAJ,GAAA,sDAIAE,GAJA,mCAOAA,GAPA,uDAYAD,GAAA,yBAGA,MAAAI,GACA,WAAApzC,CAAA+J,EAAAwjB,GACArtB,KAAA6J,WAAA,EACA7J,KAAAqtB,cAAA,EACArtB,KAAAmzC,gBAAA,EAGAnzC,KAAAozC,cAAA,EAEApzC,KAAA6J,MAAAA,EACA7J,KAAAqtB,SAAAA,EACArtB,KAAAmzC,WAAA,IAAAjgB,OAAA+f,GAAA,KACAjzC,KAAAozC,SAAA,CACA,OAEA,OAEA,CACA,UAAAC,CAAAC,EAAArc,GACAj3B,KAAAozC,SAAAE,GAAArc,CACA,CAIA,GAAAsc,GACA,IAAA1pC,EAAA7J,KAAA6J,MACA85B,EAAA3jC,KAAAmzC,WAAAK,UACA,GAAA7P,IAAA95B,EAAA3M,OACA,WAAA0jC,GAAA,UAAAH,GAAAzgC,KAAA2jC,EAAAA,IAEA,IAAA/4B,EAAA5K,KAAAmzC,WAAA/kC,KAAAvE,GACA,UAAAe,GAAAA,EAAA+d,QAAAgb,EACA,UAAAp6B,EAAA,0BAAAM,EAAA85B,GAAA,QAAA/C,GAAA/2B,EAAA85B,GAAA,IAAAlD,GAAAzgC,KAAA2jC,EAAAA,EAAA,KAEA,IAAAxiC,EAAAyJ,EAAA,IAAAA,EAAA,KAAAA,EAAA,cACA,QAAA5K,KAAAozC,SAAAjyC,GAAA,CAEA,IAAAsyC,EAAA5pC,EAAA4iC,QAAA,KAAAzsC,KAAAmzC,WAAAK,WAOA,OANA,IAAAC,GACAzzC,KAAAmzC,WAAAK,UAAA3pC,EAAA3M,OACA8C,KAAAqtB,SAAA1f,gBAAA,8HAEA3N,KAAAmzC,WAAAK,UAAAC,EAAA,EAEAzzC,KAAAuzC,KACA,CACA,WAAA3S,GAAAz/B,EAAA,IAAAs/B,GAAAzgC,KAAA2jC,EAAA3jC,KAAAmzC,WAAAK,WACA,EAUA,MAAAE,GAOA,WAAA5zC,CAAA6zC,EAAAC,QACA,IAAAD,IACAA,EAAA,SAEA,IAAAC,IACAA,EAAA,IAEA5zC,KAAA6zC,aAAA,EACA7zC,KAAA2zC,cAAA,EACA3zC,KAAA8zC,gBAAA,EACA9zC,KAAA6zC,QAAAD,EACA5zC,KAAA2zC,SAAAA,EACA3zC,KAAA8zC,WAAA,EACA,CAIA,UAAA7R,GACAjiC,KAAA8zC,WAAAnyC,KAAA,GACA,CAIA,QAAAghC,GACA,OAAA3iC,KAAA8zC,WAAA52C,OACA,UAAAqM,EAAA,kGAEA,IAAAwqC,EAAA/zC,KAAA8zC,WAAAlrB,MACA,QAAAorB,KAAAD,EACAA,EAAA12C,eAAA22C,KACA,MAAAD,EAAAC,UACAh0C,KAAA6zC,QAAAG,GAEAh0C,KAAA6zC,QAAAG,GAAAD,EAAAC,GAIA,CAKA,SAAAC,GACA,KAAAj0C,KAAA8zC,WAAA52C,OAAA,GACA8C,KAAA2iC,UAEA,CAKA,GAAAz3B,CAAAjJ,GACA,OAAAjC,KAAA6zC,QAAAx2C,eAAA4E,IAAAjC,KAAA2zC,SAAAt2C,eAAA4E,EACA,CASA,GAAAg2B,CAAAh2B,GACA,OAAAjC,KAAA6zC,QAAAx2C,eAAA4E,GACAjC,KAAA6zC,QAAA5xC,GAEAjC,KAAA2zC,SAAA1xC,EAEA,CAQA,GAAAo1B,CAAAp1B,EAAA4G,EAAAkvB,GAIA,QAHA,IAAAA,IACAA,GAAA,GAEAA,EAAA,CAKA,QAAAl0B,EAAA,EAAsBA,EAAA7D,KAAA8zC,WAAA52C,OAA4B2G,WAClD7D,KAAA8zC,WAAAjwC,GAAA5B,GAEAjC,KAAA8zC,WAAA52C,OAAA,IACA8C,KAAA8zC,WAAA9zC,KAAA8zC,WAAA52C,OAAA,GAAA+E,GAAA4G,EAEA,KAAM,CAIN,IAAA0a,EAAAvjB,KAAA8zC,WAAA9zC,KAAA8zC,WAAA52C,OAAA,GACAqmB,IAAAA,EAAAlmB,eAAA4E,KACAshB,EAAAthB,GAAAjC,KAAA6zC,QAAA5xC,GAEA,CACA,MAAA4G,SACA7I,KAAA6zC,QAAA5xC,GAEAjC,KAAA6zC,QAAA5xC,GAAA4G,CAEA,EAOA,IAAAoD,GAAAs0B,GAGAC,GAAA,sBAAAn3B,GAIA,IAAAlM,EAAAkM,EAAAovB,WAKA,OAJApvB,EAAAgvB,aAAAl7B,EAAAgE,QACAhE,EAAA+6B,UAAA,EACA/6B,EAAA0jC,cAAA,GAEA,CACA1I,OAAA,CAAAh7B,GACAg2B,QAAA,EAEA,GACAqN,GAAA,yBAAAn3B,GAMA,IAAAlM,EAAAkM,EAAAovB,WAEA,OADApvB,EAAA6qC,YAAA,GACA,CACA/b,OAAA,CAAAh7B,GACAg2B,QAAA,EAEA,GAGAqN,GAAA,yBAAAn3B,GAEA,OACA8uB,OAFA9uB,EAAA8qC,YAAA,GAEA,GACAhhB,QAAA,EAEA,GAGAqN,GAAA,0BAAAn3B,GAEA,OACA8uB,OAFA9uB,EAAA8qC,YAAA,GAEA,GACAhhB,QAAA,EAEA,GAKAqN,GAAA,yBAAAn3B,GACA,IAAAgqB,EAAAhqB,EAAA8qC,YAAA,GACA9qC,EAAAivB,gBACA,IAAAuK,EAAAx5B,EAAAkuB,SACA,WAAAlE,EAAA,GAAAn2B,QAAAm2B,EAAA,MAAAlyB,OAAA0hC,EAAA1hC,KACA,CACAg3B,OAAA9E,EAAA,GACAF,QAAA,GAGA,CACAgF,OAAA9E,EAAA,GACAF,QAAA,EAGA,GAKAqN,GAAA,kDAEAA,GAAA,wBAAAn3B,GACA,IAAAgqB,EAAAhqB,EAAA8qC,YAAA,GACA,eAAA9qC,EAAAuS,KACA,CACAuc,OAAA9E,EAAA,GACAF,QAAA,GAGA,CACAgF,OAAA9E,EAAA,GACAF,QAAA,EAGA,GAEA,IAAAihB,GAAA,CACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACAxwC,EAAA,GACAuyB,EAAA,GACArmB,EAAA,GACAukC,EAAA,GACArR,EAAA,GACAsR,EAAA,GACAr2C,EAAA,GACAs2C,EAAA,GACAv3C,EAAA,GACAw3C,EAAA,GACAC,EAAA,GACAC,EAAA,IAWAlU,GAAA,kBAAAn3B,GACA,IACA8hB,EADA3hB,EAAAH,EAAAovB,WAEA3hB,EAAA,EACA,SAAAtN,EAAArI,KACAgqB,EAAA,EACA3hB,EAAAH,EAAAovB,gBACI,SAAAjvB,EAAArI,KACJgqB,EAAA,GACA3hB,EAAAH,EAAAovB,gBACI,SAAAjvB,EAAArI,KAEJ,WADAqI,EAAAH,EAAAovB,YACAt3B,KAAA,GACA2V,EAAAtN,EAAArI,KAAAwX,WAAA,OACM,YAAAnP,EAAArI,KACN,UAAAoI,EAAA,4BAEAuN,EAAAtN,EAAArI,KAAAwX,WAAA,EACA,MAEAwS,EAAA,GAEA,GAAAA,EAAA,CAGA,UADArU,EAAAs9B,GAAA5qC,EAAArI,QACA2V,GAAAqU,EACA,UAAA5hB,EAAA,gBAAA4hB,EAAA,UAAA3hB,EAAArI,MAGA,IADA,IAAAwzC,EACA,OAAAA,EAAAP,GAAA/qC,EAAAkuB,SAAAp2B,QAAAwzC,EAAAxpB,GACArU,GAAAqU,EACArU,GAAA69B,EACAtrC,EAAAovB,UAEA,CACA,iBAAkB3hB,EAAA,GAClB,GAIA,IAAA89B,GAAA,CAAAvrC,EAAAwrC,EAAAC,EAAAC,KACA,IAAAnuB,EAAAvd,EAAAuvB,aAAAT,OACA,OAAAvR,EAAA1pB,OACA,UAAAqM,EAAA,sDAEA,IAAAtH,EAAA2kB,EAAA,GAAAzlB,KACA6zC,EAAA3rC,EAAA4rC,UAAAhzC,GACA,GAAA+yC,IAAAH,EACA,UAAAtrC,EAAA,gBAAuCtH,EAAA,4BAAcA,EAAA,wBAErD,IAAA+yC,IAAAF,EACA,UAAAvrC,EAAA,kBAAyCtH,EAAA,kBAAcA,EAAvD,yCAEA,IAAAkxB,EAAA,EAEA,QADAvM,EAAAvd,EAAAuvB,aAAAT,QACAj7B,QAAA,MAAA0pB,EAAA,GAAAzlB,KAAA,CAGA,IAFA,IAAA+zC,EAAA,GACA1rC,EAAAH,EAAA8rC,kBACA,MAAA3rC,EAAArI,MAAA,QAAAqI,EAAArI,MAEA+zC,GAAA1rC,EAAArI,KACAqI,EAAAH,EAAA8rC,kBAEA,IAAAD,EAAAtqC,MAAA,kBACA,UAAArB,EAAA,gCAAA2rC,GAEA/hB,EAAApmB,SAAAmoC,GACAtuB,EAAAvd,EAAAuvB,aAAAT,MACA,CAQA,OAPA6c,GAAAD,GAEA1rC,EAAA4C,OAAAorB,IAAAp1B,EAAA,CACAk2B,OAAAvR,EACAuM,YAGA,IAEAqN,GAAA,eAAAn3B,GAAAurC,GAAAvrC,GAAA,UACAm3B,GAAA,iBAAAn3B,GAAAurC,GAAAvrC,GAAA,UACAm3B,GAAA,mBAAAn3B,GAAAurC,GAAAvrC,GAAA,UAEAm3B,GAAA,YAAAn3B,IACA,IAAAud,EAAAvd,EAAA8qC,YAAA,MAGA,OADArmC,QAAAsnC,IAAAxuB,EAAAkS,UAAAn1B,IAAA6F,GAAAA,EAAArI,MAAA2C,KAAA,KACA,KAEA08B,GAAA,eAAAn3B,IACA,IAAAud,EAAAvd,EAAA8qC,YAAA,MAGA,OADArmC,QAAAnE,MAAAid,EAAAkS,UAAAn1B,IAAA6F,GAAAA,EAAArI,MAAA2C,KAAA,KACA,KAEA08B,GAAA,SAAAn3B,IACA,IAAAwuB,EAAAxuB,EAAAovB,WACAx2B,EAAA41B,EAAA12B,KAGA,OADA2M,QAAAsnC,IAAAvd,EAAAxuB,EAAA4C,OAAAgsB,IAAAh2B,GAAA2wC,GAAA3wC,GAAA+Z,GAAAC,KAAAha,GAAA+Z,GAAA7a,KAAAc,IACA,KAKAu+B,GAAA,gBACAA,GAAA,gBAOAA,GAAA,sBACAA,GAAA,YACAA,GAAA,YACAA,GAAA,gBACAA,GAAA,gBAOAA,GAAA,+DACAA,GAAA,wEACAA,GAAA,6EAEAA,GAAA,oBACAA,GAAA,oBACAA,GAAA,oBACAA,GAAA,oBACAA,GAAA,oBACAA,GAAA,oBACAA,GAAA,oBACAA,GAAA,oBACAA,GAAA,qBACAA,GAAA,qBACAA,GAAA,qBAEAA,GAAA,qBAEAA,GAAA,qCACAA,GAAA,qCACAA,GAAA,qCAEAA,GAAA,+BAEAA,GAAA,wCAMAA,GAAA,2EAMAA,GAAA,iEACAA,GAAA,gBACAA,GAAA,aACAA,GAAA,0FACAA,GAAA,eAEAA,GAAA,4GACAA,GAAA,wEACAA,GAAA,sEACAA,GAAA,6EACAA,GAAA,8EACAA,GAAA,4EACAA,GAAA,kEAEAA,GAAA,cACAA,GAAA,oCACAA,GAAA,eACAA,GAAA,kBACAA,GAAA,kBACAA,GAAA,kBACAA,GAAA,kBACAA,GAAA,mBACAA,GAAA,wBAGAA,GAAA,kEACAA,GAAA,kEACAA,GAAA,kEACAA,GAAA,kEAOAA,GAAA,2CACAA,GAAA,eAMAA,GAAA,kCACAA,GAAA,kCACAA,GAAA,kCACAA,GAAA,oCACAA,GAAA,4BACAA,GAAA,4BACAA,GAAA,kCACAA,GAAA,sCACAA,GAAA,8BACAA,GAAA,8BACAA,GAAA,kCAEAA,GAAA,sDAGAA,GAAA,4GAEAA,GAAA,0CAIAA,GAAA,6CACAA,GAAA,6CACAA,GAAA,8CAIAA,GAAA,mEACAA,GAAA,qEAEA,IAAA6U,GAAA,CACA,cACA,kBAEA,cACA,cACA,cACA,cACA,cACA,cACA,cAEA,oBACA,qBACA,qBACA,uBACA,uBACA,qBACA,qBACA,mBACA,kBACA,wBACA,uBACA,sBACA,uBACA,kBACA,6BACA,6BACA,4BACA,4BACA,iCACA,iCACA,qBACA,yBACA,6BACA,oBAEA,sBAEA,sBACA,qBACA,qBACA,0BACA,yBAEA,oBACA,kBACA,mBACA,mBACA,oBACA,qBACA,uBAEA,qBAEAC,GAAA,IAAAtqC,IAAA,eACAw1B,GAAA,kBAAAn3B,GAMA,IAAAksC,EAAA,UACAr0B,EAAA7X,EAAAmsC,oBAAAr0C,KAUA,OATA+f,KAAAm0B,GACAE,EAAAF,GAAAn0B,IACI,UAAAA,EAAAxd,MAAA,MAEAwd,KAAAlF,GAAAC,MACJq5B,GAAApqC,IAAA8Q,GAAAC,KAAAiF,GAAApW,UAFAyqC,EAAA,WAMAA,CACA,GACA,IAAAE,GAAA,CAEA,OACA,OACA,cACA,OAAM,EACN,cACA,cACA,aACA,cACA,cACA,kBACA,aACA,YACA,aACA,YACA,aAEAC,GAAA,EAEA,KAAI,EACJ,OACA,QAEAlV,GAAA,mBAAAn3B,GAEA,OADAA,EAAAkuB,SAAAp2B,QACAs0C,GACA,aAEA,SAEA,GACAjV,GAAA,mBAAAn3B,GACA,IAAA6X,EAAA7X,EAAAkuB,SAAAp2B,KAGA,OAAA+f,KAAAu0B,IAAA,MAAAv0B,EACA,aAEA,SAEA,GACAsf,GAAA,mBAAAn3B,GAEA,OADAA,EAAAkuB,SAAAp2B,QACAs0C,GACA,cAEA,UAEA,GACAjV,GAAA,qBACAA,GAAA,qBACAA,GAAA,wBAIAA,GAAA,wBAIAA,GAAA,qBACAA,GAAA,qBACAA,GAAA,qBAIAA,GAAA,4DAGAA,GAAA,kCAEAA,GAAA,qBAIAA,GAAA,sBACAA,GAAA,kCAEAA,GAAA,oBAGAA,GAAA,MAAgB,4BAEhBA,GAAA,sBAGAA,GAAA,kCAEAA,GAAA,wBAGAA,GAAA,4CAGAA,GAAA,6CAEAA,GAAA,2BAEAA,GAAA,iCAEAA,GAAA,8BAEAA,GAAA,+BAEAA,GAAA,6CACAA,GAAA,uCACAA,GAAA,gBAAAn3B,IACA,GAAAA,EAAA4C,OAAAgsB,IAAA,YACA,UAAA1uB,EAAA,kBAEA,qCAWAi3B,GAAA,wJACAA,GAAA,yFACAA,GAAA,0CACAA,GAAA,0GAMAA,GAAA,2BAKAA,GAAA,2FAeA,IAAAmV,GAAA5+B,EAAAwC,GAAA,oBAAAZ,WAAA,UAAAY,GAAA,oBAAAZ,WAAA,QACA6nB,GAAA,4DAA6EmV,GAA7E,gDAEAnV,GAAA,4DAA6EmV,GAA7E,gDAKAnV,GAAA,2CACAA,GAAA,iCACAA,GAAA,kDAIAA,GAAA,uBAGAA,GAAA,qDAEAA,GAAA,iHAEAA,GAAA,uGAEAA,GAAA,8GAEAA,GAAA,0HAEAA,GAAA,0HAEAA,GAAA,uGAEAA,GAAA,8GAEAA,GAAA,iHAEAA,GAAA,0HAEAA,GAAA,0HAEAA,GAAA,0HAEAA,GAAA,oHAEAA,GAAA,oHAEAA,GAAA,kBACAA,GAAA,iBACAA,GAAA,kBACAA,GAAA,kBACAA,GAAA,kBAIAA,GAAA,0BACAA,GAAA,6BACAA,GAAA,8BACAA,GAAA,mCACAA,GAAA,8BACAA,GAAA,mCACAA,GAAA,4BACAA,GAAA,iCACAA,GAAA,4BACAA,GAAA,iCAEAA,GAAA,sCAEAA,GAAA,gCAEAA,GAAA,qEACAA,GAAA,wEACAA,GAAA,2EACAA,GAAA,8EAEAA,GAAA,2DACAA,GAAA,gDACAA,GAAA,gDAGAA,GAAA,gDACAA,GAAA,kDACAA,GAAA,yDACAA,GAAA,0DACAA,GAAA,gEACAA,GAAA,gEAGAA,GAAA,gDACAA,GAAA,gDACAA,GAAA,wCACAA,GAAA,gDACAA,GAAA,wCACAA,GAAA,gDACAA,GAAA,gDACAA,GAAA,0DACAA,GAAA,kDACAA,GAAA,kDACAA,GAAA,sDACAA,GAAA,wDACAA,GAAA,sDACAA,GAAA,wDACAA,GAAA,wCACAA,GAAA,wCAKAA,GAAA,kFACAA,GAAA,oFACAA,GAAA,mBACAA,GAAA,mBACAA,GAAA,iFACAA,GAAA,mFACAA,GAAA,gBACAA,GAAA,gBAKAA,GAAA,4JACAA,GAAA,gBAOAA,GAAA,wBACAA,GAAA,wBACAA,GAAA,wBACAA,GAAA,qBACAA,GAAA,qBACAA,GAAA,sBACAA,GAAA,sBACAA,GAAA,sBACAA,GAAA,qBACAA,GAAA,qBACAA,GAAA,qBACAA,GAAA,oBACAA,GAAA,uBACAA,GAAA,yBACAA,GAAA,wBACAA,GAAA,qBACAA,GAAA,uBACAA,GAAA,wBACAA,GAAA,yBACAA,GAAA,2BACAA,GAAA,wBACAA,GAAA,8BACAA,GAAA,wBACAA,GAAA,2BACAA,GAAA,uBACAA,GAAA,sBACAA,GAAA,6BACAA,GAAA,6BACAA,GAAA,6BACAA,GAAA,0BACAA,GAAA,kBACAA,GAAA,qBACAA,GAAA,wBACAA,GAAA,iBACAA,GAAA,yBACAA,GAAA,wBACAA,GAAA,wBACAA,GAAA,wBACAA,GAAA,8BACAA,GAAA,8BACAA,GAAA,8BACAA,GAAA,sBACAA,GAAA,2BACAA,GAAA,sBACAA,GAAA,2BACAA,GAAA,mBACAA,GAAA,yBACAA,GAAA,yBACAA,GAAA,yBACAA,GAAA,iBACAA,GAAA,yBACAA,GAAA,yBACAA,GAAA,uBACAA,GAAA,mBACAA,GAAA,gBACAA,GAAA,0BACAA,GAAA,oBACAA,GAAA,uBACAA,GAAA,uBACAA,GAAA,uBACAA,GAAA,2BAEAA,GAAA,mBACAA,GAAA,wBAIAA,GAAA,gDACAA,GAAA,gDACAA,GAAA,0DAIAA,GAAA,sCACAA,GAAA,sCACAA,GAAA,gDACAA,GAAA,oCACAA,GAAA,oCACA,IAAAoV,GAAAC,GAAAxsC,IACA,IAAA0pB,EAAA1pB,EAAAuvB,aAAAT,OACAc,EAAA5vB,EAAAuvB,aAAAT,OACA2d,EAAAzsC,EAAAuvB,aAAAT,OACA6F,EAAA30B,EAAAuvB,aAAAT,OACA4d,EAAA1sC,EAAA4C,OAAAgsB,IAAA,KACA+d,EAAA3sC,EAAA4C,OAAAgsB,IAAA,OACA5uB,EAAA4C,OAAAg2B,aACA,IAAAgU,EAAAC,GAAA7sC,IACAwsC,IAEAxsC,EAAA4C,OAAAorB,IAAA,IAAA0e,GACAD,EAAA54C,QACAmM,EAAA4C,OAAAorB,IAAA,MAAA2e,IAGA,IAAAG,EAAAD,GACAA,GAAAJ,EAAA54C,SAGA,MADAmM,EAAAkuB,SACAp2B,OACAkI,EAAAovB,WACA0d,GAAA,IAGA,OACAhe,OAAAge,EAAAL,EAAA7c,EACA9F,QAAA,IAGA9pB,EAAA4C,OAAAorB,IAAA,IAAA4e,GAAA,IACAH,EAAA54C,QACAmM,EAAA4C,OAAAorB,IAAA,MAAA4e,GAAA,IAEA,IAAArvB,EAAAvd,EAAAuvB,aAAAT,OACAie,EAAA/sC,EAAAwvB,aAAA,IAAAmF,KAAApX,KAAAmM,IAGA,OADA1pB,EAAA4C,OAAA02B,WACA,CACAxK,OAAAie,EAAAtd,UACA3F,QAAA,IAGAqN,GAAA,YAAAoV,IAAA,IACApV,GAAA,YAAAoV,IAAA,IACApV,GAAA,qGACAA,GAAA,8FACAA,GAAA,8CAIAA,GAAA,wBAEAA,GAAA,sCACAA,GAAA,wCACAA,GAAA,sCACAA,GAAA,qCACAA,GAAA,uCACAA,GAAA,kCACAA,GAAA,wCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,wCACAA,GAAA,wCACAA,GAAA,wCACAA,GAAA,wCACAA,GAAA,wCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,sCACAA,GAAA,sCACAA,GAAA,sCACAA,GAAA,sCACAA,GAAA,sCACAA,GAAA,yCACAA,GAAA,yCACAA,GAAA,yCACAA,GAAA,yCACAA,GAAA,yCACAA,GAAA,yCACAA,GAAA,yCACAA,GAAA,yCACAA,GAAA,yCACAA,GAAA,yCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,uCACAA,GAAA,wCACAA,GAAA,yCAQA,IAAA6V,GAAA,CACA,OAEAC,GAAA,EAEA,cAEA,iBAEA,MAAAC,GACA,WAAAz2C,CAAA+J,EAAAwjB,EAAAzR,GACA5b,KAAAqtB,cAAA,EACArtB,KAAAw2C,oBAAA,EACAx2C,KAAA8J,WAAA,EACA9J,KAAAiM,YAAA,EACAjM,KAAAk7B,WAAA,EACAl7B,KAAA4b,UAAA,EACA5b,KAAAqtB,SAAAA,EACArtB,KAAAw2C,eAAA,EACAx2C,KAAAy2C,KAAA5sC,GAEA7J,KAAAiM,OAAA,IAAAynC,GAAAznC,GAAAohB,EAAAphB,QACAjM,KAAA4b,KAAAA,EACA5b,KAAAk7B,MAAA,EACA,CAKA,IAAAub,CAAA5sC,GACA7J,KAAA8J,MAAA,IAAAopC,GAAArpC,EAAA7J,KAAAqtB,SACA,CAIA,UAAAkgB,CAAAmJ,GACA12C,KAAA4b,KAAA86B,CACA,CAIA,UAAAzU,GACAjiC,KAAAiM,OAAAg2B,YACA,CAIA,QAAAU,GACA3iC,KAAAiM,OAAA02B,UACA,CAKA,SAAAsR,GACAj0C,KAAAiM,OAAAgoC,WACA,CAKA,MAAA1c,GAIA,OAHA,IAAAv3B,KAAAk7B,MAAAh+B,QACA8C,KAAAk5B,UAAAl5B,KAAA8J,MAAAypC,OAEAvzC,KAAAk7B,MAAAl7B,KAAAk7B,MAAAh+B,OAAA,EACA,CAIA,QAAAu7B,GAEA,OADAz4B,KAAAu3B,SACAv3B,KAAAk7B,MAAAtS,KACA,CAKA,SAAAsQ,CAAA1vB,GACAxJ,KAAAk7B,MAAAv5B,KAAA6H,EACA,CAIA,UAAAmtC,CAAAxe,GACAn4B,KAAAk7B,MAAAv5B,QAAAw2B,EACA,CAKA,YAAAye,CAAAC,GACA,IAAAptC,EACAC,EACAyuB,EACA,GAAA0e,EAAA,CAEA,GADA72C,KAAAs4B,gBACA,MAAAt4B,KAAAu3B,SAAAp2B,KACA,YAEAsI,EAAAzJ,KAAAy4B,aAEAN,SACAzuB,OACQ1J,KAAA44B,WAAA,OACR,OAEAT,SACA1uB,QACAC,OACQ1J,KAAA44B,cAKR,OAFA54B,KAAAk5B,UAAA,IAAA0H,GAAA,MAAAl3B,EAAAE,MACA5J,KAAA22C,WAAAxe,GACA,IAAAyI,GAAA,GAAAH,GAAAC,MAAAj3B,EAAAC,GACA,CAIA,aAAA4uB,GACA,OAAW,CAEX,SADAt4B,KAAAu3B,SACAp2B,KAGA,MAFAnB,KAAAk7B,MAAAtS,KAIA,CACA,CAKA,UAAAgQ,CAAAke,GAOA,IAAA3e,EAAA,GACA4e,EAAAD,GAAAA,EAAA55C,OAAA,EACA65C,GAKA/2C,KAAAs4B,gBAEA,IACAT,EADApuB,EAAAzJ,KAAAu3B,SAEAtjB,EAAA,EACArJ,EAAA,EACA,GAGA,GAFAitB,EAAA73B,KAAAy4B,WACAN,EAAAx2B,KAAAk2B,GACA,MAAAA,EAAA12B,OACA8S,OACQ,SAAA4jB,EAAA12B,MAER,UADA8S,EAEA,UAAA1K,EAAA,UAAuCsuB,QAE/B,WAAAA,EAAA12B,KACR,UAAAoI,EAAA,2DAAAutC,GAAAC,EAAAD,EAAAlsC,GAAA,KAAyI,IAAAitB,GAEzI,GAAAif,GAAAC,EACA,QAAA9iC,GAAA,IAAAA,GAAA,MAAA6iC,EAAAlsC,KAA+DitB,EAAA12B,OAAA21C,EAAAlsC,IAE/D,KADAA,IACAksC,EAAA55C,OAAA,CAEAi7B,EAAA7W,QAAA1W,EAAAA,GACA,KACA,OAEAA,EAAA,CAGA,OAAM,IAAAqJ,GAAA8iC,GAQN,MALA,MAAAttC,EAAAtI,MAAyB,MAAAg3B,EAAAA,EAAAj7B,OAAA,GAAAiE,OACzBg3B,EAAAvP,MACAuP,EAAA7V,SAEA6V,EAAAW,UACA,CACAX,SACA1uB,QACAC,IAAAmuB,EAEA,CAKA,WAAAsc,CAAAhhB,EAAAwF,GACA,GAAAA,EAAA,CACA,GAAAA,EAAAz7B,SAAAi2B,EAAA,EACA,UAAA5pB,EAAA,8DAGA,IADA,IAAAutC,EAAAne,EAAA,GACA90B,EAAA,EAAsBA,EAAAizC,EAAA55C,OAAmB2G,IAAA,CACzC,IAAAg0B,EAAA73B,KAAAy4B,WACA,GAAAqe,EAAAjzC,KAAAg0B,EAAA12B,KACA,UAAAoI,EAAA,gDAAAsuB,EAEA,CACA,CAEA,IADA,IAAAxE,EAAA,GACA7a,EAAA,EAAqBA,EAAA2a,EAAc3a,IACnC6a,EAAA1xB,KAAA3B,KAAA44B,WAAAD,GAAAA,EAAAngB,EAAA,IAAA2f,QAEA,OAAA9E,CACA,CAKA,cAAA2jB,CAAA5H,GAEA,GADApvC,KAAAw2C,gBAAApH,EACApvC,KAAAw2C,eAAAx2C,KAAAqtB,SAAArgB,UACA,UAAAzD,EAAA,2EAEA,CAoBA,UAAA2qC,CAAA+C,GACA,IAAAC,EAAAl3C,KAAAy4B,WACAx2B,EAAAi1C,EAAA/1C,KACAg2C,EAAAD,EAAAhf,SAAA,KAAAl4B,KAAAo3C,cAAAn1C,GACA,SAAAk1C,GAAAF,GAAAE,EAAA/e,aAAA,CACA,GAAA6e,GAAA,MAAAE,GAAA,OAAAl1C,EAAA,KAAAjC,KAAAi1C,UAAAhzC,GACA,UAAAsH,EAAA,+BAAAtH,GAGA,OADAjC,KAAAk5B,UAAAge,IACA,CACA,CACAl3C,KAAAg3C,eAAA,GACA,IAAA7e,EAAAgf,EAAAhf,OACA9E,EAAArzB,KAAAm0C,YAAAgD,EAAAhkB,QAAAgkB,EAAAxe,YACA,GAAAwe,EAAAhkB,QAGA,QAAAtvB,GADAs0B,EAAAA,EAAAz0B,SACAxG,OAAA,EAAsC2G,GAAA,IAAQA,EAAA,CAC9C,IAAAg0B,EAAAM,EAAAt0B,GACA,SAAAg0B,EAAA12B,KAAA,CACA,OAAA0C,EACA,UAAA0F,EAAA,8CAAAsuB,GAGA,UADAA,EAAAM,IAAAt0B,IACA1C,KAEAg3B,EAAA7W,OAAAzd,EAAA,SACY,eAAAwK,KAAAwpB,EAAA12B,MAIZ,UAAAoI,EAAA,8BAAAsuB,GAFAM,EAAA7W,OAAAzd,EAAA,KAAAwvB,GAAAwE,EAAA12B,KAAA,GAGA,CACA,CACA,CAIA,OADAnB,KAAA22C,WAAAxe,GACAA,EAAAj7B,MACA,CAOA,iBAAAs4C,GAEA,OADAx1C,KAAAk0C,aACAl0C,KAAAu3B,QACA,CAIA,eAAA4d,GACA,OACA,QAAAn1C,KAAAk0C,aAAA,CAEA,IAAA1qC,EAAAxJ,KAAAk7B,MAAAtS,MAMA,OAHApf,EAAAq3B,eACAr3B,EAAArI,KAAA,WAEAqI,CACA,CAEA,CAKA,WAAA6tC,CAAAp1C,GACA,OAAAjC,KAAAiM,OAAAf,IAAAjJ,GAAAjC,KAAA64B,aAAA,KAAA+H,GAAA3+B,UAAAP,CACA,CAMA,YAAAm3B,CAAAV,GACA,IAAA5sB,EAAA,GACA+rC,EAAAt3C,KAAAk7B,MAAAh+B,OAEA,IADA8C,KAAA22C,WAAAxe,GACAn4B,KAAAk7B,MAAAh+B,OAAAo6C,GAEA,QAAAt3C,KAAAk0C,YAAA,IAEA,IAAA1qC,EAAAxJ,KAAAk7B,MAAAtS,MACApf,EAAAq3B,eAEAr3B,EAAA0uB,UAAA,EACA1uB,EAAAq3B,cAAA,GAEAt1B,EAAA5J,KAAA6H,EACA,CAKA,OADAxJ,KAAAg3C,eAAAzrC,EAAArO,QACAqO,CACA,CAKA,iBAAA22B,CAAAjgC,GACA,IAAAk2B,EAAAn4B,KAAAq3C,YAAAp1C,GACA,OAAAk2B,EACAA,EAAAx0B,IAAA6F,GAAAA,EAAArI,MAAA2C,KAAA,IAEAq0B,CAEA,CAKA,aAAAif,CAAAn1C,GACA,IAAAs1C,EAAAv3C,KAAAiM,OAAAgsB,IAAAh2B,GACA,SAAAs1C,EAEA,OAAAA,EAIA,OAAAt1C,EAAA/E,OAAA,CACA,IAAAs6C,EAAAx3C,KAAA8J,MAAAspC,SAAAnxC,GACA,SAAAu1C,GAAA,KAAAA,EACA,MAEA,CACA,IAAAL,EAAA,mBAAAI,EAAAA,EAAAv3C,MAAAu3C,EACA,oBAAAJ,EAAA,CACA,IAAAhkB,EAAA,EACA,GAAAgkB,EAAA7iC,SAAA,KAEA,IADA,IAAAmjC,EAAAN,EAAAtvC,QAAA,UACA4vC,EAAAnjC,SAAA,KAAA6e,EAAA,OACAA,EAMA,IAHA,IAAAukB,EAAA,IAAAxE,GAAAiE,EAAAn3C,KAAAqtB,UACA8K,EAAA,GACAN,EAAA6f,EAAAnE,MACA,QAAA1b,EAAA12B,MACAg3B,EAAAx2B,KAAAk2B,GACAA,EAAA6f,EAAAnE,MAOA,OALApb,EAAAW,UACA,CACAX,SACAhF,UAGA,CACA,OAAAgkB,CACA,CAOA,SAAAlC,CAAAhzC,GACA,OAAAjC,KAAAiM,OAAAf,IAAAjJ,IAAA2wC,GAAAv1C,eAAA4E,IAAA+Z,GAAAC,KAAA5e,eAAA4E,IAAA+Z,GAAA7a,KAAA9D,eAAA4E,IAAAo0C,GAAAh5C,eAAA4E,EACA,CAIA,YAAAo2B,CAAAp2B,GACA,IAAA+1B,EAAAh4B,KAAAiM,OAAAgsB,IAAAh2B,GACA,aAAA+1B,EAAA,iBAAAA,GAAA,mBAAAA,IAAAA,EAAAI,aAAAwa,GAAAv1C,eAAA4E,KAAA2wC,GAAA3wC,GAAA6yB,SACA,EAIA,IAAA6iB,GAAA,2CACAC,GAAAh7C,OAAAi7C,OAAA,CACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,QAKAC,GAAA,CACA,KACA32C,KAAA,MACA8a,KAAA,WAEA,KACA9a,KAAA,MACA8a,KAAA,WAEA,KACA9a,KAAA,MACA8a,KAAA,UAEA,KACA9a,KAAA,MACA8a,KAAA,WAEA,KACA9a,KAAA,MACA8a,KAAA,SAEA,KACA9a,KAAA,MACA8a,KAAA,WAEA,KACA9a,KAAA,MACA8a,KAAA,WAEA,KACA9a,KAAA,MACA8a,KAAA,SAEA,KACA9a,KAAA,MACA8a,KAAA,SAEA,KACA9a,KAAA,MACA8a,KAAA,cAEA,KACA9a,KAAA,OAEA,KACAA,KAAA,QAGA42C,GAAA,CACA,OACA,OACA,OACA,QACA,OACA,OACA,OACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,OACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,OACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,OACA,OACA,QACA,QACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,OACA,OACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,OACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,OACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,OACA,OACA,QACA,QACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QA+BA,MAAAC,GACA,WAAAl4C,CAAA+J,EAAAwjB,GACArtB,KAAA4b,UAAA,EACA5b,KAAAo3B,YAAA,EACAp3B,KAAAqtB,cAAA,EACArtB,KAAA89B,oBAAA,EACA99B,KAAA6iC,eAAA,EAEA7iC,KAAA4b,KAAA,OAGA5b,KAAAo3B,OAAA,IAAAmf,GAAA1sC,EAAAwjB,EAAArtB,KAAA4b,MAEA5b,KAAAqtB,SAAAA,EAEArtB,KAAA89B,eAAA,EACA99B,KAAA6iC,UAAA,IACA,CAKA,MAAA9E,CAAA58B,EAAA+/B,GAIA,QAHA,IAAAA,IACAA,GAAA,GAEAlhC,KAAAu4B,QAAAp3B,OAAAA,EACA,UAAAoI,EAAA,aAAApI,EAAA,WAAAnB,KAAAu4B,QAAAp3B,KAAA,IAAAnB,KAAA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,wCACA,2DACA,sCACA,sCACA,wCACA,wCACA,yCACA,yCACA,0CACA,2CACA,wCACA,8CACA,qDACA,qCACA,2CACA,wCACA,0CACA,wCACA,kDACA,kCACA,kCACA,mCACA,8BACA,gDACA,gDACA,6CACA,2CACA,2CACA,uDACA,iDACA,6CACA,qDACA,+CACA,2CACA,uDACA,uCACA,yCACA,sCACA,kDACA,0CACA,8CACA,+CACA,uCACA,kCACA,qDACA,gCACA,4CACA,mCACA,mCACA,iCACA,kCACA,iCACA,qCACA,qDACA,sCACA,0DACA,gDACA,8CACA,2CACA,mCACA,0CACA,0CACA,qCACA,iDACA,mCACA,mCACA,mCACA,sDACA,kDACA,iCACA,mCACA,8BACA,gDACA,gCACA,8CACA,wCACA,wCACA,sCACA,uCACA,oCACA,sCACA,+CACA,sCACA,0CACA,sCACA,uCACA,sCACA,iDACA,2CACA,yCACA,6DACA,kEACA,sCACA,yCACA,0CACA,sCACA,0CACA,0CACA,wCACA,+CACA,6CACA,8BACA,sCACA,+CACA,+BACA,+BACA,yCACA,yCACA,8BACA,qCACA,qCACA,qCACA,qCACA,qCACA,qCACA,qCACA,6CACA,6CACA,0CACA,sCACA,4CACA,iEACA,0DACA,iEACA,0DACA,6DACA,wCACA,sCACA,iCACA,iCACA,0CACA,qCACA,wCACA,sCACA,oDACA,+DACA,sEACA,+DACA,mEACA,kEACA,4CACA,0CACA,4DACA,4DACA,qDACA,iCACA,yCACA,gCACA,mCACA,uCACA,mCACA,qDACA,4CACA,sCACA,6CACA,0CACA,uCACA,8CACA,8CACA,0DACA,8CACA,+CACA,uCACA,uCACA,uCACA,mDACA,4DACA,sDACA,qDACA,+DACA,sDACA,+DACA,mDACA,4DACA,0DACA,mEACA,yDACA,kEACA,kDACA,yDACA,2DACA,sDACA,oCACA,sCACA,6CACA,kDACA,iDACA,6EACA,QAEA,sEACA,QAEA,0EACA,QAEA,yEACA,QAEA,6EACA,wEACA,QAEA,2EACA,QAEA,2EACA,QAEA,iDACA,iCACA,yCACA,4CACA,oCACA,oCACA,oCACA,kCACA,oCACA,sCACA,wCACA,6CACA,iDACA,4CACA,0CACA,2CACA,gDACA,qCACA,+CACA,qCACA,MACA,MACA,MACA,MACA,MACA,OAEA,8BACA,sCACA,6CACA,sDACA,gDACA,kCACA,sCACA,4CACA,gDACA,8CACA,kCACA,gCACA,gCACA,gCACA,kDACA,sDACA,qDACA,iDACA,oDACA,+BACA,4CACA,qDACA,kDACA,uCACA,uCACA,4CACA,4CACA,+CACA,4CACA,oDACA,qDACA,8CACA,6CACA,wCACA,uCACA,gDACA,uCACA,gDACA,0CACA,mDACA,uCACA,yCACA,gDACA,kDACA,8CACA,8BACA,iDACA,qCACA,0CACA,wCACA,2CACA,oDACA,oDACA,yCACA,mCACA,uCACA,kCACA,sCACA,oCACA,iCACA,qCACA,yCACA,8BACA,+DACA,oCACA,8BACA,sCACA,oCACA,2CACA,mCACA,yCACA,sCACA,8BACA,iCACA,+BACA,gCACA,wCACA,2CACA,0CACA,iDACA,+DACA,4CACA,6CACA,kDACA,qCACA,yCACA,qCACA,gCACA,uCACA,yCACA,4BACA,yDACA,uCACA,uCACA,gCACA,+BACA,uCACA,kCACA,sCACA,4BACA,oCACA,oDACA,+BACA,uCACA,8BACA,kCACA,yCACA,8BACA,oCACA,mCACA,8BACA,4BACA,+CACA,uCACA,0BACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEA,6BACA,mCACA,mCACA,wCACA,4BACA,8BACA,4BACA,iCACA,yCACA,uCACA,iCACA,iCACA,qDACA,gCACA,qCACA,uCACA,8BACA,sCACA,sCACA,8BACA,4BACA,kCACA,iDACA,qCACA,uCACA,8CACA,sDACA,gDACA,8CACA,wCACA,kCACA,gCACA,sCACA,6CACA,iCACA,4BACA,iDACA,+CACA,oCACA,+BACA,+BACA,iCACA,iCACA,iCACA,mCACA,+BACA,uCACA,8DACA,gDACA,wDACA,gCACA,oCACA,mCACA,mCACA,gCACA,oCACA,4CACA,4BACA,iCACA,sCACA,qCACA,iDACA,0CACA,wCACA,+CACA,8CACA,4BACA,0BACA,8BACA,wCACA,wCACA,6BACA,gCACA,kCACA,+BACA,oCACA,kCACA,kCACA,6BACA,4BACA,iCACA,4BACA,gCACA,2CACA,8BACA,gCACA,uCACA,uCACA,uCACA,yCACA,yDACA,uCACA,uCACA,yCACA,oCACA,iDACA,iDACA,6BACA,mCACA,kCACA,0BACA,wCACA,mEACA,sCACA,kCACA,wBACA,wBACA,6BACA,iCACA,2CACA,0CACA,0CACA,0CACA,wBACA,uBACA,qCACA,sBACA,wBACA,uBACA,2BACA,0BACA,yBACA,yBACA,oCACA,sCACA,4BACA,uBACA,yBACA,yBACA,2BACA,yBACA,2BACA,yBACA,gCACA,wBACA,oCACA,2CACA,sCACA,qDACA,gCACA,kCACA,wBACA,wBACA,iCACA,wBACA,wBACA,yCACA,yCACA,mCACA,2BACA,4BACA,6BACA,4BACA,4BACA,gCACA,yCACA,8BACA,yBACA,+BACA,sBACA,4BACA,6BACA,sBACA,kDACA,wBACA,sBACA,8BACA,0BACA,uBACA,6BACA,kCACA,kCACA,mCACA,kCACA,sBACA,sBACA,0BACA,0BACA,8BACA,8BACA,0BACA,wBACA,gCACA,wBACA,wBACA,wBACA,yBACA,6BACA,8CACA,4CACA,sCACA,4BACA,0BACA,8BACA,8CACA,wBACA,6BACA,yBACA,gCACA,gCACA,gCACA,gCACA,uCACA,uBACA,gCACA,2BACA,8BACA,8BACA,2CACA,2BACA,kCACA,yBACA,iDACA,2BACA,yCACA,qCACA,8BACA,qBACA,0BACA,qBACA,uBACA,sBACA,4BACA,4BACA,uBACA,uBACA,wBACA,qBACA,0BACA,yBACA,2BACA,uBACA,mCACA,uCACA,mCACA,mCACA,sCACA,6BACA,wBACA,kCACA,2CACA,oCACA,yBACA,sBACA,sBACA,sBACA,sBACA,wCACA,sBACA,+BACA,yBACA,uBACA,yBACA,yBACA,yBACA,0BACA,8BACA,sBACA,mCAEAztM,OAAAi7C,OAAAwyJ,GACA,MAAAlkE,EAAA,EC9sBMmkE,EAAK,CACX,kCACA,4CACA,gCACA,4BACA,wCACA,gCACA,sCACA,8CACA,sCACA,mCACA,qCACA,qCACA,2CACA,6CACA,4BACA,mCACA,kCACA,gCACA,wCACA,uCACA,oCACA,oCACA,mCACA,8BACA,8BACA,0BACA,+BACA,qCACA,wCACA,4BACA,kCACA,gCACA,iCACA,kCACA,gCACA,0CACA,gCACA,0BACA,8BACA,0BACA,8BACA,iCACA,mCACA,8BACA,8BACA,0BACA,0BACA,8BACA,kCACA,wCACA,8BACA,8BACA,+CACA,6CACA,gCACA,iCACA,kCACA,8BACA,qCACA,iCACA,8BACA,mCACA,mCACA,qCACA,gCACA,4CACA,2BACA,mCACA,2CACA,oCACA,4BACA,+CACA,+CACA,wCACA,sCACA,gCACA,mCACA,mCACA,gCACA,kCACA,gDACA,4BACA,wCACA,mCACA,0BACA,6BACA,+BACA,2BACA,4BACA,MACA,MACA,MACA,MACA,KACA,OACA,QACA,MACA,MACA,OACA,MACA,SACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,UAEA,0BACA,wCACA,0BACA,kCACA,uBACA,SACA,UACA,SACA,SACA,MACA,QAEA,4BACA,uCACA,0CACA,0BACA,oCACA,+BACA,2CACA,iCACA,6BACA,uCACA,sCACA,2BACA,oCACA,gCACA,+BACA,uCACA,8BACA,8BACA,2CACA,uCACA,mCACA,iCACA,oCACA,kCACA,8CACA,wCACA,8CACA,sCACA,qCACA,uCACA,qCACA,wCACA,oCACA,+BACA,8BACA,8BACA,0BACA,gCACA,sCACA,uCACA,sCACA,uCACA,0BACA,mCACA,qCACA,gDACA,qDACA,8BACA,oCACA,sCACA,kCACA,yCACA,0BACA,4BACA,iCACA,8BACA,gCACA,gCACA,mCACA,0CACA,iCACA,uCACA,4BACA,4BACA,gCACA,6BACA,0CACA,wCACA,oCACA,4BACA,sCACA,6BACA,6BACA,gCACA,wCACA,gCACA,mCACA,oCACA,oCACA,kCACA,kCACA,gCACA,4BACA,wCACA,gCACA,4CACA,8BACA,8BACA,gCACA,uCACA,gCACA,mDACA,4BACA,8BACA,0BACA,uCACA,uBACA,2BACA,sBACA,oBACA,2BACA,wCACA,4BACA,qBACA,iCACA,qDACA,uCACA,oBACA,qBACA,oBACA,sBACA,sBACA,kBACA,0BACA,mBACA,mBACA,qBACA,uBACA,qBACA,sBACA,sBACA,sBACA,sBACA,0BACA,oBACA,2BACA,oBACA,oBACA,sBACA,qBACA,oBACA,sBACA,gCACA,sBACA,gCACA,uBACA,oBACA,sBACA,sBACA,oBACA,2BACA,kCACA,oBACA,qBACA,2BACA,0BACA,oBACA,oBACA,sBACA,sBACA,oBACA,sBACA,sBACA,sBACA,oBACA,sBACA,uBACA,oBACA,oBACA,+BACA,oBACA,4BACA,wBACA,sBACA,oBACA,gEACA,2BACA,2CACA,oDACA,mCACA,8CACA,oBACA,2BACA,4BACA,4BACA,kBACA,mCACA,oBACA,oBACA,oBACA,gDACA,0BACA,0BACA,+BACA,oBACA,oBACA,4BACA,qCACA,iCACA,mCACA,+BACA,0BACA,8CACA,8BACA,2CACA,mBACA,mBACA,mCACA,qBACA,+BACA,mBACA,qBACA,kCACA,sBACA,mBACA,iBACA,iEACA,wBACA,oBACA,2BACA,qBACA,2BACA,qBACA,gCACA,oCACA,+CACA,sBACA,sCACA,uBACA,mBACA,qBACA,oBACA,2BACA,4BACA,sBACA,sBACA,sBACA,sBACA,4BACA,sBACA,6BACA,2BACA,uCACA,kCACA,8CACA,oBACA,+BACA,uBAEA1tM,OAAAi7C,OAAcyyJ,GACd,MAAAC,EAAA,EC7WA,IAKAC,EAAAC,EAAAC,EALAC,EAA0C,SAAAC,EAAA7jJ,EAAA9jD,EAAAwxC,GAC1C,SAAAxxC,IAAAwxC,EAAA,UAAAuG,UAAA,iDACA,sBAAA+L,EAAA6jJ,IAAA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CLr2J,EACA12C,GAEA,OAAO,SAAgB0iB,GACnB,IAAIzb,EACA4oC,EAAY,EACZx0C,EAAS,GAEb,KAAQ4L,EAAQyvC,EAAMjsC,KAAKiY,IACnBmtB,IAAc5oC,EAAM+d,QACpB3pB,GAAUqnB,EAAK0mB,UAAUyG,EAAW5oC,EAAM+d,QAI9C3pB,GAAU2E,EAAIs0B,IAAIrtB,EAAM,GAAG+N,WAAW,IAGtC66B,EAAY5oC,EAAM+d,MAAQ,EAG9B,OAAO3pB,EAASqnB,EAAK0mB,UAAUyG,EACnC,CACJ,CAQO,MAUMm9J,GACOD,GACZ,cACA,IAAIrnJ,IAAI,CACJ,CAAC,GAAI,UACL,CAAC,GAAI,SACL,CAAC,IAAK,aASLunJ,GAAuDF,GAChE,eACA,IAAIrnJ,IAAI,CACJ,CAAC,GAAI,SACL,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,IAAK,aC1JPwnJ,GAAA,IAAAxnJ,IAAA,CACP,WACA,cACA,eACA,eACA,gBACA,mBACA,WACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,iBACA,eACA,UACA,UACA,UACA,UACA,UACA,iBACA,UACA,UACA,cACA,eACA,WACA,eACA,qBACA,cACA,SACA,eACA,gBACA,WACA,iBACA,iBACA,YACA1lD,IAAAkF,GAAA,CAAAA,EAAA0B,cAAA1B,KAIOioM,GAAA,IAAAznJ,IAAA,CACP,gBACA,gBACA,gBACA,gBACA,cACA,WACA,gBACA,kBACA,WACA,cACA,WACA,oBACA,gBACA,eACA,mBACA,YACA,aACA,WACA,eACA,oBACA,eACA,cACA,cACA,mBACA,YACA,aACA,aACA,sBACA,mBACA,eACA,YACA,YACA,YACA,gBACA,sBACA,iBACA,OACA,OACA,cACA,YACA,qBACA,mBACA,mBACA,mBACA,eACA,cACA,eACA,cACA,eACA,iBACA,cACA,UACA,UACA,aACA,UACA,aACA,mBACA,mBACA,cACA1lD,IAAAkF,GAAA,CAAAA,EAAA0B,cAAA1B,KC9FAkoM,GAAA,IAAA/lM,IAAA,CACA,QACA,SACA,MACA,SACA,UACA,WACA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AC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,EAAE,WAAW,CAAC,GAAG,WAAW,CAAC,EAAE,oBAAoB,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,sBAAsB,CAAC,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,IAAI,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,aAAa,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,EAAE,aAAa,CAAC,GAAG,YAAY,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC,GAAG,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,U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,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU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EACAA,EACA,MACA,GACA,KAKA,oBAAA4N,QAAA5N,IACAypU,EAAAzpU,GAAA,IAAA0pa,EACA1pa,EAtOA,GAwOA,EACAA,EAAAsI,cACA,MACA,GACA,KAIA,MAAA2ha,EAAA,iBACAC,EAAA3ia,GAAAA,EAAA,GAAAq5D,cAOA,CACA,gBACA,qBACA,cACA,iBACA,aACA,YACA,YACA,sBACA,8BACA,gBACA,kBACA,oBACA,oBACA,eACA,YACA,cACA,gBACA,cACA,YACA,mBACA,eACA,aACA,eACA,cACA,aACA,+BACA,6BACA,cACA,iBACA,kBACA,iBACA,iBACA,aACA,aACA,eACA,oBACA,qBACA,cACA,WACA,iBACA,mBACA,kBACA,aACA,eACA,yBACA,0BACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,eACA,cACA,kBACA,iBACA,qBACA,sBACA,eACA,gBACA,eACA,eACA,YACA,gBACA,iBACA,gBACA,aACA,gBACA,gBACA,eACA,eACA,cACA,YAKAhzD,QAAAyqY,IACA,MAAAr4Y,EAAAq4Y,EAAAzyY,QAAAqka,EAAAC,GACAzgG,EAAAzpU,GAAA,IAAA0pa,EACA1pa,EA9VA,GAgWA,EACAq4Y,EACA,MACA,GACA,KAKA,CACA,gBACA,gBACA,aACA,aACA,cACA,cAKAzqY,QAAAyqY,IACA,MAAAr4Y,EAAAq4Y,EAAAzyY,QAAAqka,EAAAC,GACAzgG,EAAAzpU,GAAA,IAAA0pa,EACA1pa,EAvXA,GAyXA,EACAq4Y,EACA,gCACA,GACA,KAKA,CACA,WACA,WACA,aAKAzqY,QAAAyqY,IACA,MAAAr4Y,EAAAq4Y,EAAAzyY,QAAAqka,EAAAC,GACAzgG,EAAAzpU,GAAA,IAAA0pa,EACA1pa,EA7YA,GA+YA,EACAq4Y,EACA,wCACA,GACA,KAOA,2BAAAzqY,QAAAyqY,IACA5uE,EAAA4uE,GAAA,IAAAqxB,EACArxB,EA5ZA,GA8ZA,EACAA,EAAA/vY,cACA,MACA,GACA,KAOAmhU,EAAA,cAAAigG,EACA,YA1aA,GA4aA,EACA,aACA,gCACA,GACA,GAGA,qCAA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Aj4D,SAAA,EACAh2G,OAAA,EACAwxC,MAAA,EACAz8C,KAAA,EACA8ta,OAAA,EACAtna,MAAA,EACApK,MAAA,EACA2xa,MAAA,EACAv5H,KAAA,EACAw5H,MAAA,EACAC,aAAA,EACA,+BACAC,WAAA,EACAz9E,SAAA,EACA09E,kBAAA,EACA,yCACAC,aAAA,EACAC,WAAA,EACAC,UAAA,EACAC,WAAA,EACA,2BACAC,OAAA,EACAv2B,cAAA,EACAw2B,cAAA,EACAC,YAAA,EACAC,QAAA,EACAC,cAAA,EACAC,cAAA,EACA,iCACAC,YAAA,EACAC,KAAA,EACAC,MAAA,EACAC,KAAA,EACAC,GAAA,EACAC,SAAA,EACAC,UAAA,EACA,yBACAC,KAAA,EACAjtQ,SAAA,EACA,uBACAktQ,cAAA,EACA/xa,SAAA,EACA,uBACAoM,MAAA,EACA4la,mBAAA,EACA,2CACAC,0BAAA,EACA,0DACAC,aAAA,EACA,+BACAC,eAAA,EACA,mCACAC,kBAAA,EACAC,iBAAA,EACAhpQ,OAAA,EACAxpK,GAAA,EACAC,GAAA,EACAzB,EAAA,EACAi0a,SAAA,EACAC,WAAA,EACAC,QAAA,EACAC,gBAAA,EACAngX,UAAA,EACAjrC,QAAA,EACAm8Y,QAAA,EACAkP,iBAAA,EACA,uCACAC,IAAA,EACAC,GAAA,EACA1za,GAAA,EACA2za,SAAA,EACAC,UAAA,EACAC,iBAAA,EACA,uCACAjpa,IAAA,EACA8kW,SAAA,EACAokE,0BAAA,EACA50a,KAAA,EACAE,YAAA,EACA,6BACAiB,SAAA,EACA,uBACAI,OAAA,EACAsza,UAAA,EACAh0a,YAAA,EACAi0a,aAAA,EACA,+BACAC,WAAA,EACA,2BACAC,UAAA,EACAtzZ,WAAA,EACA,2BACAuzZ,SAAA,EACA,uBACAC,eAAA,EACA,oCACAC,YAAA,EACA,6BACAC,UAAA,EACA,yBACAC,YAAA,EACA,6BACA1zZ,WAAA,EACA,2BACAnd,OAAA,EACAE,KAAA,EACA4wa,GAAA,EACAC,GAAA,EACAC,GAAA,EACAC,GAAA,EACAC,UAAA,EACA,yBACAC,2BAAA,EACA,4DACAC,yBAAA,EACA,wDACAC,SAAA,EACAC,kBAAA,EACAC,cAAA,EACAC,QAAA,EACAC,UAAA,EACA,0BACAC,aAAA,EACA,gCACAC,YAAA,EACAC,eAAA,EACA,mCACAC,IAAA,EACAt1a,GAAA,EACAu1a,OAAA,EACAC,UAAA,EACAv3C,GAAA,EACAI,GAAA,EACAo3C,GAAA,EACAC,GAAA,EACA1rY,EAAA,EACA2rY,aAAA,EACAC,iBAAA,EACAC,QAAA,EACAC,UAAA,EACAC,WAAA,EACAC,SAAA,EACAC,aAAA,EACAC,cAAA,EACA,iCACAC,cAAA,EACA,iCACAC,kBAAA,EACAC,MAAA,EACAC,UAAA,EACA,yBACAC,aAAA,EACAC,UAAA,EACA,yBACAC,YAAA,EACA,6BACAC,YAAA,EACAC,YAAA,EACAxxP,KAAA,EACAyxP,iBAAA,EACA3xP,UAAA,EACA4xP,aAAA,EACAh6Z,KAAA,EACAi6Z,WAAA,EACAxxY,OAAA,EACAyxY,QAAA,EACAnnY,SAAA,EACAs7J,MAAA,EACA8rO,OAAA,EACAC,YAAA,EACAxgI,OAAA,EACA9xI,SAAA,EACAuyQ,iBAAA,EACA,uCACAC,kBAAA,EACA,yCACAC,WAAA,EACA,2BACAC,QAAA,EACA,qBACAC,WAAA,EACAC,oBAAA,EACAC,iBAAA,EACAC,aAAA,EACAC,cAAA,EACA,iCACAxV,OAAA,EACAyV,UAAA,EACAC,UAAA,EACAC,UAAA,EACAhyV,OAAA,EACAiyV,cAAA,EACA1xZ,oBAAA,EACA2xZ,eAAA,EACA1/H,SAAA,EACAh6S,EAAA,EACA25a,OAAA,EACAC,KAAA,EACAC,KAAA,EACAC,gBAAA,EACA,qCACAC,YAAA,EACAC,UAAA,EACAC,mBAAA,EACAC,iBAAA,EACAtnI,SAAA,EACA/8M,QAAA,EACAj0F,OAAA,EACAu3D,QAAA,EACAghX,OAAA,EACAC,GAAA,EACAC,GAAA,EACArha,MAAA,EACAsha,SAAA,EACApvT,KAAA,EACAqvT,eAAA,EACA,mCACAC,MAAA,EACA56Z,QAAA,EACA66Z,iBAAA,EACAC,iBAAA,EACAv1J,MAAA,EACAw1J,aAAA,EACAr7L,YAAA,EACAz9O,aAAA,EACA+4a,MAAA,EACAC,MAAA,EACAC,YAAA,EACAC,UAAA,EACA,yBACAC,YAAA,EACA,6BACAC,sBAAA,EACA,iDACAC,uBAAA,EACA,mDACAlsY,OAAA,EACAhtC,OAAA,EACAm5a,gBAAA,EACA,qCACAC,iBAAA,EACA,uCACAn5a,cAAA,EACA,iCACAC,eAAA,EACA,mCACAm5a,iBAAA,EACA,uCACAC,YAAA,EACA,6BACAC,cAAA,EACA,iCACAC,+BAAA,EACAC,yBAAA,EACAC,aAAA,EACAC,eAAA,EACAC,YAAA,EACAC,QAAA,EACAC,QAAA,EACAC,WAAA,EACA,2BACAC,eAAA,EACA,mCACAC,WAAA,EACAC,cAAA,EACA,iCACA1rV,GAAA,EACApuF,UAAA,EACA+5a,OAAA,EACAC,GAAA,EACAC,GAAA,EACAC,kBAAA,EACA,yCACAC,mBAAA,EACA,2CACAv8P,QAAA,EACAw8P,YAAA,EACA,6BACAC,aAAA,EACA,+BACAC,WAAA,EACA,4BACAC,aAAA,EACAC,YAAA,EACA,6BACA96a,OAAA,EACA+6a,aAAA,EACA,+BACAl5R,QAAA,EACAm5R,SAAA,EACA,wBACAC,YAAA,EACA,8BACAC,YAAA,EACA,8BACAC,SAAA,EACA,uBACAC,aAAA,EACA,+BACAx8a,QAAA,EACAy8a,WAAA,EACArtV,WAAA,EACAstV,cAAA,EACA,iCACAC,MAAA,EACAC,OAAA,EACAC,YAAA,EACA,6BACAC,YAAA,EACA,6BACAn7Y,GAAA,EACAE,GAAA,EACAhhC,EAAA,EACAk8a,iBAAA,EACAlka,QAAA,EACA,qBACAmka,aAAA,EACA,+BACAC,aAAA,EACA,+BACAC,UAAA,EACA,yBACAC,UAAA,EACA,yBACAC,UAAA,EACA,yBACAC,WAAA,EACA,2BACAC,UAAA,EACA,yBACAC,QAAA,EACA,qBACAC,QAAA,EACA,qBACAz9a,MAAA,EACA,uBACA09a,WAAA,EACA,2BACAC,SAAA,EACA97Y,GAAA,EACAE,GAAA,EACAhhC,EAAA,E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","sources":["webpack://element-web/./res/img/element-icons/email-prompt.svg","webpack://element-web/./res/img/icon-email-pill-avatar.svg","webpack://element-web/./res/img/location/live-location.svg","webpack://element-web/../node_modules/.pnpm/matrix-js-sdk@42.0.0/node_modules/matrix-js-sdk/src/extensible_events_v1/ExtensibleEvent.ts","webpack://element-web/../node_modules/.pnpm/matrix-js-sdk@42.0.0/node_modules/matrix-js-sdk/src/extensible_events_v1/InvalidEventError.ts","webpack://element-web/../node_modules/.pnpm/matrix-js-sdk@42.0.0/node_modules/matrix-js-sdk/src/extensible_events_v1/MessageEvent.ts","webpack://element-web/../node_modules/.pnpm/matrix-js-sdk@42.0.0/node_modules/matrix-js-sdk/src/extensible_events_v1/PollStartEvent.ts","webpack://element-web/../node_modules/.pnpm/matrix-js-sdk@42.0.0/node_modules/matrix-js-sdk/src/types.ts","webpack://element-web/./src/audio/RecorderWorklet.ts","webpack://element-web/./src/DateUtils.ts","webpack://element-web/./src/Editing.ts","webpack://element-web/javascript/node_modules/.pnpm/katex@0.17.0/node_modules/katex/dist/katex.mjs","webpack://element-web/./src/HtmlUtils.tsx","webpack://element-web/./src/IdentityAuthClient.tsx","webpack://element-web/./src/toasts/IncomingLegacyCallToast.tsx","webpack://element-web/./src/LegacyCallHandler.tsx","webpack://element-web/./src/Linkify.ts","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/commonmark@0.31.2/node_modules/commonmark/lib/node.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/commonmark@0.31.2/node_modules/commonmark/lib/from-code-point.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/commonmark@0.31.2/node_modules/commonmark/lib/common.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/commonmark@0.31.2/node_modules/commonmark/lib/inlines.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/commonmark@0.31.2/node_modules/commonmark/lib/blocks.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/commonmark@0.31.2/node_modules/commonmark/lib/render/renderer.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/commonmark@0.31.2/node_modules/commonmark/lib/render/html.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/commonmark@0.31.2/node_modules/commonmark/lib/render/xml.js","webpack://element-web/./src/Markdown.ts","webpack://element-web/./src/MediaDeviceHandler.ts","webpack://element-web/./src/Resend.ts","webpack://element-web/./src/Roles.ts","webpack://element-web/./src/RoomAliasCache.ts","webpack://element-web/./src/RoomInvite.tsx","webpack://element-web/./src/RoomNotifs.ts","webpack://element-web/./src/Rooms.ts","webpack://element-web/./src/components/views/dialogs/security/AccessSecretStorageDialog.tsx","webpack://element-web/./src/SecurityManager.ts","webpack://element-web/./src/SendHistoryManager.ts","webpack://element-web/./src/utils/event/getSenderName.ts","webpack://element-web/./src/TextForEvent.tsx","webpack://element-web/./src/TimezoneHandler.ts","webpack://element-web/./src/Typeguards.ts","webpack://element-web/./src/Unread.ts","webpack://element-web/./src/UserActivity.ts","webpack://element-web/./src/UserAddress.ts","webpack://element-web/./src/WorkerManager.ts","webpack://element-web/./src/accessibility/LandmarkNavigation.ts","webpack://element-web/./src/accessibility/Toolbar.tsx","webpack://element-web/./src/accessibility/context_menu/ContextMenuButton.tsx","webpack://element-web/./src/accessibility/context_menu/ContextMenuTooltipButton.tsx","webpack://element-web/./src/accessibility/context_menu/MenuItemRadio.tsx","webpack://element-web/./src/audio/BackgroundAudio.ts","webpack://element-web/./src/audio/PlaybackClock.ts","webpack://element-web/./src/PlaybackEncoder.ts","webpack://element-web/./src/workers/playbackWorkerFactory.ts","webpack://element-web/./src/audio/Playback.ts","webpack://element-web/./src/audio/ManagedPlayback.ts","webpack://element-web/./src/audio/PlaybackManager.ts","webpack://element-web/../../node_modules/.pnpm/opus-recorder@8.0.5/node_modules/opus-recorder/dist/encoderWorker.min.js","webpack://element-web/./src/utils/FixedRollingArray.ts","webpack://element-web/./src/audio/VoiceRecording.ts","webpack://element-web/./src/audio/recorderWorkletFactory.ts","webpack://element-web/../../node_modules/.pnpm/opus-recorder@8.0.5/node_modules/opus-recorder/dist/decoderWorker.min.wasm","webpack://element-web/../../node_modules/.pnpm/opus-recorder@8.0.5/node_modules/opus-recorder/dist/waveWorker.min.js","webpack://element-web/../../node_modules/.pnpm/opus-recorder@8.0.5/node_modules/opus-recorder/dist/decoderWorker.min.js","webpack://element-web/./src/audio/compat.ts","webpack://element-web/./src/audio/consts.ts","webpack://element-web/./src/autocomplete/AutocompleteProvider.tsx","webpack://element-web/./src/autocomplete/CommandProvider.tsx","webpack://element-web/./src/autocomplete/Components.tsx","webpack://element-web/./src/autocomplete/QueryMatcher.ts","webpack://element-web/./src/viewmodels/status/UserStatusIconViewModel.ts","webpack://element-web/./src/autocomplete/UserProvider.tsx","webpack://element-web/./src/call-types.ts","webpack://element-web/./src/accessibility/context_menu/MenuItem.tsx","webpack://element-web/./src/accessibility/context_menu/MenuItemCheckbox.tsx","webpack://element-web/./src/components/structures/ContextMenu.tsx","webpack://element-web/./src/components/structures/InteractiveAuth.tsx","webpack://element-web/./src/components/structures/LegacyCallEventGrouper.ts","webpack://element-web/./src/components/structures/ScrollPanel.tsx","webpack://element-web/./src/components/structures/SearchBox.tsx","webpack://element-web/./src/components/structures/SpacePillButton.tsx","webpack://element-web/./src/components/structures/ViewSource.tsx","webpack://element-web/./src/components/structures/auth/header/AuthHeaderContext.tsx","webpack://element-web/./src/components/structures/auth/header/AuthHeaderProvider.tsx","webpack://element-web/./src/components/views/audio_messages/PlayPauseButton.tsx","webpack://element-web/./src/components/views/audio_messages/PlaybackClock.tsx","webpack://element-web/./src/components/views/audio_messages/AudioPlayerBase.tsx","webpack://element-web/./src/components/views/audio_messages/LegacySeekBar.tsx","webpack://element-web/./src/components/views/audio_messages/PlaybackWaveform.tsx","webpack://element-web/./src/components/views/audio_messages/RecordingPlayback.tsx","webpack://element-web/./src/components/views/audio_messages/Waveform.tsx","webpack://element-web/./src/components/structures/auth/header/AuthHeaderModifier.tsx","webpack://element-web/./src/components/views/auth/CaptchaForm.tsx","webpack://element-web/./src/components/views/auth/InteractiveAuthEntryComponents.tsx","webpack://element-web/./src/components/views/avatars/BaseAvatar.tsx","webpack://element-web/./src/components/views/avatars/DecoratedRoomAvatar.tsx","webpack://element-web/./src/components/views/avatars/MemberAvatar.tsx","webpack://element-web/./src/components/views/avatars/RoomAvatar.tsx","webpack://element-web/./src/hooks/room/useRoomIdName.ts","webpack://element-web/./src/components/views/avatars/SearchResultAvatar.tsx","webpack://element-web/./src/components/views/avatars/WithPresenceIndicator.tsx","webpack://element-web/./src/components/views/beacon/LiveTimeRemaining.tsx","webpack://element-web/./src/components/views/beacon/BeaconStatus.tsx","webpack://element-web/./src/components/views/beacon/OwnBeaconStatus.tsx","webpack://element-web/./src/components/views/beacon/StyledLiveBeaconIcon.tsx","webpack://element-web/./src/components/views/beacon/displayStatus.ts","webpack://element-web/./src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx","webpack://element-web/./src/components/views/dialogs/BetaFeedbackDialog.tsx","webpack://element-web/./src/components/views/beta/BetaCard.tsx","webpack://element-web/./src/components/views/context_menus/IconizedContextMenu.tsx","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/reply.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/reaction-add.js","webpack://element-web/../node_modules/.pnpm/matrix-js-sdk@42.0.0/node_modules/matrix-js-sdk/src/extensible_events_v1/PollEndEvent.ts","webpack://element-web/./src/components/views/dialogs/EndPollDialog.tsx","webpack://element-web/./src/components/views/context_menus/MessageContextMenu.tsx","webpack://element-web/./src/components/views/dialogs/AddExistingToSpaceDialog.tsx","webpack://element-web/./src/components/views/dialogs/BugReportDialog.tsx","webpack://element-web/./src/components/views/dialogs/ConfirmRedactDialog.tsx","webpack://element-web/./src/components/views/dialogs/ConfirmUserActionDialog.tsx","webpack://element-web/./src/components/views/dialogs/CreateRoomDialog.tsx","webpack://element-web/./src/components/views/dialogs/devtools/ServersInRoom.tsx","webpack://element-web/./src/components/views/dialogs/devtools/SettingExplorer.tsx","webpack://element-web/./src/components/views/dialogs/devtools/WidgetExplorer.tsx","webpack://element-web/./src/components/views/dialogs/devtools/Users.tsx","webpack://element-web/./src/components/views/dialogs/devtools/AccountData.tsx","webpack://element-web/./src/components/views/dialogs/devtools/RoomNotifications.tsx","webpack://element-web/./src/components/views/dialogs/devtools/Crypto.tsx","webpack://element-web/./src/components/views/elements/SettingsField.tsx","webpack://element-web/./src/components/views/dialogs/devtools/StickyEventState.tsx","webpack://element-web/./src/components/views/dialogs/DevtoolsDialog.tsx","webpack://element-web/./src/components/views/dialogs/InteractiveAuthDialog.tsx","webpack://element-web/./src/components/views/dialogs/invite/DMRoomTile.tsx","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/PageHeader/PageHeader.tsx","webpack://element-web/./src/components/views/dialogs/invite/UnknownIdentityUsersWarningDialog.tsx","webpack://element-web/./src/components/views/dialogs/InviteDialog.tsx","webpack://element-web/./src/components/views/dialogs/InviteDialogTypes.ts","webpack://element-web/./src/components/views/dialogs/InviteProgressBody.tsx","webpack://element-web/./src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx","webpack://element-web/./src/components/views/dialogs/RoomSettingsDialog-tab.ts","webpack://element-web/./src/components/views/dialogs/RoomUpgradeWarningDialog.tsx","webpack://element-web/./src/components/views/dialogs/ShareDialog.tsx","webpack://element-web/./src/components/views/dialogs/TextInputDialog.tsx","webpack://element-web/./src/components/views/dialogs/UploadConfirmDialog.tsx","webpack://element-web/./src/components/views/dialogs/devtools/Event.tsx","webpack://element-web/./src/components/views/dialogs/devtools/FilteredList.tsx","webpack://element-web/./src/components/views/dialogs/devtools/RoomState.tsx","webpack://element-web/./src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx","webpack://element-web/./src/components/views/dialogs/spotlight/Filter.ts","webpack://element-web/./src/components/views/elements/CopyableText.tsx","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/backspace-solid.js","webpack://element-web/./src/components/views/elements/DialPadBackspaceButton.tsx","webpack://element-web/./src/components/views/elements/Dropdown.tsx","webpack://element-web/./src/components/views/elements/FacePile.tsx","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/zoom-out.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/zoom-in.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/rotate-left.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/rotate-right.js","webpack://element-web/./src/utils/Mouse.ts","webpack://element-web/./src/components/views/elements/ImageView.tsx","webpack://element-web/./src/hooks/useDownloadMedia.ts","webpack://element-web/./src/components/views/elements/InfoTooltip.tsx","webpack://element-web/./src/components/views/elements/InlineSpinner.tsx","webpack://element-web/./src/components/views/elements/JoinRuleDropdown.tsx","webpack://element-web/./src/components/views/elements/LazyRenderList.tsx","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/user-solid.js","webpack://element-web/./src/hooks/usePermalinkTargetRoom.ts","webpack://element-web/./src/hooks/usePermalinkMember.ts","webpack://element-web/./src/hooks/usePermalink.ts","webpack://element-web/./src/hooks/usePermalinkEvent.ts","webpack://element-web/./src/components/views/elements/Pill.tsx","webpack://element-web/./src/components/views/elements/PillType.ts","webpack://element-web/./src/components/views/elements/PollCreateDialog.tsx","webpack://element-web/./src/components/views/elements/PowerSelector.tsx","webpack://element-web/./src/hooks/useAnimation.ts","webpack://element-web/./src/hooks/useSmoothAnimation.ts","webpack://element-web/./src/components/views/elements/ProgressBar.tsx","webpack://element-web/./src/components/views/elements/QRCode.tsx","webpack://element-web/./src/components/views/elements/RoomAliasField.tsx","webpack://element-web/./src/components/views/elements/SettingsFlag.tsx","webpack://element-web/./src/components/views/elements/Spoiler.tsx","webpack://element-web/./src/components/views/elements/StyledCheckbox.tsx","webpack://element-web/./src/components/views/elements/StyledRadioButton.tsx","webpack://element-web/./src/components/views/elements/StyledRadioGroup.tsx","webpack://element-web/./src/components/views/elements/TextWithTooltip.tsx","webpack://element-web/./src/components/views/elements/TruncatedList.tsx","webpack://element-web/./src/components/views/elements/Validation.tsx","webpack://element-web/./src/components/views/emojipicker/Header.tsx","webpack://element-web/./src/components/views/emojipicker/Search.tsx","webpack://element-web/./src/components/views/emojipicker/Preview.tsx","webpack://element-web/./src/components/views/emojipicker/Emoji.tsx","webpack://element-web/./src/components/views/emojipicker/QuickReactions.tsx","webpack://element-web/./src/components/views/emojipicker/Category.tsx","webpack://element-web/./src/components/views/emojipicker/EmojiPicker.tsx","webpack://element-web/./src/components/views/emojipicker/ReactionPicker.tsx","webpack://element-web/./src/components/views/location/MapError.tsx","webpack://element-web/./res/img/location/map.svg","webpack://element-web/./src/components/views/location/MapFallback.tsx","webpack://element-web/./src/components/views/location/index.tsx","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/voice-call-missed-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/video-call-missed-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/video-call-declined-solid.js","webpack://element-web/./src/components/views/messages/LegacyCallEvent.tsx","webpack://element-web/./src/viewmodels/room/timeline/event-tile/body/AudioPlayerViewModel.ts","webpack://element-web/./src/components/views/messages/MAudioBody.tsx","webpack://element-web/./src/viewmodels/room/timeline/event-tile/body/DecryptionFailureBodyViewModel.ts","webpack://element-web/./src/viewmodels/message-body/FileBodyViewModel.ts","webpack://element-web/../../node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/icons/download.svg","webpack://element-web/./src/viewmodels/message-body/ImageBodyViewModel.ts","webpack://element-web/./src/viewmodels/message-body/RedactedBodyViewModel.ts","webpack://element-web/./src/viewmodels/message-body/VideoBodyViewModel.ts","webpack://element-web/./src/components/views/messages/MBodyFactory.tsx","webpack://element-web/../node_modules/.pnpm/react-blurhash@0.3.0_patch_hash=58bc7f075478017ce27bcc252e8509876390db106246bd5b0a74466_db89d7fecb717f714e5851cd88b80158/node_modules/react-blurhash/src/BlurhashCanvas.tsx","webpack://element-web/../node_modules/.pnpm/react-blurhash@0.3.0_patch_hash=58bc7f075478017ce27bcc252e8509876390db106246bd5b0a74466_db89d7fecb717f714e5851cd88b80158/node_modules/react-blurhash/src/Blurhash.tsx","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/react-transition-group@4.4.5_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-transition-group/esm/config.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/react-transition-group@4.4.5_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-transition-group/esm/TransitionGroupContext.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/react-transition-group@4.4.5_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-transition-group/esm/utils/reflow.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/react-transition-group@4.4.5_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-transition-group/esm/Transition.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/react-transition-group@4.4.5_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-transition-group/esm/SwitchTransition.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/dom-helpers@5.2.1/node_modules/dom-helpers/esm/removeClass.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/react-transition-group@4.4.5_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-transition-group/esm/CSSTransition.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/dom-helpers@5.2.1/node_modules/dom-helpers/esm/addClass.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/dom-helpers@5.2.1/node_modules/dom-helpers/esm/hasClass.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/image-error.js","webpack://element-web/./src/components/views/messages/MImageReplyBody.tsx","webpack://element-web/../node_modules/.pnpm/matrix-js-sdk@42.0.0/node_modules/matrix-js-sdk/src/extensible_events_v1/PollResponseEvent.ts","webpack://element-web/./src/components/views/messages/MPollBody.tsx","webpack://element-web/./src/audio/PlaybackQueue.ts","webpack://element-web/./src/components/views/messages/MVoiceMessageBody.tsx","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/mime@4.1.0/node_modules/mime/dist/types/other.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/mime@4.1.0/node_modules/mime/dist/types/standard.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/mime@4.1.0/node_modules/mime/dist/src/Mime.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/mime@4.1.0/node_modules/mime/dist/src/index.js","webpack://element-web/./src/components/views/messages/MVoiceOrAudioBody.tsx","webpack://element-web/./src/components/views/messages/MStickerBody.tsx","webpack://element-web/./res/img/icons-show-stickers.svg","webpack://element-web/./src/components/views/messages/MLocationBody.tsx","webpack://element-web/./src/components/views/beacon/index.tsx","webpack://element-web/./src/components/views/messages/MBeaconBody.tsx","webpack://element-web/./src/viewmodels/room/timeline/event-tile/body/MjolnirBodyViewModel.ts","webpack://element-web/./src/viewmodels/message-body/EditHistoryActionBarViewModel.ts","webpack://element-web/javascript/node_modules/.pnpm/html-react-parser@6.0.1_@types+react@19.2.14_react@19.2.7/node_modules/html-react-parser/esm/index.mjs","webpack://element-web/./src/components/views/elements/LinkWithTooltip.tsx","webpack://element-web/./src/renderer/utils.tsx","webpack://element-web/./src/renderer/link-tooltip.tsx","webpack://element-web/../node_modules/.pnpm/entities@8.0.0/node_modules/entities/src/escape.ts","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/dom-serializer@3.0.0/node_modules/dom-serializer/dist/foreign-names.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/dom-serializer@3.0.0/node_modules/dom-serializer/dist/index.js","webpack://element-web/../node_modules/.pnpm/domutils@4.0.2/node_modules/domutils/src/stringify.ts","webpack://element-web/./src/renderer/pill.tsx","webpack://element-web/./src/renderer/spoiler.tsx","webpack://element-web/./src/components/views/messages/CodeBlock.tsx","webpack://element-web/./src/renderer/code-block.tsx","webpack://element-web/./src/viewmodels/message-body/EventContentBodyViewModel.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/node_modules/tslib/tslib.es6.js","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/diffDOM/helpers.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/diffDOM/dom/fromVirtual.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/diffDOM/dom/apply.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/diffDOM/dom/undo.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/diffDOM/virtual/helpers.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/diffDOM/virtual/apply.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/diffDOM/virtual/fromDOM.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/diffDOM/virtual/fromString.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/diffDOM/virtual/diff.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/diffDOM/index.ts","webpack://element-web/../node_modules/.pnpm/diff-dom@5.2.1/node_modules/diff-dom/src/TraceLogger.ts","webpack://element-web/./src/utils/MessageDiffUtils.tsx","webpack://element-web/./src/components/views/dialogs/ConfirmAndWaitRedactDialog.tsx","webpack://element-web/./src/components/views/messages/EditHistoryMessage.tsx","webpack://element-web/./src/components/views/dialogs/MessageEditHistoryDialog.tsx","webpack://element-web/./src/viewmodels/room/timeline/event-tile/body/TextualBodyViewModel.tsx","webpack://element-web/./src/components/views/rooms/EditMessageComposer.tsx","webpack://element-web/./src/viewmodels/message-body/UrlPreviewGroupViewModel.ts","webpack://element-web/./src/components/views/messages/TextualBodyFactory.tsx","webpack://element-web/./src/components/views/messages/MessageEvent.tsx","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/file-error.js","webpack://element-web/./src/components/views/messages/shared/MediaProcessingError.tsx","webpack://element-web/./res/img/element-icons/trophy.svg","webpack://element-web/./src/components/views/polls/PollOption.tsx","webpack://element-web/./src/components/views/right_panel/BaseCard.tsx","webpack://element-web/./src/components/views/right_panel/EncryptionInfo.tsx","webpack://element-web/../../node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/icons/error-solid.svg","webpack://element-web/./src/components/views/elements/crypto/VerificationQRCode.tsx","webpack://element-web/./src/components/views/right_panel/VerificationPanel.tsx","webpack://element-web/./src/components/views/right_panel/EncryptionPanel.tsx","webpack://element-web/./src/hooks/useUserTimezone.ts","webpack://element-web/./src/components/viewmodels/right_panel/user_info/UserInfoHeaderViewModel.tsx","webpack://element-web/./src/components/viewmodels/right_panel/user_info/UserInfoHeaderVerificationViewModel.tsx","webpack://element-web/./src/components/views/right_panel/user_info/UserInfoHeaderVerificationView.tsx","webpack://element-web/./src/components/views/right_panel/user_info/UserInfoHeaderView.tsx","webpack://element-web/./src/components/viewmodels/right_panel/user_info/UserInfoBasicViewModel.tsx","webpack://element-web/./src/components/viewmodels/right_panel/UserInfoPowerlevelViewModel.tsx","webpack://element-web/./src/components/views/right_panel/user_info/UserInfoPowerLevels.tsx","webpack://element-web/./src/components/viewmodels/right_panel/user_info/UserInfoIgnoreButtonViewModel.tsx","webpack://element-web/./src/components/views/right_panel/user_info/UserInfoIgnoreButtonView.tsx","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/chat-problem.js","webpack://element-web/./src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx","webpack://element-web/./src/components/viewmodels/right_panel/user_info/admin/UserInfoBanButtonViewModel.tsx","webpack://element-web/./src/components/views/dialogs/BulkRedactDialog.tsx","webpack://element-web/./src/components/views/right_panel/user_info/UserInfoAdminToolsContainer.tsx","webpack://element-web/./src/components/viewmodels/right_panel/user_info/admin/UserInfoKickButtonViewModel.tsx","webpack://element-web/./src/components/viewmodels/right_panel/user_info/admin/UserInfoRedactButtonViewModel.tsx","webpack://element-web/./src/components/viewmodels/right_panel/user_info/admin/UserInfoMuteButtonViewModel.tsx","webpack://element-web/./src/components/viewmodels/right_panel/user_info/admin/UserInfoAdminToolsContainerViewModel.tsx","webpack://element-web/./src/components/views/right_panel/user_info/UserInfoBasicOptionsView.tsx","webpack://element-web/./src/components/viewmodels/right_panel/user_info/UserInfoBasicOptionsViewModel.tsx","webpack://element-web/./src/components/views/right_panel/user_info/UserInfoBasicView.tsx","webpack://element-web/./src/components/views/right_panel/UserInfo.tsx","webpack://element-web/./src/components/views/right_panel/context.ts","webpack://element-web/./src/components/views/right_panel/types.ts","webpack://element-web/./src/autocomplete/RoomProvider.tsx","webpack://element-web/./src/autocomplete/EmojiProvider.tsx","webpack://element-web/./src/autocomplete/NotifProvider.tsx","webpack://element-web/./src/autocomplete/Autocompleter.ts","webpack://element-web/./src/autocomplete/SpaceProvider.tsx","webpack://element-web/./src/components/views/rooms/Autocomplete.tsx","webpack://element-web/./src/editor/history.ts","webpack://element-web/./src/editor/caret.ts","webpack://element-web/./src/components/views/rooms/MessageComposerFormatBar.tsx","webpack://element-web/./src/editor/operations.ts","webpack://element-web/./src/components/views/rooms/BasicMessageComposer.tsx","webpack://element-web/./src/components/views/rooms/E2EIcon.tsx","webpack://element-web/./src/components/views/rooms/MemberList/tiles/common/PresenceIconView.tsx","webpack://element-web/./src/components/views/rooms/NotificationBadge.tsx","webpack://element-web/./src/components/views/rooms/NotificationBadge/StatelessNotificationBadge.tsx","webpack://element-web/./src/components/views/rooms/PresenceLabel.tsx","webpack://element-web/./src/components/views/rooms/RoomHeader/toggle/useToggled.tsx","webpack://element-web/./src/components/views/rooms/wysiwyg_composer/DynamicImportWysiwygComposer.tsx","webpack://element-web/./src/components/views/settings/encryption/EncryptionCard.tsx","webpack://element-web/./src/components/views/settings/encryption/EncryptionCardButtons.tsx","webpack://element-web/./src/components/views/spaces/SpaceBasicSettings.tsx","webpack://element-web/./src/components/views/spaces/SpaceChildrenPicker.tsx","webpack://element-web/./src/components/views/spaces/SpaceCreateMenu.tsx","webpack://element-web/./src/components/views/spaces/SpacePublicShare.tsx","webpack://element-web/./src/components/views/verification/VerificationShowSas.tsx","webpack://element-web/./src/components/views/voip/DialPad.tsx","webpack://element-web/./src/contexts/CurrentRightPanelPhaseContext.tsx","webpack://element-web/./src/hooks/right-panel/useCurrentPhase.ts","webpack://element-web/./src/contexts/LocalDeviceVerificationStateContext.ts","webpack://element-web/./src/stores/MemberListStore.ts","webpack://element-web/./src/stores/RoomViewStore.tsx","webpack://element-web/./src/stores/TypingStore.ts","webpack://element-web/./src/stores/UserProfilesStore.ts","webpack://element-web/./src/utils/ResizeNotifier.ts","webpack://element-web/./src/stores/MultiRoomViewStore.ts","webpack://element-web/./src/toasts/IncomingCallToast.tsx","webpack://element-web/./src/Notifier.ts","webpack://element-web/./src/contexts/SDKContextClass.ts","webpack://element-web/./src/contexts/ScopedRoomContext.tsx","webpack://element-web/./src/createRoom.ts","webpack://element-web/./src/customisations/helpers/UIComponents.ts","webpack://element-web/./src/editor/commands.tsx","webpack://element-web/./src/editor/deserialize.ts","webpack://element-web/./src/editor/dom.ts","webpack://element-web/./src/editor/diff.ts","webpack://element-web/./src/editor/model.ts","webpack://element-web/./src/editor/offset.ts","webpack://element-web/./src/editor/autocomplete.ts","webpack://element-web/./src/editor/parts.ts","webpack://element-web/./src/editor/position.ts","webpack://element-web/./src/editor/range.ts","webpack://element-web/./src/editor/render.ts","webpack://element-web/./src/editor/serialize.ts","webpack://element-web/./src/effects/index.ts","webpack://element-web/./src/effects/utils.ts","webpack://element-web/./src/email.ts","webpack://element-web/./src/components/views/rooms/LiveContentSummary.tsx","webpack://element-web/./src/components/views/voip/CallDuration.tsx","webpack://element-web/./src/components/views/messages/CallEvent.tsx","webpack://element-web/./src/components/views/messages/RoomPredecessorTile.tsx","webpack://element-web/./src/viewmodels/room/timeline/event-tile/MJitsiWidgetEventViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/MKeyVerificationRequestViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/RoomAvatarEventViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/TextualEventViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/body/HiddenBodyViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/body/ViewSourceEventViewModel.ts","webpack://element-web/./src/components/viewmodels/avatars/MemberAvatarViewModel.ts","webpack://element-web/./src/components/viewmodels/avatars/FacePileViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/call/common.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/call/tiles/ongoing/components/DurationViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/call/tiles/ongoing/BaseOngoingCallTileViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/call/tiles/ongoing/RoomOngoingCallTileViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/call/tiles/ongoing/DmOngoingCallTileViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/call/tiles/tombstone/common.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/call/tiles/tombstone/RoomTombstoneCallTileViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/call/tiles/tombstone/DmTombstoneCallTileViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/call/RootCallTileViewModel.ts","webpack://element-web/./src/events/EventTileFactory.tsx","webpack://element-web/./src/utils/beacon/timeline.ts","webpack://element-web/./src/events/forward/getForwardableEvent.ts","webpack://element-web/./src/events/location/getShareableLocationEvent.ts","webpack://element-web/./src/hooks/room/useRoomCall.tsx","webpack://element-web/./src/hooks/room/useRoomMemberProfile.ts","webpack://element-web/./src/hooks/useCall.ts","webpack://element-web/./src/hooks/useDispatcher.ts","webpack://element-web/./src/hooks/useIsEncrypted.ts","webpack://element-web/./src/hooks/useMediaVisible.ts","webpack://element-web/./src/hooks/useRoomMembers.ts","webpack://element-web/./src/hooks/useRoomNotificationState.ts","webpack://element-web/./src/hooks/useRoomState.ts","webpack://element-web/./src/hooks/useSettings.ts","webpack://element-web/./src/hooks/useUserStatus.ts","webpack://element-web/./src/utils/MatrixGlob.ts","webpack://element-web/./src/mjolnir/ListRule.ts","webpack://element-web/./src/mjolnir/BanList.ts","webpack://element-web/./src/mjolnir/Mjolnir.ts","webpack://element-web/./src/models/Call.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/syncpromise.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/eventProcessors.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/debug-ids.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/prepareEvent.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/exports.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/integration.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/eventUtils.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/integrations/eventFilters.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/integrations/functiontostring.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/instrument/handlers.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/instrument/console.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/supports.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/instrument/fetch.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/breadcrumbs.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/browser.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/severity.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/breadcrumb-log-level.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/url.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/types.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/instrument/dom.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/instrument/xhr.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/instrument/history.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/htmlTreeAsString.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/debug-build.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/helpers.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/integrations/breadcrumbs.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/tracing/spans/captureSpan.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/integrations/httpcontext.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/integrations/dedupe.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/integrations/conversationId.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/sdk.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/api.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/metrics/envelope.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/metrics/internal.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/tracing/spans/spanJsonToStreamedSpan.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/timer.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/promisebuffer.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/should-ignore-span.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/data-collection/filtering-snippets.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/data-collection/resolveDataCollectionOptions.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/data-collection/defaultPiiToCollectionOptions.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/client.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/tracing/spans/extractGenAiSpans.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/tracing/spans/hasSpanStreamingEnabled.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/envelope.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/parseSampleRate.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/tracing/spans/beforeSendSpan.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/transactionEvent.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/clientreport.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/ipAddress.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/eventbuilder.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/eventbuilder.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/client.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/sdkMetadata.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/integrations/browserapierrors.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/metrics/web-vitals/lib/globalListeners.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/metrics/web-vitals/lib/runOnce.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/integrations/browsersession.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/metrics/web-vitals/lib/whenIdleOrHidden.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/integrations/culturecontext.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/instrument/globalError.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/instrument/globalUnhandledRejection.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/integrations/globalhandlers.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/aggregate-errors.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/integrations/linkederrors.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/stack-parsers.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/ratelimit.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/transports/base.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/debug-build.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/getNativeImplementation.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/transports/fetch.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/normalizeStringifyValue.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser-utils@10.63.0/node_modules/@sentry/browser-utils/src/is.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/utils/detectBrowserExtension.ts","webpack://element-web/../node_modules/.pnpm/@sentry+browser@10.63.0/node_modules/@sentry/browser/src/sdk.ts","webpack://element-web/./src/sentry.ts","webpack://element-web/./src/shouldHideEvent.ts","webpack://element-web/./src/components/views/dialogs/SlashCommandHelpDialog.tsx","webpack://element-web/./src/slash-commands/utils.ts","webpack://element-web/./src/slash-commands/interface.ts","webpack://element-web/./src/slash-commands/command.ts","webpack://element-web/./src/slash-commands/op.ts","webpack://element-web/./src/slash-commands/join.ts","webpack://element-web/./src/slash-commands/upgraderoom/upgraderoom.ts","webpack://element-web/./src/slash-commands/upgraderoom/runUpgradeRoomCommand.ts","webpack://element-web/./src/slash-commands/upgraderoom/parseUpgradeRoomArgs.ts","webpack://element-web/./src/slash-commands/emoticon.ts","webpack://element-web/./src/slash-commands/status.ts","webpack://element-web/./src/slash-commands/SlashCommands.tsx","webpack://element-web/./src/stores/CallStore.ts","webpack://element-web/./src/stores/LatestRtcNotificationEventStore.ts","webpack://element-web/./src/stores/NonUrgentToastStore.ts","webpack://element-web/./src/stores/OwnBeaconStore.ts","webpack://element-web/./src/stores/local-echo/EchoContext.ts","webpack://element-web/./src/stores/local-echo/RoomEchoContext.ts","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/offline.js","webpack://element-web/./src/components/views/dialogs/ServerOfflineDialog.tsx","webpack://element-web/./src/components/views/toasts/NonUrgentEchoFailureToast.tsx","webpack://element-web/./src/stores/local-echo/EchoStore.ts","webpack://element-web/./src/stores/local-echo/EchoChamber.ts","webpack://element-web/./src/stores/local-echo/EchoTransaction.ts","webpack://element-web/./src/stores/local-echo/GenericEchoChamber.ts","webpack://element-web/./src/stores/local-echo/RoomEchoChamber.ts","webpack://element-web/./src/stores/notifications/NotificationLevel.ts","webpack://element-web/./src/stores/notifications/NotificationState.ts","webpack://element-web/./src/stores/notifications/ListNotificationState.ts","webpack://element-web/./src/stores/notifications/RoomNotificationState.ts","webpack://element-web/./src/stores/notifications/SummarizedNotificationState.ts","webpack://element-web/./src/stores/notifications/RoomNotificationStateStore.ts","webpack://element-web/./src/stores/right-panel/RightPanelStoreIPanelState.ts","webpack://element-web/./src/stores/right-panel/RightPanelStore.ts","webpack://element-web/./src/stores/right-panel/RightPanelStorePhases.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/sorters/BaseRecencySorter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/sorters/RecencySorter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/sorters/AlphabeticSorter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/sorters/UnreadSorter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/RoomNode.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/utils.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/Level.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/iterators.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/RoomSkipList.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/filters/ExcludeTagsFilter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/filters/TagFilter.ts","webpack://element-web/./src/stores/room-list-v3/RoomListStoreV3.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/filters/FavouriteFilter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/filters/UnreadFilter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/filters/PeopleFilter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/filters/RoomsFilter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/filters/InvitesFilter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/filters/MentionsFilter.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/filters/LowPriorityFilter.ts","webpack://element-web/./src/stores/room-list-v3/utils.ts","webpack://element-web/./src/stores/room-list-v3/isRoomVisible.ts","webpack://element-web/./src/components/views/dialogs/CreateSectionDialog.tsx","webpack://element-web/./src/components/views/dialogs/RemoveSectionDialog.tsx","webpack://element-web/./src/stores/room-list-v3/section.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/filters/index.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/sorters/utils/getLastTimestamp.ts","webpack://element-web/./src/stores/room-list-v3/skip-list/tag.ts","webpack://element-web/./src/stores/notifications/SpaceNotificationState.ts","webpack://element-web/./src/utils/sets.ts","webpack://element-web/./src/utils/stringOrderField.ts","webpack://element-web/./src/stores/spaces/flattenSpaceHierarchy.ts","webpack://element-web/./src/stores/spaces/SpaceStore.ts","webpack://element-web/./src/stores/widgets/ElementWidgetActions.ts","webpack://element-web/./src/stores/widgets/ElementWidgetCapabilities.ts","webpack://element-web/./src/components/views/dialogs/WidgetOpenIDPermissionsDialog.tsx","webpack://element-web/./src/widgets/CapabilityText.tsx","webpack://element-web/./src/components/views/dialogs/WidgetCapabilitiesPromptDialog.tsx","webpack://element-web/./src/stores/widgets/ElementWidgetDriver.ts","webpack://element-web/./src/utils/iterables.ts","webpack://element-web/./src/identifiers.ts","webpack://element-web/./src/components/views/dialogs/ModalWidgetDialog.tsx","webpack://element-web/./src/stores/ModalWidgetStore.ts","webpack://element-web/./src/stores/widgets/WidgetMessaging.ts","webpack://element-web/./src/stores/widgets/WidgetPermissionStore.ts","webpack://element-web/./src/toasts/DesktopNotificationsToast.ts","webpack://element-web/./src/utils/BrowserWorkarounds.ts","webpack://element-web/./src/utils/DecryptFile.ts","webpack://element-web/./src/utils/ErrorUtils.tsx","webpack://element-web/./src/utils/EventUtils.ts","webpack://element-web/./src/utils/Feedback.ts","webpack://element-web/./src/utils/FileDownloader.ts","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/filesize@11.0.19/node_modules/filesize/dist/filesize.js","webpack://element-web/./src/utils/FileUtils.ts","webpack://element-web/./src/utils/FormattingUtils.ts","webpack://element-web/./src/utils/IdentityServerUtils.ts","webpack://element-web/./src/utils/Image.ts","webpack://element-web/./src/utils/KeyVerificationStateObserver.ts","webpack://element-web/./src/utils/MarkedExecution.ts","webpack://element-web/./src/utils/LazyValue.ts","webpack://element-web/./src/utils/MediaEventHelper.ts","webpack://element-web/./src/components/views/dialogs/AskInviteAnywayDialog.tsx","webpack://element-web/./src/components/views/dialogs/InviteProgressDialog.tsx","webpack://element-web/./src/utils/MultiInviter.ts","webpack://element-web/./src/utils/NativeEventUtils.ts","webpack://element-web/./src/utils/PinningUtils.ts","webpack://element-web/./src/utils/PreferredRoomVersions.ts","webpack://element-web/./src/utils/ReactUtils.tsx","webpack://element-web/./src/utils/Reply.ts","webpack://element-web/./src/utils/RoomUpgrade.ts","webpack://element-web/./src/utils/ShieldUtils.ts","webpack://element-web/./src/utils/Singleflight.ts","webpack://element-web/./src/utils/SortMembers.ts","webpack://element-web/./src/utils/Timer.ts","webpack://element-web/./src/utils/UrlPreviewFetcher.ts","webpack://element-web/./src/ImageUtils.ts","webpack://element-web/./src/utils/WellKnownUtils.ts","webpack://element-web/./src/utils/Whenable.ts","webpack://element-web/./src/utils/beacon/getShareableLocation.ts","webpack://element-web/./src/utils/beacon/duration.ts","webpack://element-web/./src/utils/beacon/geolocation.ts","webpack://element-web/./src/utils/beacon/useBeacon.ts","webpack://element-web/./src/utils/beacon/useOwnLiveBeacons.ts","webpack://element-web/./src/utils/blobs.ts","webpack://element-web/./src/utils/colour.ts","webpack://element-web/./src/utils/connection.ts","webpack://element-web/./src/utils/crypto/deviceInfo.ts","webpack://element-web/./src/utils/crypto/index.ts","webpack://element-web/./src/utils/crypto/shouldForceDisableEncryption.ts","webpack://element-web/./src/utils/dm/startDm.ts","webpack://element-web/./src/utils/threepids.ts","webpack://element-web/./src/utils/direct-messages.ts","webpack://element-web/./src/utils/dm/findDMRoom.ts","webpack://element-web/./src/utils/dm/createDmLocalRoom.ts","webpack://element-web/./src/utils/dm/findDMForUser.ts","webpack://element-web/./src/BlurhashEncoder.ts","webpack://element-web/./src/workers/blurhashWorkerFactory.ts","webpack://element-web/./src/utils/image-media.ts","webpack://element-web/./src/components/views/dialogs/LeaveSpaceDialog.tsx","webpack://element-web/./src/utils/leave-behaviour.ts","webpack://element-web/./src/utils/localRoom/isRoomReady.ts","webpack://element-web/./src/utils/local-room.ts","webpack://element-web/./src/utils/location/LocationShareErrors.ts","webpack://element-web/./src/utils/location/findMapStyleUrl.ts","webpack://element-web/./src/utils/location/isSelfLocation.ts","webpack://element-web/./src/utils/location/locationEventGeoUri.ts","webpack://element-web/./src/utils/location/parseGeoUri.ts","webpack://element-web/./src/utils/location/links.ts","webpack://element-web/./src/utils/location/positionFailureMessage.ts","webpack://element-web/./src/utils/media/mediaVisibility.ts","webpack://element-web/./src/utils/membership.ts","webpack://element-web/./src/utils/messages.ts","webpack://element-web/./src/utils/notifications.ts","webpack://element-web/./src/utils/presence.ts","webpack://element-web/./src/utils/read-receipts.ts","webpack://element-web/./src/utils/room/getFunctionalMembers.ts","webpack://element-web/./src/utils/room/getJoinedNonFunctionalMembers.ts","webpack://element-web/./src/utils/room/getTagsForRoom.ts","webpack://element-web/./src/utils/room/placeCall.ts","webpack://element-web/./src/utils/room/sortRoomsByRecency.ts","webpack://element-web/./src/utils/rooms.ts","webpack://element-web/./src/components/views/dialogs/CreateSubspaceDialog.tsx","webpack://element-web/./src/components/views/dialogs/AddExistingSubspaceDialog.tsx","webpack://element-web/./src/utils/space.tsx","webpack://element-web/./src/utils/video-rooms.ts","webpack://element-web/./src/verification.ts","webpack://element-web/./src/viewmodels/room/timeline/DateSeparatorViewModel.tsx","webpack://element-web/./src/viewmodels/room/timeline/event-tile/EncryptionEventViewModel.ts","webpack://element-web/./src/viewmodels/room/timeline/event-tile/timestamp/MessageTimestampViewModel.ts","webpack://element-web/./src/widgets/ManagedHybrid.ts","webpack://element-web/./res/img/social/email-1.png","webpack://element-web/./res/img/social/facebook.png","webpack://element-web/./res/img/social/linkedin.png","webpack://element-web/./res/img/social/reddit.png","webpack://element-web/./res/img/social/twitter-2.png","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@matrix-org+emojibase-bindings@1.5.0/node_modules/@matrix-org/emojibase-bindings/build/emoji.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@matrix-org+react-sdk-module-api@2.5.0_patch_hash=016146c9cc96e6363609d2b2ac0896ccef567_88e9e4948198afef3a26d5a493f07dc1/node_modules/@matrix-org/react-sdk-module-api/lib/lifecycles/RoomViewLifecycle.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@matrix-org+react-sdk-module-api@2.5.0_patch_hash=016146c9cc96e6363609d2b2ac0896ccef567_88e9e4948198afef3a26d5a493f07dc1/node_modules/@matrix-org/react-sdk-module-api/lib/lifecycles/WidgetLifecycle.js","webpack://element-web/../node_modules/.pnpm/blurhash@2.0.5/node_modules/blurhash/src/base83.ts","webpack://element-web/../node_modules/.pnpm/blurhash@2.0.5/node_modules/blurhash/src/utils.ts","webpack://element-web/../node_modules/.pnpm/blurhash@2.0.5/node_modules/blurhash/src/error.ts","webpack://element-web/../node_modules/.pnpm/blurhash@2.0.5/node_modules/blurhash/src/decode.ts","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/dayjs@1.11.21/node_modules/dayjs/dayjs.min.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/dist/cjs.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/diff-match-patch@1.0.5/node_modules/diff-match-patch/index.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/dom-serializer@2.0.0/node_modules/dom-serializer/lib/foreignNames.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/dom-serializer@2.0.0/node_modules/dom-serializer/lib/index.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/domelementtype@2.3.0/node_modules/domelementtype/lib/index.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/domhandler@5.0.3/node_modules/domhandler/lib/index.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/domhandler@5.0.3/node_modules/domhandler/lib/node.js","webpack://element-web/https/","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/emojibase-regex@17.0.0/node_modules/emojibase-regex/emoticon.js","webpack://element-web/../node_modules/.pnpm/emojibase@17.0.0/node_modules/emojibase/src/constants.ts","webpack://element-web/../node_modules/.pnpm/emojibase@17.0.0/node_modules/emojibase/src/generateEmoticonPermutations.ts","webpack://element-web/../node_modules/.pnpm/emojibase@17.0.0/node_modules/emojibase/src/stripHexcode.ts","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/entities@3.0.1/node_modules/entities/lib/decode.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/entities@3.0.1/node_modules/entities/lib/decode_codepoint.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/entities@3.0.1/node_modules/entities/lib/encode-trie.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/entities@3.0.1/node_modules/entities/lib/encode.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/entities@3.0.1/node_modules/entities/lib/generated/decode-data-html.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/entities@3.0.1/node_modules/entities/lib/generated/decode-data-xml.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/entities@3.0.1/node_modules/entities/lib/index.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/escape-html@1.0.3/node_modules/escape-html/index.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/escape-string-regexp@4.0.0/node_modules/escape-string-regexp/index.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/glob-to-regexp@0.4.1/node_modules/glob-to-regexp/index.js","webpack://element-web/../node_modules/.pnpm/html-dom-parser@7.0.1/node_modules/html-dom-parser/node_modules/domelementtype/dist/index.js","webpack://element-web/../node_modules/.pnpm/html-dom-parser@7.0.1/node_modules/html-dom-parser/node_modules/domhandler/dist/node.js","webpack://element-web/../src/client/constants.ts","webpack://element-web/../src/client/utilities.ts","webpack://element-web/../src/client/domparser.ts","webpack://element-web/../src/client/html-to-dom.ts","webpack://element-web/../node_modules/.pnpm/html-react-parser@6.0.1_@types+react@19.2.14_react@19.2.7/node_modules/html-react-parser/src/attributes-to-props.ts","webpack://element-web/../node_modules/.pnpm/html-react-parser@6.0.1_@types+react@19.2.14_react@19.2.7/node_modules/html-react-parser/src/dom-to-react.ts","webpack://element-web/../node_modules/.pnpm/html-react-parser@6.0.1_@types+react@19.2.14_react@19.2.7/node_modules/html-react-parser/src/index.ts","webpack://element-web/../node_modules/.pnpm/html-react-parser@6.0.1_@types+react@19.2.14_react@19.2.7/node_modules/html-react-parser/src/utilities.ts","webpack://element-web/../node_modules/.pnpm/inline-style-parser@0.2.7/node_modules/inline-style-parser/index.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/is-plain-object@5.0.0/node_modules/is-plain-object/dist/is-plain-object.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/launder@1.7.1/node_modules/launder/index.js","webpack://element-web/../node_modules/.pnpm/matrix-encrypt-attachment@1.0.3/node_modules/matrix-encrypt-attachment/lib/node_modules/browser-pack/_prelude.js","webpack://element-web/../node_modules/.pnpm/matrix-encrypt-attachment@1.0.3/node_modules/matrix-encrypt-attachment/lib/src/webcrypto.ts","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/mdurl@1.0.1/node_modules/mdurl/encode.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/opus-recorder@8.0.5/node_modules/opus-recorder/dist/recorder.min.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/parse-srcset@1.0.2/node_modules/parse-srcset/src/parse-srcset.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.browser.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/at-rule.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/comment.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/container.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/css-syntax-error.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/declaration.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/document.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/fromJSON.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/input.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/lazy-result.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/list.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/map-generator.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/no-work-result.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/node.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/parse.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/parser.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/postcss.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/previous-map.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/processor.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/result.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/root.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/rule.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/stringifier.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/stringify.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/symbols.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/tokenize.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/warn-once.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/postcss@8.5.16/node_modules/postcss/lib/warning.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/react-property@2.0.2/node_modules/react-property/lib/index.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/react-property@2.0.2/node_modules/react-property/lib/possibleStandardNamesOptimized.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/react-string-replace@2.0.1/node_modules/react-string-replace/index.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/sanitize-html@2.17.5/node_modules/sanitize-html/index.js","webpack://element-web/../node_modules/.pnpm/style-to-js@1.1.21/node_modules/style-to-js/src/index.ts","webpack://element-web/../node_modules/.pnpm/style-to-js@1.1.21/node_modules/style-to-js/src/utilities.ts","webpack://element-web/../node_modules/.pnpm/style-to-object@1.0.14/node_modules/style-to-object/src/index.ts","webpack://element-web/javascript/node_modules/.pnpm/nanoid@3.3.12/node_modules/nanoid/non-secure/index.cjs","webpack://element-web/../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/decode-codepoint.ts","webpack://element-web/../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/decode.ts","webpack://element-web/../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/generated/decode-data-html.ts","webpack://element-web/../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/generated/decode-data-xml.ts","webpack://element-web/../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/internal/bin-trie-flags.ts","webpack://element-web/../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/internal/decode-shared.ts","webpack://element-web/../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/src/Parser.ts","webpack://element-web/../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/src/Tokenizer.ts","webpack://element-web/../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/src/index.ts","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/Alert/Alert.tsx","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/Form/Controls/Action/Action.tsx","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/Form/Controls/EditInPlace/EditInPlace.tsx","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/Form/Controls/MFA/MFA.tsx","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/Form/Controls/Password/Password.tsx","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/Form/Controls/SettingsToggle/SettingsToggle.tsx","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/Form/InlineField.tsx","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/Form/Label.tsx","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/Form/Message.tsx","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/dist/_virtual/_rolldown/runtime.js","webpack://element-web/../node_modules/.pnpm/@vector-im+compound-web@9.8.0_@fontsource+inconsolata@5.2.8_@fontsource+inter@5.2.8_@ty_4f4ee9539afab4e70c94c1425596cfcf/node_modules/@vector-im/compound-web/src/components/Icon/BigIcon/BigIcon.tsx","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/chain-and-copy-promiselike.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/defaultScopes.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/asyncContext/index.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/attributes.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/carrier.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/constants.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/currentScopes.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/debug-build.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/timestampSequence.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/logs/constants.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/logs/envelope.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/logs/internal.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/trace-info.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/logs/public-api.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/scope.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/semanticAttributes.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/session.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/baggage.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/hasSpansEnabled.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/tracing/sentryNonRecordingSpan.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/tracing/dynamicSamplingContext.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/tracing/utils.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/debug-logger.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/dsn.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/env.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/envelope.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/is.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/isBrowser.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/node.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/merge.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/misc.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/normalizationHints.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/normalize.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/object.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/propagationContext.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/randomSafeContext.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/scopeData.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/spanOnScope.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/spanUtils.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/stacktrace.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/string.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/time.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/version.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/weakRef.ts","webpack://element-web/../node_modules/.pnpm/@sentry+core@10.63.0/node_modules/@sentry/core/src/utils/worldwide.ts","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/ask-to-join.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/block.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/bold.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/chat-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/chat.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/check-circle-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/check-circle.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/chevron-left.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/chevron-up.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/collapse.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/copy.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/delete.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/dial-pad.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/download.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/edit.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/end-call.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/error.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/expand.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/files.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/forward.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/group.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/info-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/info.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/inline-code.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/italic.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/leave.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/link.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/location-pin-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/lock-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/mention.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/overflow-horizontal.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/pin.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/polls-end.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/polls.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/presence-outline-8x8.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/presence-solid-8x8.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/presence-strikethrough-8x8.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/public.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/quote.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/restart.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/search.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/share.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/shield.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/strikethrough.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/take-photo-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/threads.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/tree.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/unpin.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/user-add-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/user-add.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/user-profile-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/verified.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/video-call-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/visibility-off.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/visibility-on.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/voice-call-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/volume-off-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/volume-on-solid.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/domelementtype@3.0.0/node_modules/domelementtype/dist/index.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/domhandler@6.0.1/node_modules/domhandler/dist/index.js","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/domhandler@6.0.1/node_modules/domhandler/dist/node.js","webpack://element-web/../node_modules/.pnpm/html-entities@2.6.0/node_modules/html-entities/src/named-references.ts","webpack://element-web/../node_modules/.pnpm/html-entities@2.6.0/node_modules/html-entities/src/numeric-unicode-map.ts","webpack://element-web/../node_modules/.pnpm/html-entities@2.6.0/node_modules/html-entities/src/surrogate-pairs.ts","webpack://element-web/../node_modules/.pnpm/html-entities@2.6.0/node_modules/html-entities/src/index.ts"],"sourcesContent":["var _path, _path2, _path3, _path4;\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\";\nimport { forwardRef } from \"react\";\nvar SvgEmailPrompt = function SvgEmailPrompt(props, ref) {\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 57 46\",\n    role: \"presentation\",\n    \"aria-hidden\": true,\n    ref: ref\n  }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    fill: \"#737d8c\",\n    d: \"M4 17c-.5 0-.975.096-1.416.264L20 34.68l17.416-17.416A4 4 0 0 0 36 17ZM.264 19.584A4 4 0 0 0 0 21v21a4 4 0 0 0 4 4h32a4 4 0 0 0 4-4V21c0-.5-.096-.975-.264-1.416L21.16 38.16a1.6 1.6 0 0 1-.533.356 1.6 1.6 0 0 1-.627.125 1.6 1.6 0 0 1-.627-.125 1.6 1.6 0 0 1-.533-.356z\"\n  })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n    fill: \"#0dbd8b\",\n    fillOpacity: 0.1,\n    d: \"M57 16a16 16 0 0 1-16 16 16 16 0 0 1-16-16A16 16 0 0 1 41 0a16 16 0 0 1 16 16\"\n  })), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n    fill: \"#fff\",\n    d: \"M53 16a12 12 0 0 1-12 12 12 12 0 0 1-12-12A12 12 0 0 1 41 4a12 12 0 0 1 12 12\"\n  })), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n    fill: \"#0dbd8b\",\n    d: \"M49 16a8 8 0 0 1-8 8 8 8 0 0 1-8-8 8 8 0 0 1 8-8 8 8 0 0 1 8 8\"\n  })));\n};\nvar ForwardRef = /*#__PURE__*/forwardRef(SvgEmailPrompt);\nexport { ForwardRef as Icon };\nexport default \"img/element-icons/email-prompt.67a8ba4.svg\";","var _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\";\nimport { forwardRef } from \"react\";\nvar SvgIconEmailPillAvatar = function SvgIconEmailPillAvatar(props, ref) {\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 65.631 67.981\",\n    role: \"presentation\",\n    \"aria-hidden\": true,\n    ref: ref\n  }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"filter\", {\n    id: \"icon-email-pill-avatar_svg__a\",\n    width: 1.118,\n    height: 1.158,\n    x: -0.059,\n    y: -0.079,\n    filterUnits: \"objectBoundingBox\"\n  }, /*#__PURE__*/React.createElement(\"feOffset\", {\n    dy: 2,\n    \"in\": \"SourceAlpha\",\n    result: \"shadowOffsetOuter1\"\n  }), /*#__PURE__*/React.createElement(\"feGaussianBlur\", {\n    \"in\": \"shadowOffsetOuter1\",\n    result: \"shadowBlurOuter1\",\n    stdDeviation: 16\n  }), /*#__PURE__*/React.createElement(\"feColorMatrix\", {\n    \"in\": \"shadowBlurOuter1\",\n    result: \"shadowMatrixOuter1\",\n    values: \"0 0 0 0 0 0 0 0 0 0.473684211 0 0 0 0 1 0 0 0 0.241258741 0\"\n  }), /*#__PURE__*/React.createElement(\"feMerge\", null, /*#__PURE__*/React.createElement(\"feMergeNode\", {\n    \"in\": \"shadowMatrixOuter1\"\n  }), /*#__PURE__*/React.createElement(\"feMergeNode\", {\n    \"in\": \"SourceGraphic\"\n  }))))), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n    fill: \"none\",\n    fillRule: \"evenodd\",\n    stroke: \"#368bd6\",\n    strokeLinecap: \"round\",\n    strokeLinejoin: \"round\",\n    filter: \"url(#icon-email-pill-avatar_svg__a)\",\n    transform: \"translate(-1493.716 -795.144)scale(3.40907)\"\n  }, /*#__PURE__*/React.createElement(\"g\", {\n    transform: \"translate(441.5 237.5)\"\n  }, /*#__PURE__*/React.createElement(\"circle\", {\n    cx: 6.286,\n    cy: 5.714,\n    r: 2.286\n  }), /*#__PURE__*/React.createElement(\"path\", {\n    d: \"M8.571 3.429v2.857a1.714 1.714 0 1 0 3.429 0v-.572a5.714 5.714 0 1 0-2.24 4.537\"\n  })))));\n};\nvar ForwardRef = /*#__PURE__*/forwardRef(SvgIconEmailPillAvatar);\nexport { ForwardRef as Icon };\nexport default \"img/icon-email-pill-avatar.a6d2e88.svg\";","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\";\nimport { forwardRef } from \"react\";\nvar SvgLiveLocation = function SvgLiveLocation(props, ref) {\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 26 14\",\n    role: \"presentation\",\n    \"aria-hidden\": true,\n    ref: ref\n  }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M3.654 13.153a.87.87 0 0 0 .063-1.173c-2.41-2.93-2.41-7.185-.007-10.121A.885.885 0 0 0 3.654.673a.89.89 0 0 0-1.318.063c-2.93 3.582-2.93 8.765 0 12.354a.885.885 0 0 0 1.318.063m2.529-2.529a.885.885 0 0 0 .081-1.148 4.43 4.43 0 0 1 0-5.12.89.89 0 0 0-.081-1.148l-.007-.006c-.376-.377-1.016-.352-1.324.081a6.22 6.22 0 0 0 0 7.266c.314.433.948.458 1.33.075m7.132-9.585c-2.429 0-4.392 2.018-4.392 4.512 0 2.688 2.773 6.394 3.915 7.805.25.31.709.31.96 0 1.136-1.411 3.909-5.117 3.909-7.805 0-2.494-1.964-4.512-4.392-4.512m0 6.123c-.866 0-1.569-.722-1.569-1.611 0-.89.703-1.611 1.569-1.611s1.568.721 1.568 1.61-.702 1.612-1.568 1.612m8.994 4.818a.87.87 0 0 0 .063 1.173.885.885 0 0 0 1.318-.063c2.93-3.589 2.93-8.772 0-12.354a.89.89 0 0 0-1.318-.063.885.885 0 0 0-.056 1.186c2.403 2.936 2.403 7.19-.007 10.12m-2.547-2.504a.885.885 0 0 0 .081 1.148c.383.383 1.017.358 1.33-.075a6.22 6.22 0 0 0 0-7.266c-.307-.433-.947-.458-1.323-.081l-.007.006a.89.89 0 0 0-.081 1.148 4.43 4.43 0 0 1 0 5.12\",\n    clipRule: \"evenodd\"\n  })));\n};\nvar ForwardRef = /*#__PURE__*/forwardRef(SvgLiveLocation);\nexport { ForwardRef as Icon };\nexport default \"img/location/live-location.db24eab.svg\";","/*\nCopyright 2021 - 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { type ExtensibleEventType, type IPartialEvent } from \"../@types/extensible_events.ts\";\n\n/**\n * Represents an Extensible Event in Matrix.\n */\nexport abstract class ExtensibleEvent<TContent extends object = object> {\n    protected constructor(public readonly wireFormat: IPartialEvent<TContent>) {}\n\n    /**\n     * Shortcut to wireFormat.content\n     */\n    public get wireContent(): TContent {\n        return this.wireFormat.content;\n    }\n\n    /**\n     * Serializes the event into a format which can be used to send the\n     * event to the room.\n     * @returns The serialized event.\n     */\n    public abstract serialize(): IPartialEvent<object>;\n\n    /**\n     * Determines if this event is equivalent to the provided event type.\n     * This is recommended over `instanceof` checks due to issues in the JS\n     * runtime (and layering of dependencies in some projects).\n     *\n     * Implementations should pass this check off to their super classes\n     * if their own checks fail. Some primary implementations do not extend\n     * fallback classes given they support the primary type first. Thus,\n     * those classes may return false if asked about their fallback\n     * representation.\n     *\n     * Note that this only checks primary event types: legacy events, like\n     * m.room.message, should/will fail this check.\n     * @param primaryEventType - The (potentially namespaced) event\n     * type.\n     * @returns True if this event *could* be represented as the\n     * given type.\n     */\n    public abstract isEquivalentTo(primaryEventType: ExtensibleEventType): boolean;\n}\n","/*\nCopyright 2022 - 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * Thrown when an event is unforgivably unparsable.\n */\nexport class InvalidEventError extends Error {\n    public constructor(message: string) {\n        super(message);\n    }\n}\n","/*\nCopyright 2022 - 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\nimport {\n    type ExtensibleEventType,\n    type IMessageRendering,\n    type IPartialEvent,\n    isEventTypeSame,\n    M_HTML,\n    M_MESSAGE,\n    type ExtensibleAnyMessageEventContent,\n    M_TEXT,\n} from \"../@types/extensible_events.ts\";\nimport { isOptionalAString, isProvided } from \"./utilities.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\n\n/**\n * Represents a message event. Message events are the simplest form of event with\n * just text (optionally of different mimetypes, like HTML).\n *\n * Message events can additionally be an Emote or Notice, though typically those\n * are represented as EmoteEvent and NoticeEvent respectively.\n */\nexport class MessageEvent extends ExtensibleEvent<ExtensibleAnyMessageEventContent> {\n    /**\n     * The default text for the event.\n     */\n    public readonly text: string;\n\n    /**\n     * The default HTML for the event, if provided.\n     */\n    public readonly html?: string;\n\n    /**\n     * All the different renderings of the message. Note that this is the same\n     * format as an m.message body but may contain elements not found directly\n     * in the event content: this is because this is interpreted based off the\n     * other information available in the event.\n     */\n    public readonly renderings: IMessageRendering[];\n\n    /**\n     * Creates a new MessageEvent from a pure format. Note that the event is\n     * *not* parsed here: it will be treated as a literal m.message primary\n     * typed event.\n     * @param wireFormat - The event.\n     */\n    public constructor(wireFormat: IPartialEvent<ExtensibleAnyMessageEventContent>) {\n        super(wireFormat);\n\n        const mmessage = M_MESSAGE.findIn(this.wireContent);\n        const mtext = M_TEXT.findIn<string>(this.wireContent);\n        const mhtml = M_HTML.findIn<string>(this.wireContent);\n        if (isProvided(mmessage)) {\n            if (!Array.isArray(mmessage)) {\n                throw new InvalidEventError(\"m.message contents must be an array\");\n            }\n            const text = mmessage.find((r) => !isProvided(r.mimetype) || r.mimetype === \"text/plain\");\n            const html = mmessage.find((r) => r.mimetype === \"text/html\");\n\n            if (!text) throw new InvalidEventError(\"m.message is missing a plain text representation\");\n\n            this.text = text.body;\n            this.html = html?.body;\n            this.renderings = mmessage;\n        } else if (isOptionalAString(mtext)) {\n            this.text = mtext;\n            this.html = mhtml ?? undefined;\n            this.renderings = [{ body: mtext, mimetype: \"text/plain\" }];\n            if (this.html) {\n                this.renderings.push({ body: this.html, mimetype: \"text/html\" });\n            }\n        } else {\n            throw new InvalidEventError(\"Missing textual representation for event\");\n        }\n    }\n\n    public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n        return isEventTypeSame(primaryEventType, M_MESSAGE);\n    }\n\n    protected serializeMMessageOnly(): ExtensibleAnyMessageEventContent {\n        let messageRendering: ExtensibleAnyMessageEventContent = {\n            [M_MESSAGE.name]: this.renderings,\n        };\n\n        // Use the shorthand if it's just a simple text event\n        if (this.renderings.length === 1) {\n            const mime = this.renderings[0].mimetype;\n            if (mime === undefined || mime === \"text/plain\") {\n                messageRendering = {\n                    [M_TEXT.name]: this.renderings[0].body,\n                };\n            }\n        }\n\n        return messageRendering;\n    }\n\n    public serialize(): IPartialEvent<object> {\n        return {\n            type: \"m.room.message\",\n            content: {\n                ...this.serializeMMessageOnly(),\n                body: this.text,\n                msgtype: \"m.text\",\n                format: this.html ? \"org.matrix.custom.html\" : undefined,\n                formatted_body: this.html ?? undefined,\n            },\n        };\n    }\n\n    /**\n     * Creates a new MessageEvent from text and HTML.\n     * @param text - The text.\n     * @param html - Optional HTML.\n     * @returns The representative message event.\n     */\n    public static from(text: string, html?: string): MessageEvent {\n        return new MessageEvent({\n            type: M_MESSAGE.name,\n            content: {\n                [M_TEXT.name]: text,\n                [M_HTML.name]: html,\n            },\n        });\n    }\n}\n","/*\nCopyright 2022 - 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { NamespacedValue } from \"matrix-events-sdk\";\n\nimport { MessageEvent } from \"./MessageEvent.ts\";\nimport { type ExtensibleEventType, type IPartialEvent, isEventTypeSame, M_TEXT } from \"../@types/extensible_events.ts\";\nimport {\n    type KnownPollKind,\n    M_POLL_KIND_DISCLOSED,\n    M_POLL_KIND_UNDISCLOSED,\n    M_POLL_START,\n    type PollStartEventContent,\n    type PollStartSubtype,\n    type PollAnswer,\n} from \"../@types/polls.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\nimport { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\n\n/**\n * Represents a poll answer. Note that this is represented as a subtype and is\n * not registered as a parsable event - it is implied for usage exclusively\n * within the PollStartEvent parsing.\n */\nexport class PollAnswerSubevent extends MessageEvent {\n    /**\n     * The answer ID.\n     */\n    public readonly id: string;\n\n    public constructor(wireFormat: IPartialEvent<PollAnswer>) {\n        super(wireFormat);\n\n        const id = wireFormat.content.id;\n        if (!id || typeof id !== \"string\") {\n            throw new InvalidEventError(\"Answer ID must be a non-empty string\");\n        }\n        this.id = id;\n    }\n\n    public serialize(): IPartialEvent<object> {\n        return {\n            type: \"org.matrix.sdk.poll.answer\",\n            content: {\n                id: this.id,\n                ...this.serializeMMessageOnly(),\n            },\n        };\n    }\n\n    /**\n     * Creates a new PollAnswerSubevent from ID and text.\n     * @param id - The answer ID (unique within the poll).\n     * @param text - The text.\n     * @returns The representative answer.\n     */\n    public static from(id: string, text: string): PollAnswerSubevent {\n        return new PollAnswerSubevent({\n            type: \"org.matrix.sdk.poll.answer\",\n            content: {\n                id: id,\n                [M_TEXT.name]: text,\n            },\n        });\n    }\n}\n\n/**\n * Represents a poll start event.\n */\nexport class PollStartEvent extends ExtensibleEvent<PollStartEventContent> {\n    /**\n     * The question being asked, as a MessageEvent node.\n     */\n    public readonly question: MessageEvent;\n\n    /**\n     * The interpreted kind of poll. Note that this will infer a value that is known to the\n     * SDK rather than verbatim - this means unknown types will be represented as undisclosed\n     * polls.\n     *\n     * To get the raw kind, use rawKind.\n     */\n    public readonly kind: KnownPollKind;\n\n    /**\n     * The true kind as provided by the event sender. Might not be valid.\n     */\n    public readonly rawKind: string;\n\n    /**\n     * The maximum number of selections a user is allowed to make.\n     */\n    public readonly maxSelections: number;\n\n    /**\n     * The possible answers for the poll.\n     */\n    public readonly answers: PollAnswerSubevent[];\n\n    /**\n     * Creates a new PollStartEvent from a pure format. Note that the event is *not*\n     * parsed here: it will be treated as a literal m.poll.start primary typed event.\n     * @param wireFormat - The event.\n     */\n    public constructor(wireFormat: IPartialEvent<PollStartEventContent>) {\n        super(wireFormat);\n\n        const poll = M_POLL_START.findIn<PollStartSubtype>(this.wireContent);\n\n        if (!poll?.question) {\n            throw new InvalidEventError(\"A question is required\");\n        }\n\n        this.question = new MessageEvent({ type: \"org.matrix.sdk.poll.question\", content: poll.question });\n\n        this.rawKind = poll.kind;\n        if (M_POLL_KIND_DISCLOSED.matches(this.rawKind)) {\n            this.kind = M_POLL_KIND_DISCLOSED;\n        } else {\n            this.kind = M_POLL_KIND_UNDISCLOSED; // default & assumed value\n        }\n\n        this.maxSelections =\n            Number.isFinite(poll.max_selections) && poll.max_selections! > 0 ? poll.max_selections! : 1;\n\n        if (!Array.isArray(poll.answers)) {\n            throw new InvalidEventError(\"Poll answers must be an array\");\n        }\n        const answers = poll.answers.slice(0, 20).map(\n            (a) =>\n                new PollAnswerSubevent({\n                    type: \"org.matrix.sdk.poll.answer\",\n                    content: a,\n                }),\n        );\n        if (answers.length <= 0) {\n            throw new InvalidEventError(\"No answers available\");\n        }\n        this.answers = answers;\n    }\n\n    public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n        return isEventTypeSame(primaryEventType, M_POLL_START);\n    }\n\n    public serialize(): IPartialEvent<object> {\n        return {\n            type: M_POLL_START.name,\n            content: {\n                [M_POLL_START.name]: {\n                    question: this.question.serialize().content,\n                    kind: this.rawKind,\n                    max_selections: this.maxSelections,\n                    answers: this.answers.map((a) => a.serialize().content),\n                },\n                [M_TEXT.name]: `${this.question.text}\\n${this.answers.map((a, i) => `${i + 1}. ${a.text}`).join(\"\\n\")}`,\n            },\n        };\n    }\n\n    /**\n     * Creates a new PollStartEvent from question, answers, and metadata.\n     * @param question - The question to ask.\n     * @param answers - The answers. Should be unique within each other.\n     * @param kind - The kind of poll.\n     * @param maxSelections - The maximum number of selections. Must be 1 or higher.\n     * @returns The representative poll start event.\n     */\n    public static from(\n        question: string,\n        answers: string[],\n        kind: KnownPollKind | string,\n        maxSelections = 1,\n    ): PollStartEvent {\n        return new PollStartEvent({\n            type: M_POLL_START.name,\n            content: {\n                [M_TEXT.name]: question, // unused by parsing\n                [M_POLL_START.name]: {\n                    question: { [M_TEXT.name]: question },\n                    kind: kind instanceof NamespacedValue ? kind.name : kind,\n                    max_selections: maxSelections,\n                    answers: answers.map((a) => ({ id: makeId(), [M_TEXT.name]: a })),\n                },\n            },\n        });\n    }\n}\n\nconst LETTERS = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\nfunction makeId(): string {\n    return [...Array(16)].map(() => LETTERS.charAt(Math.floor(Math.random() * LETTERS.length))).join(\"\");\n}\n","/*\nCopyright 2024 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/*\n * This file is a secondary entrypoint for the js-sdk library, for use by Typescript projects.\n * It exposes low-level types and interfaces reflecting structures defined in the Matrix specification.\n *\n * Remember to only export *public* types from this file.\n */\n\nexport type * from \"./@types/media.ts\";\nexport * from \"./@types/membership.ts\";\nexport type * from \"./@types/event.ts\";\nexport type * from \"./@types/events.ts\";\nexport type * from \"./@types/state_events.ts\";\nexport type * from \"./@types/AESEncryptedSecretStoragePayload.ts\";\n\n/** The different methods for device and user verification */\nexport enum VerificationMethod {\n    /** Short authentication string (emoji or decimals).\n     *\n     * @see https://spec.matrix.org/v1.9/client-server-api/#short-authentication-string-sas-verification\n     */\n    Sas = \"m.sas.v1\",\n\n    /**\n     * Verification by showing a QR code which is scanned by the other device.\n     *\n     * @see https://spec.matrix.org/v1.9/client-server-api/#qr-codes\n     */\n    ShowQrCode = \"m.qr_code.show.v1\",\n\n    /**\n     * Verification by scanning a QR code that is shown by the other device.\n     *\n     * @see https://spec.matrix.org/v1.9/client-server-api/#qr-codes\n     */\n    ScanQrCode = \"m.qr_code.scan.v1\",\n\n    /**\n     * Verification by confirming that we have scanned a QR code.\n     *\n     * @see https://spec.matrix.org/v1.9/client-server-api/#qr-codes\n     */\n    Reciprocate = \"m.reciprocate.v1\",\n}\n","module.exports = __webpack_public_path__ + \"recorder.worklet.js\";","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\nCopyright 2017 Vector Creations Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { _t } from \"./languageHandler\";\nimport { getUserLanguage } from \"./i18n/settings\";\nimport { getUserTimezone } from \"./TimezoneHandler\";\n\nexport { formatSeconds } from \"@element-hq/web-shared-components\";\n\nexport const MINUTE_MS = 60000;\nexport const HOUR_MS = MINUTE_MS * 60;\nexport const DAY_MS = HOUR_MS * 24;\n\n/**\n * Returns array of 7 weekday names, from Sunday to Saturday, internationalised to the user's language.\n * @param weekday - format desired \"short\" | \"long\" | \"narrow\"\n */\nexport function getDaysArray(weekday: Intl.DateTimeFormatOptions[\"weekday\"] = \"short\"): string[] {\n    const sunday = 1672574400000; // 2023-01-01 12:00 UTC\n    const dateTimeFormat = new Intl.DateTimeFormat(getUserLanguage(), { weekday, timeZone: \"UTC\" });\n    return [...Array(7).keys()].map((day) => dateTimeFormat.format(sunday + day * DAY_MS));\n}\n\n/**\n * Returns array of 12 month names, from January to December, internationalised to the user's language.\n * @param month - format desired \"numeric\" | \"2-digit\" | \"long\" | \"short\" | \"narrow\"\n */\nexport function getMonthsArray(month: Intl.DateTimeFormatOptions[\"month\"] = \"short\"): string[] {\n    const dateTimeFormat = new Intl.DateTimeFormat(getUserLanguage(), { month, timeZone: \"UTC\" });\n    return [...Array(12).keys()].map((m) => dateTimeFormat.format(Date.UTC(2021, m)));\n}\n\n// XXX: Ideally we could just specify `hour12: boolean` but it has issues on Chrome in the `en` locale\n// https://support.google.com/chrome/thread/29828561?hl=en\nexport function getTwelveHourOptions(showTwelveHour: boolean): Intl.DateTimeFormatOptions {\n    return {\n        hourCycle: showTwelveHour ? \"h12\" : \"h23\",\n    };\n}\n\n/**\n * Formats a given date to a date & time string.\n *\n * The output format depends on how far away the given date is from now.\n * Will use the browser's default time zone.\n * If the date is today it will return a time string excluding seconds. See {@formatTime}.\n * If the date is within the last 6 days it will return the name of the weekday along with the time string excluding seconds.\n * If the date is within the same year then it will return the weekday, month and day of the month along with the time string excluding seconds.\n * Otherwise, it will return a string representing the full date & time in a human friendly manner. See {@formatFullDate}.\n * @param date - date object to format\n * @param showTwelveHour - whether to use 12-hour rather than 24-hour time. Defaults to `false` (24 hour mode).\n *        Overrides the default from the locale, whether `true` or `false`.\n * @param locale - the locale string to use, in BCP 47 format, defaulting to user's selected application locale\n */\nexport function formatDate(date: Date, showTwelveHour = false, locale?: string): string {\n    const _locale = locale ?? getUserLanguage();\n    const now = new Date();\n    if (date.toDateString() === now.toDateString()) {\n        return formatTime(date, showTwelveHour, _locale);\n    } else if (now.getTime() - date.getTime() < 6 * DAY_MS) {\n        // Time is within the last 6 days (or in the future)\n        return new Intl.DateTimeFormat(_locale, {\n            ...getTwelveHourOptions(showTwelveHour),\n            weekday: \"short\",\n            hour: \"numeric\",\n            minute: \"2-digit\",\n            timeZone: getUserTimezone(),\n        }).format(date);\n    } else if (now.getFullYear() === date.getFullYear()) {\n        return new Intl.DateTimeFormat(_locale, {\n            ...getTwelveHourOptions(showTwelveHour),\n            weekday: \"short\",\n            month: \"short\",\n            day: \"numeric\",\n            hour: \"numeric\",\n            minute: \"2-digit\",\n            timeZone: getUserTimezone(),\n        }).format(date);\n    }\n    return formatFullDate(date, showTwelveHour, false, _locale);\n}\n\n/**\n * Formats a given date to a human-friendly string with short weekday.\n * Will use the browser's default time zone.\n * @example \"Thu, 17 Nov 2022\" in en-GB locale\n * @param date - date object to format\n * @param locale - the locale string to use, in BCP 47 format, defaulting to user's selected application locale\n */\nexport function formatFullDateNoTime(date: Date, locale?: string): string {\n    return new Intl.DateTimeFormat(locale ?? getUserLanguage(), {\n        weekday: \"short\",\n        month: \"short\",\n        day: \"numeric\",\n        year: \"numeric\",\n        timeZone: getUserTimezone(),\n    }).format(date);\n}\n\n/**\n * Formats a given date to a date & time string, optionally including seconds.\n * Will use the browser's default time zone.\n * @example \"Thu, 17 Nov 2022, 4:58:32 pm\" in en-GB locale with showTwelveHour=true and showSeconds=true\n * @param date - date object to format\n * @param showTwelveHour - whether to use 12-hour rather than 24-hour time. Defaults to `false` (24 hour mode).\n *        Overrides the default from the locale, whether `true` or `false`.\n * @param showSeconds - whether to include seconds in the time portion of the string\n * @param locale - the locale string to use, in BCP 47 format, defaulting to user's selected application locale\n */\nexport function formatFullDate(date: Date, showTwelveHour = false, showSeconds = true, locale?: string): string {\n    return new Intl.DateTimeFormat(locale ?? getUserLanguage(), {\n        ...getTwelveHourOptions(showTwelveHour),\n        weekday: \"short\",\n        month: \"short\",\n        day: \"numeric\",\n        year: \"numeric\",\n        hour: \"numeric\",\n        minute: \"2-digit\",\n        second: showSeconds ? \"2-digit\" : undefined,\n        timeZone: getUserTimezone(),\n    }).format(date);\n}\n\n/**\n * Formats a given date to a time string including seconds.\n * Will use the browser's default time zone.\n * @example \"4:58:32 PM\" in en-GB locale with showTwelveHour=true\n * @example \"16:58:32\" in en-GB locale with showTwelveHour=false\n * @param date - date object to format\n * @param showTwelveHour - whether to use 12-hour rather than 24-hour time. Defaults to `false` (24 hour mode).\n *        Overrides the default from the locale, whether `true` or `false`.\n * @param locale - the locale string to use, in BCP 47 format, defaulting to user's selected application locale\n */\nexport function formatFullTime(date: Date, showTwelveHour = false, locale?: string): string {\n    return new Intl.DateTimeFormat(locale ?? getUserLanguage(), {\n        ...getTwelveHourOptions(showTwelveHour),\n        hour: \"numeric\",\n        minute: \"2-digit\",\n        second: \"2-digit\",\n        timeZone: getUserTimezone(),\n    }).format(date);\n}\n\n/**\n * Formats a given date to a time string excluding seconds.\n * Will use the browser's default time zone.\n * @example \"4:58 PM\" in en-GB locale with showTwelveHour=true\n * @example \"16:58\" in en-GB locale with showTwelveHour=false\n * @param date - date object to format\n * @param showTwelveHour - whether to use 12-hour rather than 24-hour time. Defaults to `false` (24 hour mode).\n *        Overrides the default from the locale, whether `true` or `false`.\n * @param locale - the locale string to use, in BCP 47 format, defaulting to user's selected application locale\n */\nexport function formatTime(date: Date, showTwelveHour = false, locale?: string): string {\n    return new Intl.DateTimeFormat(locale ?? getUserLanguage(), {\n        ...getTwelveHourOptions(showTwelveHour),\n        hour: \"numeric\",\n        minute: \"2-digit\",\n        timeZone: getUserTimezone(),\n    }).format(date);\n}\n\nexport function formatTimeLeft(inSeconds: number): string {\n    const hours = Math.floor(inSeconds / (60 * 60)).toFixed(0);\n    const minutes = Math.floor((inSeconds % (60 * 60)) / 60).toFixed(0);\n    const seconds = Math.floor((inSeconds % (60 * 60)) % 60).toFixed(0);\n\n    if (hours !== \"0\") {\n        return _t(\"time|hours_minutes_seconds_left\", {\n            hours,\n            minutes,\n            seconds,\n        });\n    }\n\n    if (minutes !== \"0\") {\n        return _t(\"time|minutes_seconds_left\", {\n            minutes,\n            seconds,\n        });\n    }\n\n    return _t(\"time|seconds_left\", {\n        seconds,\n    });\n}\n\nfunction withinPast24Hours(prevDate: Date, nextDate: Date): boolean {\n    return Math.abs(prevDate.getTime() - nextDate.getTime()) <= DAY_MS;\n}\n\nfunction withinCurrentDay(prevDate: Date, nextDate: Date): boolean {\n    return withinPast24Hours(prevDate, nextDate) && prevDate.getDay() === nextDate.getDay();\n}\n\nfunction withinCurrentYear(prevDate: Date, nextDate: Date): boolean {\n    return prevDate.getFullYear() === nextDate.getFullYear();\n}\n\nexport function wantsDateSeparator(prevEventDate: Date | undefined, nextEventDate: Date | undefined): boolean {\n    if (!nextEventDate || !prevEventDate) {\n        return false;\n    }\n    // Return early for events that are > 24h apart\n    if (!withinPast24Hours(prevEventDate, nextEventDate)) {\n        return true;\n    }\n\n    // Compare weekdays\n    return prevEventDate.getDay() !== nextEventDate.getDay();\n}\n\nexport function formatFullDateNoDay(date: Date): string {\n    const locale = getUserLanguage();\n    return _t(\"time|date_at_time\", {\n        date: date.toLocaleDateString(locale).replace(/\\//g, \"-\"),\n        time: date.toLocaleTimeString(locale).replace(/:/g, \"-\"),\n    });\n}\n\n/**\n * Returns an ISO date string without textual description of the date (ie: no \"Wednesday\" or similar)\n * @param date The date to format.\n * @returns The date string in ISO format.\n */\nexport function formatFullDateNoDayISO(date: Date): string {\n    return date.toISOString();\n}\n\n/**\n * Formats a given date to a string.\n * Will use the browser's default time zone.\n * @example 17/11/2022 in en-GB locale\n * @param date - date object to format\n * @param locale - the locale string to use, in BCP 47 format, defaulting to user's selected application locale\n */\nexport function formatFullDateNoDayNoTime(date: Date, locale?: string): string {\n    return new Intl.DateTimeFormat(locale ?? getUserLanguage(), {\n        year: \"numeric\",\n        month: \"numeric\",\n        day: \"numeric\",\n        timeZone: getUserTimezone(),\n    }).format(date);\n}\n\nexport function formatRelativeTime(date: Date, showTwelveHour = false): string {\n    const now = new Date();\n    if (withinCurrentDay(date, now)) {\n        return formatTime(date, showTwelveHour);\n    } else {\n        const months = getMonthsArray();\n        let relativeDate = `${months[date.getMonth()]} ${date.getDate()}`;\n\n        if (!withinCurrentYear(date, now)) {\n            relativeDate += `, ${date.getFullYear()}`;\n        }\n        return relativeDate;\n    }\n}\n\n/**\n * Formats duration in ms to human-readable string\n * Returns value in the biggest possible unit (day, hour, min, second)\n * Rounds values up until unit threshold\n * i.e. 23:13:57 -> 23h, 24:13:57 -> 1d, 44:56:56 -> 2d\n */\nexport function formatDuration(durationMs: number): string {\n    if (durationMs >= DAY_MS) {\n        return _t(\"time|short_days\", { value: Math.round(durationMs / DAY_MS) });\n    }\n    if (durationMs >= HOUR_MS) {\n        return _t(\"time|short_hours\", { value: Math.round(durationMs / HOUR_MS) });\n    }\n    if (durationMs >= MINUTE_MS) {\n        return _t(\"time|short_minutes\", { value: Math.round(durationMs / MINUTE_MS) });\n    }\n    return _t(\"time|short_seconds\", { value: Math.round(durationMs / 1000) });\n}\n\n/**\n * Formats duration in ms to human-readable string\n * Returns precise value down to the nearest second\n * i.e. 23:13:57 -> 23h 13m 57s, 44:56:56 -> 1d 20h 56m 56s\n */\nexport function formatPreciseDuration(durationMs: number): string {\n    const days = Math.floor(durationMs / DAY_MS);\n    const hours = Math.floor((durationMs % DAY_MS) / HOUR_MS);\n    const minutes = Math.floor((durationMs % HOUR_MS) / MINUTE_MS);\n    const seconds = Math.floor((durationMs % MINUTE_MS) / 1000);\n\n    if (days > 0) {\n        return _t(\"time|short_days_hours_minutes_seconds\", { days, hours, minutes, seconds });\n    }\n    if (hours > 0) {\n        return _t(\"time|short_hours_minutes_seconds\", { hours, minutes, seconds });\n    }\n    if (minutes > 0) {\n        return _t(\"time|short_minutes_seconds\", { minutes, seconds });\n    }\n    return _t(\"time|short_seconds\", { value: seconds });\n}\n\n/**\n * Formats a timestamp to a short date\n * Similar to {@formatFullDateNoDayNoTime} but with 2-digit on day, month, year.\n * @example 25/12/22 in en-GB locale\n * @param timestamp - epoch timestamp\n * @param locale - the locale string to use, in BCP 47 format, defaulting to user's selected application locale\n * @returns {string} formattedDate\n */\nexport const formatLocalDateShort = (timestamp: number, locale?: string): string =>\n    new Intl.DateTimeFormat(locale ?? getUserLanguage(), {\n        day: \"2-digit\",\n        month: \"2-digit\",\n        year: \"2-digit\",\n        timeZone: getUserTimezone(),\n    }).format(timestamp);\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type TimelineRenderingType } from \"./contexts/RoomContext\";\n\nexport const editorRoomKey = (roomId: string, context: TimelineRenderingType): string =>\n    `mx_edit_room_${roomId}_${context}`;\nexport const editorStateKey = (eventId: string): string => `mx_edit_state_${eventId}`;\n","/**\n * This is the ParseError class, which is the main error thrown by KaTeX\n * functions when something has gone wrong. This is used to distinguish internal\n * errors from errors in the expression that the user provided.\n *\n * If possible, a caller should provide a Token or ParseNode with information\n * about where in the source string the problem occurred.\n */\nclass ParseError extends Error {\n  // The underlying error message without any context added.\n  constructor(message,\n  // The error message\n  token) {\n    var error = \"KaTeX parse error: \" + message;\n    var start;\n    var end;\n    var loc = token && token.loc;\n    if (loc && loc.start <= loc.end) {\n      // If we have the input and a position, make the error a bit fancier\n      // Get the input\n      var input = loc.lexer.input;\n      // Prepend some information\n      start = loc.start;\n      end = loc.end;\n      if (start === input.length) {\n        error += \" at end of input: \";\n      } else {\n        error += \" at position \" + (start + 1) + \": \";\n      }\n      // Underline token in question using combining underscores\n      var underlined = input.slice(start, end).replace(/[^]/g, \"$&\\u0332\");\n      // Extract some context from the input and add it to the error\n      var left;\n      if (start > 15) {\n        left = \"…\" + input.slice(start - 15, start);\n      } else {\n        left = input.slice(0, start);\n      }\n      var right;\n      if (end + 15 < input.length) {\n        right = input.slice(end, end + 15) + \"…\";\n      } else {\n        right = input.slice(end);\n      }\n      error += left + underlined + right;\n    }\n    super(error);\n    this.name = \"ParseError\";\n    this.position = void 0;\n    // Error start position based on passed-in Token or ParseNode.\n    this.length = void 0;\n    // Length of affected text based on passed-in Token or ParseNode.\n    this.rawMessage = void 0;\n    Object.setPrototypeOf(this, ParseError.prototype);\n    this.position = start;\n    if (start != null && end != null) {\n      this.length = end - start;\n    }\n    this.rawMessage = message;\n  }\n}\n\n/**\n * This file contains a list of utility functions which are useful in other\n * files.\n */\n// hyphenate and escape adapted from Facebook's React under Apache 2 license\nvar uppercase = /([A-Z])/g;\nvar hyphenate = str => str.replace(uppercase, \"-$1\").toLowerCase();\nvar ESCAPE_LOOKUP = {\n  \"&\": \"&amp;\",\n  \">\": \"&gt;\",\n  \"<\": \"&lt;\",\n  \"\\\"\": \"&quot;\",\n  \"'\": \"&#x27;\"\n};\nvar ESCAPE_REGEX = /[&><\"']/g;\n/**\n * Escapes text to prevent scripting attacks.\n */\nvar escape = text => String(text).replace(ESCAPE_REGEX, match => ESCAPE_LOOKUP[match]);\n/**\n * Sometimes we want to pull out the innermost element of a group. In most\n * cases, this will just be the group itself, but when ordgroups and colors have\n * a single element, we want to pull that out.\n */\nvar getBaseElem = group => {\n  if (group.type === \"ordgroup\") {\n    if (group.body.length === 1) {\n      return getBaseElem(group.body[0]);\n    } else {\n      return group;\n    }\n  } else if (group.type === \"color\") {\n    if (group.body.length === 1) {\n      return getBaseElem(group.body[0]);\n    } else {\n      return group;\n    }\n  } else if (group.type === \"font\") {\n    return getBaseElem(group.body);\n  } else {\n    return group;\n  }\n};\nvar characterNodesTypes = new Set([\"mathord\", \"textord\", \"atom\"]);\n/**\n * TeXbook algorithms often reference \"character boxes\", which are simply groups\n * with a single character in them. To decide if something is a character box,\n * we find its innermost group, and see if it is a single character.\n */\nvar isCharacterBox = group => characterNodesTypes.has(getBaseElem(group).type);\n/**\n * Return the protocol of a URL, or \"_relative\" if the URL does not specify a\n * protocol (and thus is relative), or `null` if URL has invalid protocol\n * (so should be outright rejected).\n */\nvar protocolFromUrl = url => {\n  // Check for possible leading protocol.\n  // https://url.spec.whatwg.org/#url-parsing strips leading whitespace\n  // (U+20) or C0 control (U+00-U+1F) characters.\n  var protocol = /^[\\x00-\\x20]*([^\\\\/#?]*?)(:|&#0*58|&#x0*3a|&colon)/i.exec(url);\n  if (!protocol) {\n    return \"_relative\";\n  }\n  // Reject weird colons\n  if (protocol[2] !== \":\") {\n    return null;\n  }\n  // Reject invalid characters in scheme according to\n  // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1\n  if (!/^[a-zA-Z][a-zA-Z0-9+\\-.]*$/.test(protocol[1])) {\n    return null;\n  }\n  // Lowercase the protocol\n  return protocol[1].toLowerCase();\n};\n\n/* eslint no-console:0 */\n// TODO: automatically generate documentation\n// TODO: check all properties on Settings exist\n// TODO: check the type of a property on Settings matches\nvar SETTINGS_SCHEMA = {\n  displayMode: {\n    type: \"boolean\",\n    description: \"Render math in display mode, which puts the math in \" + \"display style (so \\\\int and \\\\sum are large, for example), and \" + \"centers the math on the page on its own line.\",\n    cli: \"-d, --display-mode\"\n  },\n  output: {\n    type: {\n      enum: [\"htmlAndMathml\", \"html\", \"mathml\"]\n    },\n    description: \"Determines the markup language of the output.\",\n    cli: \"-F, --format <type>\"\n  },\n  leqno: {\n    type: \"boolean\",\n    description: \"Render display math in leqno style (left-justified tags).\"\n  },\n  fleqn: {\n    type: \"boolean\",\n    description: \"Render display math flush left.\"\n  },\n  throwOnError: {\n    type: \"boolean\",\n    default: true,\n    cli: \"-t, --no-throw-on-error\",\n    cliDescription: \"Render errors (in the color given by --error-color) ins\" + \"tead of throwing a ParseError exception when encountering an error.\"\n  },\n  errorColor: {\n    type: \"string\",\n    default: \"#cc0000\",\n    cli: \"-c, --error-color <color>\",\n    cliDescription: \"A color string given in the format 'rgb' or 'rrggbb' \" + \"(no #). This option determines the color of errors rendered by the \" + \"-t option.\",\n    cliProcessor: color => \"#\" + color\n  },\n  macros: {\n    type: \"object\",\n    cli: \"-m, --macro <def>\",\n    cliDescription: \"Define custom macro of the form '\\\\foo:expansion' (use \" + \"multiple -m arguments for multiple macros).\",\n    cliDefault: [],\n    cliProcessor: (def, defs) => {\n      defs.push(def);\n      return defs;\n    }\n  },\n  minRuleThickness: {\n    type: \"number\",\n    description: \"Specifies a minimum thickness, in ems, for fraction lines,\" + \" `\\\\sqrt` top lines, `{array}` vertical lines, `\\\\hline`, \" + \"`\\\\hdashline`, `\\\\underline`, `\\\\overline`, and the borders of \" + \"`\\\\fbox`, `\\\\boxed`, and `\\\\fcolorbox`.\",\n    processor: t => Math.max(0, t),\n    cli: \"--min-rule-thickness <size>\",\n    cliProcessor: parseFloat\n  },\n  colorIsTextColor: {\n    type: \"boolean\",\n    description: \"Makes \\\\color behave like LaTeX's 2-argument \\\\textcolor, \" + \"instead of LaTeX's one-argument \\\\color mode change.\",\n    cli: \"-b, --color-is-text-color\"\n  },\n  strict: {\n    type: [{\n      enum: [\"warn\", \"ignore\", \"error\"]\n    }, \"boolean\", \"function\"],\n    description: \"Turn on strict / LaTeX faithfulness mode, which throws an \" + \"error if the input uses features that are not supported by LaTeX.\",\n    cli: \"-S, --strict\",\n    cliDefault: false\n  },\n  trust: {\n    type: [\"boolean\", \"function\"],\n    description: \"Trust the input, enabling all HTML features such as \\\\url.\",\n    cli: \"-T, --trust\"\n  },\n  maxSize: {\n    type: \"number\",\n    default: Infinity,\n    description: \"If non-zero, all user-specified sizes, e.g. in \" + \"\\\\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, \" + \"elements and spaces can be arbitrarily large\",\n    processor: s => Math.max(0, s),\n    cli: \"-s, --max-size <n>\",\n    cliProcessor: parseInt\n  },\n  maxExpand: {\n    type: \"number\",\n    default: 1000,\n    description: \"Limit the number of macro expansions to the specified \" + \"number, to prevent e.g. infinite macro loops. If set to Infinity, \" + \"the macro expander will try to fully expand as in LaTeX.\",\n    processor: n => Math.max(0, n),\n    cli: \"-e, --max-expand <n>\",\n    cliProcessor: n => n === \"Infinity\" ? Infinity : parseInt(n)\n  },\n  globalGroup: {\n    type: \"boolean\",\n    cli: false\n  }\n};\nfunction getImplicitDefault(type) {\n  if (typeof type !== 'string') {\n    return type.enum[0];\n  }\n  switch (type) {\n    case 'boolean':\n      return false;\n    case 'string':\n      return '';\n    case 'number':\n      return 0;\n    case 'object':\n      return {};\n    default:\n      throw new Error(\"Unexpected schema type; settings must declare an explicit default.\");\n  }\n}\nfunction getDefaultValue(schema) {\n  if (schema.default !== undefined) {\n    return schema.default;\n  }\n  var type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n  return getImplicitDefault(type);\n}\nfunction applySetting(target, prop, options, schema) {\n  var optionValue = options[prop];\n  target[prop] = optionValue !== undefined ? schema.processor ? schema.processor(optionValue) : optionValue : getDefaultValue(schema);\n}\n/**\n * The main Settings object\n *\n * The current options stored are:\n *  - displayMode: Whether the expression should be typeset as inline math\n *                 (false, the default), meaning that the math starts in\n *                 \\textstyle and is placed in an inline-block); or as display\n *                 math (true), meaning that the math starts in \\displaystyle\n *                 and is placed in a block with vertical margin.\n */\nclass Settings {\n  constructor(options) {\n    if (options === void 0) {\n      options = {};\n    }\n    this.displayMode = void 0;\n    this.output = void 0;\n    this.leqno = void 0;\n    this.fleqn = void 0;\n    this.throwOnError = void 0;\n    this.errorColor = void 0;\n    this.macros = void 0;\n    this.minRuleThickness = void 0;\n    this.colorIsTextColor = void 0;\n    this.strict = void 0;\n    this.trust = void 0;\n    this.maxSize = void 0;\n    this.maxExpand = void 0;\n    this.globalGroup = void 0;\n    // allow null options\n    options = options || {};\n    for (var prop of Object.keys(SETTINGS_SCHEMA)) {\n      var schema = SETTINGS_SCHEMA[prop];\n      if (schema) {\n        // TODO: validate options\n        applySetting(this, prop, options, schema);\n      }\n    }\n  }\n  /**\n   * Report nonstrict (non-LaTeX-compatible) input.\n   * Can safely not be called if `this.strict` is false in JavaScript.\n   */\n  reportNonstrict(errorCode, errorMsg, token) {\n    var strict = this.strict;\n    if (typeof strict === \"function\") {\n      // Allow return value of strict function to be boolean or string\n      // (or null/undefined, meaning no further processing).\n      strict = strict(errorCode, errorMsg, token);\n    }\n    if (!strict || strict === \"ignore\") {\n      return;\n    } else if (strict === true || strict === \"error\") {\n      throw new ParseError(\"LaTeX-incompatible input and strict mode is set to 'error': \" + (errorMsg + \" [\" + errorCode + \"]\"), token);\n    } else if (strict === \"warn\") {\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n    } else {\n      // won't happen in type-safe code\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n    }\n  }\n  /**\n   * Check whether to apply strict (LaTeX-adhering) behavior for unusual\n   * input (like `\\\\`).  Unlike `nonstrict`, will not throw an error;\n   * instead, \"error\" translates to a return value of `true`, while \"ignore\"\n   * translates to a return value of `false`.  May still print a warning:\n   * \"warn\" prints a warning and returns `false`.\n   * This is for the second category of `errorCode`s listed in the README.\n   */\n  useStrictBehavior(errorCode, errorMsg, token) {\n    var strict = this.strict;\n    if (typeof strict === \"function\") {\n      // Allow return value of strict function to be boolean or string\n      // (or null/undefined, meaning no further processing).\n      // But catch any exceptions thrown by function, treating them\n      // like \"error\".\n      try {\n        strict = strict(errorCode, errorMsg, token);\n      } catch (error) {\n        strict = \"error\";\n      }\n    }\n    if (!strict || strict === \"ignore\") {\n      return false;\n    } else if (strict === true || strict === \"error\") {\n      return true;\n    } else if (strict === \"warn\") {\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n      return false;\n    } else {\n      // won't happen in type-safe code\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n      return false;\n    }\n  }\n  /**\n   * Check whether to test potentially dangerous input, and return\n   * `true` (trusted) or `false` (untrusted).  The sole argument `context`\n   * should be an object with `command` field specifying the relevant LaTeX\n   * command (as a string starting with `\\`), and any other arguments, etc.\n   * If `context` has a `url` field, a `protocol` field will automatically\n   * get added by this function (changing the specified object).\n   */\n  isTrusted(context) {\n    if (\"url\" in context && context.url && !context.protocol) {\n      var protocol = protocolFromUrl(context.url);\n      if (protocol == null) {\n        return false;\n      }\n      context.protocol = protocol;\n    }\n    var trust = typeof this.trust === \"function\" ? this.trust(context) : this.trust;\n    return Boolean(trust);\n  }\n}\n\n/**\n * This file contains information and classes for the various kinds of styles\n * used in TeX. It provides a generic `Style` class, which holds information\n * about a specific style. It then provides instances of all the different kinds\n * of styles possible, and provides functions to move between them and get\n * information about them.\n */\n/**\n * The main style class. Contains a unique id for the style, a size (which is\n * the same for cramped and uncramped version of a style), and a cramped flag.\n */\nclass Style {\n  constructor(id, size, cramped) {\n    this.id = void 0;\n    this.size = void 0;\n    this.cramped = void 0;\n    this.id = id;\n    this.size = size;\n    this.cramped = cramped;\n  }\n  /**\n   * Get the style of a superscript given a base in the current style.\n   */\n  sup() {\n    return styles[sup[this.id]];\n  }\n  /**\n   * Get the style of a subscript given a base in the current style.\n   */\n  sub() {\n    return styles[sub[this.id]];\n  }\n  /**\n   * Get the style of a fraction numerator given the fraction in the current\n   * style.\n   */\n  fracNum() {\n    return styles[fracNum[this.id]];\n  }\n  /**\n   * Get the style of a fraction denominator given the fraction in the current\n   * style.\n   */\n  fracDen() {\n    return styles[fracDen[this.id]];\n  }\n  /**\n   * Get the cramped version of a style (in particular, cramping a cramped style\n   * doesn't change the style).\n   */\n  cramp() {\n    return styles[cramp[this.id]];\n  }\n  /**\n   * Get a text or display version of this style.\n   */\n  text() {\n    return styles[text$1[this.id]];\n  }\n  /**\n   * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)\n   */\n  isTight() {\n    return this.size >= 2;\n  }\n}\n// IDs of the different styles\nvar D = 0;\nvar Dc = 1;\nvar T = 2;\nvar Tc = 3;\nvar S = 4;\nvar Sc = 5;\nvar SS = 6;\nvar SSc = 7;\n// Instances of the different styles\nvar styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)];\n// Lookup tables for switching from one style to another\nvar sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];\nvar sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];\nvar fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];\nvar text$1 = [D, Dc, T, Tc, T, Tc, T, Tc];\n// We only export some of the styles.\nvar Style$1 = {\n  DISPLAY: styles[D],\n  TEXT: styles[T],\n  SCRIPT: styles[S],\n  SCRIPTSCRIPT: styles[SS]\n};\n\n/*\n * This file defines the Unicode scripts and script families that we\n * support. To add new scripts or families, just add a new entry to the\n * scriptData array below. Adding scripts to the scriptData array allows\n * characters from that script to appear in \\text{} environments.\n */\n/**\n * Unicode block data for the families of scripts we support in \\text{}.\n * Scripts only need to appear here if they do not have font metrics.\n */\nvar scriptData = [{\n  // Latin characters beyond the Latin-1 characters we have metrics for.\n  // Needed for Czech, Hungarian and Turkish text, for example.\n  name: 'latin',\n  blocks: [[0x0100, 0x024f],\n  // Latin Extended-A and Latin Extended-B\n  [0x0300, 0x036f] // Combining Diacritical marks\n  ]\n}, {\n  // The Cyrillic script used by Russian and related languages.\n  // A Cyrillic subset used to be supported as explicitly defined\n  // symbols in symbols.js\n  name: 'cyrillic',\n  blocks: [[0x0400, 0x04ff]]\n}, {\n  // Armenian\n  name: 'armenian',\n  blocks: [[0x0530, 0x058F]]\n}, {\n  // The Brahmic scripts of South and Southeast Asia\n  // Devanagari (0900–097F)\n  // Bengali (0980–09FF)\n  // Gurmukhi (0A00–0A7F)\n  // Gujarati (0A80–0AFF)\n  // Oriya (0B00–0B7F)\n  // Tamil (0B80–0BFF)\n  // Telugu (0C00–0C7F)\n  // Kannada (0C80–0CFF)\n  // Malayalam (0D00–0D7F)\n  // Sinhala (0D80–0DFF)\n  // Thai (0E00–0E7F)\n  // Lao (0E80–0EFF)\n  // Tibetan (0F00–0FFF)\n  // Myanmar (1000–109F)\n  name: 'brahmic',\n  blocks: [[0x0900, 0x109F]]\n}, {\n  name: 'georgian',\n  blocks: [[0x10A0, 0x10ff]]\n}, {\n  // Chinese and Japanese.\n  // The \"k\" in cjk is for Korean, but we've separated Korean out\n  name: \"cjk\",\n  blocks: [[0x3000, 0x30FF],\n  // CJK symbols and punctuation, Hiragana, Katakana\n  [0x4E00, 0x9FAF],\n  // CJK ideograms\n  [0xFF00, 0xFF60] // Fullwidth punctuation\n  // TODO: add halfwidth Katakana and Romanji glyphs\n  ]\n}, {\n  // Korean\n  name: 'hangul',\n  blocks: [[0xAC00, 0xD7AF]]\n}];\n/**\n * Given a codepoint, return the name of the script or script family\n * it is from, or null if it is not part of a known block\n */\nfunction scriptFromCodepoint(codepoint) {\n  for (var i = 0; i < scriptData.length; i++) {\n    var script = scriptData[i];\n    for (var _i = 0; _i < script.blocks.length; _i++) {\n      var block = script.blocks[_i];\n      if (codepoint >= block[0] && codepoint <= block[1]) {\n        return script.name;\n      }\n    }\n  }\n  return null;\n}\n/**\n * A flattened version of all the supported blocks in a single array.\n * This is an optimization to make supportedCodepoint() fast.\n */\nvar allBlocks = [];\nscriptData.forEach(s => s.blocks.forEach(b => allBlocks.push(...b)));\n/**\n * Given a codepoint, return true if it falls within one of the\n * scripts or script families defined above and false otherwise.\n *\n * Micro benchmarks shows that this is faster than\n * /[\\u3000-\\u30FF\\u4E00-\\u9FAF\\uFF00-\\uFF60\\uAC00-\\uD7AF\\u0900-\\u109F]/.test()\n * in Firefox, Chrome and Node.\n */\nfunction supportedCodepoint(codepoint) {\n  for (var i = 0; i < allBlocks.length; i += 2) {\n    if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * This file provides support to domTree.js and delimiter.js.\n * It's a storehouse of path geometry for SVG images.\n */\n// In all paths below, the viewBox-to-em scale is 1000:1.\n// Second Brush Stroke\n//    Low resolution monitors struggle to display images in fine detail.\n//    So browsers apply anti-aliasing. A long straight arrow shaft therefore\n//    will sometimes appear as if it has a blurred edge.\n//    To mitigate this, these SVG files contain a second \"brush-stroke\" on the\n//    arrow shafts. That is, a second long thin rectangular SVG path has been\n//    written directly on top of each arrow shaft. This reinforcement causes\n//    some of the screen pixels to display as black instead of the anti-aliased\n//    gray pixel that a  single path would generate. So we get arrow shafts\n//    whose edges appear to be sharper.\nvar doubleBrushStroke = svgPath => svgPath + \" \" + svgPath;\nvar hLinePad = 80; // padding above a sqrt vinculum. Prevents image cropping.\n// The vinculum of a \\sqrt can be made thicker by a KaTeX rendering option.\n// Think of variable extraVinculum as two detours in the SVG path.\n// The detour begins at the lower left of the area labeled extraVinculum below.\n// The detour proceeds one extraVinculum distance up and slightly to the right,\n// displacing the radiused corner between surd and vinculum. The radius is\n// traversed as usual, then the detour resumes. It goes right, to the end of\n// the very long vinculum, then down one extraVinculum distance,\n// after which it resumes regular path geometry for the radical.\n/*                                                  vinculum\n                                                   /\n         /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraVinculum\n        / █████████████████████←0.04em (40 unit) std vinculum thickness\n       / /\n      / /\n     / /\\\n    / / surd\n*/\nvar sqrtMain = function sqrtMain(extraVinculum, hLinePad) {\n  // sqrtMain path geometry is from glyph U221A in the font KaTeX Main\n  return \"M95,\" + (622 + extraVinculum + hLinePad) + \"\\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\\nc69,-144,104.5,-217.7,106.5,-221\\nl\" + extraVinculum / 2.075 + \" -\" + extraVinculum + \"\\nc5.3,-9.3,12,-14,20,-14\\nH400000v\" + (40 + extraVinculum) + \"H845.2724\\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\\nM\" + (834 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize1 = function sqrtSize1(extraVinculum, hLinePad) {\n  // size1 is from glyph U221A in the font KaTeX_Size1-Regular\n  return \"M263,\" + (601 + extraVinculum + hLinePad) + \"c0.7,0,18,39.7,52,119\\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\\nc340,-704.7,510.7,-1060.3,512,-1067\\nl\" + extraVinculum / 2.084 + \" -\" + extraVinculum + \"\\nc4.7,-7.3,11,-11,19,-11\\nH40000v\" + (40 + extraVinculum) + \"H1012.3\\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\\nM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize2 = function sqrtSize2(extraVinculum, hLinePad) {\n  // size2 is from glyph U221A in the font KaTeX_Size2-Regular\n  return \"M983 \" + (10 + extraVinculum + hLinePad) + \"\\nl\" + extraVinculum / 3.13 + \" -\" + extraVinculum + \"\\nc4,-6.7,10,-10,18,-10 H400000v\" + (40 + extraVinculum) + \"\\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\\nM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize3 = function sqrtSize3(extraVinculum, hLinePad) {\n  // size3 is from glyph U221A in the font KaTeX_Size3-Regular\n  return \"M424,\" + (2398 + extraVinculum + hLinePad) + \"\\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\\nl\" + extraVinculum / 4.223 + \" -\" + extraVinculum + \"c4,-6.7,10,-10,18,-10 H400000\\nv\" + (40 + extraVinculum) + \"H1014.6\\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\\nc-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2z M\" + (1001 + extraVinculum) + \" \" + hLinePad + \"\\nh400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize4 = function sqrtSize4(extraVinculum, hLinePad) {\n  // size4 is from glyph U221A in the font KaTeX_Size4-Regular\n  return \"M473,\" + (2713 + extraVinculum + hLinePad) + \"\\nc339.3,-1799.3,509.3,-2700,510,-2702 l\" + extraVinculum / 5.298 + \" -\" + extraVinculum + \"\\nc3.3,-7.3,9.3,-11,18,-11 H400000v\" + (40 + extraVinculum) + \"H1017.7\\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\\n606zM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"H1017.7z\";\n};\nvar phasePath = function phasePath(y) {\n  var x = y / 2; // x coordinate at top of angle\n  return \"M400000 \" + y + \" H0 L\" + x + \" 0 l65 45 L145 \" + (y - 80) + \" H400000z\";\n};\nvar sqrtTall = function sqrtTall(extraVinculum, hLinePad, viewBoxHeight) {\n  // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular\n  // One path edge has a variable length. It runs vertically from the vinculum\n  // to a point near (14 units) the bottom of the surd. The vinculum\n  // is normally 40 units thick. So the length of the line in question is:\n  var vertSegment = viewBoxHeight - 54 - hLinePad - extraVinculum;\n  return \"M702 \" + (extraVinculum + hLinePad) + \"H400000\" + (40 + extraVinculum) + \"\\nH742v\" + vertSegment + \"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\\n219 661 l218 661zM702 \" + hLinePad + \"H400000v\" + (40 + extraVinculum) + \"H742z\";\n};\nvar sqrtPath = function sqrtPath(size, extraVinculum, viewBoxHeight) {\n  extraVinculum = 1000 * extraVinculum; // Convert from document ems to viewBox.\n  var path = \"\";\n  switch (size) {\n    case \"sqrtMain\":\n      path = sqrtMain(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize1\":\n      path = sqrtSize1(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize2\":\n      path = sqrtSize2(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize3\":\n      path = sqrtSize3(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize4\":\n      path = sqrtSize4(extraVinculum, hLinePad);\n      break;\n    case \"sqrtTall\":\n      path = sqrtTall(extraVinculum, hLinePad, viewBoxHeight);\n  }\n  return path;\n};\nvar innerPath = function innerPath(name, height) {\n  // The inner part of stretchy tall delimiters\n  switch (name) {\n    case \"\\u239c\":\n      return doubleBrushStroke(\"M291 0 H417 V\" + height + \" H291z\");\n    case \"\\u2223\":\n      return doubleBrushStroke(\"M145 0 H188 V\" + height + \" H145z\");\n    case \"\\u2225\":\n      return doubleBrushStroke(\"M145 0 H188 V\" + height + \" H145z\") + doubleBrushStroke(\"M367 0 H410 V\" + height + \" H367z\");\n    case \"\\u239f\":\n      return doubleBrushStroke(\"M457 0 H583 V\" + height + \" H457z\");\n    case \"\\u23a2\":\n      return doubleBrushStroke(\"M319 0 H403 V\" + height + \" H319z\");\n    case \"\\u23a5\":\n      return doubleBrushStroke(\"M263 0 H347 V\" + height + \" H263z\");\n    case \"\\u23aa\":\n      return doubleBrushStroke(\"M384 0 H504 V\" + height + \" H384z\");\n    case \"\\u23d0\":\n      return doubleBrushStroke(\"M312 0 H355 V\" + height + \" H312z\");\n    case \"\\u2016\":\n      return doubleBrushStroke(\"M257 0 H300 V\" + height + \" H257z\") + doubleBrushStroke(\"M478 0 H521 V\" + height + \" H478z\");\n    default:\n      return \"\";\n  }\n};\nvar path = {\n  // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main\n  doubleleftarrow: \"M262 157\\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\\nm8 0v40h399730v-40zm0 194v40h399730v-40z\",\n  // doublerightarrow is from glyph U+21D2 in font KaTeX Main\n  doublerightarrow: \"M399738 392l\\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z\",\n  // leftarrow is from glyph U+2190 in font KaTeX Main\n  leftarrow: \"M400000 241H110l3-3c68.7-52.7 113.7-120\\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\\n l-3-3h399890zM100 241v40h399900v-40z\",\n  // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular\n  leftbrace: \"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z\",\n  leftbraceunder: \"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z\",\n  // overgroup is from the MnSymbol package (public domain)\n  leftgroup: \"M400000 80\\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\\n 435 0h399565z\",\n  leftgroupunder: \"M400000 262\\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\\n 435 219h399565z\",\n  // Harpoons are from glyph U+21BD in font KaTeX Main\n  leftharpoon: \"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z\",\n  leftharpoonplus: \"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\\nm0 0v40h400000v-40z\",\n  leftharpoondown: \"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z\",\n  leftharpoondownplus: \"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z\",\n  // hook is from glyph U+21A9 in font KaTeX Main\n  lefthook: \"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\\n 71.5 23h399859zM103 281v-40h399897v40z\",\n  leftlinesegment: doubleBrushStroke(\"M40 281 V428 H0 V94 H40 V241 H400000 v40z\"),\n  leftbracketunder: doubleBrushStroke(\"M0 0 h120 V290 H399995 v120 H0z\"),\n  leftbracketover: doubleBrushStroke(\"M0 440 h120 V150 H399995 v-120 H0z\"),\n  leftmapsto: doubleBrushStroke(\"M40 281 V448H0V74H40V241H400000v40z\"),\n  // tofrom is from glyph U+21C4 in font KaTeX AMS Regular\n  leftToFrom: \"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z\",\n  longequal: doubleBrushStroke(\"M0 50 h400000 v40H0z m0 194h40000v40H0z\"),\n  midbrace: \"M200428 334\\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z\",\n  midbraceunder: \"M199572 214\\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z\",\n  oiintSize1: \"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z\",\n  oiintSize2: \"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\\nc0 110 84 276 504 276s502.4-166 502.4-276z\",\n  oiiintSize1: \"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z\",\n  oiiintSize2: \"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z\",\n  rightarrow: \"M0 241v40h399891c-47.3 35.3-84 78-110 128\\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n 151.7 139 205zm0 0v40h399900v-40z\",\n  rightbrace: \"M400000 542l\\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z\",\n  rightbraceunder: \"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z\",\n  rightgroup: \"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\\n 3-1 3-3v-38c-76-158-257-219-435-219H0z\",\n  rightgroupunder: \"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z\",\n  rightharpoon: \"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\\n 69.2 92 94.5zm0 0v40h399900v-40z\",\n  rightharpoonplus: \"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z\",\n  rightharpoondown: \"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z\",\n  rightharpoondownplus: \"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\\nm0-194v40h400000v-40zm0 0v40h400000v-40z\",\n  righthook: \"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z\",\n  rightlinesegment: doubleBrushStroke(\"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\"),\n  rightbracketunder: doubleBrushStroke(\"M399995 0 h-120 V290 H0 v120 H400000z\"),\n  rightbracketover: doubleBrushStroke(\"M399995 440 h-120 V150 H0 v-120 H399995z\"),\n  rightToFrom: \"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z\",\n  // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular\n  twoheadleftarrow: \"M0 167c68 40\\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z\",\n  twoheadrightarrow: \"M400000 167\\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z\",\n  // tilde1 is a modified version of a glyph from the MnSymbol package\n  tilde1: \"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\\n-68.267.847-113-73.952-191-73.952z\",\n  // ditto tilde2, tilde3, & tilde4\n  tilde2: \"M344 55.266c-142 0-300.638 81.316-311.5 86.418\\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z\",\n  tilde3: \"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\\n -338 0-409-156.573-744-156.573z\",\n  tilde4: \"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\\n -175.236-744-175.236z\",\n  // vec is from glyph U+20D7 in font KaTeX Main\n  vec: \"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\\nc-16-25.333-24-45-24-59z\",\n  // widehat1 is a modified version of a glyph from the MnSymbol package\n  widehat1: \"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z\",\n  // ditto widehat2, widehat3, & widehat4\n  widehat2: \"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n  widehat3: \"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n  widehat4: \"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n  // widecheck paths are all inverted versions of widehat\n  widecheck1: \"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z\",\n  widecheck2: \"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n  widecheck3: \"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n  widecheck4: \"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n  // The next ten paths support reaction arrows from the mhchem package.\n  // Arrows for \\ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX\n  // baraboveleftarrow is mostly from glyph U+2190 in font KaTeX Main\n  baraboveleftarrow: \"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z\",\n  // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main\n  rightarrowabovebar: \"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z\",\n  // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end.\n  // Ref from mhchem.sty: \\rlap{\\raisebox{-.22ex}{$\\kern0.5em\n  baraboveshortleftharpoon: \"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z\",\n  rightharpoonaboveshortbar: \"M0,241 l0,40c399126,0,399993,0,399993,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z\",\n  shortbaraboveleftharpoon: \"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z\",\n  shortrightharpoonabovebar: \"M53,241l0,40c398570,0,399437,0,399437,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z\"\n};\nvar tallDelim = function tallDelim(label, midHeight) {\n  switch (label) {\n    case \"lbrack\":\n      return \"M403 1759 V84 H666 V0 H319 V1759 v\" + midHeight + \" v1759 v84 h347 v-84\\nH403z M403 1759 V0 H319 V1759 v\" + midHeight + \" v1759 v84 h84z\";\n    case \"rbrack\":\n      return \"M347 1759 V0 H0 V84 H263 V1759 v\" + midHeight + \" v1759 H0 v84 H347z\\nM347 1759 V0 H263 V1759 v\" + midHeight + \" v1759 h84z\";\n    case \"vert\":\n      return \"M145 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v\" + midHeight + \" v585 h43z\";\n    case \"doublevert\":\n      return \"M145 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v\" + midHeight + \" v585 h43z\\nM367 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v\" + midHeight + \" v585 h43z\";\n    case \"lfloor\":\n      return \"M319 602 V0 H403 V602 v\" + midHeight + \" v1715 h263 v84 H319z\\nMM319 602 V0 H403 V602 v\" + midHeight + \" v1715 H319z\";\n    case \"rfloor\":\n      return \"M319 602 V0 H403 V602 v\" + midHeight + \" v1799 H0 v-84 H319z\\nMM319 602 V0 H403 V602 v\" + midHeight + \" v1715 H319z\";\n    case \"lceil\":\n      return \"M403 1759 V84 H666 V0 H319 V1759 v\" + midHeight + \" v602 h84z\\nM403 1759 V0 H319 V1759 v\" + midHeight + \" v602 h84z\";\n    case \"rceil\":\n      return \"M347 1759 V0 H0 V84 H263 V1759 v\" + midHeight + \" v602 h84z\\nM347 1759 V0 h-84 V1759 v\" + midHeight + \" v602 h84z\";\n    case \"lparen\":\n      return \"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\\n-36,557 l0,\" + (midHeight + 84) + \"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\\nl0,-\" + (midHeight + 92) + \"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z\";\n    case \"rparen\":\n      return \"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,\" + (midHeight + 9) + \"\\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\\nl0,-\" + (midHeight + 144) + \"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z\";\n    default:\n      // We should not ever get here.\n      throw new Error(\"Unknown stretchy delimiter.\");\n  }\n};\n\nfunction isMathDomNode(node) {\n  return 'toText' in node;\n}\n/**\n * This node represents a document fragment, which contains elements, but when\n * placed into the DOM doesn't have any representation itself. It only contains\n * children and doesn't have any DOM node properties.\n */\nclass DocumentFragment {\n  // Never used; needed for satisfying interface.\n  constructor(children) {\n    this.children = void 0;\n    this.classes = void 0;\n    this.height = void 0;\n    this.depth = void 0;\n    this.maxFontSize = void 0;\n    this.style = void 0;\n    this.children = children;\n    this.classes = [];\n    this.height = 0;\n    this.depth = 0;\n    this.maxFontSize = 0;\n    this.style = {};\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  /** Convert the fragment into a node. */\n  toNode() {\n    var frag = document.createDocumentFragment();\n    for (var i = 0; i < this.children.length; i++) {\n      frag.appendChild(this.children[i].toNode());\n    }\n    return frag;\n  }\n  /** Convert the fragment into HTML markup. */\n  toMarkup() {\n    var markup = \"\";\n    // Simply concatenate the markup for the children together.\n    for (var i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    return markup;\n  }\n  /**\n   * Converts the math node into a string, similar to innerText. Applies to\n   * MathDomNode's only.\n   */\n  toText() {\n    return this.children.map(child => {\n      if (isMathDomNode(child)) {\n        return child.toText();\n      }\n      throw new Error(\"Expected MathDomNode with toText, got \" + child.constructor.name);\n    }).join(\"\");\n  }\n}\n\n/**\n * This file does conversion between units.  In particular, it provides\n * calculateSize to convert other units into ems.\n */\n// This table gives the number of TeX pts in one of each *absolute* TeX unit.\n// Thus, multiplying a length by this number converts the length from units\n// into pts.  Dividing the result by ptPerEm gives the number of ems\n// *assuming* a font size of ptPerEm (normal size, normal style).\nvar ptPerUnit = {\n  // https://en.wikibooks.org/wiki/LaTeX/Lengths and\n  // https://tex.stackexchange.com/a/8263\n  \"pt\": 1,\n  // TeX point\n  \"mm\": 7227 / 2540,\n  // millimeter\n  \"cm\": 7227 / 254,\n  // centimeter\n  \"in\": 72.27,\n  // inch\n  \"bp\": 803 / 800,\n  // big (PostScript) points\n  \"pc\": 12,\n  // pica\n  \"dd\": 1238 / 1157,\n  // didot\n  \"cc\": 14856 / 1157,\n  // cicero (12 didot)\n  \"nd\": 685 / 642,\n  // new didot\n  \"nc\": 1370 / 107,\n  // new cicero (12 new didot)\n  \"sp\": 1 / 65536,\n  // scaled point (TeX's internal smallest unit)\n  // https://tex.stackexchange.com/a/41371\n  \"px\": 803 / 800 // \\pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX\n};\n// Dictionary of relative units, for fast validity testing.\nvar relativeUnit = {\n  \"ex\": true,\n  \"em\": true,\n  \"mu\": true\n};\n/**\n * Determine whether the specified unit (either a string defining the unit\n * or a \"size\" parse node containing a unit field) is valid.\n */\nvar validUnit = function validUnit(unit) {\n  if (typeof unit !== \"string\") {\n    unit = unit.unit;\n  }\n  return unit in ptPerUnit || unit in relativeUnit || unit === \"ex\";\n};\n/*\n * Convert a \"size\" parse node (with numeric \"number\" and string \"unit\" fields,\n * as parsed by functions.js argType \"size\") into a CSS em value for the\n * current style/scale.  `options` gives the current options.\n */\nvar calculateSize = function calculateSize(sizeValue, options) {\n  var scale;\n  if (sizeValue.unit in ptPerUnit) {\n    // Absolute units\n    scale = ptPerUnit[sizeValue.unit] // Convert unit to pt\n    / options.fontMetrics().ptPerEm // Convert pt to CSS em\n    / options.sizeMultiplier; // Unscale to make absolute units\n  } else if (sizeValue.unit === \"mu\") {\n    // `mu` units scale with scriptstyle/scriptscriptstyle.\n    scale = options.fontMetrics().cssEmPerMu;\n  } else {\n    // Other relative units always refer to the *textstyle* font\n    // in the current size.\n    var unitOptions;\n    if (options.style.isTight()) {\n      // isTight() means current style is script/scriptscript.\n      unitOptions = options.havingStyle(options.style.text());\n    } else {\n      unitOptions = options;\n    }\n    // TODO: In TeX these units are relative to the quad of the current\n    // *text* font, e.g. cmr10. KaTeX instead uses values from the\n    // comparably-sized *Computer Modern symbol* font. At 10pt, these\n    // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641;\n    // cmr5=1.361133, cmsy5=1.472241. Consider $\\scriptsize a\\kern1emb$.\n    // TeX \\showlists shows a kern of 1.13889 * fontsize;\n    // KaTeX shows a kern of 1.171 * fontsize.\n    if (sizeValue.unit === \"ex\") {\n      scale = unitOptions.fontMetrics().xHeight;\n    } else if (sizeValue.unit === \"em\") {\n      scale = unitOptions.fontMetrics().quad;\n    } else {\n      throw new ParseError(\"Invalid unit: '\" + sizeValue.unit + \"'\");\n    }\n    if (unitOptions !== options) {\n      scale *= unitOptions.sizeMultiplier / options.sizeMultiplier;\n    }\n  }\n  return Math.min(sizeValue.number * scale, options.maxSize);\n};\n/**\n * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. See\n * https://github.com/KaTeX/KaTeX/pull/2460.\n */\nvar makeEm = function makeEm(n) {\n  return +n.toFixed(4) + \"em\";\n};\n\n/**\n * These objects store the data about the DOM nodes we create, as well as some\n * extra data. They can then be transformed into real DOM nodes with the\n * `toNode` function or HTML markup using `toMarkup`. They are useful for both\n * storing extra properties on the nodes, as well as providing a way to easily\n * work with the DOM.\n *\n * Similar functions for working with MathML nodes exist in mathMLTree.js.\n *\n * TODO: refactor `span` and `anchor` into common superclass when\n * target environments support class inheritance\n */\n/**\n * Create an HTML className based on a list of classes. In addition to joining\n * with spaces, we also remove empty classes.\n */\nvar createClass = function createClass(classes) {\n  return classes.filter(cls => cls).join(\" \");\n};\n/**\n * Serialize a CssStyle object into a semicolon-delimited inline-style string\n * (hyphenating camelCase property names). Returns \"\" when no property is set.\n */\nvar cssStyleToString = function cssStyleToString(style) {\n  var styles = \"\";\n  for (var key of Object.keys(style)) {\n    var value = style[key];\n    if (value !== undefined) {\n      styles += hyphenate(key) + \":\" + value + \";\";\n    }\n  }\n  return styles;\n};\nvar initNode = function initNode(classes, options, style) {\n  this.classes = classes || [];\n  this.attributes = {};\n  this.height = 0;\n  this.depth = 0;\n  this.maxFontSize = 0;\n  this.style = style || {};\n  if (options) {\n    if (options.style.isTight()) {\n      this.classes.push(\"mtight\");\n    }\n    var color = options.getColor();\n    if (color) {\n      this.style.color = color;\n    }\n  }\n};\n/**\n * Convert into an HTML node\n */\nvar toNode = function toNode(tagName) {\n  var node = document.createElement(tagName);\n  // Apply the class\n  node.className = createClass(this.classes);\n  // Apply inline styles\n  Object.assign(node.style, this.style);\n  // Apply attributes\n  for (var attr of Object.keys(this.attributes)) {\n    node.setAttribute(attr, this.attributes[attr]);\n  }\n  // Append the children, also as HTML nodes\n  for (var i = 0; i < this.children.length; i++) {\n    node.appendChild(this.children[i].toNode());\n  }\n  return node;\n};\n/**\n * https://w3c.github.io/html-reference/syntax.html#syntax-attributes\n *\n * > Attribute Names must consist of one or more characters\n * other than the space characters, U+0000 NULL,\n * '\"', \"'\", \">\", \"/\", \"=\", the control characters,\n * and any characters that are not defined by Unicode.\n */\nvar invalidAttributeNameRegex = /[\\s\"'>/=\\x00-\\x1f]/;\n/**\n * Convert into an HTML markup string\n */\nvar toMarkup = function toMarkup(tagName) {\n  var markup = \"<\" + tagName;\n  // Add the class\n  if (this.classes.length) {\n    markup += \" class=\\\"\" + escape(createClass(this.classes)) + \"\\\"\";\n  }\n  var styles = cssStyleToString(this.style);\n  if (styles) {\n    markup += \" style=\\\"\" + escape(styles) + \"\\\"\";\n  }\n  // Add the attributes\n  for (var attr of Object.keys(this.attributes)) {\n    if (invalidAttributeNameRegex.test(attr)) {\n      throw new ParseError(\"Invalid attribute name '\" + attr + \"'\");\n    }\n    markup += \" \" + attr + \"=\\\"\" + escape(this.attributes[attr]) + \"\\\"\";\n  }\n  markup += \">\";\n  // Add the markup of the children, also as markup\n  for (var i = 0; i < this.children.length; i++) {\n    markup += this.children[i].toMarkup();\n  }\n  markup += \"</\" + tagName + \">\";\n  return markup;\n};\n/**\n * This node represents a span node, with a className, a list of children, and\n * an inline style. It also contains information about its height, depth, and\n * maxFontSize.\n *\n * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan\n * otherwise. This typesafety is important when HTML builders access a span's\n * children.\n */\nclass Span {\n  constructor(classes, children, options, style) {\n    this.children = void 0;\n    this.attributes = void 0;\n    this.classes = void 0;\n    this.height = void 0;\n    this.depth = void 0;\n    this.width = void 0;\n    this.maxFontSize = void 0;\n    this.style = void 0;\n    /**\n     * Italic correction carried over from a SymbolNode when the symbol is\n     * wrapped in a vlist (e.g. \\oiint / \\oiiint).  Read by supsub to adjust\n     * subscript positioning.  Only set when nonzero; use `?? 0` at read sites.\n     */\n    this.italic = void 0;\n    initNode.call(this, classes, options, style);\n    this.children = children || [];\n  }\n  /**\n   * Sets an arbitrary attribute on the span. Warning: use this wisely. Not\n   * all browsers support attributes the same, and having too many custom\n   * attributes is probably bad.\n   */\n  setAttribute(attribute, value) {\n    this.attributes[attribute] = value;\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  toNode() {\n    return toNode.call(this, \"span\");\n  }\n  toMarkup() {\n    return toMarkup.call(this, \"span\");\n  }\n}\n/**\n * This node represents an anchor (<a>) element with a hyperlink.  See `span`\n * for further details.\n */\nclass Anchor {\n  constructor(href, classes, children, options) {\n    this.children = void 0;\n    this.attributes = void 0;\n    this.classes = void 0;\n    this.height = void 0;\n    this.depth = void 0;\n    this.maxFontSize = void 0;\n    this.style = void 0;\n    initNode.call(this, classes, options);\n    this.children = children || [];\n    this.setAttribute('href', href);\n  }\n  setAttribute(attribute, value) {\n    this.attributes[attribute] = value;\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  toNode() {\n    return toNode.call(this, \"a\");\n  }\n  toMarkup() {\n    return toMarkup.call(this, \"a\");\n  }\n}\n/**\n * This node represents an image embed (<img>) element.\n */\nclass Img {\n  constructor(src, alt, style) {\n    this.src = void 0;\n    this.alt = void 0;\n    this.classes = void 0;\n    this.height = void 0;\n    this.depth = void 0;\n    this.maxFontSize = void 0;\n    this.style = void 0;\n    this.alt = alt;\n    this.src = src;\n    this.classes = [\"mord\"];\n    this.height = 0;\n    this.depth = 0;\n    this.maxFontSize = 0;\n    this.style = style;\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  toNode() {\n    var node = document.createElement(\"img\");\n    node.src = this.src;\n    node.alt = this.alt;\n    node.className = \"mord\";\n    // Apply inline styles\n    Object.assign(node.style, this.style);\n    return node;\n  }\n  toMarkup() {\n    var markup = \"<img src=\\\"\" + escape(this.src) + \"\\\"\" + (\" alt=\\\"\" + escape(this.alt) + \"\\\"\");\n    var styles = cssStyleToString(this.style);\n    if (styles) {\n      markup += \" style=\\\"\" + escape(styles) + \"\\\"\";\n    }\n    markup += \"'/>\";\n    return markup;\n  }\n}\nvar iCombinations = {\n  'î': '\\u0131\\u0302',\n  'ï': '\\u0131\\u0308',\n  'í': '\\u0131\\u0301',\n  // 'ī': '\\u0131\\u0304', // enable when we add Extended Latin\n  'ì': '\\u0131\\u0300'\n};\n/**\n * A symbol node contains information about a single symbol. It either renders\n * to a single text node, or a span with a single text node in it, depending on\n * whether it has CSS classes, styles, or needs italic correction.\n */\nclass SymbolNode {\n  constructor(text, height, depth, italic, skew, width, classes, style) {\n    this.text = void 0;\n    this.height = void 0;\n    this.depth = void 0;\n    this.italic = void 0;\n    this.skew = void 0;\n    this.width = void 0;\n    this.maxFontSize = void 0;\n    this.classes = void 0;\n    this.style = void 0;\n    this.text = text;\n    this.height = height || 0;\n    this.depth = depth || 0;\n    this.italic = italic || 0;\n    this.skew = skew || 0;\n    this.width = width || 0;\n    this.classes = classes || [];\n    this.style = style || {};\n    this.maxFontSize = 0;\n    // Mark text from non-Latin scripts with specific classes so that we\n    // can specify which fonts to use.  This allows us to render these\n    // characters with a serif font in situations where the browser would\n    // either default to a sans serif or render a placeholder character.\n    // We use CSS class names like cjk_fallback, hangul_fallback and\n    // brahmic_fallback. See ./unicodeScripts.js for the set of possible\n    // script names\n    var script = scriptFromCodepoint(this.text.charCodeAt(0));\n    if (script) {\n      this.classes.push(script + \"_fallback\");\n    }\n    if (/[îïíì]/.test(this.text)) {\n      // add ī when we add Extended Latin\n      this.text = iCombinations[this.text];\n    }\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  /**\n   * Creates a text node or span from a symbol node. Note that a span is only\n   * created if it is needed.\n   */\n  toNode() {\n    var node = document.createTextNode(this.text);\n    var span = null;\n    if (this.italic > 0) {\n      span = document.createElement(\"span\");\n      span.style.marginRight = makeEm(this.italic);\n    }\n    if (this.classes.length > 0) {\n      span = span || document.createElement(\"span\");\n      span.className = createClass(this.classes);\n    }\n    if (Object.keys(this.style).length > 0) {\n      span = span || document.createElement(\"span\");\n      Object.assign(span.style, this.style);\n    }\n    if (span) {\n      span.appendChild(node);\n      return span;\n    } else {\n      return node;\n    }\n  }\n  /**\n   * Creates markup for a symbol node.\n   */\n  toMarkup() {\n    // TODO(alpert): More duplication than I'd like from\n    // span.prototype.toMarkup and symbolNode.prototype.toNode...\n    var needsSpan = false;\n    var markup = \"<span\";\n    if (this.classes.length) {\n      needsSpan = true;\n      markup += \" class=\\\"\";\n      markup += escape(createClass(this.classes));\n      markup += \"\\\"\";\n    }\n    var styles = \"\";\n    if (this.italic > 0) {\n      styles += \"margin-right:\" + makeEm(this.italic) + \";\";\n    }\n    styles += cssStyleToString(this.style);\n    if (styles) {\n      needsSpan = true;\n      markup += \" style=\\\"\" + escape(styles) + \"\\\"\";\n    }\n    var escaped = escape(this.text);\n    if (needsSpan) {\n      markup += \">\";\n      markup += escaped;\n      markup += \"</span>\";\n      return markup;\n    } else {\n      return escaped;\n    }\n  }\n}\n/**\n * SVG nodes are used to render stretchy wide elements.\n */\nclass SvgNode {\n  constructor(children, attributes) {\n    this.children = void 0;\n    this.attributes = void 0;\n    this.children = children || [];\n    this.attributes = attributes || {};\n  }\n  toNode() {\n    var svgNS = \"http://www.w3.org/2000/svg\";\n    var node = document.createElementNS(svgNS, \"svg\");\n    // Apply attributes\n    for (var attr of Object.keys(this.attributes)) {\n      node.setAttribute(attr, this.attributes[attr]);\n    }\n    for (var i = 0; i < this.children.length; i++) {\n      node.appendChild(this.children[i].toNode());\n    }\n    return node;\n  }\n  toMarkup() {\n    var markup = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"\";\n    // Apply attributes\n    for (var attr of Object.keys(this.attributes)) {\n      markup += \" \" + attr + \"=\\\"\" + escape(this.attributes[attr]) + \"\\\"\";\n    }\n    markup += \">\";\n    for (var i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    markup += \"</svg>\";\n    return markup;\n  }\n}\nclass PathNode {\n  constructor(pathName, alternate) {\n    this.pathName = void 0;\n    this.alternate = void 0;\n    this.pathName = pathName;\n    this.alternate = alternate; // Used only for \\sqrt, \\phase, & tall delims\n  }\n  toNode() {\n    var svgNS = \"http://www.w3.org/2000/svg\";\n    var node = document.createElementNS(svgNS, \"path\");\n    if (this.alternate) {\n      node.setAttribute(\"d\", this.alternate);\n    } else {\n      node.setAttribute(\"d\", path[this.pathName]);\n    }\n    return node;\n  }\n  toMarkup() {\n    if (this.alternate) {\n      return \"<path d=\\\"\" + escape(this.alternate) + \"\\\"/>\";\n    } else {\n      return \"<path d=\\\"\" + escape(path[this.pathName]) + \"\\\"/>\";\n    }\n  }\n}\nclass LineNode {\n  constructor(attributes) {\n    this.attributes = void 0;\n    this.attributes = attributes || {};\n  }\n  toNode() {\n    var svgNS = \"http://www.w3.org/2000/svg\";\n    var node = document.createElementNS(svgNS, \"line\");\n    // Apply attributes\n    for (var attr of Object.keys(this.attributes)) {\n      node.setAttribute(attr, this.attributes[attr]);\n    }\n    return node;\n  }\n  toMarkup() {\n    var markup = \"<line\";\n    for (var attr of Object.keys(this.attributes)) {\n      markup += \" \" + attr + \"=\\\"\" + escape(this.attributes[attr]) + \"\\\"\";\n    }\n    markup += \"/>\";\n    return markup;\n  }\n}\nfunction assertSymbolDomNode(group) {\n  if (group instanceof SymbolNode) {\n    return group;\n  } else {\n    throw new Error(\"Expected symbolNode but got \" + String(group) + \".\");\n  }\n}\nfunction assertSpan(group) {\n  if (group instanceof Span) {\n    return group;\n  } else {\n    throw new Error(\"Expected span<HtmlDomNode> but got \" + String(group) + \".\");\n  }\n}\n/**\n * Whether an HtmlDomNode has HtmlDomNode children.\n * HtmlDomNode is a base type representing a union of\n * SymbolNode, SvgSpan, DomSpan, Anchor, and documentFragment.\n * In the last three cases, the children are HtmlDomNode[].\n */\nvar hasHtmlDomChildren = node => node instanceof Span || node instanceof Anchor || node instanceof DocumentFragment;\n\n// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY.\nvar fontMetricsData = {\n  \"AMS-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"65\": [0, 0.68889, 0, 0, 0.72222],\n    \"66\": [0, 0.68889, 0, 0, 0.66667],\n    \"67\": [0, 0.68889, 0, 0, 0.72222],\n    \"68\": [0, 0.68889, 0, 0, 0.72222],\n    \"69\": [0, 0.68889, 0, 0, 0.66667],\n    \"70\": [0, 0.68889, 0, 0, 0.61111],\n    \"71\": [0, 0.68889, 0, 0, 0.77778],\n    \"72\": [0, 0.68889, 0, 0, 0.77778],\n    \"73\": [0, 0.68889, 0, 0, 0.38889],\n    \"74\": [0.16667, 0.68889, 0, 0, 0.5],\n    \"75\": [0, 0.68889, 0, 0, 0.77778],\n    \"76\": [0, 0.68889, 0, 0, 0.66667],\n    \"77\": [0, 0.68889, 0, 0, 0.94445],\n    \"78\": [0, 0.68889, 0, 0, 0.72222],\n    \"79\": [0.16667, 0.68889, 0, 0, 0.77778],\n    \"80\": [0, 0.68889, 0, 0, 0.61111],\n    \"81\": [0.16667, 0.68889, 0, 0, 0.77778],\n    \"82\": [0, 0.68889, 0, 0, 0.72222],\n    \"83\": [0, 0.68889, 0, 0, 0.55556],\n    \"84\": [0, 0.68889, 0, 0, 0.66667],\n    \"85\": [0, 0.68889, 0, 0, 0.72222],\n    \"86\": [0, 0.68889, 0, 0, 0.72222],\n    \"87\": [0, 0.68889, 0, 0, 1.0],\n    \"88\": [0, 0.68889, 0, 0, 0.72222],\n    \"89\": [0, 0.68889, 0, 0, 0.72222],\n    \"90\": [0, 0.68889, 0, 0, 0.66667],\n    \"107\": [0, 0.68889, 0, 0, 0.55556],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"165\": [0, 0.675, 0.025, 0, 0.75],\n    \"174\": [0.15559, 0.69224, 0, 0, 0.94666],\n    \"240\": [0, 0.68889, 0, 0, 0.55556],\n    \"295\": [0, 0.68889, 0, 0, 0.54028],\n    \"710\": [0, 0.825, 0, 0, 2.33334],\n    \"732\": [0, 0.9, 0, 0, 2.33334],\n    \"770\": [0, 0.825, 0, 0, 2.33334],\n    \"771\": [0, 0.9, 0, 0, 2.33334],\n    \"989\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"1008\": [0, 0.43056, 0.04028, 0, 0.66667],\n    \"8245\": [0, 0.54986, 0, 0, 0.275],\n    \"8463\": [0, 0.68889, 0, 0, 0.54028],\n    \"8487\": [0, 0.68889, 0, 0, 0.72222],\n    \"8498\": [0, 0.68889, 0, 0, 0.55556],\n    \"8502\": [0, 0.68889, 0, 0, 0.66667],\n    \"8503\": [0, 0.68889, 0, 0, 0.44445],\n    \"8504\": [0, 0.68889, 0, 0, 0.66667],\n    \"8513\": [0, 0.68889, 0, 0, 0.63889],\n    \"8592\": [-0.03598, 0.46402, 0, 0, 0.5],\n    \"8594\": [-0.03598, 0.46402, 0, 0, 0.5],\n    \"8602\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8603\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8606\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8608\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8610\": [0.01354, 0.52239, 0, 0, 1.11111],\n    \"8611\": [0.01354, 0.52239, 0, 0, 1.11111],\n    \"8619\": [0, 0.54986, 0, 0, 1.0],\n    \"8620\": [0, 0.54986, 0, 0, 1.0],\n    \"8621\": [-0.13313, 0.37788, 0, 0, 1.38889],\n    \"8622\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8624\": [0, 0.69224, 0, 0, 0.5],\n    \"8625\": [0, 0.69224, 0, 0, 0.5],\n    \"8630\": [0, 0.43056, 0, 0, 1.0],\n    \"8631\": [0, 0.43056, 0, 0, 1.0],\n    \"8634\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8635\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8638\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8639\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8642\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8643\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8644\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8646\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8647\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8648\": [0.19444, 0.69224, 0, 0, 0.83334],\n    \"8649\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8650\": [0.19444, 0.69224, 0, 0, 0.83334],\n    \"8651\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8652\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8653\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8654\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8655\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8666\": [0.13667, 0.63667, 0, 0, 1.0],\n    \"8667\": [0.13667, 0.63667, 0, 0, 1.0],\n    \"8669\": [-0.13313, 0.37788, 0, 0, 1.0],\n    \"8672\": [-0.064, 0.437, 0, 0, 1.334],\n    \"8674\": [-0.064, 0.437, 0, 0, 1.334],\n    \"8705\": [0, 0.825, 0, 0, 0.5],\n    \"8708\": [0, 0.68889, 0, 0, 0.55556],\n    \"8709\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8717\": [0, 0.43056, 0, 0, 0.42917],\n    \"8722\": [-0.03598, 0.46402, 0, 0, 0.5],\n    \"8724\": [0.08198, 0.69224, 0, 0, 0.77778],\n    \"8726\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8733\": [0, 0.69224, 0, 0, 0.77778],\n    \"8736\": [0, 0.69224, 0, 0, 0.72222],\n    \"8737\": [0, 0.69224, 0, 0, 0.72222],\n    \"8738\": [0.03517, 0.52239, 0, 0, 0.72222],\n    \"8739\": [0.08167, 0.58167, 0, 0, 0.22222],\n    \"8740\": [0.25142, 0.74111, 0, 0, 0.27778],\n    \"8741\": [0.08167, 0.58167, 0, 0, 0.38889],\n    \"8742\": [0.25142, 0.74111, 0, 0, 0.5],\n    \"8756\": [0, 0.69224, 0, 0, 0.66667],\n    \"8757\": [0, 0.69224, 0, 0, 0.66667],\n    \"8764\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"8765\": [-0.13313, 0.37788, 0, 0, 0.77778],\n    \"8769\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"8770\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8774\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8776\": [-0.01688, 0.48312, 0, 0, 0.77778],\n    \"8778\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8782\": [0.06062, 0.54986, 0, 0, 0.77778],\n    \"8783\": [0.06062, 0.54986, 0, 0, 0.77778],\n    \"8785\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8786\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8787\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8790\": [0, 0.69224, 0, 0, 0.77778],\n    \"8791\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8796\": [0.08198, 0.91667, 0, 0, 0.77778],\n    \"8806\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"8807\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"8808\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"8809\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"8812\": [0.25583, 0.75583, 0, 0, 0.5],\n    \"8814\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8815\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8816\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8817\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8818\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8819\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8822\": [0.1808, 0.675, 0, 0, 0.77778],\n    \"8823\": [0.1808, 0.675, 0, 0, 0.77778],\n    \"8828\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8829\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8830\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8831\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8832\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8833\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8840\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8841\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8842\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8843\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8847\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8848\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8858\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8859\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8861\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8862\": [0, 0.675, 0, 0, 0.77778],\n    \"8863\": [0, 0.675, 0, 0, 0.77778],\n    \"8864\": [0, 0.675, 0, 0, 0.77778],\n    \"8865\": [0, 0.675, 0, 0, 0.77778],\n    \"8872\": [0, 0.69224, 0, 0, 0.61111],\n    \"8873\": [0, 0.69224, 0, 0, 0.72222],\n    \"8874\": [0, 0.69224, 0, 0, 0.88889],\n    \"8876\": [0, 0.68889, 0, 0, 0.61111],\n    \"8877\": [0, 0.68889, 0, 0, 0.61111],\n    \"8878\": [0, 0.68889, 0, 0, 0.72222],\n    \"8879\": [0, 0.68889, 0, 0, 0.72222],\n    \"8882\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8883\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8884\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8885\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8888\": [0, 0.54986, 0, 0, 1.11111],\n    \"8890\": [0.19444, 0.43056, 0, 0, 0.55556],\n    \"8891\": [0.19444, 0.69224, 0, 0, 0.61111],\n    \"8892\": [0.19444, 0.69224, 0, 0, 0.61111],\n    \"8901\": [0, 0.54986, 0, 0, 0.27778],\n    \"8903\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8905\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8906\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8907\": [0, 0.69224, 0, 0, 0.77778],\n    \"8908\": [0, 0.69224, 0, 0, 0.77778],\n    \"8909\": [-0.03598, 0.46402, 0, 0, 0.77778],\n    \"8910\": [0, 0.54986, 0, 0, 0.76042],\n    \"8911\": [0, 0.54986, 0, 0, 0.76042],\n    \"8912\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8913\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8914\": [0, 0.54986, 0, 0, 0.66667],\n    \"8915\": [0, 0.54986, 0, 0, 0.66667],\n    \"8916\": [0, 0.69224, 0, 0, 0.66667],\n    \"8918\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8919\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8920\": [0.03517, 0.54986, 0, 0, 1.33334],\n    \"8921\": [0.03517, 0.54986, 0, 0, 1.33334],\n    \"8922\": [0.38569, 0.88569, 0, 0, 0.77778],\n    \"8923\": [0.38569, 0.88569, 0, 0, 0.77778],\n    \"8926\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8927\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8928\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8929\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8934\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8935\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8936\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8937\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8938\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8939\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8940\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8941\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8994\": [0.19444, 0.69224, 0, 0, 0.77778],\n    \"8995\": [0.19444, 0.69224, 0, 0, 0.77778],\n    \"9416\": [0.15559, 0.69224, 0, 0, 0.90222],\n    \"9484\": [0, 0.69224, 0, 0, 0.5],\n    \"9488\": [0, 0.69224, 0, 0, 0.5],\n    \"9492\": [0, 0.37788, 0, 0, 0.5],\n    \"9496\": [0, 0.37788, 0, 0, 0.5],\n    \"9585\": [0.19444, 0.68889, 0, 0, 0.88889],\n    \"9586\": [0.19444, 0.74111, 0, 0, 0.88889],\n    \"9632\": [0, 0.675, 0, 0, 0.77778],\n    \"9633\": [0, 0.675, 0, 0, 0.77778],\n    \"9650\": [0, 0.54986, 0, 0, 0.72222],\n    \"9651\": [0, 0.54986, 0, 0, 0.72222],\n    \"9654\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"9660\": [0, 0.54986, 0, 0, 0.72222],\n    \"9661\": [0, 0.54986, 0, 0, 0.72222],\n    \"9664\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"9674\": [0.11111, 0.69224, 0, 0, 0.66667],\n    \"9733\": [0.19444, 0.69224, 0, 0, 0.94445],\n    \"10003\": [0, 0.69224, 0, 0, 0.83334],\n    \"10016\": [0, 0.69224, 0, 0, 0.83334],\n    \"10731\": [0.11111, 0.69224, 0, 0, 0.66667],\n    \"10846\": [0.19444, 0.75583, 0, 0, 0.61111],\n    \"10877\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10878\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10885\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10886\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10887\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"10888\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"10889\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10890\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10891\": [0.48256, 0.98256, 0, 0, 0.77778],\n    \"10892\": [0.48256, 0.98256, 0, 0, 0.77778],\n    \"10901\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10902\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10933\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"10934\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"10935\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10936\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10937\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10938\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10949\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10950\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10955\": [0.28481, 0.79383, 0, 0, 0.77778],\n    \"10956\": [0.28481, 0.79383, 0, 0, 0.77778],\n    \"57350\": [0.08167, 0.58167, 0, 0, 0.22222],\n    \"57351\": [0.08167, 0.58167, 0, 0, 0.38889],\n    \"57352\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"57353\": [0, 0.43056, 0.04028, 0, 0.66667],\n    \"57356\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57357\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57358\": [0.41951, 0.91951, 0, 0, 0.77778],\n    \"57359\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"57360\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"57361\": [0.41951, 0.91951, 0, 0, 0.77778],\n    \"57366\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57367\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57368\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57369\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57370\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"57371\": [0.13597, 0.63597, 0, 0, 0.77778]\n  },\n  \"Caligraphic-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"65\": [0, 0.68333, 0, 0.19445, 0.79847],\n    \"66\": [0, 0.68333, 0.03041, 0.13889, 0.65681],\n    \"67\": [0, 0.68333, 0.05834, 0.13889, 0.52653],\n    \"68\": [0, 0.68333, 0.02778, 0.08334, 0.77139],\n    \"69\": [0, 0.68333, 0.08944, 0.11111, 0.52778],\n    \"70\": [0, 0.68333, 0.09931, 0.11111, 0.71875],\n    \"71\": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487],\n    \"72\": [0, 0.68333, 0.00965, 0.11111, 0.84452],\n    \"73\": [0, 0.68333, 0.07382, 0, 0.54452],\n    \"74\": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778],\n    \"75\": [0, 0.68333, 0.01445, 0.05556, 0.76195],\n    \"76\": [0, 0.68333, 0, 0.13889, 0.68972],\n    \"77\": [0, 0.68333, 0, 0.13889, 1.2009],\n    \"78\": [0, 0.68333, 0.14736, 0.08334, 0.82049],\n    \"79\": [0, 0.68333, 0.02778, 0.11111, 0.79611],\n    \"80\": [0, 0.68333, 0.08222, 0.08334, 0.69556],\n    \"81\": [0.09722, 0.68333, 0, 0.11111, 0.81667],\n    \"82\": [0, 0.68333, 0, 0.08334, 0.8475],\n    \"83\": [0, 0.68333, 0.075, 0.13889, 0.60556],\n    \"84\": [0, 0.68333, 0.25417, 0, 0.54464],\n    \"85\": [0, 0.68333, 0.09931, 0.08334, 0.62583],\n    \"86\": [0, 0.68333, 0.08222, 0, 0.61278],\n    \"87\": [0, 0.68333, 0.08222, 0.08334, 0.98778],\n    \"88\": [0, 0.68333, 0.14643, 0.13889, 0.7133],\n    \"89\": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834],\n    \"90\": [0, 0.68333, 0.07944, 0.13889, 0.72473],\n    \"160\": [0, 0, 0, 0, 0.25]\n  },\n  \"Fraktur-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69141, 0, 0, 0.29574],\n    \"34\": [0, 0.69141, 0, 0, 0.21471],\n    \"38\": [0, 0.69141, 0, 0, 0.73786],\n    \"39\": [0, 0.69141, 0, 0, 0.21201],\n    \"40\": [0.24982, 0.74947, 0, 0, 0.38865],\n    \"41\": [0.24982, 0.74947, 0, 0, 0.38865],\n    \"42\": [0, 0.62119, 0, 0, 0.27764],\n    \"43\": [0.08319, 0.58283, 0, 0, 0.75623],\n    \"44\": [0, 0.10803, 0, 0, 0.27764],\n    \"45\": [0.08319, 0.58283, 0, 0, 0.75623],\n    \"46\": [0, 0.10803, 0, 0, 0.27764],\n    \"47\": [0.24982, 0.74947, 0, 0, 0.50181],\n    \"48\": [0, 0.47534, 0, 0, 0.50181],\n    \"49\": [0, 0.47534, 0, 0, 0.50181],\n    \"50\": [0, 0.47534, 0, 0, 0.50181],\n    \"51\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"52\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"53\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"54\": [0, 0.69141, 0, 0, 0.50181],\n    \"55\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"56\": [0, 0.69141, 0, 0, 0.50181],\n    \"57\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"58\": [0, 0.47534, 0, 0, 0.21606],\n    \"59\": [0.12604, 0.47534, 0, 0, 0.21606],\n    \"61\": [-0.13099, 0.36866, 0, 0, 0.75623],\n    \"63\": [0, 0.69141, 0, 0, 0.36245],\n    \"65\": [0, 0.69141, 0, 0, 0.7176],\n    \"66\": [0, 0.69141, 0, 0, 0.88397],\n    \"67\": [0, 0.69141, 0, 0, 0.61254],\n    \"68\": [0, 0.69141, 0, 0, 0.83158],\n    \"69\": [0, 0.69141, 0, 0, 0.66278],\n    \"70\": [0.12604, 0.69141, 0, 0, 0.61119],\n    \"71\": [0, 0.69141, 0, 0, 0.78539],\n    \"72\": [0.06302, 0.69141, 0, 0, 0.7203],\n    \"73\": [0, 0.69141, 0, 0, 0.55448],\n    \"74\": [0.12604, 0.69141, 0, 0, 0.55231],\n    \"75\": [0, 0.69141, 0, 0, 0.66845],\n    \"76\": [0, 0.69141, 0, 0, 0.66602],\n    \"77\": [0, 0.69141, 0, 0, 1.04953],\n    \"78\": [0, 0.69141, 0, 0, 0.83212],\n    \"79\": [0, 0.69141, 0, 0, 0.82699],\n    \"80\": [0.18906, 0.69141, 0, 0, 0.82753],\n    \"81\": [0.03781, 0.69141, 0, 0, 0.82699],\n    \"82\": [0, 0.69141, 0, 0, 0.82807],\n    \"83\": [0, 0.69141, 0, 0, 0.82861],\n    \"84\": [0, 0.69141, 0, 0, 0.66899],\n    \"85\": [0, 0.69141, 0, 0, 0.64576],\n    \"86\": [0, 0.69141, 0, 0, 0.83131],\n    \"87\": [0, 0.69141, 0, 0, 1.04602],\n    \"88\": [0, 0.69141, 0, 0, 0.71922],\n    \"89\": [0.18906, 0.69141, 0, 0, 0.83293],\n    \"90\": [0.12604, 0.69141, 0, 0, 0.60201],\n    \"91\": [0.24982, 0.74947, 0, 0, 0.27764],\n    \"93\": [0.24982, 0.74947, 0, 0, 0.27764],\n    \"94\": [0, 0.69141, 0, 0, 0.49965],\n    \"97\": [0, 0.47534, 0, 0, 0.50046],\n    \"98\": [0, 0.69141, 0, 0, 0.51315],\n    \"99\": [0, 0.47534, 0, 0, 0.38946],\n    \"100\": [0, 0.62119, 0, 0, 0.49857],\n    \"101\": [0, 0.47534, 0, 0, 0.40053],\n    \"102\": [0.18906, 0.69141, 0, 0, 0.32626],\n    \"103\": [0.18906, 0.47534, 0, 0, 0.5037],\n    \"104\": [0.18906, 0.69141, 0, 0, 0.52126],\n    \"105\": [0, 0.69141, 0, 0, 0.27899],\n    \"106\": [0, 0.69141, 0, 0, 0.28088],\n    \"107\": [0, 0.69141, 0, 0, 0.38946],\n    \"108\": [0, 0.69141, 0, 0, 0.27953],\n    \"109\": [0, 0.47534, 0, 0, 0.76676],\n    \"110\": [0, 0.47534, 0, 0, 0.52666],\n    \"111\": [0, 0.47534, 0, 0, 0.48885],\n    \"112\": [0.18906, 0.52396, 0, 0, 0.50046],\n    \"113\": [0.18906, 0.47534, 0, 0, 0.48912],\n    \"114\": [0, 0.47534, 0, 0, 0.38919],\n    \"115\": [0, 0.47534, 0, 0, 0.44266],\n    \"116\": [0, 0.62119, 0, 0, 0.33301],\n    \"117\": [0, 0.47534, 0, 0, 0.5172],\n    \"118\": [0, 0.52396, 0, 0, 0.5118],\n    \"119\": [0, 0.52396, 0, 0, 0.77351],\n    \"120\": [0.18906, 0.47534, 0, 0, 0.38865],\n    \"121\": [0.18906, 0.47534, 0, 0, 0.49884],\n    \"122\": [0.18906, 0.47534, 0, 0, 0.39054],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"8216\": [0, 0.69141, 0, 0, 0.21471],\n    \"8217\": [0, 0.69141, 0, 0, 0.21471],\n    \"58112\": [0, 0.62119, 0, 0, 0.49749],\n    \"58113\": [0, 0.62119, 0, 0, 0.4983],\n    \"58114\": [0.18906, 0.69141, 0, 0, 0.33328],\n    \"58115\": [0.18906, 0.69141, 0, 0, 0.32923],\n    \"58116\": [0.18906, 0.47534, 0, 0, 0.50343],\n    \"58117\": [0, 0.69141, 0, 0, 0.33301],\n    \"58118\": [0, 0.62119, 0, 0, 0.33409],\n    \"58119\": [0, 0.47534, 0, 0, 0.50073]\n  },\n  \"Main-Bold\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.35],\n    \"34\": [0, 0.69444, 0, 0, 0.60278],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.95833],\n    \"36\": [0.05556, 0.75, 0, 0, 0.575],\n    \"37\": [0.05556, 0.75, 0, 0, 0.95833],\n    \"38\": [0, 0.69444, 0, 0, 0.89444],\n    \"39\": [0, 0.69444, 0, 0, 0.31944],\n    \"40\": [0.25, 0.75, 0, 0, 0.44722],\n    \"41\": [0.25, 0.75, 0, 0, 0.44722],\n    \"42\": [0, 0.75, 0, 0, 0.575],\n    \"43\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"44\": [0.19444, 0.15556, 0, 0, 0.31944],\n    \"45\": [0, 0.44444, 0, 0, 0.38333],\n    \"46\": [0, 0.15556, 0, 0, 0.31944],\n    \"47\": [0.25, 0.75, 0, 0, 0.575],\n    \"48\": [0, 0.64444, 0, 0, 0.575],\n    \"49\": [0, 0.64444, 0, 0, 0.575],\n    \"50\": [0, 0.64444, 0, 0, 0.575],\n    \"51\": [0, 0.64444, 0, 0, 0.575],\n    \"52\": [0, 0.64444, 0, 0, 0.575],\n    \"53\": [0, 0.64444, 0, 0, 0.575],\n    \"54\": [0, 0.64444, 0, 0, 0.575],\n    \"55\": [0, 0.64444, 0, 0, 0.575],\n    \"56\": [0, 0.64444, 0, 0, 0.575],\n    \"57\": [0, 0.64444, 0, 0, 0.575],\n    \"58\": [0, 0.44444, 0, 0, 0.31944],\n    \"59\": [0.19444, 0.44444, 0, 0, 0.31944],\n    \"60\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"61\": [-0.10889, 0.39111, 0, 0, 0.89444],\n    \"62\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"63\": [0, 0.69444, 0, 0, 0.54305],\n    \"64\": [0, 0.69444, 0, 0, 0.89444],\n    \"65\": [0, 0.68611, 0, 0, 0.86944],\n    \"66\": [0, 0.68611, 0, 0, 0.81805],\n    \"67\": [0, 0.68611, 0, 0, 0.83055],\n    \"68\": [0, 0.68611, 0, 0, 0.88194],\n    \"69\": [0, 0.68611, 0, 0, 0.75555],\n    \"70\": [0, 0.68611, 0, 0, 0.72361],\n    \"71\": [0, 0.68611, 0, 0, 0.90416],\n    \"72\": [0, 0.68611, 0, 0, 0.9],\n    \"73\": [0, 0.68611, 0, 0, 0.43611],\n    \"74\": [0, 0.68611, 0, 0, 0.59444],\n    \"75\": [0, 0.68611, 0, 0, 0.90138],\n    \"76\": [0, 0.68611, 0, 0, 0.69166],\n    \"77\": [0, 0.68611, 0, 0, 1.09166],\n    \"78\": [0, 0.68611, 0, 0, 0.9],\n    \"79\": [0, 0.68611, 0, 0, 0.86388],\n    \"80\": [0, 0.68611, 0, 0, 0.78611],\n    \"81\": [0.19444, 0.68611, 0, 0, 0.86388],\n    \"82\": [0, 0.68611, 0, 0, 0.8625],\n    \"83\": [0, 0.68611, 0, 0, 0.63889],\n    \"84\": [0, 0.68611, 0, 0, 0.8],\n    \"85\": [0, 0.68611, 0, 0, 0.88472],\n    \"86\": [0, 0.68611, 0.01597, 0, 0.86944],\n    \"87\": [0, 0.68611, 0.01597, 0, 1.18888],\n    \"88\": [0, 0.68611, 0, 0, 0.86944],\n    \"89\": [0, 0.68611, 0.02875, 0, 0.86944],\n    \"90\": [0, 0.68611, 0, 0, 0.70277],\n    \"91\": [0.25, 0.75, 0, 0, 0.31944],\n    \"92\": [0.25, 0.75, 0, 0, 0.575],\n    \"93\": [0.25, 0.75, 0, 0, 0.31944],\n    \"94\": [0, 0.69444, 0, 0, 0.575],\n    \"95\": [0.31, 0.13444, 0.03194, 0, 0.575],\n    \"97\": [0, 0.44444, 0, 0, 0.55902],\n    \"98\": [0, 0.69444, 0, 0, 0.63889],\n    \"99\": [0, 0.44444, 0, 0, 0.51111],\n    \"100\": [0, 0.69444, 0, 0, 0.63889],\n    \"101\": [0, 0.44444, 0, 0, 0.52708],\n    \"102\": [0, 0.69444, 0.10903, 0, 0.35139],\n    \"103\": [0.19444, 0.44444, 0.01597, 0, 0.575],\n    \"104\": [0, 0.69444, 0, 0, 0.63889],\n    \"105\": [0, 0.69444, 0, 0, 0.31944],\n    \"106\": [0.19444, 0.69444, 0, 0, 0.35139],\n    \"107\": [0, 0.69444, 0, 0, 0.60694],\n    \"108\": [0, 0.69444, 0, 0, 0.31944],\n    \"109\": [0, 0.44444, 0, 0, 0.95833],\n    \"110\": [0, 0.44444, 0, 0, 0.63889],\n    \"111\": [0, 0.44444, 0, 0, 0.575],\n    \"112\": [0.19444, 0.44444, 0, 0, 0.63889],\n    \"113\": [0.19444, 0.44444, 0, 0, 0.60694],\n    \"114\": [0, 0.44444, 0, 0, 0.47361],\n    \"115\": [0, 0.44444, 0, 0, 0.45361],\n    \"116\": [0, 0.63492, 0, 0, 0.44722],\n    \"117\": [0, 0.44444, 0, 0, 0.63889],\n    \"118\": [0, 0.44444, 0.01597, 0, 0.60694],\n    \"119\": [0, 0.44444, 0.01597, 0, 0.83055],\n    \"120\": [0, 0.44444, 0, 0, 0.60694],\n    \"121\": [0.19444, 0.44444, 0.01597, 0, 0.60694],\n    \"122\": [0, 0.44444, 0, 0, 0.51111],\n    \"123\": [0.25, 0.75, 0, 0, 0.575],\n    \"124\": [0.25, 0.75, 0, 0, 0.31944],\n    \"125\": [0.25, 0.75, 0, 0, 0.575],\n    \"126\": [0.35, 0.34444, 0, 0, 0.575],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"163\": [0, 0.69444, 0, 0, 0.86853],\n    \"168\": [0, 0.69444, 0, 0, 0.575],\n    \"172\": [0, 0.44444, 0, 0, 0.76666],\n    \"176\": [0, 0.69444, 0, 0, 0.86944],\n    \"177\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"184\": [0.17014, 0, 0, 0, 0.51111],\n    \"198\": [0, 0.68611, 0, 0, 1.04166],\n    \"215\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"216\": [0.04861, 0.73472, 0, 0, 0.89444],\n    \"223\": [0, 0.69444, 0, 0, 0.59722],\n    \"230\": [0, 0.44444, 0, 0, 0.83055],\n    \"247\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"248\": [0.09722, 0.54167, 0, 0, 0.575],\n    \"305\": [0, 0.44444, 0, 0, 0.31944],\n    \"338\": [0, 0.68611, 0, 0, 1.16944],\n    \"339\": [0, 0.44444, 0, 0, 0.89444],\n    \"567\": [0.19444, 0.44444, 0, 0, 0.35139],\n    \"710\": [0, 0.69444, 0, 0, 0.575],\n    \"711\": [0, 0.63194, 0, 0, 0.575],\n    \"713\": [0, 0.59611, 0, 0, 0.575],\n    \"714\": [0, 0.69444, 0, 0, 0.575],\n    \"715\": [0, 0.69444, 0, 0, 0.575],\n    \"728\": [0, 0.69444, 0, 0, 0.575],\n    \"729\": [0, 0.69444, 0, 0, 0.31944],\n    \"730\": [0, 0.69444, 0, 0, 0.86944],\n    \"732\": [0, 0.69444, 0, 0, 0.575],\n    \"733\": [0, 0.69444, 0, 0, 0.575],\n    \"915\": [0, 0.68611, 0, 0, 0.69166],\n    \"916\": [0, 0.68611, 0, 0, 0.95833],\n    \"920\": [0, 0.68611, 0, 0, 0.89444],\n    \"923\": [0, 0.68611, 0, 0, 0.80555],\n    \"926\": [0, 0.68611, 0, 0, 0.76666],\n    \"928\": [0, 0.68611, 0, 0, 0.9],\n    \"931\": [0, 0.68611, 0, 0, 0.83055],\n    \"933\": [0, 0.68611, 0, 0, 0.89444],\n    \"934\": [0, 0.68611, 0, 0, 0.83055],\n    \"936\": [0, 0.68611, 0, 0, 0.89444],\n    \"937\": [0, 0.68611, 0, 0, 0.83055],\n    \"8211\": [0, 0.44444, 0.03194, 0, 0.575],\n    \"8212\": [0, 0.44444, 0.03194, 0, 1.14999],\n    \"8216\": [0, 0.69444, 0, 0, 0.31944],\n    \"8217\": [0, 0.69444, 0, 0, 0.31944],\n    \"8220\": [0, 0.69444, 0, 0, 0.60278],\n    \"8221\": [0, 0.69444, 0, 0, 0.60278],\n    \"8224\": [0.19444, 0.69444, 0, 0, 0.51111],\n    \"8225\": [0.19444, 0.69444, 0, 0, 0.51111],\n    \"8242\": [0, 0.55556, 0, 0, 0.34444],\n    \"8407\": [0, 0.72444, 0.15486, 0, 0.575],\n    \"8463\": [0, 0.69444, 0, 0, 0.66759],\n    \"8465\": [0, 0.69444, 0, 0, 0.83055],\n    \"8467\": [0, 0.69444, 0, 0, 0.47361],\n    \"8472\": [0.19444, 0.44444, 0, 0, 0.74027],\n    \"8476\": [0, 0.69444, 0, 0, 0.83055],\n    \"8501\": [0, 0.69444, 0, 0, 0.70277],\n    \"8592\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8593\": [0.19444, 0.69444, 0, 0, 0.575],\n    \"8594\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8595\": [0.19444, 0.69444, 0, 0, 0.575],\n    \"8596\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8597\": [0.25, 0.75, 0, 0, 0.575],\n    \"8598\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8599\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8600\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8601\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8636\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8637\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8640\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8641\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8656\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8657\": [0.19444, 0.69444, 0, 0, 0.70277],\n    \"8658\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8659\": [0.19444, 0.69444, 0, 0, 0.70277],\n    \"8660\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8661\": [0.25, 0.75, 0, 0, 0.70277],\n    \"8704\": [0, 0.69444, 0, 0, 0.63889],\n    \"8706\": [0, 0.69444, 0.06389, 0, 0.62847],\n    \"8707\": [0, 0.69444, 0, 0, 0.63889],\n    \"8709\": [0.05556, 0.75, 0, 0, 0.575],\n    \"8711\": [0, 0.68611, 0, 0, 0.95833],\n    \"8712\": [0.08556, 0.58556, 0, 0, 0.76666],\n    \"8715\": [0.08556, 0.58556, 0, 0, 0.76666],\n    \"8722\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8723\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8725\": [0.25, 0.75, 0, 0, 0.575],\n    \"8726\": [0.25, 0.75, 0, 0, 0.575],\n    \"8727\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"8728\": [-0.02639, 0.47361, 0, 0, 0.575],\n    \"8729\": [-0.02639, 0.47361, 0, 0, 0.575],\n    \"8730\": [0.18, 0.82, 0, 0, 0.95833],\n    \"8733\": [0, 0.44444, 0, 0, 0.89444],\n    \"8734\": [0, 0.44444, 0, 0, 1.14999],\n    \"8736\": [0, 0.69224, 0, 0, 0.72222],\n    \"8739\": [0.25, 0.75, 0, 0, 0.31944],\n    \"8741\": [0.25, 0.75, 0, 0, 0.575],\n    \"8743\": [0, 0.55556, 0, 0, 0.76666],\n    \"8744\": [0, 0.55556, 0, 0, 0.76666],\n    \"8745\": [0, 0.55556, 0, 0, 0.76666],\n    \"8746\": [0, 0.55556, 0, 0, 0.76666],\n    \"8747\": [0.19444, 0.69444, 0.12778, 0, 0.56875],\n    \"8764\": [-0.10889, 0.39111, 0, 0, 0.89444],\n    \"8768\": [0.19444, 0.69444, 0, 0, 0.31944],\n    \"8771\": [0.00222, 0.50222, 0, 0, 0.89444],\n    \"8773\": [0.027, 0.638, 0, 0, 0.894],\n    \"8776\": [0.02444, 0.52444, 0, 0, 0.89444],\n    \"8781\": [0.00222, 0.50222, 0, 0, 0.89444],\n    \"8801\": [0.00222, 0.50222, 0, 0, 0.89444],\n    \"8804\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8805\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8810\": [0.08556, 0.58556, 0, 0, 1.14999],\n    \"8811\": [0.08556, 0.58556, 0, 0, 1.14999],\n    \"8826\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8827\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8834\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8835\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8838\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8839\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8846\": [0, 0.55556, 0, 0, 0.76666],\n    \"8849\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8850\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8851\": [0, 0.55556, 0, 0, 0.76666],\n    \"8852\": [0, 0.55556, 0, 0, 0.76666],\n    \"8853\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8854\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8855\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8856\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8857\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8866\": [0, 0.69444, 0, 0, 0.70277],\n    \"8867\": [0, 0.69444, 0, 0, 0.70277],\n    \"8868\": [0, 0.69444, 0, 0, 0.89444],\n    \"8869\": [0, 0.69444, 0, 0, 0.89444],\n    \"8900\": [-0.02639, 0.47361, 0, 0, 0.575],\n    \"8901\": [-0.02639, 0.47361, 0, 0, 0.31944],\n    \"8902\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"8968\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8969\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8970\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8971\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8994\": [-0.13889, 0.36111, 0, 0, 1.14999],\n    \"8995\": [-0.13889, 0.36111, 0, 0, 1.14999],\n    \"9651\": [0.19444, 0.69444, 0, 0, 1.02222],\n    \"9657\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"9661\": [0.19444, 0.69444, 0, 0, 1.02222],\n    \"9667\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"9711\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"9824\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9825\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9826\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9827\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9837\": [0, 0.75, 0, 0, 0.44722],\n    \"9838\": [0.19444, 0.69444, 0, 0, 0.44722],\n    \"9839\": [0.19444, 0.69444, 0, 0, 0.44722],\n    \"10216\": [0.25, 0.75, 0, 0, 0.44722],\n    \"10217\": [0.25, 0.75, 0, 0, 0.44722],\n    \"10815\": [0, 0.68611, 0, 0, 0.9],\n    \"10927\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"10928\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"57376\": [0.19444, 0.69444, 0, 0, 0]\n  },\n  \"Main-BoldItalic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0.11417, 0, 0.38611],\n    \"34\": [0, 0.69444, 0.07939, 0, 0.62055],\n    \"35\": [0.19444, 0.69444, 0.06833, 0, 0.94444],\n    \"37\": [0.05556, 0.75, 0.12861, 0, 0.94444],\n    \"38\": [0, 0.69444, 0.08528, 0, 0.88555],\n    \"39\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"40\": [0.25, 0.75, 0.15806, 0, 0.47333],\n    \"41\": [0.25, 0.75, 0.03306, 0, 0.47333],\n    \"42\": [0, 0.75, 0.14333, 0, 0.59111],\n    \"43\": [0.10333, 0.60333, 0.03306, 0, 0.88555],\n    \"44\": [0.19444, 0.14722, 0, 0, 0.35555],\n    \"45\": [0, 0.44444, 0.02611, 0, 0.41444],\n    \"46\": [0, 0.14722, 0, 0, 0.35555],\n    \"47\": [0.25, 0.75, 0.15806, 0, 0.59111],\n    \"48\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"49\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"50\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"51\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"52\": [0.19444, 0.64444, 0.13167, 0, 0.59111],\n    \"53\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"54\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"55\": [0.19444, 0.64444, 0.13167, 0, 0.59111],\n    \"56\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"57\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"58\": [0, 0.44444, 0.06695, 0, 0.35555],\n    \"59\": [0.19444, 0.44444, 0.06695, 0, 0.35555],\n    \"61\": [-0.10889, 0.39111, 0.06833, 0, 0.88555],\n    \"63\": [0, 0.69444, 0.11472, 0, 0.59111],\n    \"64\": [0, 0.69444, 0.09208, 0, 0.88555],\n    \"65\": [0, 0.68611, 0, 0, 0.86555],\n    \"66\": [0, 0.68611, 0.0992, 0, 0.81666],\n    \"67\": [0, 0.68611, 0.14208, 0, 0.82666],\n    \"68\": [0, 0.68611, 0.09062, 0, 0.87555],\n    \"69\": [0, 0.68611, 0.11431, 0, 0.75666],\n    \"70\": [0, 0.68611, 0.12903, 0, 0.72722],\n    \"71\": [0, 0.68611, 0.07347, 0, 0.89527],\n    \"72\": [0, 0.68611, 0.17208, 0, 0.8961],\n    \"73\": [0, 0.68611, 0.15681, 0, 0.47166],\n    \"74\": [0, 0.68611, 0.145, 0, 0.61055],\n    \"75\": [0, 0.68611, 0.14208, 0, 0.89499],\n    \"76\": [0, 0.68611, 0, 0, 0.69777],\n    \"77\": [0, 0.68611, 0.17208, 0, 1.07277],\n    \"78\": [0, 0.68611, 0.17208, 0, 0.8961],\n    \"79\": [0, 0.68611, 0.09062, 0, 0.85499],\n    \"80\": [0, 0.68611, 0.0992, 0, 0.78721],\n    \"81\": [0.19444, 0.68611, 0.09062, 0, 0.85499],\n    \"82\": [0, 0.68611, 0.02559, 0, 0.85944],\n    \"83\": [0, 0.68611, 0.11264, 0, 0.64999],\n    \"84\": [0, 0.68611, 0.12903, 0, 0.7961],\n    \"85\": [0, 0.68611, 0.17208, 0, 0.88083],\n    \"86\": [0, 0.68611, 0.18625, 0, 0.86555],\n    \"87\": [0, 0.68611, 0.18625, 0, 1.15999],\n    \"88\": [0, 0.68611, 0.15681, 0, 0.86555],\n    \"89\": [0, 0.68611, 0.19803, 0, 0.86555],\n    \"90\": [0, 0.68611, 0.14208, 0, 0.70888],\n    \"91\": [0.25, 0.75, 0.1875, 0, 0.35611],\n    \"93\": [0.25, 0.75, 0.09972, 0, 0.35611],\n    \"94\": [0, 0.69444, 0.06709, 0, 0.59111],\n    \"95\": [0.31, 0.13444, 0.09811, 0, 0.59111],\n    \"97\": [0, 0.44444, 0.09426, 0, 0.59111],\n    \"98\": [0, 0.69444, 0.07861, 0, 0.53222],\n    \"99\": [0, 0.44444, 0.05222, 0, 0.53222],\n    \"100\": [0, 0.69444, 0.10861, 0, 0.59111],\n    \"101\": [0, 0.44444, 0.085, 0, 0.53222],\n    \"102\": [0.19444, 0.69444, 0.21778, 0, 0.4],\n    \"103\": [0.19444, 0.44444, 0.105, 0, 0.53222],\n    \"104\": [0, 0.69444, 0.09426, 0, 0.59111],\n    \"105\": [0, 0.69326, 0.11387, 0, 0.35555],\n    \"106\": [0.19444, 0.69326, 0.1672, 0, 0.35555],\n    \"107\": [0, 0.69444, 0.11111, 0, 0.53222],\n    \"108\": [0, 0.69444, 0.10861, 0, 0.29666],\n    \"109\": [0, 0.44444, 0.09426, 0, 0.94444],\n    \"110\": [0, 0.44444, 0.09426, 0, 0.64999],\n    \"111\": [0, 0.44444, 0.07861, 0, 0.59111],\n    \"112\": [0.19444, 0.44444, 0.07861, 0, 0.59111],\n    \"113\": [0.19444, 0.44444, 0.105, 0, 0.53222],\n    \"114\": [0, 0.44444, 0.11111, 0, 0.50167],\n    \"115\": [0, 0.44444, 0.08167, 0, 0.48694],\n    \"116\": [0, 0.63492, 0.09639, 0, 0.385],\n    \"117\": [0, 0.44444, 0.09426, 0, 0.62055],\n    \"118\": [0, 0.44444, 0.11111, 0, 0.53222],\n    \"119\": [0, 0.44444, 0.11111, 0, 0.76777],\n    \"120\": [0, 0.44444, 0.12583, 0, 0.56055],\n    \"121\": [0.19444, 0.44444, 0.105, 0, 0.56166],\n    \"122\": [0, 0.44444, 0.13889, 0, 0.49055],\n    \"126\": [0.35, 0.34444, 0.11472, 0, 0.59111],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.69444, 0.11473, 0, 0.59111],\n    \"176\": [0, 0.69444, 0, 0, 0.94888],\n    \"184\": [0.17014, 0, 0, 0, 0.53222],\n    \"198\": [0, 0.68611, 0.11431, 0, 1.02277],\n    \"216\": [0.04861, 0.73472, 0.09062, 0, 0.88555],\n    \"223\": [0.19444, 0.69444, 0.09736, 0, 0.665],\n    \"230\": [0, 0.44444, 0.085, 0, 0.82666],\n    \"248\": [0.09722, 0.54167, 0.09458, 0, 0.59111],\n    \"305\": [0, 0.44444, 0.09426, 0, 0.35555],\n    \"338\": [0, 0.68611, 0.11431, 0, 1.14054],\n    \"339\": [0, 0.44444, 0.085, 0, 0.82666],\n    \"567\": [0.19444, 0.44444, 0.04611, 0, 0.385],\n    \"710\": [0, 0.69444, 0.06709, 0, 0.59111],\n    \"711\": [0, 0.63194, 0.08271, 0, 0.59111],\n    \"713\": [0, 0.59444, 0.10444, 0, 0.59111],\n    \"714\": [0, 0.69444, 0.08528, 0, 0.59111],\n    \"715\": [0, 0.69444, 0, 0, 0.59111],\n    \"728\": [0, 0.69444, 0.10333, 0, 0.59111],\n    \"729\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"730\": [0, 0.69444, 0, 0, 0.94888],\n    \"732\": [0, 0.69444, 0.11472, 0, 0.59111],\n    \"733\": [0, 0.69444, 0.11472, 0, 0.59111],\n    \"915\": [0, 0.68611, 0.12903, 0, 0.69777],\n    \"916\": [0, 0.68611, 0, 0, 0.94444],\n    \"920\": [0, 0.68611, 0.09062, 0, 0.88555],\n    \"923\": [0, 0.68611, 0, 0, 0.80666],\n    \"926\": [0, 0.68611, 0.15092, 0, 0.76777],\n    \"928\": [0, 0.68611, 0.17208, 0, 0.8961],\n    \"931\": [0, 0.68611, 0.11431, 0, 0.82666],\n    \"933\": [0, 0.68611, 0.10778, 0, 0.88555],\n    \"934\": [0, 0.68611, 0.05632, 0, 0.82666],\n    \"936\": [0, 0.68611, 0.10778, 0, 0.88555],\n    \"937\": [0, 0.68611, 0.0992, 0, 0.82666],\n    \"8211\": [0, 0.44444, 0.09811, 0, 0.59111],\n    \"8212\": [0, 0.44444, 0.09811, 0, 1.18221],\n    \"8216\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"8217\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"8220\": [0, 0.69444, 0.16772, 0, 0.62055],\n    \"8221\": [0, 0.69444, 0.07939, 0, 0.62055]\n  },\n  \"Main-Italic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"34\": [0, 0.69444, 0.06961, 0, 0.51444],\n    \"35\": [0.19444, 0.69444, 0.06616, 0, 0.81777],\n    \"37\": [0.05556, 0.75, 0.13639, 0, 0.81777],\n    \"38\": [0, 0.69444, 0.09694, 0, 0.76666],\n    \"39\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"40\": [0.25, 0.75, 0.16194, 0, 0.40889],\n    \"41\": [0.25, 0.75, 0.03694, 0, 0.40889],\n    \"42\": [0, 0.75, 0.14917, 0, 0.51111],\n    \"43\": [0.05667, 0.56167, 0.03694, 0, 0.76666],\n    \"44\": [0.19444, 0.10556, 0, 0, 0.30667],\n    \"45\": [0, 0.43056, 0.02826, 0, 0.35778],\n    \"46\": [0, 0.10556, 0, 0, 0.30667],\n    \"47\": [0.25, 0.75, 0.16194, 0, 0.51111],\n    \"48\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"49\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"50\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"51\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"52\": [0.19444, 0.64444, 0.13556, 0, 0.51111],\n    \"53\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"54\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"55\": [0.19444, 0.64444, 0.13556, 0, 0.51111],\n    \"56\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"57\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"58\": [0, 0.43056, 0.0582, 0, 0.30667],\n    \"59\": [0.19444, 0.43056, 0.0582, 0, 0.30667],\n    \"61\": [-0.13313, 0.36687, 0.06616, 0, 0.76666],\n    \"63\": [0, 0.69444, 0.1225, 0, 0.51111],\n    \"64\": [0, 0.69444, 0.09597, 0, 0.76666],\n    \"65\": [0, 0.68333, 0, 0, 0.74333],\n    \"66\": [0, 0.68333, 0.10257, 0, 0.70389],\n    \"67\": [0, 0.68333, 0.14528, 0, 0.71555],\n    \"68\": [0, 0.68333, 0.09403, 0, 0.755],\n    \"69\": [0, 0.68333, 0.12028, 0, 0.67833],\n    \"70\": [0, 0.68333, 0.13305, 0, 0.65277],\n    \"71\": [0, 0.68333, 0.08722, 0, 0.77361],\n    \"72\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"73\": [0, 0.68333, 0.15806, 0, 0.38555],\n    \"74\": [0, 0.68333, 0.14028, 0, 0.525],\n    \"75\": [0, 0.68333, 0.14528, 0, 0.76888],\n    \"76\": [0, 0.68333, 0, 0, 0.62722],\n    \"77\": [0, 0.68333, 0.16389, 0, 0.89666],\n    \"78\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"79\": [0, 0.68333, 0.09403, 0, 0.76666],\n    \"80\": [0, 0.68333, 0.10257, 0, 0.67833],\n    \"81\": [0.19444, 0.68333, 0.09403, 0, 0.76666],\n    \"82\": [0, 0.68333, 0.03868, 0, 0.72944],\n    \"83\": [0, 0.68333, 0.11972, 0, 0.56222],\n    \"84\": [0, 0.68333, 0.13305, 0, 0.71555],\n    \"85\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"86\": [0, 0.68333, 0.18361, 0, 0.74333],\n    \"87\": [0, 0.68333, 0.18361, 0, 0.99888],\n    \"88\": [0, 0.68333, 0.15806, 0, 0.74333],\n    \"89\": [0, 0.68333, 0.19383, 0, 0.74333],\n    \"90\": [0, 0.68333, 0.14528, 0, 0.61333],\n    \"91\": [0.25, 0.75, 0.1875, 0, 0.30667],\n    \"93\": [0.25, 0.75, 0.10528, 0, 0.30667],\n    \"94\": [0, 0.69444, 0.06646, 0, 0.51111],\n    \"95\": [0.31, 0.12056, 0.09208, 0, 0.51111],\n    \"97\": [0, 0.43056, 0.07671, 0, 0.51111],\n    \"98\": [0, 0.69444, 0.06312, 0, 0.46],\n    \"99\": [0, 0.43056, 0.05653, 0, 0.46],\n    \"100\": [0, 0.69444, 0.10333, 0, 0.51111],\n    \"101\": [0, 0.43056, 0.07514, 0, 0.46],\n    \"102\": [0.19444, 0.69444, 0.21194, 0, 0.30667],\n    \"103\": [0.19444, 0.43056, 0.08847, 0, 0.46],\n    \"104\": [0, 0.69444, 0.07671, 0, 0.51111],\n    \"105\": [0, 0.65536, 0.1019, 0, 0.30667],\n    \"106\": [0.19444, 0.65536, 0.14467, 0, 0.30667],\n    \"107\": [0, 0.69444, 0.10764, 0, 0.46],\n    \"108\": [0, 0.69444, 0.10333, 0, 0.25555],\n    \"109\": [0, 0.43056, 0.07671, 0, 0.81777],\n    \"110\": [0, 0.43056, 0.07671, 0, 0.56222],\n    \"111\": [0, 0.43056, 0.06312, 0, 0.51111],\n    \"112\": [0.19444, 0.43056, 0.06312, 0, 0.51111],\n    \"113\": [0.19444, 0.43056, 0.08847, 0, 0.46],\n    \"114\": [0, 0.43056, 0.10764, 0, 0.42166],\n    \"115\": [0, 0.43056, 0.08208, 0, 0.40889],\n    \"116\": [0, 0.61508, 0.09486, 0, 0.33222],\n    \"117\": [0, 0.43056, 0.07671, 0, 0.53666],\n    \"118\": [0, 0.43056, 0.10764, 0, 0.46],\n    \"119\": [0, 0.43056, 0.10764, 0, 0.66444],\n    \"120\": [0, 0.43056, 0.12042, 0, 0.46389],\n    \"121\": [0.19444, 0.43056, 0.08847, 0, 0.48555],\n    \"122\": [0, 0.43056, 0.12292, 0, 0.40889],\n    \"126\": [0.35, 0.31786, 0.11585, 0, 0.51111],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.66786, 0.10474, 0, 0.51111],\n    \"176\": [0, 0.69444, 0, 0, 0.83129],\n    \"184\": [0.17014, 0, 0, 0, 0.46],\n    \"198\": [0, 0.68333, 0.12028, 0, 0.88277],\n    \"216\": [0.04861, 0.73194, 0.09403, 0, 0.76666],\n    \"223\": [0.19444, 0.69444, 0.10514, 0, 0.53666],\n    \"230\": [0, 0.43056, 0.07514, 0, 0.71555],\n    \"248\": [0.09722, 0.52778, 0.09194, 0, 0.51111],\n    \"338\": [0, 0.68333, 0.12028, 0, 0.98499],\n    \"339\": [0, 0.43056, 0.07514, 0, 0.71555],\n    \"710\": [0, 0.69444, 0.06646, 0, 0.51111],\n    \"711\": [0, 0.62847, 0.08295, 0, 0.51111],\n    \"713\": [0, 0.56167, 0.10333, 0, 0.51111],\n    \"714\": [0, 0.69444, 0.09694, 0, 0.51111],\n    \"715\": [0, 0.69444, 0, 0, 0.51111],\n    \"728\": [0, 0.69444, 0.10806, 0, 0.51111],\n    \"729\": [0, 0.66786, 0.11752, 0, 0.30667],\n    \"730\": [0, 0.69444, 0, 0, 0.83129],\n    \"732\": [0, 0.66786, 0.11585, 0, 0.51111],\n    \"733\": [0, 0.69444, 0.1225, 0, 0.51111],\n    \"915\": [0, 0.68333, 0.13305, 0, 0.62722],\n    \"916\": [0, 0.68333, 0, 0, 0.81777],\n    \"920\": [0, 0.68333, 0.09403, 0, 0.76666],\n    \"923\": [0, 0.68333, 0, 0, 0.69222],\n    \"926\": [0, 0.68333, 0.15294, 0, 0.66444],\n    \"928\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"931\": [0, 0.68333, 0.12028, 0, 0.71555],\n    \"933\": [0, 0.68333, 0.11111, 0, 0.76666],\n    \"934\": [0, 0.68333, 0.05986, 0, 0.71555],\n    \"936\": [0, 0.68333, 0.11111, 0, 0.76666],\n    \"937\": [0, 0.68333, 0.10257, 0, 0.71555],\n    \"8211\": [0, 0.43056, 0.09208, 0, 0.51111],\n    \"8212\": [0, 0.43056, 0.09208, 0, 1.02222],\n    \"8216\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"8217\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"8220\": [0, 0.69444, 0.1685, 0, 0.51444],\n    \"8221\": [0, 0.69444, 0.06961, 0, 0.51444],\n    \"8463\": [0, 0.68889, 0, 0, 0.54028]\n  },\n  \"Main-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.27778],\n    \"34\": [0, 0.69444, 0, 0, 0.5],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.83334],\n    \"36\": [0.05556, 0.75, 0, 0, 0.5],\n    \"37\": [0.05556, 0.75, 0, 0, 0.83334],\n    \"38\": [0, 0.69444, 0, 0, 0.77778],\n    \"39\": [0, 0.69444, 0, 0, 0.27778],\n    \"40\": [0.25, 0.75, 0, 0, 0.38889],\n    \"41\": [0.25, 0.75, 0, 0, 0.38889],\n    \"42\": [0, 0.75, 0, 0, 0.5],\n    \"43\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"44\": [0.19444, 0.10556, 0, 0, 0.27778],\n    \"45\": [0, 0.43056, 0, 0, 0.33333],\n    \"46\": [0, 0.10556, 0, 0, 0.27778],\n    \"47\": [0.25, 0.75, 0, 0, 0.5],\n    \"48\": [0, 0.64444, 0, 0, 0.5],\n    \"49\": [0, 0.64444, 0, 0, 0.5],\n    \"50\": [0, 0.64444, 0, 0, 0.5],\n    \"51\": [0, 0.64444, 0, 0, 0.5],\n    \"52\": [0, 0.64444, 0, 0, 0.5],\n    \"53\": [0, 0.64444, 0, 0, 0.5],\n    \"54\": [0, 0.64444, 0, 0, 0.5],\n    \"55\": [0, 0.64444, 0, 0, 0.5],\n    \"56\": [0, 0.64444, 0, 0, 0.5],\n    \"57\": [0, 0.64444, 0, 0, 0.5],\n    \"58\": [0, 0.43056, 0, 0, 0.27778],\n    \"59\": [0.19444, 0.43056, 0, 0, 0.27778],\n    \"60\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"61\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"62\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"63\": [0, 0.69444, 0, 0, 0.47222],\n    \"64\": [0, 0.69444, 0, 0, 0.77778],\n    \"65\": [0, 0.68333, 0, 0, 0.75],\n    \"66\": [0, 0.68333, 0, 0, 0.70834],\n    \"67\": [0, 0.68333, 0, 0, 0.72222],\n    \"68\": [0, 0.68333, 0, 0, 0.76389],\n    \"69\": [0, 0.68333, 0, 0, 0.68056],\n    \"70\": [0, 0.68333, 0, 0, 0.65278],\n    \"71\": [0, 0.68333, 0, 0, 0.78472],\n    \"72\": [0, 0.68333, 0, 0, 0.75],\n    \"73\": [0, 0.68333, 0, 0, 0.36111],\n    \"74\": [0, 0.68333, 0, 0, 0.51389],\n    \"75\": [0, 0.68333, 0, 0, 0.77778],\n    \"76\": [0, 0.68333, 0, 0, 0.625],\n    \"77\": [0, 0.68333, 0, 0, 0.91667],\n    \"78\": [0, 0.68333, 0, 0, 0.75],\n    \"79\": [0, 0.68333, 0, 0, 0.77778],\n    \"80\": [0, 0.68333, 0, 0, 0.68056],\n    \"81\": [0.19444, 0.68333, 0, 0, 0.77778],\n    \"82\": [0, 0.68333, 0, 0, 0.73611],\n    \"83\": [0, 0.68333, 0, 0, 0.55556],\n    \"84\": [0, 0.68333, 0, 0, 0.72222],\n    \"85\": [0, 0.68333, 0, 0, 0.75],\n    \"86\": [0, 0.68333, 0.01389, 0, 0.75],\n    \"87\": [0, 0.68333, 0.01389, 0, 1.02778],\n    \"88\": [0, 0.68333, 0, 0, 0.75],\n    \"89\": [0, 0.68333, 0.025, 0, 0.75],\n    \"90\": [0, 0.68333, 0, 0, 0.61111],\n    \"91\": [0.25, 0.75, 0, 0, 0.27778],\n    \"92\": [0.25, 0.75, 0, 0, 0.5],\n    \"93\": [0.25, 0.75, 0, 0, 0.27778],\n    \"94\": [0, 0.69444, 0, 0, 0.5],\n    \"95\": [0.31, 0.12056, 0.02778, 0, 0.5],\n    \"97\": [0, 0.43056, 0, 0, 0.5],\n    \"98\": [0, 0.69444, 0, 0, 0.55556],\n    \"99\": [0, 0.43056, 0, 0, 0.44445],\n    \"100\": [0, 0.69444, 0, 0, 0.55556],\n    \"101\": [0, 0.43056, 0, 0, 0.44445],\n    \"102\": [0, 0.69444, 0.07778, 0, 0.30556],\n    \"103\": [0.19444, 0.43056, 0.01389, 0, 0.5],\n    \"104\": [0, 0.69444, 0, 0, 0.55556],\n    \"105\": [0, 0.66786, 0, 0, 0.27778],\n    \"106\": [0.19444, 0.66786, 0, 0, 0.30556],\n    \"107\": [0, 0.69444, 0, 0, 0.52778],\n    \"108\": [0, 0.69444, 0, 0, 0.27778],\n    \"109\": [0, 0.43056, 0, 0, 0.83334],\n    \"110\": [0, 0.43056, 0, 0, 0.55556],\n    \"111\": [0, 0.43056, 0, 0, 0.5],\n    \"112\": [0.19444, 0.43056, 0, 0, 0.55556],\n    \"113\": [0.19444, 0.43056, 0, 0, 0.52778],\n    \"114\": [0, 0.43056, 0, 0, 0.39167],\n    \"115\": [0, 0.43056, 0, 0, 0.39445],\n    \"116\": [0, 0.61508, 0, 0, 0.38889],\n    \"117\": [0, 0.43056, 0, 0, 0.55556],\n    \"118\": [0, 0.43056, 0.01389, 0, 0.52778],\n    \"119\": [0, 0.43056, 0.01389, 0, 0.72222],\n    \"120\": [0, 0.43056, 0, 0, 0.52778],\n    \"121\": [0.19444, 0.43056, 0.01389, 0, 0.52778],\n    \"122\": [0, 0.43056, 0, 0, 0.44445],\n    \"123\": [0.25, 0.75, 0, 0, 0.5],\n    \"124\": [0.25, 0.75, 0, 0, 0.27778],\n    \"125\": [0.25, 0.75, 0, 0, 0.5],\n    \"126\": [0.35, 0.31786, 0, 0, 0.5],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"163\": [0, 0.69444, 0, 0, 0.76909],\n    \"167\": [0.19444, 0.69444, 0, 0, 0.44445],\n    \"168\": [0, 0.66786, 0, 0, 0.5],\n    \"172\": [0, 0.43056, 0, 0, 0.66667],\n    \"176\": [0, 0.69444, 0, 0, 0.75],\n    \"177\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"182\": [0.19444, 0.69444, 0, 0, 0.61111],\n    \"184\": [0.17014, 0, 0, 0, 0.44445],\n    \"198\": [0, 0.68333, 0, 0, 0.90278],\n    \"215\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"216\": [0.04861, 0.73194, 0, 0, 0.77778],\n    \"223\": [0, 0.69444, 0, 0, 0.5],\n    \"230\": [0, 0.43056, 0, 0, 0.72222],\n    \"247\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"248\": [0.09722, 0.52778, 0, 0, 0.5],\n    \"305\": [0, 0.43056, 0, 0, 0.27778],\n    \"338\": [0, 0.68333, 0, 0, 1.01389],\n    \"339\": [0, 0.43056, 0, 0, 0.77778],\n    \"567\": [0.19444, 0.43056, 0, 0, 0.30556],\n    \"710\": [0, 0.69444, 0, 0, 0.5],\n    \"711\": [0, 0.62847, 0, 0, 0.5],\n    \"713\": [0, 0.56778, 0, 0, 0.5],\n    \"714\": [0, 0.69444, 0, 0, 0.5],\n    \"715\": [0, 0.69444, 0, 0, 0.5],\n    \"728\": [0, 0.69444, 0, 0, 0.5],\n    \"729\": [0, 0.66786, 0, 0, 0.27778],\n    \"730\": [0, 0.69444, 0, 0, 0.75],\n    \"732\": [0, 0.66786, 0, 0, 0.5],\n    \"733\": [0, 0.69444, 0, 0, 0.5],\n    \"915\": [0, 0.68333, 0, 0, 0.625],\n    \"916\": [0, 0.68333, 0, 0, 0.83334],\n    \"920\": [0, 0.68333, 0, 0, 0.77778],\n    \"923\": [0, 0.68333, 0, 0, 0.69445],\n    \"926\": [0, 0.68333, 0, 0, 0.66667],\n    \"928\": [0, 0.68333, 0, 0, 0.75],\n    \"931\": [0, 0.68333, 0, 0, 0.72222],\n    \"933\": [0, 0.68333, 0, 0, 0.77778],\n    \"934\": [0, 0.68333, 0, 0, 0.72222],\n    \"936\": [0, 0.68333, 0, 0, 0.77778],\n    \"937\": [0, 0.68333, 0, 0, 0.72222],\n    \"8211\": [0, 0.43056, 0.02778, 0, 0.5],\n    \"8212\": [0, 0.43056, 0.02778, 0, 1.0],\n    \"8216\": [0, 0.69444, 0, 0, 0.27778],\n    \"8217\": [0, 0.69444, 0, 0, 0.27778],\n    \"8220\": [0, 0.69444, 0, 0, 0.5],\n    \"8221\": [0, 0.69444, 0, 0, 0.5],\n    \"8224\": [0.19444, 0.69444, 0, 0, 0.44445],\n    \"8225\": [0.19444, 0.69444, 0, 0, 0.44445],\n    \"8230\": [0, 0.123, 0, 0, 1.172],\n    \"8242\": [0, 0.55556, 0, 0, 0.275],\n    \"8407\": [0, 0.71444, 0.15382, 0, 0.5],\n    \"8463\": [0, 0.68889, 0, 0, 0.54028],\n    \"8465\": [0, 0.69444, 0, 0, 0.72222],\n    \"8467\": [0, 0.69444, 0, 0.11111, 0.41667],\n    \"8472\": [0.19444, 0.43056, 0, 0.11111, 0.63646],\n    \"8476\": [0, 0.69444, 0, 0, 0.72222],\n    \"8501\": [0, 0.69444, 0, 0, 0.61111],\n    \"8592\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8593\": [0.19444, 0.69444, 0, 0, 0.5],\n    \"8594\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8595\": [0.19444, 0.69444, 0, 0, 0.5],\n    \"8596\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8597\": [0.25, 0.75, 0, 0, 0.5],\n    \"8598\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8599\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8600\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8601\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8614\": [0.011, 0.511, 0, 0, 1.0],\n    \"8617\": [0.011, 0.511, 0, 0, 1.126],\n    \"8618\": [0.011, 0.511, 0, 0, 1.126],\n    \"8636\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8637\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8640\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8641\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8652\": [0.011, 0.671, 0, 0, 1.0],\n    \"8656\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8657\": [0.19444, 0.69444, 0, 0, 0.61111],\n    \"8658\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8659\": [0.19444, 0.69444, 0, 0, 0.61111],\n    \"8660\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8661\": [0.25, 0.75, 0, 0, 0.61111],\n    \"8704\": [0, 0.69444, 0, 0, 0.55556],\n    \"8706\": [0, 0.69444, 0.05556, 0.08334, 0.5309],\n    \"8707\": [0, 0.69444, 0, 0, 0.55556],\n    \"8709\": [0.05556, 0.75, 0, 0, 0.5],\n    \"8711\": [0, 0.68333, 0, 0, 0.83334],\n    \"8712\": [0.0391, 0.5391, 0, 0, 0.66667],\n    \"8715\": [0.0391, 0.5391, 0, 0, 0.66667],\n    \"8722\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8723\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8725\": [0.25, 0.75, 0, 0, 0.5],\n    \"8726\": [0.25, 0.75, 0, 0, 0.5],\n    \"8727\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"8728\": [-0.05555, 0.44445, 0, 0, 0.5],\n    \"8729\": [-0.05555, 0.44445, 0, 0, 0.5],\n    \"8730\": [0.2, 0.8, 0, 0, 0.83334],\n    \"8733\": [0, 0.43056, 0, 0, 0.77778],\n    \"8734\": [0, 0.43056, 0, 0, 1.0],\n    \"8736\": [0, 0.69224, 0, 0, 0.72222],\n    \"8739\": [0.25, 0.75, 0, 0, 0.27778],\n    \"8741\": [0.25, 0.75, 0, 0, 0.5],\n    \"8743\": [0, 0.55556, 0, 0, 0.66667],\n    \"8744\": [0, 0.55556, 0, 0, 0.66667],\n    \"8745\": [0, 0.55556, 0, 0, 0.66667],\n    \"8746\": [0, 0.55556, 0, 0, 0.66667],\n    \"8747\": [0.19444, 0.69444, 0.11111, 0, 0.41667],\n    \"8764\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"8768\": [0.19444, 0.69444, 0, 0, 0.27778],\n    \"8771\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8773\": [-0.022, 0.589, 0, 0, 0.778],\n    \"8776\": [-0.01688, 0.48312, 0, 0, 0.77778],\n    \"8781\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8784\": [-0.133, 0.673, 0, 0, 0.778],\n    \"8801\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8804\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8805\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8810\": [0.0391, 0.5391, 0, 0, 1.0],\n    \"8811\": [0.0391, 0.5391, 0, 0, 1.0],\n    \"8826\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8827\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8834\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8835\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8838\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8839\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8846\": [0, 0.55556, 0, 0, 0.66667],\n    \"8849\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8850\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8851\": [0, 0.55556, 0, 0, 0.66667],\n    \"8852\": [0, 0.55556, 0, 0, 0.66667],\n    \"8853\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8854\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8855\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8856\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8857\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8866\": [0, 0.69444, 0, 0, 0.61111],\n    \"8867\": [0, 0.69444, 0, 0, 0.61111],\n    \"8868\": [0, 0.69444, 0, 0, 0.77778],\n    \"8869\": [0, 0.69444, 0, 0, 0.77778],\n    \"8872\": [0.249, 0.75, 0, 0, 0.867],\n    \"8900\": [-0.05555, 0.44445, 0, 0, 0.5],\n    \"8901\": [-0.05555, 0.44445, 0, 0, 0.27778],\n    \"8902\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"8904\": [0.005, 0.505, 0, 0, 0.9],\n    \"8942\": [0.03, 0.903, 0, 0, 0.278],\n    \"8943\": [-0.19, 0.313, 0, 0, 1.172],\n    \"8945\": [-0.1, 0.823, 0, 0, 1.282],\n    \"8968\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8969\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8970\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8971\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8994\": [-0.14236, 0.35764, 0, 0, 1.0],\n    \"8995\": [-0.14236, 0.35764, 0, 0, 1.0],\n    \"9136\": [0.244, 0.744, 0, 0, 0.412],\n    \"9137\": [0.244, 0.745, 0, 0, 0.412],\n    \"9651\": [0.19444, 0.69444, 0, 0, 0.88889],\n    \"9657\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"9661\": [0.19444, 0.69444, 0, 0, 0.88889],\n    \"9667\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"9711\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"9824\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9825\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9826\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9827\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9837\": [0, 0.75, 0, 0, 0.38889],\n    \"9838\": [0.19444, 0.69444, 0, 0, 0.38889],\n    \"9839\": [0.19444, 0.69444, 0, 0, 0.38889],\n    \"10216\": [0.25, 0.75, 0, 0, 0.38889],\n    \"10217\": [0.25, 0.75, 0, 0, 0.38889],\n    \"10222\": [0.244, 0.744, 0, 0, 0.412],\n    \"10223\": [0.244, 0.745, 0, 0, 0.412],\n    \"10229\": [0.011, 0.511, 0, 0, 1.609],\n    \"10230\": [0.011, 0.511, 0, 0, 1.638],\n    \"10231\": [0.011, 0.511, 0, 0, 1.859],\n    \"10232\": [0.024, 0.525, 0, 0, 1.609],\n    \"10233\": [0.024, 0.525, 0, 0, 1.638],\n    \"10234\": [0.024, 0.525, 0, 0, 1.858],\n    \"10236\": [0.011, 0.511, 0, 0, 1.638],\n    \"10815\": [0, 0.68333, 0, 0, 0.75],\n    \"10927\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"10928\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"57376\": [0.19444, 0.69444, 0, 0, 0]\n  },\n  \"Math-BoldItalic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"48\": [0, 0.44444, 0, 0, 0.575],\n    \"49\": [0, 0.44444, 0, 0, 0.575],\n    \"50\": [0, 0.44444, 0, 0, 0.575],\n    \"51\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"52\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"53\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"54\": [0, 0.64444, 0, 0, 0.575],\n    \"55\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"56\": [0, 0.64444, 0, 0, 0.575],\n    \"57\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"65\": [0, 0.68611, 0, 0, 0.86944],\n    \"66\": [0, 0.68611, 0.04835, 0, 0.8664],\n    \"67\": [0, 0.68611, 0.06979, 0, 0.81694],\n    \"68\": [0, 0.68611, 0.03194, 0, 0.93812],\n    \"69\": [0, 0.68611, 0.05451, 0, 0.81007],\n    \"70\": [0, 0.68611, 0.15972, 0, 0.68889],\n    \"71\": [0, 0.68611, 0, 0, 0.88673],\n    \"72\": [0, 0.68611, 0.08229, 0, 0.98229],\n    \"73\": [0, 0.68611, 0.07778, 0, 0.51111],\n    \"74\": [0, 0.68611, 0.10069, 0, 0.63125],\n    \"75\": [0, 0.68611, 0.06979, 0, 0.97118],\n    \"76\": [0, 0.68611, 0, 0, 0.75555],\n    \"77\": [0, 0.68611, 0.11424, 0, 1.14201],\n    \"78\": [0, 0.68611, 0.11424, 0, 0.95034],\n    \"79\": [0, 0.68611, 0.03194, 0, 0.83666],\n    \"80\": [0, 0.68611, 0.15972, 0, 0.72309],\n    \"81\": [0.19444, 0.68611, 0, 0, 0.86861],\n    \"82\": [0, 0.68611, 0.00421, 0, 0.87235],\n    \"83\": [0, 0.68611, 0.05382, 0, 0.69271],\n    \"84\": [0, 0.68611, 0.15972, 0, 0.63663],\n    \"85\": [0, 0.68611, 0.11424, 0, 0.80027],\n    \"86\": [0, 0.68611, 0.25555, 0, 0.67778],\n    \"87\": [0, 0.68611, 0.15972, 0, 1.09305],\n    \"88\": [0, 0.68611, 0.07778, 0, 0.94722],\n    \"89\": [0, 0.68611, 0.25555, 0, 0.67458],\n    \"90\": [0, 0.68611, 0.06979, 0, 0.77257],\n    \"97\": [0, 0.44444, 0, 0, 0.63287],\n    \"98\": [0, 0.69444, 0, 0, 0.52083],\n    \"99\": [0, 0.44444, 0, 0, 0.51342],\n    \"100\": [0, 0.69444, 0, 0, 0.60972],\n    \"101\": [0, 0.44444, 0, 0, 0.55361],\n    \"102\": [0.19444, 0.69444, 0.11042, 0, 0.56806],\n    \"103\": [0.19444, 0.44444, 0.03704, 0, 0.5449],\n    \"104\": [0, 0.69444, 0, 0, 0.66759],\n    \"105\": [0, 0.69326, 0, 0, 0.4048],\n    \"106\": [0.19444, 0.69326, 0.0622, 0, 0.47083],\n    \"107\": [0, 0.69444, 0.01852, 0, 0.6037],\n    \"108\": [0, 0.69444, 0.0088, 0, 0.34815],\n    \"109\": [0, 0.44444, 0, 0, 1.0324],\n    \"110\": [0, 0.44444, 0, 0, 0.71296],\n    \"111\": [0, 0.44444, 0, 0, 0.58472],\n    \"112\": [0.19444, 0.44444, 0, 0, 0.60092],\n    \"113\": [0.19444, 0.44444, 0.03704, 0, 0.54213],\n    \"114\": [0, 0.44444, 0.03194, 0, 0.5287],\n    \"115\": [0, 0.44444, 0, 0, 0.53125],\n    \"116\": [0, 0.63492, 0, 0, 0.41528],\n    \"117\": [0, 0.44444, 0, 0, 0.68102],\n    \"118\": [0, 0.44444, 0.03704, 0, 0.56666],\n    \"119\": [0, 0.44444, 0.02778, 0, 0.83148],\n    \"120\": [0, 0.44444, 0, 0, 0.65903],\n    \"121\": [0.19444, 0.44444, 0.03704, 0, 0.59028],\n    \"122\": [0, 0.44444, 0.04213, 0, 0.55509],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"915\": [0, 0.68611, 0.15972, 0, 0.65694],\n    \"916\": [0, 0.68611, 0, 0, 0.95833],\n    \"920\": [0, 0.68611, 0.03194, 0, 0.86722],\n    \"923\": [0, 0.68611, 0, 0, 0.80555],\n    \"926\": [0, 0.68611, 0.07458, 0, 0.84125],\n    \"928\": [0, 0.68611, 0.08229, 0, 0.98229],\n    \"931\": [0, 0.68611, 0.05451, 0, 0.88507],\n    \"933\": [0, 0.68611, 0.15972, 0, 0.67083],\n    \"934\": [0, 0.68611, 0, 0, 0.76666],\n    \"936\": [0, 0.68611, 0.11653, 0, 0.71402],\n    \"937\": [0, 0.68611, 0.04835, 0, 0.8789],\n    \"945\": [0, 0.44444, 0, 0, 0.76064],\n    \"946\": [0.19444, 0.69444, 0.03403, 0, 0.65972],\n    \"947\": [0.19444, 0.44444, 0.06389, 0, 0.59003],\n    \"948\": [0, 0.69444, 0.03819, 0, 0.52222],\n    \"949\": [0, 0.44444, 0, 0, 0.52882],\n    \"950\": [0.19444, 0.69444, 0.06215, 0, 0.50833],\n    \"951\": [0.19444, 0.44444, 0.03704, 0, 0.6],\n    \"952\": [0, 0.69444, 0.03194, 0, 0.5618],\n    \"953\": [0, 0.44444, 0, 0, 0.41204],\n    \"954\": [0, 0.44444, 0, 0, 0.66759],\n    \"955\": [0, 0.69444, 0, 0, 0.67083],\n    \"956\": [0.19444, 0.44444, 0, 0, 0.70787],\n    \"957\": [0, 0.44444, 0.06898, 0, 0.57685],\n    \"958\": [0.19444, 0.69444, 0.03021, 0, 0.50833],\n    \"959\": [0, 0.44444, 0, 0, 0.58472],\n    \"960\": [0, 0.44444, 0.03704, 0, 0.68241],\n    \"961\": [0.19444, 0.44444, 0, 0, 0.6118],\n    \"962\": [0.09722, 0.44444, 0.07917, 0, 0.42361],\n    \"963\": [0, 0.44444, 0.03704, 0, 0.68588],\n    \"964\": [0, 0.44444, 0.13472, 0, 0.52083],\n    \"965\": [0, 0.44444, 0.03704, 0, 0.63055],\n    \"966\": [0.19444, 0.44444, 0, 0, 0.74722],\n    \"967\": [0.19444, 0.44444, 0, 0, 0.71805],\n    \"968\": [0.19444, 0.69444, 0.03704, 0, 0.75833],\n    \"969\": [0, 0.44444, 0.03704, 0, 0.71782],\n    \"977\": [0, 0.69444, 0, 0, 0.69155],\n    \"981\": [0.19444, 0.69444, 0, 0, 0.7125],\n    \"982\": [0, 0.44444, 0.03194, 0, 0.975],\n    \"1009\": [0.19444, 0.44444, 0, 0, 0.6118],\n    \"1013\": [0, 0.44444, 0, 0, 0.48333],\n    \"57649\": [0, 0.44444, 0, 0, 0.39352],\n    \"57911\": [0.19444, 0.44444, 0, 0, 0.43889]\n  },\n  \"Math-Italic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"48\": [0, 0.43056, 0, 0, 0.5],\n    \"49\": [0, 0.43056, 0, 0, 0.5],\n    \"50\": [0, 0.43056, 0, 0, 0.5],\n    \"51\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"52\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"53\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"54\": [0, 0.64444, 0, 0, 0.5],\n    \"55\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"56\": [0, 0.64444, 0, 0, 0.5],\n    \"57\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"65\": [0, 0.68333, 0, 0.13889, 0.75],\n    \"66\": [0, 0.68333, 0.05017, 0.08334, 0.75851],\n    \"67\": [0, 0.68333, 0.07153, 0.08334, 0.71472],\n    \"68\": [0, 0.68333, 0.02778, 0.05556, 0.82792],\n    \"69\": [0, 0.68333, 0.05764, 0.08334, 0.7382],\n    \"70\": [0, 0.68333, 0.13889, 0.08334, 0.64306],\n    \"71\": [0, 0.68333, 0, 0.08334, 0.78625],\n    \"72\": [0, 0.68333, 0.08125, 0.05556, 0.83125],\n    \"73\": [0, 0.68333, 0.07847, 0.11111, 0.43958],\n    \"74\": [0, 0.68333, 0.09618, 0.16667, 0.55451],\n    \"75\": [0, 0.68333, 0.07153, 0.05556, 0.84931],\n    \"76\": [0, 0.68333, 0, 0.02778, 0.68056],\n    \"77\": [0, 0.68333, 0.10903, 0.08334, 0.97014],\n    \"78\": [0, 0.68333, 0.10903, 0.08334, 0.80347],\n    \"79\": [0, 0.68333, 0.02778, 0.08334, 0.76278],\n    \"80\": [0, 0.68333, 0.13889, 0.08334, 0.64201],\n    \"81\": [0.19444, 0.68333, 0, 0.08334, 0.79056],\n    \"82\": [0, 0.68333, 0.00773, 0.08334, 0.75929],\n    \"83\": [0, 0.68333, 0.05764, 0.08334, 0.6132],\n    \"84\": [0, 0.68333, 0.13889, 0.08334, 0.58438],\n    \"85\": [0, 0.68333, 0.10903, 0.02778, 0.68278],\n    \"86\": [0, 0.68333, 0.22222, 0, 0.58333],\n    \"87\": [0, 0.68333, 0.13889, 0, 0.94445],\n    \"88\": [0, 0.68333, 0.07847, 0.08334, 0.82847],\n    \"89\": [0, 0.68333, 0.22222, 0, 0.58056],\n    \"90\": [0, 0.68333, 0.07153, 0.08334, 0.68264],\n    \"97\": [0, 0.43056, 0, 0, 0.52859],\n    \"98\": [0, 0.69444, 0, 0, 0.42917],\n    \"99\": [0, 0.43056, 0, 0.05556, 0.43276],\n    \"100\": [0, 0.69444, 0, 0.16667, 0.52049],\n    \"101\": [0, 0.43056, 0, 0.05556, 0.46563],\n    \"102\": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],\n    \"103\": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],\n    \"104\": [0, 0.69444, 0, 0, 0.57616],\n    \"105\": [0, 0.65952, 0, 0, 0.34451],\n    \"106\": [0.19444, 0.65952, 0.05724, 0, 0.41181],\n    \"107\": [0, 0.69444, 0.03148, 0, 0.5206],\n    \"108\": [0, 0.69444, 0.01968, 0.08334, 0.29838],\n    \"109\": [0, 0.43056, 0, 0, 0.87801],\n    \"110\": [0, 0.43056, 0, 0, 0.60023],\n    \"111\": [0, 0.43056, 0, 0.05556, 0.48472],\n    \"112\": [0.19444, 0.43056, 0, 0.08334, 0.50313],\n    \"113\": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],\n    \"114\": [0, 0.43056, 0.02778, 0.05556, 0.45116],\n    \"115\": [0, 0.43056, 0, 0.05556, 0.46875],\n    \"116\": [0, 0.61508, 0, 0.08334, 0.36111],\n    \"117\": [0, 0.43056, 0, 0.02778, 0.57246],\n    \"118\": [0, 0.43056, 0.03588, 0.02778, 0.48472],\n    \"119\": [0, 0.43056, 0.02691, 0.08334, 0.71592],\n    \"120\": [0, 0.43056, 0, 0.02778, 0.57153],\n    \"121\": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],\n    \"122\": [0, 0.43056, 0.04398, 0.05556, 0.46505],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"915\": [0, 0.68333, 0.13889, 0.08334, 0.61528],\n    \"916\": [0, 0.68333, 0, 0.16667, 0.83334],\n    \"920\": [0, 0.68333, 0.02778, 0.08334, 0.76278],\n    \"923\": [0, 0.68333, 0, 0.16667, 0.69445],\n    \"926\": [0, 0.68333, 0.07569, 0.08334, 0.74236],\n    \"928\": [0, 0.68333, 0.08125, 0.05556, 0.83125],\n    \"931\": [0, 0.68333, 0.05764, 0.08334, 0.77986],\n    \"933\": [0, 0.68333, 0.13889, 0.05556, 0.58333],\n    \"934\": [0, 0.68333, 0, 0.08334, 0.66667],\n    \"936\": [0, 0.68333, 0.11, 0.05556, 0.61222],\n    \"937\": [0, 0.68333, 0.05017, 0.08334, 0.7724],\n    \"945\": [0, 0.43056, 0.0037, 0.02778, 0.6397],\n    \"946\": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],\n    \"947\": [0.19444, 0.43056, 0.05556, 0, 0.51773],\n    \"948\": [0, 0.69444, 0.03785, 0.05556, 0.44444],\n    \"949\": [0, 0.43056, 0, 0.08334, 0.46632],\n    \"950\": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],\n    \"951\": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],\n    \"952\": [0, 0.69444, 0.02778, 0.08334, 0.46944],\n    \"953\": [0, 0.43056, 0, 0.05556, 0.35394],\n    \"954\": [0, 0.43056, 0, 0, 0.57616],\n    \"955\": [0, 0.69444, 0, 0, 0.58334],\n    \"956\": [0.19444, 0.43056, 0, 0.02778, 0.60255],\n    \"957\": [0, 0.43056, 0.06366, 0.02778, 0.49398],\n    \"958\": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],\n    \"959\": [0, 0.43056, 0, 0.05556, 0.48472],\n    \"960\": [0, 0.43056, 0.03588, 0, 0.57003],\n    \"961\": [0.19444, 0.43056, 0, 0.08334, 0.51702],\n    \"962\": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],\n    \"963\": [0, 0.43056, 0.03588, 0, 0.57141],\n    \"964\": [0, 0.43056, 0.1132, 0.02778, 0.43715],\n    \"965\": [0, 0.43056, 0.03588, 0.02778, 0.54028],\n    \"966\": [0.19444, 0.43056, 0, 0.08334, 0.65417],\n    \"967\": [0.19444, 0.43056, 0, 0.05556, 0.62569],\n    \"968\": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],\n    \"969\": [0, 0.43056, 0.03588, 0, 0.62245],\n    \"977\": [0, 0.69444, 0, 0.08334, 0.59144],\n    \"981\": [0.19444, 0.69444, 0, 0.08334, 0.59583],\n    \"982\": [0, 0.43056, 0.02778, 0, 0.82813],\n    \"1009\": [0.19444, 0.43056, 0, 0.08334, 0.51702],\n    \"1013\": [0, 0.43056, 0, 0.05556, 0.4059],\n    \"57649\": [0, 0.43056, 0, 0.02778, 0.32246],\n    \"57911\": [0.19444, 0.43056, 0, 0.08334, 0.38403]\n  },\n  \"SansSerif-Bold\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.36667],\n    \"34\": [0, 0.69444, 0, 0, 0.55834],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.91667],\n    \"36\": [0.05556, 0.75, 0, 0, 0.55],\n    \"37\": [0.05556, 0.75, 0, 0, 1.02912],\n    \"38\": [0, 0.69444, 0, 0, 0.83056],\n    \"39\": [0, 0.69444, 0, 0, 0.30556],\n    \"40\": [0.25, 0.75, 0, 0, 0.42778],\n    \"41\": [0.25, 0.75, 0, 0, 0.42778],\n    \"42\": [0, 0.75, 0, 0, 0.55],\n    \"43\": [0.11667, 0.61667, 0, 0, 0.85556],\n    \"44\": [0.10556, 0.13056, 0, 0, 0.30556],\n    \"45\": [0, 0.45833, 0, 0, 0.36667],\n    \"46\": [0, 0.13056, 0, 0, 0.30556],\n    \"47\": [0.25, 0.75, 0, 0, 0.55],\n    \"48\": [0, 0.69444, 0, 0, 0.55],\n    \"49\": [0, 0.69444, 0, 0, 0.55],\n    \"50\": [0, 0.69444, 0, 0, 0.55],\n    \"51\": [0, 0.69444, 0, 0, 0.55],\n    \"52\": [0, 0.69444, 0, 0, 0.55],\n    \"53\": [0, 0.69444, 0, 0, 0.55],\n    \"54\": [0, 0.69444, 0, 0, 0.55],\n    \"55\": [0, 0.69444, 0, 0, 0.55],\n    \"56\": [0, 0.69444, 0, 0, 0.55],\n    \"57\": [0, 0.69444, 0, 0, 0.55],\n    \"58\": [0, 0.45833, 0, 0, 0.30556],\n    \"59\": [0.10556, 0.45833, 0, 0, 0.30556],\n    \"61\": [-0.09375, 0.40625, 0, 0, 0.85556],\n    \"63\": [0, 0.69444, 0, 0, 0.51945],\n    \"64\": [0, 0.69444, 0, 0, 0.73334],\n    \"65\": [0, 0.69444, 0, 0, 0.73334],\n    \"66\": [0, 0.69444, 0, 0, 0.73334],\n    \"67\": [0, 0.69444, 0, 0, 0.70278],\n    \"68\": [0, 0.69444, 0, 0, 0.79445],\n    \"69\": [0, 0.69444, 0, 0, 0.64167],\n    \"70\": [0, 0.69444, 0, 0, 0.61111],\n    \"71\": [0, 0.69444, 0, 0, 0.73334],\n    \"72\": [0, 0.69444, 0, 0, 0.79445],\n    \"73\": [0, 0.69444, 0, 0, 0.33056],\n    \"74\": [0, 0.69444, 0, 0, 0.51945],\n    \"75\": [0, 0.69444, 0, 0, 0.76389],\n    \"76\": [0, 0.69444, 0, 0, 0.58056],\n    \"77\": [0, 0.69444, 0, 0, 0.97778],\n    \"78\": [0, 0.69444, 0, 0, 0.79445],\n    \"79\": [0, 0.69444, 0, 0, 0.79445],\n    \"80\": [0, 0.69444, 0, 0, 0.70278],\n    \"81\": [0.10556, 0.69444, 0, 0, 0.79445],\n    \"82\": [0, 0.69444, 0, 0, 0.70278],\n    \"83\": [0, 0.69444, 0, 0, 0.61111],\n    \"84\": [0, 0.69444, 0, 0, 0.73334],\n    \"85\": [0, 0.69444, 0, 0, 0.76389],\n    \"86\": [0, 0.69444, 0.01528, 0, 0.73334],\n    \"87\": [0, 0.69444, 0.01528, 0, 1.03889],\n    \"88\": [0, 0.69444, 0, 0, 0.73334],\n    \"89\": [0, 0.69444, 0.0275, 0, 0.73334],\n    \"90\": [0, 0.69444, 0, 0, 0.67223],\n    \"91\": [0.25, 0.75, 0, 0, 0.34306],\n    \"93\": [0.25, 0.75, 0, 0, 0.34306],\n    \"94\": [0, 0.69444, 0, 0, 0.55],\n    \"95\": [0.35, 0.10833, 0.03056, 0, 0.55],\n    \"97\": [0, 0.45833, 0, 0, 0.525],\n    \"98\": [0, 0.69444, 0, 0, 0.56111],\n    \"99\": [0, 0.45833, 0, 0, 0.48889],\n    \"100\": [0, 0.69444, 0, 0, 0.56111],\n    \"101\": [0, 0.45833, 0, 0, 0.51111],\n    \"102\": [0, 0.69444, 0.07639, 0, 0.33611],\n    \"103\": [0.19444, 0.45833, 0.01528, 0, 0.55],\n    \"104\": [0, 0.69444, 0, 0, 0.56111],\n    \"105\": [0, 0.69444, 0, 0, 0.25556],\n    \"106\": [0.19444, 0.69444, 0, 0, 0.28611],\n    \"107\": [0, 0.69444, 0, 0, 0.53056],\n    \"108\": [0, 0.69444, 0, 0, 0.25556],\n    \"109\": [0, 0.45833, 0, 0, 0.86667],\n    \"110\": [0, 0.45833, 0, 0, 0.56111],\n    \"111\": [0, 0.45833, 0, 0, 0.55],\n    \"112\": [0.19444, 0.45833, 0, 0, 0.56111],\n    \"113\": [0.19444, 0.45833, 0, 0, 0.56111],\n    \"114\": [0, 0.45833, 0.01528, 0, 0.37222],\n    \"115\": [0, 0.45833, 0, 0, 0.42167],\n    \"116\": [0, 0.58929, 0, 0, 0.40417],\n    \"117\": [0, 0.45833, 0, 0, 0.56111],\n    \"118\": [0, 0.45833, 0.01528, 0, 0.5],\n    \"119\": [0, 0.45833, 0.01528, 0, 0.74445],\n    \"120\": [0, 0.45833, 0, 0, 0.5],\n    \"121\": [0.19444, 0.45833, 0.01528, 0, 0.5],\n    \"122\": [0, 0.45833, 0, 0, 0.47639],\n    \"126\": [0.35, 0.34444, 0, 0, 0.55],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.69444, 0, 0, 0.55],\n    \"176\": [0, 0.69444, 0, 0, 0.73334],\n    \"180\": [0, 0.69444, 0, 0, 0.55],\n    \"184\": [0.17014, 0, 0, 0, 0.48889],\n    \"305\": [0, 0.45833, 0, 0, 0.25556],\n    \"567\": [0.19444, 0.45833, 0, 0, 0.28611],\n    \"710\": [0, 0.69444, 0, 0, 0.55],\n    \"711\": [0, 0.63542, 0, 0, 0.55],\n    \"713\": [0, 0.63778, 0, 0, 0.55],\n    \"728\": [0, 0.69444, 0, 0, 0.55],\n    \"729\": [0, 0.69444, 0, 0, 0.30556],\n    \"730\": [0, 0.69444, 0, 0, 0.73334],\n    \"732\": [0, 0.69444, 0, 0, 0.55],\n    \"733\": [0, 0.69444, 0, 0, 0.55],\n    \"915\": [0, 0.69444, 0, 0, 0.58056],\n    \"916\": [0, 0.69444, 0, 0, 0.91667],\n    \"920\": [0, 0.69444, 0, 0, 0.85556],\n    \"923\": [0, 0.69444, 0, 0, 0.67223],\n    \"926\": [0, 0.69444, 0, 0, 0.73334],\n    \"928\": [0, 0.69444, 0, 0, 0.79445],\n    \"931\": [0, 0.69444, 0, 0, 0.79445],\n    \"933\": [0, 0.69444, 0, 0, 0.85556],\n    \"934\": [0, 0.69444, 0, 0, 0.79445],\n    \"936\": [0, 0.69444, 0, 0, 0.85556],\n    \"937\": [0, 0.69444, 0, 0, 0.79445],\n    \"8211\": [0, 0.45833, 0.03056, 0, 0.55],\n    \"8212\": [0, 0.45833, 0.03056, 0, 1.10001],\n    \"8216\": [0, 0.69444, 0, 0, 0.30556],\n    \"8217\": [0, 0.69444, 0, 0, 0.30556],\n    \"8220\": [0, 0.69444, 0, 0, 0.55834],\n    \"8221\": [0, 0.69444, 0, 0, 0.55834]\n  },\n  \"SansSerif-Italic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0.05733, 0, 0.31945],\n    \"34\": [0, 0.69444, 0.00316, 0, 0.5],\n    \"35\": [0.19444, 0.69444, 0.05087, 0, 0.83334],\n    \"36\": [0.05556, 0.75, 0.11156, 0, 0.5],\n    \"37\": [0.05556, 0.75, 0.03126, 0, 0.83334],\n    \"38\": [0, 0.69444, 0.03058, 0, 0.75834],\n    \"39\": [0, 0.69444, 0.07816, 0, 0.27778],\n    \"40\": [0.25, 0.75, 0.13164, 0, 0.38889],\n    \"41\": [0.25, 0.75, 0.02536, 0, 0.38889],\n    \"42\": [0, 0.75, 0.11775, 0, 0.5],\n    \"43\": [0.08333, 0.58333, 0.02536, 0, 0.77778],\n    \"44\": [0.125, 0.08333, 0, 0, 0.27778],\n    \"45\": [0, 0.44444, 0.01946, 0, 0.33333],\n    \"46\": [0, 0.08333, 0, 0, 0.27778],\n    \"47\": [0.25, 0.75, 0.13164, 0, 0.5],\n    \"48\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"49\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"50\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"51\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"52\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"53\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"54\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"55\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"56\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"57\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"58\": [0, 0.44444, 0.02502, 0, 0.27778],\n    \"59\": [0.125, 0.44444, 0.02502, 0, 0.27778],\n    \"61\": [-0.13, 0.37, 0.05087, 0, 0.77778],\n    \"63\": [0, 0.69444, 0.11809, 0, 0.47222],\n    \"64\": [0, 0.69444, 0.07555, 0, 0.66667],\n    \"65\": [0, 0.69444, 0, 0, 0.66667],\n    \"66\": [0, 0.69444, 0.08293, 0, 0.66667],\n    \"67\": [0, 0.69444, 0.11983, 0, 0.63889],\n    \"68\": [0, 0.69444, 0.07555, 0, 0.72223],\n    \"69\": [0, 0.69444, 0.11983, 0, 0.59722],\n    \"70\": [0, 0.69444, 0.13372, 0, 0.56945],\n    \"71\": [0, 0.69444, 0.11983, 0, 0.66667],\n    \"72\": [0, 0.69444, 0.08094, 0, 0.70834],\n    \"73\": [0, 0.69444, 0.13372, 0, 0.27778],\n    \"74\": [0, 0.69444, 0.08094, 0, 0.47222],\n    \"75\": [0, 0.69444, 0.11983, 0, 0.69445],\n    \"76\": [0, 0.69444, 0, 0, 0.54167],\n    \"77\": [0, 0.69444, 0.08094, 0, 0.875],\n    \"78\": [0, 0.69444, 0.08094, 0, 0.70834],\n    \"79\": [0, 0.69444, 0.07555, 0, 0.73611],\n    \"80\": [0, 0.69444, 0.08293, 0, 0.63889],\n    \"81\": [0.125, 0.69444, 0.07555, 0, 0.73611],\n    \"82\": [0, 0.69444, 0.08293, 0, 0.64584],\n    \"83\": [0, 0.69444, 0.09205, 0, 0.55556],\n    \"84\": [0, 0.69444, 0.13372, 0, 0.68056],\n    \"85\": [0, 0.69444, 0.08094, 0, 0.6875],\n    \"86\": [0, 0.69444, 0.1615, 0, 0.66667],\n    \"87\": [0, 0.69444, 0.1615, 0, 0.94445],\n    \"88\": [0, 0.69444, 0.13372, 0, 0.66667],\n    \"89\": [0, 0.69444, 0.17261, 0, 0.66667],\n    \"90\": [0, 0.69444, 0.11983, 0, 0.61111],\n    \"91\": [0.25, 0.75, 0.15942, 0, 0.28889],\n    \"93\": [0.25, 0.75, 0.08719, 0, 0.28889],\n    \"94\": [0, 0.69444, 0.0799, 0, 0.5],\n    \"95\": [0.35, 0.09444, 0.08616, 0, 0.5],\n    \"97\": [0, 0.44444, 0.00981, 0, 0.48056],\n    \"98\": [0, 0.69444, 0.03057, 0, 0.51667],\n    \"99\": [0, 0.44444, 0.08336, 0, 0.44445],\n    \"100\": [0, 0.69444, 0.09483, 0, 0.51667],\n    \"101\": [0, 0.44444, 0.06778, 0, 0.44445],\n    \"102\": [0, 0.69444, 0.21705, 0, 0.30556],\n    \"103\": [0.19444, 0.44444, 0.10836, 0, 0.5],\n    \"104\": [0, 0.69444, 0.01778, 0, 0.51667],\n    \"105\": [0, 0.67937, 0.09718, 0, 0.23889],\n    \"106\": [0.19444, 0.67937, 0.09162, 0, 0.26667],\n    \"107\": [0, 0.69444, 0.08336, 0, 0.48889],\n    \"108\": [0, 0.69444, 0.09483, 0, 0.23889],\n    \"109\": [0, 0.44444, 0.01778, 0, 0.79445],\n    \"110\": [0, 0.44444, 0.01778, 0, 0.51667],\n    \"111\": [0, 0.44444, 0.06613, 0, 0.5],\n    \"112\": [0.19444, 0.44444, 0.0389, 0, 0.51667],\n    \"113\": [0.19444, 0.44444, 0.04169, 0, 0.51667],\n    \"114\": [0, 0.44444, 0.10836, 0, 0.34167],\n    \"115\": [0, 0.44444, 0.0778, 0, 0.38333],\n    \"116\": [0, 0.57143, 0.07225, 0, 0.36111],\n    \"117\": [0, 0.44444, 0.04169, 0, 0.51667],\n    \"118\": [0, 0.44444, 0.10836, 0, 0.46111],\n    \"119\": [0, 0.44444, 0.10836, 0, 0.68334],\n    \"120\": [0, 0.44444, 0.09169, 0, 0.46111],\n    \"121\": [0.19444, 0.44444, 0.10836, 0, 0.46111],\n    \"122\": [0, 0.44444, 0.08752, 0, 0.43472],\n    \"126\": [0.35, 0.32659, 0.08826, 0, 0.5],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.67937, 0.06385, 0, 0.5],\n    \"176\": [0, 0.69444, 0, 0, 0.73752],\n    \"184\": [0.17014, 0, 0, 0, 0.44445],\n    \"305\": [0, 0.44444, 0.04169, 0, 0.23889],\n    \"567\": [0.19444, 0.44444, 0.04169, 0, 0.26667],\n    \"710\": [0, 0.69444, 0.0799, 0, 0.5],\n    \"711\": [0, 0.63194, 0.08432, 0, 0.5],\n    \"713\": [0, 0.60889, 0.08776, 0, 0.5],\n    \"714\": [0, 0.69444, 0.09205, 0, 0.5],\n    \"715\": [0, 0.69444, 0, 0, 0.5],\n    \"728\": [0, 0.69444, 0.09483, 0, 0.5],\n    \"729\": [0, 0.67937, 0.07774, 0, 0.27778],\n    \"730\": [0, 0.69444, 0, 0, 0.73752],\n    \"732\": [0, 0.67659, 0.08826, 0, 0.5],\n    \"733\": [0, 0.69444, 0.09205, 0, 0.5],\n    \"915\": [0, 0.69444, 0.13372, 0, 0.54167],\n    \"916\": [0, 0.69444, 0, 0, 0.83334],\n    \"920\": [0, 0.69444, 0.07555, 0, 0.77778],\n    \"923\": [0, 0.69444, 0, 0, 0.61111],\n    \"926\": [0, 0.69444, 0.12816, 0, 0.66667],\n    \"928\": [0, 0.69444, 0.08094, 0, 0.70834],\n    \"931\": [0, 0.69444, 0.11983, 0, 0.72222],\n    \"933\": [0, 0.69444, 0.09031, 0, 0.77778],\n    \"934\": [0, 0.69444, 0.04603, 0, 0.72222],\n    \"936\": [0, 0.69444, 0.09031, 0, 0.77778],\n    \"937\": [0, 0.69444, 0.08293, 0, 0.72222],\n    \"8211\": [0, 0.44444, 0.08616, 0, 0.5],\n    \"8212\": [0, 0.44444, 0.08616, 0, 1.0],\n    \"8216\": [0, 0.69444, 0.07816, 0, 0.27778],\n    \"8217\": [0, 0.69444, 0.07816, 0, 0.27778],\n    \"8220\": [0, 0.69444, 0.14205, 0, 0.5],\n    \"8221\": [0, 0.69444, 0.00316, 0, 0.5]\n  },\n  \"SansSerif-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.31945],\n    \"34\": [0, 0.69444, 0, 0, 0.5],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.83334],\n    \"36\": [0.05556, 0.75, 0, 0, 0.5],\n    \"37\": [0.05556, 0.75, 0, 0, 0.83334],\n    \"38\": [0, 0.69444, 0, 0, 0.75834],\n    \"39\": [0, 0.69444, 0, 0, 0.27778],\n    \"40\": [0.25, 0.75, 0, 0, 0.38889],\n    \"41\": [0.25, 0.75, 0, 0, 0.38889],\n    \"42\": [0, 0.75, 0, 0, 0.5],\n    \"43\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"44\": [0.125, 0.08333, 0, 0, 0.27778],\n    \"45\": [0, 0.44444, 0, 0, 0.33333],\n    \"46\": [0, 0.08333, 0, 0, 0.27778],\n    \"47\": [0.25, 0.75, 0, 0, 0.5],\n    \"48\": [0, 0.65556, 0, 0, 0.5],\n    \"49\": [0, 0.65556, 0, 0, 0.5],\n    \"50\": [0, 0.65556, 0, 0, 0.5],\n    \"51\": [0, 0.65556, 0, 0, 0.5],\n    \"52\": [0, 0.65556, 0, 0, 0.5],\n    \"53\": [0, 0.65556, 0, 0, 0.5],\n    \"54\": [0, 0.65556, 0, 0, 0.5],\n    \"55\": [0, 0.65556, 0, 0, 0.5],\n    \"56\": [0, 0.65556, 0, 0, 0.5],\n    \"57\": [0, 0.65556, 0, 0, 0.5],\n    \"58\": [0, 0.44444, 0, 0, 0.27778],\n    \"59\": [0.125, 0.44444, 0, 0, 0.27778],\n    \"61\": [-0.13, 0.37, 0, 0, 0.77778],\n    \"63\": [0, 0.69444, 0, 0, 0.47222],\n    \"64\": [0, 0.69444, 0, 0, 0.66667],\n    \"65\": [0, 0.69444, 0, 0, 0.66667],\n    \"66\": [0, 0.69444, 0, 0, 0.66667],\n    \"67\": [0, 0.69444, 0, 0, 0.63889],\n    \"68\": [0, 0.69444, 0, 0, 0.72223],\n    \"69\": [0, 0.69444, 0, 0, 0.59722],\n    \"70\": [0, 0.69444, 0, 0, 0.56945],\n    \"71\": [0, 0.69444, 0, 0, 0.66667],\n    \"72\": [0, 0.69444, 0, 0, 0.70834],\n    \"73\": [0, 0.69444, 0, 0, 0.27778],\n    \"74\": [0, 0.69444, 0, 0, 0.47222],\n    \"75\": [0, 0.69444, 0, 0, 0.69445],\n    \"76\": [0, 0.69444, 0, 0, 0.54167],\n    \"77\": [0, 0.69444, 0, 0, 0.875],\n    \"78\": [0, 0.69444, 0, 0, 0.70834],\n    \"79\": [0, 0.69444, 0, 0, 0.73611],\n    \"80\": [0, 0.69444, 0, 0, 0.63889],\n    \"81\": [0.125, 0.69444, 0, 0, 0.73611],\n    \"82\": [0, 0.69444, 0, 0, 0.64584],\n    \"83\": [0, 0.69444, 0, 0, 0.55556],\n    \"84\": [0, 0.69444, 0, 0, 0.68056],\n    \"85\": [0, 0.69444, 0, 0, 0.6875],\n    \"86\": [0, 0.69444, 0.01389, 0, 0.66667],\n    \"87\": [0, 0.69444, 0.01389, 0, 0.94445],\n    \"88\": [0, 0.69444, 0, 0, 0.66667],\n    \"89\": [0, 0.69444, 0.025, 0, 0.66667],\n    \"90\": [0, 0.69444, 0, 0, 0.61111],\n    \"91\": [0.25, 0.75, 0, 0, 0.28889],\n    \"93\": [0.25, 0.75, 0, 0, 0.28889],\n    \"94\": [0, 0.69444, 0, 0, 0.5],\n    \"95\": [0.35, 0.09444, 0.02778, 0, 0.5],\n    \"97\": [0, 0.44444, 0, 0, 0.48056],\n    \"98\": [0, 0.69444, 0, 0, 0.51667],\n    \"99\": [0, 0.44444, 0, 0, 0.44445],\n    \"100\": [0, 0.69444, 0, 0, 0.51667],\n    \"101\": [0, 0.44444, 0, 0, 0.44445],\n    \"102\": [0, 0.69444, 0.06944, 0, 0.30556],\n    \"103\": [0.19444, 0.44444, 0.01389, 0, 0.5],\n    \"104\": [0, 0.69444, 0, 0, 0.51667],\n    \"105\": [0, 0.67937, 0, 0, 0.23889],\n    \"106\": [0.19444, 0.67937, 0, 0, 0.26667],\n    \"107\": [0, 0.69444, 0, 0, 0.48889],\n    \"108\": [0, 0.69444, 0, 0, 0.23889],\n    \"109\": [0, 0.44444, 0, 0, 0.79445],\n    \"110\": [0, 0.44444, 0, 0, 0.51667],\n    \"111\": [0, 0.44444, 0, 0, 0.5],\n    \"112\": [0.19444, 0.44444, 0, 0, 0.51667],\n    \"113\": [0.19444, 0.44444, 0, 0, 0.51667],\n    \"114\": [0, 0.44444, 0.01389, 0, 0.34167],\n    \"115\": [0, 0.44444, 0, 0, 0.38333],\n    \"116\": [0, 0.57143, 0, 0, 0.36111],\n    \"117\": [0, 0.44444, 0, 0, 0.51667],\n    \"118\": [0, 0.44444, 0.01389, 0, 0.46111],\n    \"119\": [0, 0.44444, 0.01389, 0, 0.68334],\n    \"120\": [0, 0.44444, 0, 0, 0.46111],\n    \"121\": [0.19444, 0.44444, 0.01389, 0, 0.46111],\n    \"122\": [0, 0.44444, 0, 0, 0.43472],\n    \"126\": [0.35, 0.32659, 0, 0, 0.5],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.67937, 0, 0, 0.5],\n    \"176\": [0, 0.69444, 0, 0, 0.66667],\n    \"184\": [0.17014, 0, 0, 0, 0.44445],\n    \"305\": [0, 0.44444, 0, 0, 0.23889],\n    \"567\": [0.19444, 0.44444, 0, 0, 0.26667],\n    \"710\": [0, 0.69444, 0, 0, 0.5],\n    \"711\": [0, 0.63194, 0, 0, 0.5],\n    \"713\": [0, 0.60889, 0, 0, 0.5],\n    \"714\": [0, 0.69444, 0, 0, 0.5],\n    \"715\": [0, 0.69444, 0, 0, 0.5],\n    \"728\": [0, 0.69444, 0, 0, 0.5],\n    \"729\": [0, 0.67937, 0, 0, 0.27778],\n    \"730\": [0, 0.69444, 0, 0, 0.66667],\n    \"732\": [0, 0.67659, 0, 0, 0.5],\n    \"733\": [0, 0.69444, 0, 0, 0.5],\n    \"915\": [0, 0.69444, 0, 0, 0.54167],\n    \"916\": [0, 0.69444, 0, 0, 0.83334],\n    \"920\": [0, 0.69444, 0, 0, 0.77778],\n    \"923\": [0, 0.69444, 0, 0, 0.61111],\n    \"926\": [0, 0.69444, 0, 0, 0.66667],\n    \"928\": [0, 0.69444, 0, 0, 0.70834],\n    \"931\": [0, 0.69444, 0, 0, 0.72222],\n    \"933\": [0, 0.69444, 0, 0, 0.77778],\n    \"934\": [0, 0.69444, 0, 0, 0.72222],\n    \"936\": [0, 0.69444, 0, 0, 0.77778],\n    \"937\": [0, 0.69444, 0, 0, 0.72222],\n    \"8211\": [0, 0.44444, 0.02778, 0, 0.5],\n    \"8212\": [0, 0.44444, 0.02778, 0, 1.0],\n    \"8216\": [0, 0.69444, 0, 0, 0.27778],\n    \"8217\": [0, 0.69444, 0, 0, 0.27778],\n    \"8220\": [0, 0.69444, 0, 0, 0.5],\n    \"8221\": [0, 0.69444, 0, 0, 0.5]\n  },\n  \"Script-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"65\": [0, 0.7, 0.22925, 0, 0.80253],\n    \"66\": [0, 0.7, 0.04087, 0, 0.90757],\n    \"67\": [0, 0.7, 0.1689, 0, 0.66619],\n    \"68\": [0, 0.7, 0.09371, 0, 0.77443],\n    \"69\": [0, 0.7, 0.18583, 0, 0.56162],\n    \"70\": [0, 0.7, 0.13634, 0, 0.89544],\n    \"71\": [0, 0.7, 0.17322, 0, 0.60961],\n    \"72\": [0, 0.7, 0.29694, 0, 0.96919],\n    \"73\": [0, 0.7, 0.19189, 0, 0.80907],\n    \"74\": [0.27778, 0.7, 0.19189, 0, 1.05159],\n    \"75\": [0, 0.7, 0.31259, 0, 0.91364],\n    \"76\": [0, 0.7, 0.19189, 0, 0.87373],\n    \"77\": [0, 0.7, 0.15981, 0, 1.08031],\n    \"78\": [0, 0.7, 0.3525, 0, 0.9015],\n    \"79\": [0, 0.7, 0.08078, 0, 0.73787],\n    \"80\": [0, 0.7, 0.08078, 0, 1.01262],\n    \"81\": [0, 0.7, 0.03305, 0, 0.88282],\n    \"82\": [0, 0.7, 0.06259, 0, 0.85],\n    \"83\": [0, 0.7, 0.19189, 0, 0.86767],\n    \"84\": [0, 0.7, 0.29087, 0, 0.74697],\n    \"85\": [0, 0.7, 0.25815, 0, 0.79996],\n    \"86\": [0, 0.7, 0.27523, 0, 0.62204],\n    \"87\": [0, 0.7, 0.27523, 0, 0.80532],\n    \"88\": [0, 0.7, 0.26006, 0, 0.94445],\n    \"89\": [0, 0.7, 0.2939, 0, 0.70961],\n    \"90\": [0, 0.7, 0.24037, 0, 0.8212],\n    \"160\": [0, 0, 0, 0, 0.25]\n  },\n  \"Size1-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [0.35001, 0.85, 0, 0, 0.45834],\n    \"41\": [0.35001, 0.85, 0, 0, 0.45834],\n    \"47\": [0.35001, 0.85, 0, 0, 0.57778],\n    \"91\": [0.35001, 0.85, 0, 0, 0.41667],\n    \"92\": [0.35001, 0.85, 0, 0, 0.57778],\n    \"93\": [0.35001, 0.85, 0, 0, 0.41667],\n    \"123\": [0.35001, 0.85, 0, 0, 0.58334],\n    \"125\": [0.35001, 0.85, 0, 0, 0.58334],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.72222, 0, 0, 0.55556],\n    \"732\": [0, 0.72222, 0, 0, 0.55556],\n    \"770\": [0, 0.72222, 0, 0, 0.55556],\n    \"771\": [0, 0.72222, 0, 0, 0.55556],\n    \"8214\": [-0.00099, 0.601, 0, 0, 0.77778],\n    \"8593\": [1e-05, 0.6, 0, 0, 0.66667],\n    \"8595\": [1e-05, 0.6, 0, 0, 0.66667],\n    \"8657\": [1e-05, 0.6, 0, 0, 0.77778],\n    \"8659\": [1e-05, 0.6, 0, 0, 0.77778],\n    \"8719\": [0.25001, 0.75, 0, 0, 0.94445],\n    \"8720\": [0.25001, 0.75, 0, 0, 0.94445],\n    \"8721\": [0.25001, 0.75, 0, 0, 1.05556],\n    \"8730\": [0.35001, 0.85, 0, 0, 1.0],\n    \"8739\": [-0.00599, 0.606, 0, 0, 0.33333],\n    \"8741\": [-0.00599, 0.606, 0, 0, 0.55556],\n    \"8747\": [0.30612, 0.805, 0.19445, 0, 0.47222],\n    \"8748\": [0.306, 0.805, 0.19445, 0, 0.47222],\n    \"8749\": [0.306, 0.805, 0.19445, 0, 0.47222],\n    \"8750\": [0.30612, 0.805, 0.19445, 0, 0.47222],\n    \"8896\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8897\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8898\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8899\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8968\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"8969\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"8970\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"8971\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"9168\": [-0.00099, 0.601, 0, 0, 0.66667],\n    \"10216\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"10217\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"10752\": [0.25001, 0.75, 0, 0, 1.11111],\n    \"10753\": [0.25001, 0.75, 0, 0, 1.11111],\n    \"10754\": [0.25001, 0.75, 0, 0, 1.11111],\n    \"10756\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"10758\": [0.25001, 0.75, 0, 0, 0.83334]\n  },\n  \"Size2-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [0.65002, 1.15, 0, 0, 0.59722],\n    \"41\": [0.65002, 1.15, 0, 0, 0.59722],\n    \"47\": [0.65002, 1.15, 0, 0, 0.81111],\n    \"91\": [0.65002, 1.15, 0, 0, 0.47222],\n    \"92\": [0.65002, 1.15, 0, 0, 0.81111],\n    \"93\": [0.65002, 1.15, 0, 0, 0.47222],\n    \"123\": [0.65002, 1.15, 0, 0, 0.66667],\n    \"125\": [0.65002, 1.15, 0, 0, 0.66667],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.75, 0, 0, 1.0],\n    \"732\": [0, 0.75, 0, 0, 1.0],\n    \"770\": [0, 0.75, 0, 0, 1.0],\n    \"771\": [0, 0.75, 0, 0, 1.0],\n    \"8719\": [0.55001, 1.05, 0, 0, 1.27778],\n    \"8720\": [0.55001, 1.05, 0, 0, 1.27778],\n    \"8721\": [0.55001, 1.05, 0, 0, 1.44445],\n    \"8730\": [0.65002, 1.15, 0, 0, 1.0],\n    \"8747\": [0.86225, 1.36, 0.44445, 0, 0.55556],\n    \"8748\": [0.862, 1.36, 0.44445, 0, 0.55556],\n    \"8749\": [0.862, 1.36, 0.44445, 0, 0.55556],\n    \"8750\": [0.86225, 1.36, 0.44445, 0, 0.55556],\n    \"8896\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8897\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8898\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8899\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8968\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"8969\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"8970\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"8971\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"10216\": [0.65002, 1.15, 0, 0, 0.61111],\n    \"10217\": [0.65002, 1.15, 0, 0, 0.61111],\n    \"10752\": [0.55001, 1.05, 0, 0, 1.51112],\n    \"10753\": [0.55001, 1.05, 0, 0, 1.51112],\n    \"10754\": [0.55001, 1.05, 0, 0, 1.51112],\n    \"10756\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"10758\": [0.55001, 1.05, 0, 0, 1.11111]\n  },\n  \"Size3-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [0.95003, 1.45, 0, 0, 0.73611],\n    \"41\": [0.95003, 1.45, 0, 0, 0.73611],\n    \"47\": [0.95003, 1.45, 0, 0, 1.04445],\n    \"91\": [0.95003, 1.45, 0, 0, 0.52778],\n    \"92\": [0.95003, 1.45, 0, 0, 1.04445],\n    \"93\": [0.95003, 1.45, 0, 0, 0.52778],\n    \"123\": [0.95003, 1.45, 0, 0, 0.75],\n    \"125\": [0.95003, 1.45, 0, 0, 0.75],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.75, 0, 0, 1.44445],\n    \"732\": [0, 0.75, 0, 0, 1.44445],\n    \"770\": [0, 0.75, 0, 0, 1.44445],\n    \"771\": [0, 0.75, 0, 0, 1.44445],\n    \"8730\": [0.95003, 1.45, 0, 0, 1.0],\n    \"8968\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"8969\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"8970\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"8971\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"10216\": [0.95003, 1.45, 0, 0, 0.75],\n    \"10217\": [0.95003, 1.45, 0, 0, 0.75]\n  },\n  \"Size4-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [1.25003, 1.75, 0, 0, 0.79167],\n    \"41\": [1.25003, 1.75, 0, 0, 0.79167],\n    \"47\": [1.25003, 1.75, 0, 0, 1.27778],\n    \"91\": [1.25003, 1.75, 0, 0, 0.58334],\n    \"92\": [1.25003, 1.75, 0, 0, 1.27778],\n    \"93\": [1.25003, 1.75, 0, 0, 0.58334],\n    \"123\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"125\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.825, 0, 0, 1.8889],\n    \"732\": [0, 0.825, 0, 0, 1.8889],\n    \"770\": [0, 0.825, 0, 0, 1.8889],\n    \"771\": [0, 0.825, 0, 0, 1.8889],\n    \"8730\": [1.25003, 1.75, 0, 0, 1.0],\n    \"8968\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"8969\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"8970\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"8971\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"9115\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9116\": [1e-05, 0.6, 0, 0, 0.875],\n    \"9117\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9118\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9119\": [1e-05, 0.6, 0, 0, 0.875],\n    \"9120\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9121\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9122\": [-0.00099, 0.601, 0, 0, 0.66667],\n    \"9123\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9124\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9125\": [-0.00099, 0.601, 0, 0, 0.66667],\n    \"9126\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9127\": [1e-05, 0.9, 0, 0, 0.88889],\n    \"9128\": [0.65002, 1.15, 0, 0, 0.88889],\n    \"9129\": [0.90001, 0, 0, 0, 0.88889],\n    \"9130\": [0, 0.3, 0, 0, 0.88889],\n    \"9131\": [1e-05, 0.9, 0, 0, 0.88889],\n    \"9132\": [0.65002, 1.15, 0, 0, 0.88889],\n    \"9133\": [0.90001, 0, 0, 0, 0.88889],\n    \"9143\": [0.88502, 0.915, 0, 0, 1.05556],\n    \"10216\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"10217\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"57344\": [-0.00499, 0.605, 0, 0, 1.05556],\n    \"57345\": [-0.00499, 0.605, 0, 0, 1.05556],\n    \"57680\": [0, 0.12, 0, 0, 0.45],\n    \"57681\": [0, 0.12, 0, 0, 0.45],\n    \"57682\": [0, 0.12, 0, 0, 0.45],\n    \"57683\": [0, 0.12, 0, 0, 0.45]\n  },\n  \"Typewriter-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.525],\n    \"33\": [0, 0.61111, 0, 0, 0.525],\n    \"34\": [0, 0.61111, 0, 0, 0.525],\n    \"35\": [0, 0.61111, 0, 0, 0.525],\n    \"36\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"37\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"38\": [0, 0.61111, 0, 0, 0.525],\n    \"39\": [0, 0.61111, 0, 0, 0.525],\n    \"40\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"41\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"42\": [0, 0.52083, 0, 0, 0.525],\n    \"43\": [-0.08056, 0.53055, 0, 0, 0.525],\n    \"44\": [0.13889, 0.125, 0, 0, 0.525],\n    \"45\": [-0.08056, 0.53055, 0, 0, 0.525],\n    \"46\": [0, 0.125, 0, 0, 0.525],\n    \"47\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"48\": [0, 0.61111, 0, 0, 0.525],\n    \"49\": [0, 0.61111, 0, 0, 0.525],\n    \"50\": [0, 0.61111, 0, 0, 0.525],\n    \"51\": [0, 0.61111, 0, 0, 0.525],\n    \"52\": [0, 0.61111, 0, 0, 0.525],\n    \"53\": [0, 0.61111, 0, 0, 0.525],\n    \"54\": [0, 0.61111, 0, 0, 0.525],\n    \"55\": [0, 0.61111, 0, 0, 0.525],\n    \"56\": [0, 0.61111, 0, 0, 0.525],\n    \"57\": [0, 0.61111, 0, 0, 0.525],\n    \"58\": [0, 0.43056, 0, 0, 0.525],\n    \"59\": [0.13889, 0.43056, 0, 0, 0.525],\n    \"60\": [-0.05556, 0.55556, 0, 0, 0.525],\n    \"61\": [-0.19549, 0.41562, 0, 0, 0.525],\n    \"62\": [-0.05556, 0.55556, 0, 0, 0.525],\n    \"63\": [0, 0.61111, 0, 0, 0.525],\n    \"64\": [0, 0.61111, 0, 0, 0.525],\n    \"65\": [0, 0.61111, 0, 0, 0.525],\n    \"66\": [0, 0.61111, 0, 0, 0.525],\n    \"67\": [0, 0.61111, 0, 0, 0.525],\n    \"68\": [0, 0.61111, 0, 0, 0.525],\n    \"69\": [0, 0.61111, 0, 0, 0.525],\n    \"70\": [0, 0.61111, 0, 0, 0.525],\n    \"71\": [0, 0.61111, 0, 0, 0.525],\n    \"72\": [0, 0.61111, 0, 0, 0.525],\n    \"73\": [0, 0.61111, 0, 0, 0.525],\n    \"74\": [0, 0.61111, 0, 0, 0.525],\n    \"75\": [0, 0.61111, 0, 0, 0.525],\n    \"76\": [0, 0.61111, 0, 0, 0.525],\n    \"77\": [0, 0.61111, 0, 0, 0.525],\n    \"78\": [0, 0.61111, 0, 0, 0.525],\n    \"79\": [0, 0.61111, 0, 0, 0.525],\n    \"80\": [0, 0.61111, 0, 0, 0.525],\n    \"81\": [0.13889, 0.61111, 0, 0, 0.525],\n    \"82\": [0, 0.61111, 0, 0, 0.525],\n    \"83\": [0, 0.61111, 0, 0, 0.525],\n    \"84\": [0, 0.61111, 0, 0, 0.525],\n    \"85\": [0, 0.61111, 0, 0, 0.525],\n    \"86\": [0, 0.61111, 0, 0, 0.525],\n    \"87\": [0, 0.61111, 0, 0, 0.525],\n    \"88\": [0, 0.61111, 0, 0, 0.525],\n    \"89\": [0, 0.61111, 0, 0, 0.525],\n    \"90\": [0, 0.61111, 0, 0, 0.525],\n    \"91\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"92\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"93\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"94\": [0, 0.61111, 0, 0, 0.525],\n    \"95\": [0.09514, 0, 0, 0, 0.525],\n    \"96\": [0, 0.61111, 0, 0, 0.525],\n    \"97\": [0, 0.43056, 0, 0, 0.525],\n    \"98\": [0, 0.61111, 0, 0, 0.525],\n    \"99\": [0, 0.43056, 0, 0, 0.525],\n    \"100\": [0, 0.61111, 0, 0, 0.525],\n    \"101\": [0, 0.43056, 0, 0, 0.525],\n    \"102\": [0, 0.61111, 0, 0, 0.525],\n    \"103\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"104\": [0, 0.61111, 0, 0, 0.525],\n    \"105\": [0, 0.61111, 0, 0, 0.525],\n    \"106\": [0.22222, 0.61111, 0, 0, 0.525],\n    \"107\": [0, 0.61111, 0, 0, 0.525],\n    \"108\": [0, 0.61111, 0, 0, 0.525],\n    \"109\": [0, 0.43056, 0, 0, 0.525],\n    \"110\": [0, 0.43056, 0, 0, 0.525],\n    \"111\": [0, 0.43056, 0, 0, 0.525],\n    \"112\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"113\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"114\": [0, 0.43056, 0, 0, 0.525],\n    \"115\": [0, 0.43056, 0, 0, 0.525],\n    \"116\": [0, 0.55358, 0, 0, 0.525],\n    \"117\": [0, 0.43056, 0, 0, 0.525],\n    \"118\": [0, 0.43056, 0, 0, 0.525],\n    \"119\": [0, 0.43056, 0, 0, 0.525],\n    \"120\": [0, 0.43056, 0, 0, 0.525],\n    \"121\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"122\": [0, 0.43056, 0, 0, 0.525],\n    \"123\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"124\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"125\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"126\": [0, 0.61111, 0, 0, 0.525],\n    \"127\": [0, 0.61111, 0, 0, 0.525],\n    \"160\": [0, 0, 0, 0, 0.525],\n    \"176\": [0, 0.61111, 0, 0, 0.525],\n    \"184\": [0.19445, 0, 0, 0, 0.525],\n    \"305\": [0, 0.43056, 0, 0, 0.525],\n    \"567\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"711\": [0, 0.56597, 0, 0, 0.525],\n    \"713\": [0, 0.56555, 0, 0, 0.525],\n    \"714\": [0, 0.61111, 0, 0, 0.525],\n    \"715\": [0, 0.61111, 0, 0, 0.525],\n    \"728\": [0, 0.61111, 0, 0, 0.525],\n    \"730\": [0, 0.61111, 0, 0, 0.525],\n    \"770\": [0, 0.61111, 0, 0, 0.525],\n    \"771\": [0, 0.61111, 0, 0, 0.525],\n    \"776\": [0, 0.61111, 0, 0, 0.525],\n    \"915\": [0, 0.61111, 0, 0, 0.525],\n    \"916\": [0, 0.61111, 0, 0, 0.525],\n    \"920\": [0, 0.61111, 0, 0, 0.525],\n    \"923\": [0, 0.61111, 0, 0, 0.525],\n    \"926\": [0, 0.61111, 0, 0, 0.525],\n    \"928\": [0, 0.61111, 0, 0, 0.525],\n    \"931\": [0, 0.61111, 0, 0, 0.525],\n    \"933\": [0, 0.61111, 0, 0, 0.525],\n    \"934\": [0, 0.61111, 0, 0, 0.525],\n    \"936\": [0, 0.61111, 0, 0, 0.525],\n    \"937\": [0, 0.61111, 0, 0, 0.525],\n    \"8216\": [0, 0.61111, 0, 0, 0.525],\n    \"8217\": [0, 0.61111, 0, 0, 0.525],\n    \"8242\": [0, 0.61111, 0, 0, 0.525],\n    \"9251\": [0.11111, 0.21944, 0, 0, 0.525]\n  }\n};\n\n/**\n * This file contains metrics regarding fonts and individual symbols. The sigma\n * and xi variables, as well as the metricMap map contain data extracted from\n * TeX, TeX font metrics, and the TTF files. These data are then exposed via the\n * `metrics` variable and the getCharacterMetrics function.\n */\n// In TeX, there are actually three sets of dimensions, one for each of\n// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4:\n// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt).  These are\n// provided in the arrays below, in that order.\n//\n// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respectively.\n// This was determined by running the following script:\n//\n//     latex -interaction=nonstopmode \\\n//     '\\documentclass{article}\\usepackage{amsmath}\\begin{document}' \\\n//     '$a$ \\expandafter\\show\\the\\textfont2' \\\n//     '\\expandafter\\show\\the\\scriptfont2' \\\n//     '\\expandafter\\show\\the\\scriptscriptfont2' \\\n//     '\\stop'\n//\n// The metrics themselves were retrieved using the following commands:\n//\n//     tftopl cmsy10\n//     tftopl cmsy7\n//     tftopl cmsy5\n//\n// The output of each of these commands is quite lengthy.  The only part we\n// care about is the FONTDIMEN section. Each value is measured in EMs.\nvar sigmasAndXis = {\n  slant: [0.250, 0.250, 0.250],\n  // sigma1\n  space: [0.000, 0.000, 0.000],\n  // sigma2\n  stretch: [0.000, 0.000, 0.000],\n  // sigma3\n  shrink: [0.000, 0.000, 0.000],\n  // sigma4\n  xHeight: [0.431, 0.431, 0.431],\n  // sigma5\n  quad: [1.000, 1.171, 1.472],\n  // sigma6\n  extraSpace: [0.000, 0.000, 0.000],\n  // sigma7\n  num1: [0.677, 0.732, 0.925],\n  // sigma8\n  num2: [0.394, 0.384, 0.387],\n  // sigma9\n  num3: [0.444, 0.471, 0.504],\n  // sigma10\n  denom1: [0.686, 0.752, 1.025],\n  // sigma11\n  denom2: [0.345, 0.344, 0.532],\n  // sigma12\n  sup1: [0.413, 0.503, 0.504],\n  // sigma13\n  sup2: [0.363, 0.431, 0.404],\n  // sigma14\n  sup3: [0.289, 0.286, 0.294],\n  // sigma15\n  sub1: [0.150, 0.143, 0.200],\n  // sigma16\n  sub2: [0.247, 0.286, 0.400],\n  // sigma17\n  supDrop: [0.386, 0.353, 0.494],\n  // sigma18\n  subDrop: [0.050, 0.071, 0.100],\n  // sigma19\n  delim1: [2.390, 1.700, 1.980],\n  // sigma20\n  delim2: [1.010, 1.157, 1.420],\n  // sigma21\n  axisHeight: [0.250, 0.250, 0.250],\n  // sigma22\n  // These font metrics are extracted from TeX by using tftopl on cmex10.tfm;\n  // they correspond to the font parameters of the extension fonts (family 3).\n  // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to\n  // match cmex7, we'd use cmex7.tfm values for script and scriptscript\n  // values.\n  defaultRuleThickness: [0.04, 0.049, 0.049],\n  // xi8; cmex7: 0.049\n  bigOpSpacing1: [0.111, 0.111, 0.111],\n  // xi9\n  bigOpSpacing2: [0.166, 0.166, 0.166],\n  // xi10\n  bigOpSpacing3: [0.2, 0.2, 0.2],\n  // xi11\n  bigOpSpacing4: [0.6, 0.611, 0.611],\n  // xi12; cmex7: 0.611\n  bigOpSpacing5: [0.1, 0.143, 0.143],\n  // xi13; cmex7: 0.143\n  // The \\sqrt rule width is taken from the height of the surd character.\n  // Since we use the same font at all sizes, this thickness doesn't scale.\n  sqrtRuleThickness: [0.04, 0.04, 0.04],\n  // This value determines how large a pt is, for metrics which are defined\n  // in terms of pts.\n  // This value is also used in katex.scss; if you change it make sure the\n  // values match.\n  ptPerEm: [10.0, 10.0, 10.0],\n  // The space between adjacent `|` columns in an array definition. From\n  // `\\showthe\\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm.\n  doubleRuleSep: [0.2, 0.2, 0.2],\n  // The width of separator lines in {array} environments. From\n  // `\\showthe\\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm.\n  arrayRuleWidth: [0.04, 0.04, 0.04],\n  // Two values from LaTeX source2e:\n  fboxsep: [0.3, 0.3, 0.3],\n  //        3 pt / ptPerEm\n  fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm\n};\n// These are very rough approximations.  We default to Times New Roman which\n// should have Latin-1 and Cyrillic characters, but may not depending on the\n// operating system.  The metrics do not account for extra height from the\n// accents.  In the case of Cyrillic characters which have both ascenders and\n// descenders we prefer approximations with ascenders, primarily to prevent\n// the fraction bar or root line from intersecting the glyph.\n// TODO(kevinb) allow union of multiple glyph metrics for better accuracy.\nvar extraCharacterMap = {\n  // Latin-1\n  'Å': 'A',\n  'Ð': 'D',\n  'Þ': 'o',\n  'å': 'a',\n  'ð': 'd',\n  'þ': 'o',\n  // Cyrillic\n  'А': 'A',\n  'Б': 'B',\n  'В': 'B',\n  'Г': 'F',\n  'Д': 'A',\n  'Е': 'E',\n  'Ж': 'K',\n  'З': '3',\n  'И': 'N',\n  'Й': 'N',\n  'К': 'K',\n  'Л': 'N',\n  'М': 'M',\n  'Н': 'H',\n  'О': 'O',\n  'П': 'N',\n  'Р': 'P',\n  'С': 'C',\n  'Т': 'T',\n  'У': 'y',\n  'Ф': 'O',\n  'Х': 'X',\n  'Ц': 'U',\n  'Ч': 'h',\n  'Ш': 'W',\n  'Щ': 'W',\n  'Ъ': 'B',\n  'Ы': 'X',\n  'Ь': 'B',\n  'Э': '3',\n  'Ю': 'X',\n  'Я': 'R',\n  'а': 'a',\n  'б': 'b',\n  'в': 'a',\n  'г': 'r',\n  'д': 'y',\n  'е': 'e',\n  'ж': 'm',\n  'з': 'e',\n  'и': 'n',\n  'й': 'n',\n  'к': 'n',\n  'л': 'n',\n  'м': 'm',\n  'н': 'n',\n  'о': 'o',\n  'п': 'n',\n  'р': 'p',\n  'с': 'c',\n  'т': 'o',\n  'у': 'y',\n  'ф': 'b',\n  'х': 'x',\n  'ц': 'n',\n  'ч': 'n',\n  'ш': 'w',\n  'щ': 'w',\n  'ъ': 'a',\n  'ы': 'm',\n  'ь': 'a',\n  'э': 'e',\n  'ю': 'm',\n  'я': 'r'\n};\n/**\n * This function adds new font metrics to default metricMap\n * It can also override existing metrics\n */\nfunction setFontMetrics(fontName, metrics) {\n  fontMetricsData[fontName] = metrics;\n}\n/**\n * This function is a convenience function for looking up information in the\n * metricMap table. It takes a character as a string, and a font.\n *\n * Note: the `width` property may be undefined if fontMetricsData.js wasn't\n * built using `Make extended_metrics`.\n */\nfunction getCharacterMetrics(character, font, mode) {\n  if (!fontMetricsData[font]) {\n    throw new Error(\"Font metrics not found for font: \" + font + \".\");\n  }\n  var ch = character.charCodeAt(0);\n  var metrics = fontMetricsData[font][ch];\n  if (!metrics && character[0] in extraCharacterMap) {\n    ch = extraCharacterMap[character[0]].charCodeAt(0);\n    metrics = fontMetricsData[font][ch];\n  }\n  if (!metrics && mode === 'text') {\n    // We don't typically have font metrics for Asian scripts.\n    // But since we support them in text mode, we need to return\n    // some sort of metrics.\n    // So if the character is in a script we support but we\n    // don't have metrics for it, just use the metrics for\n    // the Latin capital letter M. This is close enough because\n    // we (currently) only care about the height of the glyph\n    // not its width.\n    if (supportedCodepoint(ch)) {\n      metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M'\n    }\n  }\n  if (metrics) {\n    return {\n      depth: metrics[0],\n      height: metrics[1],\n      italic: metrics[2],\n      skew: metrics[3],\n      width: metrics[4]\n    };\n  }\n}\nvar fontMetricsBySizeIndex = {};\n/**\n * Get the font metrics for a given size.\n */\nfunction getGlobalMetrics(size) {\n  var sizeIndex;\n  if (size >= 5) {\n    sizeIndex = 0;\n  } else if (size >= 3) {\n    sizeIndex = 1;\n  } else {\n    sizeIndex = 2;\n  }\n  if (!fontMetricsBySizeIndex[sizeIndex]) {\n    var metrics = fontMetricsBySizeIndex[sizeIndex] = {\n      cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18\n    };\n    for (var key in sigmasAndXis) {\n      if (sigmasAndXis.hasOwnProperty(key)) {\n        metrics[key] = sigmasAndXis[key][sizeIndex];\n      }\n    }\n  }\n  return fontMetricsBySizeIndex[sizeIndex];\n}\n\n/**\n * This file holds a list of all no-argument functions and single-character\n * symbols (like 'a' or ';').\n *\n * For each of the symbols, there are three properties they can have:\n * - font (required): the font to be used for this symbol. Either \"main\" (the\n     normal font), or \"ams\" (the ams fonts).\n * - group (required): the ParseNode group type the symbol should have (i.e.\n     \"textord\", \"mathord\", etc).\n     See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types\n * - replace: the character that this symbol or function should be\n *   replaced with (i.e. \"\\phi\" has a replace value of \"\\u03d5\", the phi\n *   character in the main font).\n *\n * The outermost map in the table indicates what mode the symbols should be\n * accepted in (e.g. \"math\" or \"text\").\n */\nvar symbols = {\n  \"math\": {},\n  \"text\": {}\n};\n/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */\nfunction defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) {\n  symbols[mode][name] = {\n    font,\n    group,\n    replace\n  };\n  if (acceptUnicodeChar && replace) {\n    symbols[mode][replace] = symbols[mode][name];\n  }\n}\n// Some abbreviations for commonly used strings.\n// This helps minify the code, and also spotting typos using jshint.\n// modes:\nvar math = \"math\";\nvar text = \"text\";\n// fonts:\nvar main = \"main\";\nvar ams = \"ams\";\n// groups:\nvar accent = \"accent-token\";\nvar bin = \"bin\";\nvar close = \"close\";\nvar inner = \"inner\";\nvar mathord = \"mathord\";\nvar op = \"op-token\";\nvar open = \"open\";\nvar punct = \"punct\";\nvar rel = \"rel\";\nvar spacing = \"spacing\";\nvar textord = \"textord\";\n// Now comes the symbol table\n// Relation Symbols\ndefineSymbol(math, main, rel, \"\\u2261\", \"\\\\equiv\", true);\ndefineSymbol(math, main, rel, \"\\u227a\", \"\\\\prec\", true);\ndefineSymbol(math, main, rel, \"\\u227b\", \"\\\\succ\", true);\ndefineSymbol(math, main, rel, \"\\u223c\", \"\\\\sim\", true);\ndefineSymbol(math, main, rel, \"\\u22a5\", \"\\\\perp\");\ndefineSymbol(math, main, rel, \"\\u2aaf\", \"\\\\preceq\", true);\ndefineSymbol(math, main, rel, \"\\u2ab0\", \"\\\\succeq\", true);\ndefineSymbol(math, main, rel, \"\\u2243\", \"\\\\simeq\", true);\ndefineSymbol(math, main, rel, \"\\u2223\", \"\\\\mid\", true);\ndefineSymbol(math, main, rel, \"\\u226a\", \"\\\\ll\", true);\ndefineSymbol(math, main, rel, \"\\u226b\", \"\\\\gg\", true);\ndefineSymbol(math, main, rel, \"\\u224d\", \"\\\\asymp\", true);\ndefineSymbol(math, main, rel, \"\\u2225\", \"\\\\parallel\");\ndefineSymbol(math, main, rel, \"\\u22c8\", \"\\\\bowtie\", true);\ndefineSymbol(math, main, rel, \"\\u2323\", \"\\\\smile\", true);\ndefineSymbol(math, main, rel, \"\\u2291\", \"\\\\sqsubseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2292\", \"\\\\sqsupseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2250\", \"\\\\doteq\", true);\ndefineSymbol(math, main, rel, \"\\u2322\", \"\\\\frown\", true);\ndefineSymbol(math, main, rel, \"\\u220b\", \"\\\\ni\", true);\ndefineSymbol(math, main, rel, \"\\u221d\", \"\\\\propto\", true);\ndefineSymbol(math, main, rel, \"\\u22a2\", \"\\\\vdash\", true);\ndefineSymbol(math, main, rel, \"\\u22a3\", \"\\\\dashv\", true);\ndefineSymbol(math, main, rel, \"\\u220b\", \"\\\\owns\");\n// Punctuation\ndefineSymbol(math, main, punct, \"\\u002e\", \"\\\\ldotp\");\ndefineSymbol(math, main, punct, \"\\u22c5\", \"\\\\cdotp\");\n// The KaTeX fonts do not contain U+00B7. Use the centered dot glyph at U+22C5\n// in both modes, but keep math-mode punctuation spacing only in math mode.\ndefineSymbol(math, main, punct, \"\\u22c5\", \"\\u00b7\");\ndefineSymbol(text, main, textord, \"\\u22c5\", \"\\u00b7\");\n// Misc Symbols\ndefineSymbol(math, main, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(text, main, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(math, main, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(text, main, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(math, main, textord, \"\\u2135\", \"\\\\aleph\", true);\ndefineSymbol(math, main, textord, \"\\u2200\", \"\\\\forall\", true);\ndefineSymbol(math, main, textord, \"\\u210f\", \"\\\\hbar\", true);\ndefineSymbol(math, main, textord, \"\\u2203\", \"\\\\exists\", true);\ndefineSymbol(math, main, textord, \"\\u2207\", \"\\\\nabla\", true);\ndefineSymbol(math, main, textord, \"\\u266d\", \"\\\\flat\", true);\ndefineSymbol(math, main, textord, \"\\u2113\", \"\\\\ell\", true);\ndefineSymbol(math, main, textord, \"\\u266e\", \"\\\\natural\", true);\ndefineSymbol(math, main, textord, \"\\u2663\", \"\\\\clubsuit\", true);\ndefineSymbol(math, main, textord, \"\\u2118\", \"\\\\wp\", true);\ndefineSymbol(math, main, textord, \"\\u266f\", \"\\\\sharp\", true);\ndefineSymbol(math, main, textord, \"\\u2662\", \"\\\\diamondsuit\", true);\ndefineSymbol(math, main, textord, \"\\u211c\", \"\\\\Re\", true);\ndefineSymbol(math, main, textord, \"\\u2661\", \"\\\\heartsuit\", true);\ndefineSymbol(math, main, textord, \"\\u2111\", \"\\\\Im\", true);\ndefineSymbol(math, main, textord, \"\\u2660\", \"\\\\spadesuit\", true);\ndefineSymbol(math, main, textord, \"\\u00a7\", \"\\\\S\", true);\ndefineSymbol(text, main, textord, \"\\u00a7\", \"\\\\S\");\ndefineSymbol(math, main, textord, \"\\u00b6\", \"\\\\P\", true);\ndefineSymbol(text, main, textord, \"\\u00b6\", \"\\\\P\");\n// Math and Text\ndefineSymbol(math, main, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, main, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, main, textord, \"\\u2020\", \"\\\\textdagger\");\ndefineSymbol(math, main, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, main, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, main, textord, \"\\u2021\", \"\\\\textdaggerdbl\");\n// Large Delimiters\ndefineSymbol(math, main, close, \"\\u23b1\", \"\\\\rmoustache\", true);\ndefineSymbol(math, main, open, \"\\u23b0\", \"\\\\lmoustache\", true);\ndefineSymbol(math, main, close, \"\\u27ef\", \"\\\\rgroup\", true);\ndefineSymbol(math, main, open, \"\\u27ee\", \"\\\\lgroup\", true);\n// Binary Operators\ndefineSymbol(math, main, bin, \"\\u2213\", \"\\\\mp\", true);\ndefineSymbol(math, main, bin, \"\\u2296\", \"\\\\ominus\", true);\ndefineSymbol(math, main, bin, \"\\u228e\", \"\\\\uplus\", true);\ndefineSymbol(math, main, bin, \"\\u2293\", \"\\\\sqcap\", true);\ndefineSymbol(math, main, bin, \"\\u2217\", \"\\\\ast\");\ndefineSymbol(math, main, bin, \"\\u2294\", \"\\\\sqcup\", true);\ndefineSymbol(math, main, bin, \"\\u25ef\", \"\\\\bigcirc\", true);\ndefineSymbol(math, main, bin, \"\\u2219\", \"\\\\bullet\", true);\ndefineSymbol(math, main, bin, \"\\u2021\", \"\\\\ddagger\");\ndefineSymbol(math, main, bin, \"\\u2240\", \"\\\\wr\", true);\ndefineSymbol(math, main, bin, \"\\u2a3f\", \"\\\\amalg\");\ndefineSymbol(math, main, bin, \"\\u0026\", \"\\\\And\"); // from amsmath\n// Arrow Symbols\ndefineSymbol(math, main, rel, \"\\u27f5\", \"\\\\longleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d0\", \"\\\\Leftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f8\", \"\\\\Longleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f6\", \"\\\\longrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d2\", \"\\\\Rightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f9\", \"\\\\Longrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2194\", \"\\\\leftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f7\", \"\\\\longleftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d4\", \"\\\\Leftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27fa\", \"\\\\Longleftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21a6\", \"\\\\mapsto\", true);\ndefineSymbol(math, main, rel, \"\\u27fc\", \"\\\\longmapsto\", true);\ndefineSymbol(math, main, rel, \"\\u2197\", \"\\\\nearrow\", true);\ndefineSymbol(math, main, rel, \"\\u21a9\", \"\\\\hookleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21aa\", \"\\\\hookrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2198\", \"\\\\searrow\", true);\ndefineSymbol(math, main, rel, \"\\u21bc\", \"\\\\leftharpoonup\", true);\ndefineSymbol(math, main, rel, \"\\u21c0\", \"\\\\rightharpoonup\", true);\ndefineSymbol(math, main, rel, \"\\u2199\", \"\\\\swarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21bd\", \"\\\\leftharpoondown\", true);\ndefineSymbol(math, main, rel, \"\\u21c1\", \"\\\\rightharpoondown\", true);\ndefineSymbol(math, main, rel, \"\\u2196\", \"\\\\nwarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21cc\", \"\\\\rightleftharpoons\", true);\n// AMS Negated Binary Relations\ndefineSymbol(math, ams, rel, \"\\u226e\", \"\\\\nless\", true);\n// Symbol names preceded by \"@\" each have a corresponding macro.\ndefineSymbol(math, ams, rel, \"\\ue010\", \"\\\\@nleqslant\");\ndefineSymbol(math, ams, rel, \"\\ue011\", \"\\\\@nleqq\");\ndefineSymbol(math, ams, rel, \"\\u2a87\", \"\\\\lneq\", true);\ndefineSymbol(math, ams, rel, \"\\u2268\", \"\\\\lneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue00c\", \"\\\\@lvertneqq\");\ndefineSymbol(math, ams, rel, \"\\u22e6\", \"\\\\lnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a89\", \"\\\\lnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2280\", \"\\\\nprec\", true);\n// unicode-math maps \\u22e0 to \\npreccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u22e0\", \"\\\\npreceq\", true);\ndefineSymbol(math, ams, rel, \"\\u22e8\", \"\\\\precnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab9\", \"\\\\precnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2241\", \"\\\\nsim\", true);\ndefineSymbol(math, ams, rel, \"\\ue006\", \"\\\\@nshortmid\");\ndefineSymbol(math, ams, rel, \"\\u2224\", \"\\\\nmid\", true);\ndefineSymbol(math, ams, rel, \"\\u22ac\", \"\\\\nvdash\", true);\ndefineSymbol(math, ams, rel, \"\\u22ad\", \"\\\\nvDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22ea\", \"\\\\ntriangleleft\");\ndefineSymbol(math, ams, rel, \"\\u22ec\", \"\\\\ntrianglelefteq\", true);\ndefineSymbol(math, ams, rel, \"\\u228a\", \"\\\\subsetneq\", true);\ndefineSymbol(math, ams, rel, \"\\ue01a\", \"\\\\@varsubsetneq\");\ndefineSymbol(math, ams, rel, \"\\u2acb\", \"\\\\subsetneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue017\", \"\\\\@varsubsetneqq\");\ndefineSymbol(math, ams, rel, \"\\u226f\", \"\\\\ngtr\", true);\ndefineSymbol(math, ams, rel, \"\\ue00f\", \"\\\\@ngeqslant\");\ndefineSymbol(math, ams, rel, \"\\ue00e\", \"\\\\@ngeqq\");\ndefineSymbol(math, ams, rel, \"\\u2a88\", \"\\\\gneq\", true);\ndefineSymbol(math, ams, rel, \"\\u2269\", \"\\\\gneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue00d\", \"\\\\@gvertneqq\");\ndefineSymbol(math, ams, rel, \"\\u22e7\", \"\\\\gnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8a\", \"\\\\gnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2281\", \"\\\\nsucc\", true);\n// unicode-math maps \\u22e1 to \\nsucccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u22e1\", \"\\\\nsucceq\", true);\ndefineSymbol(math, ams, rel, \"\\u22e9\", \"\\\\succnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2aba\", \"\\\\succnapprox\", true);\n// unicode-math maps \\u2246 to \\simneqq. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u2246\", \"\\\\ncong\", true);\ndefineSymbol(math, ams, rel, \"\\ue007\", \"\\\\@nshortparallel\");\ndefineSymbol(math, ams, rel, \"\\u2226\", \"\\\\nparallel\", true);\ndefineSymbol(math, ams, rel, \"\\u22af\", \"\\\\nVDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22eb\", \"\\\\ntriangleright\");\ndefineSymbol(math, ams, rel, \"\\u22ed\", \"\\\\ntrianglerighteq\", true);\ndefineSymbol(math, ams, rel, \"\\ue018\", \"\\\\@nsupseteqq\");\ndefineSymbol(math, ams, rel, \"\\u228b\", \"\\\\supsetneq\", true);\ndefineSymbol(math, ams, rel, \"\\ue01b\", \"\\\\@varsupsetneq\");\ndefineSymbol(math, ams, rel, \"\\u2acc\", \"\\\\supsetneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue019\", \"\\\\@varsupsetneqq\");\ndefineSymbol(math, ams, rel, \"\\u22ae\", \"\\\\nVdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab5\", \"\\\\precneqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab6\", \"\\\\succneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue016\", \"\\\\@nsubseteqq\");\ndefineSymbol(math, ams, bin, \"\\u22b4\", \"\\\\unlhd\");\ndefineSymbol(math, ams, bin, \"\\u22b5\", \"\\\\unrhd\");\n// AMS Negated Arrows\ndefineSymbol(math, ams, rel, \"\\u219a\", \"\\\\nleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u219b\", \"\\\\nrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21cd\", \"\\\\nLeftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21cf\", \"\\\\nRightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21ae\", \"\\\\nleftrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21ce\", \"\\\\nLeftrightarrow\", true);\n// AMS Misc\ndefineSymbol(math, ams, rel, \"\\u25b3\", \"\\\\vartriangle\");\ndefineSymbol(math, ams, textord, \"\\u210f\", \"\\\\hslash\");\ndefineSymbol(math, ams, textord, \"\\u25bd\", \"\\\\triangledown\");\ndefineSymbol(math, ams, textord, \"\\u25ca\", \"\\\\lozenge\");\ndefineSymbol(math, ams, textord, \"\\u24c8\", \"\\\\circledS\");\ndefineSymbol(math, ams, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(text, ams, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(math, ams, textord, \"\\u2221\", \"\\\\measuredangle\", true);\ndefineSymbol(math, ams, textord, \"\\u2204\", \"\\\\nexists\");\ndefineSymbol(math, ams, textord, \"\\u2127\", \"\\\\mho\");\ndefineSymbol(math, ams, textord, \"\\u2132\", \"\\\\Finv\", true);\ndefineSymbol(math, ams, textord, \"\\u2141\", \"\\\\Game\", true);\ndefineSymbol(math, ams, textord, \"\\u2035\", \"\\\\backprime\");\ndefineSymbol(math, ams, textord, \"\\u25b2\", \"\\\\blacktriangle\");\ndefineSymbol(math, ams, textord, \"\\u25bc\", \"\\\\blacktriangledown\");\ndefineSymbol(math, ams, textord, \"\\u25a0\", \"\\\\blacksquare\");\ndefineSymbol(math, ams, textord, \"\\u29eb\", \"\\\\blacklozenge\");\ndefineSymbol(math, ams, textord, \"\\u2605\", \"\\\\bigstar\");\ndefineSymbol(math, ams, textord, \"\\u2222\", \"\\\\sphericalangle\", true);\ndefineSymbol(math, ams, textord, \"\\u2201\", \"\\\\complement\", true);\n// unicode-math maps U+F0 to \\matheth. We map to AMS function \\eth\ndefineSymbol(math, ams, textord, \"\\u00f0\", \"\\\\eth\", true);\ndefineSymbol(text, main, textord, \"\\u00f0\", \"\\u00f0\");\ndefineSymbol(math, ams, textord, \"\\u2571\", \"\\\\diagup\");\ndefineSymbol(math, ams, textord, \"\\u2572\", \"\\\\diagdown\");\ndefineSymbol(math, ams, textord, \"\\u25a1\", \"\\\\square\");\ndefineSymbol(math, ams, textord, \"\\u25a1\", \"\\\\Box\");\ndefineSymbol(math, ams, textord, \"\\u25ca\", \"\\\\Diamond\");\n// unicode-math maps U+A5 to \\mathyen. We map to AMS function \\yen\ndefineSymbol(math, ams, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(text, ams, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(math, ams, textord, \"\\u2713\", \"\\\\checkmark\", true);\ndefineSymbol(text, ams, textord, \"\\u2713\", \"\\\\checkmark\");\n// AMS Hebrew\ndefineSymbol(math, ams, textord, \"\\u2136\", \"\\\\beth\", true);\ndefineSymbol(math, ams, textord, \"\\u2138\", \"\\\\daleth\", true);\ndefineSymbol(math, ams, textord, \"\\u2137\", \"\\\\gimel\", true);\n// AMS Greek\ndefineSymbol(math, ams, textord, \"\\u03dd\", \"\\\\digamma\", true);\ndefineSymbol(math, ams, textord, \"\\u03f0\", \"\\\\varkappa\");\n// AMS Delimiters\ndefineSymbol(math, ams, open, \"\\u250c\", \"\\\\@ulcorner\", true);\ndefineSymbol(math, ams, close, \"\\u2510\", \"\\\\@urcorner\", true);\ndefineSymbol(math, ams, open, \"\\u2514\", \"\\\\@llcorner\", true);\ndefineSymbol(math, ams, close, \"\\u2518\", \"\\\\@lrcorner\", true);\n// AMS Binary Relations\ndefineSymbol(math, ams, rel, \"\\u2266\", \"\\\\leqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2a7d\", \"\\\\leqslant\", true);\ndefineSymbol(math, ams, rel, \"\\u2a95\", \"\\\\eqslantless\", true);\ndefineSymbol(math, ams, rel, \"\\u2272\", \"\\\\lesssim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a85\", \"\\\\lessapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u224a\", \"\\\\approxeq\", true);\ndefineSymbol(math, ams, bin, \"\\u22d6\", \"\\\\lessdot\");\ndefineSymbol(math, ams, rel, \"\\u22d8\", \"\\\\lll\", true);\ndefineSymbol(math, ams, rel, \"\\u2276\", \"\\\\lessgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u22da\", \"\\\\lesseqgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8b\", \"\\\\lesseqqgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2251\", \"\\\\doteqdot\");\ndefineSymbol(math, ams, rel, \"\\u2253\", \"\\\\risingdotseq\", true);\ndefineSymbol(math, ams, rel, \"\\u2252\", \"\\\\fallingdotseq\", true);\ndefineSymbol(math, ams, rel, \"\\u223d\", \"\\\\backsim\", true);\ndefineSymbol(math, ams, rel, \"\\u22cd\", \"\\\\backsimeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2ac5\", \"\\\\subseteqq\", true);\ndefineSymbol(math, ams, rel, \"\\u22d0\", \"\\\\Subset\", true);\ndefineSymbol(math, ams, rel, \"\\u228f\", \"\\\\sqsubset\", true);\ndefineSymbol(math, ams, rel, \"\\u227c\", \"\\\\preccurlyeq\", true);\ndefineSymbol(math, ams, rel, \"\\u22de\", \"\\\\curlyeqprec\", true);\ndefineSymbol(math, ams, rel, \"\\u227e\", \"\\\\precsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab7\", \"\\\\precapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u22b2\", \"\\\\vartriangleleft\");\ndefineSymbol(math, ams, rel, \"\\u22b4\", \"\\\\trianglelefteq\");\ndefineSymbol(math, ams, rel, \"\\u22a8\", \"\\\\vDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22aa\", \"\\\\Vvdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2323\", \"\\\\smallsmile\");\ndefineSymbol(math, ams, rel, \"\\u2322\", \"\\\\smallfrown\");\ndefineSymbol(math, ams, rel, \"\\u224f\", \"\\\\bumpeq\", true);\ndefineSymbol(math, ams, rel, \"\\u224e\", \"\\\\Bumpeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2267\", \"\\\\geqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2a7e\", \"\\\\geqslant\", true);\ndefineSymbol(math, ams, rel, \"\\u2a96\", \"\\\\eqslantgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2273\", \"\\\\gtrsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a86\", \"\\\\gtrapprox\", true);\ndefineSymbol(math, ams, bin, \"\\u22d7\", \"\\\\gtrdot\");\ndefineSymbol(math, ams, rel, \"\\u22d9\", \"\\\\ggg\", true);\ndefineSymbol(math, ams, rel, \"\\u2277\", \"\\\\gtrless\", true);\ndefineSymbol(math, ams, rel, \"\\u22db\", \"\\\\gtreqless\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8c\", \"\\\\gtreqqless\", true);\ndefineSymbol(math, ams, rel, \"\\u2256\", \"\\\\eqcirc\", true);\ndefineSymbol(math, ams, rel, \"\\u2257\", \"\\\\circeq\", true);\ndefineSymbol(math, ams, rel, \"\\u225c\", \"\\\\triangleq\", true);\ndefineSymbol(math, ams, rel, \"\\u223c\", \"\\\\thicksim\");\ndefineSymbol(math, ams, rel, \"\\u2248\", \"\\\\thickapprox\");\ndefineSymbol(math, ams, rel, \"\\u2ac6\", \"\\\\supseteqq\", true);\ndefineSymbol(math, ams, rel, \"\\u22d1\", \"\\\\Supset\", true);\ndefineSymbol(math, ams, rel, \"\\u2290\", \"\\\\sqsupset\", true);\ndefineSymbol(math, ams, rel, \"\\u227d\", \"\\\\succcurlyeq\", true);\ndefineSymbol(math, ams, rel, \"\\u22df\", \"\\\\curlyeqsucc\", true);\ndefineSymbol(math, ams, rel, \"\\u227f\", \"\\\\succsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab8\", \"\\\\succapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u22b3\", \"\\\\vartriangleright\");\ndefineSymbol(math, ams, rel, \"\\u22b5\", \"\\\\trianglerighteq\");\ndefineSymbol(math, ams, rel, \"\\u22a9\", \"\\\\Vdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2223\", \"\\\\shortmid\");\ndefineSymbol(math, ams, rel, \"\\u2225\", \"\\\\shortparallel\");\ndefineSymbol(math, ams, rel, \"\\u226c\", \"\\\\between\", true);\ndefineSymbol(math, ams, rel, \"\\u22d4\", \"\\\\pitchfork\", true);\ndefineSymbol(math, ams, rel, \"\\u221d\", \"\\\\varpropto\");\ndefineSymbol(math, ams, rel, \"\\u25c0\", \"\\\\blacktriangleleft\");\n// unicode-math says that \\therefore is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, ams, rel, \"\\u2234\", \"\\\\therefore\", true);\ndefineSymbol(math, ams, rel, \"\\u220d\", \"\\\\backepsilon\");\ndefineSymbol(math, ams, rel, \"\\u25b6\", \"\\\\blacktriangleright\");\n// unicode-math says that \\because is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, ams, rel, \"\\u2235\", \"\\\\because\", true);\ndefineSymbol(math, ams, rel, \"\\u22d8\", \"\\\\llless\");\ndefineSymbol(math, ams, rel, \"\\u22d9\", \"\\\\gggtr\");\ndefineSymbol(math, ams, bin, \"\\u22b2\", \"\\\\lhd\");\ndefineSymbol(math, ams, bin, \"\\u22b3\", \"\\\\rhd\");\ndefineSymbol(math, ams, rel, \"\\u2242\", \"\\\\eqsim\", true);\ndefineSymbol(math, main, rel, \"\\u22c8\", \"\\\\Join\");\ndefineSymbol(math, ams, rel, \"\\u2251\", \"\\\\Doteq\", true);\n// AMS Binary Operators\ndefineSymbol(math, ams, bin, \"\\u2214\", \"\\\\dotplus\", true);\ndefineSymbol(math, ams, bin, \"\\u2216\", \"\\\\smallsetminus\");\ndefineSymbol(math, ams, bin, \"\\u22d2\", \"\\\\Cap\", true);\ndefineSymbol(math, ams, bin, \"\\u22d3\", \"\\\\Cup\", true);\ndefineSymbol(math, ams, bin, \"\\u2a5e\", \"\\\\doublebarwedge\", true);\ndefineSymbol(math, ams, bin, \"\\u229f\", \"\\\\boxminus\", true);\ndefineSymbol(math, ams, bin, \"\\u229e\", \"\\\\boxplus\", true);\ndefineSymbol(math, ams, bin, \"\\u22c7\", \"\\\\divideontimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22c9\", \"\\\\ltimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22ca\", \"\\\\rtimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cb\", \"\\\\leftthreetimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cc\", \"\\\\rightthreetimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cf\", \"\\\\curlywedge\", true);\ndefineSymbol(math, ams, bin, \"\\u22ce\", \"\\\\curlyvee\", true);\ndefineSymbol(math, ams, bin, \"\\u229d\", \"\\\\circleddash\", true);\ndefineSymbol(math, ams, bin, \"\\u229b\", \"\\\\circledast\", true);\ndefineSymbol(math, ams, bin, \"\\u22c5\", \"\\\\centerdot\");\ndefineSymbol(math, ams, bin, \"\\u22ba\", \"\\\\intercal\", true);\ndefineSymbol(math, ams, bin, \"\\u22d2\", \"\\\\doublecap\");\ndefineSymbol(math, ams, bin, \"\\u22d3\", \"\\\\doublecup\");\ndefineSymbol(math, ams, bin, \"\\u22a0\", \"\\\\boxtimes\", true);\n// AMS Arrows\n// Note: unicode-math maps \\u21e2 to their own function \\rightdasharrow.\n// We'll map it to AMS function \\dashrightarrow. It produces the same atom.\ndefineSymbol(math, ams, rel, \"\\u21e2\", \"\\\\dashrightarrow\", true);\n// unicode-math maps \\u21e0 to \\leftdasharrow. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u21e0\", \"\\\\dashleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21c7\", \"\\\\leftleftarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21c6\", \"\\\\leftrightarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21da\", \"\\\\Lleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u219e\", \"\\\\twoheadleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21a2\", \"\\\\leftarrowtail\", true);\ndefineSymbol(math, ams, rel, \"\\u21ab\", \"\\\\looparrowleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21cb\", \"\\\\leftrightharpoons\", true);\ndefineSymbol(math, ams, rel, \"\\u21b6\", \"\\\\curvearrowleft\", true);\n// unicode-math maps \\u21ba to \\acwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u21ba\", \"\\\\circlearrowleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21b0\", \"\\\\Lsh\", true);\ndefineSymbol(math, ams, rel, \"\\u21c8\", \"\\\\upuparrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21bf\", \"\\\\upharpoonleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21c3\", \"\\\\downharpoonleft\", true);\ndefineSymbol(math, main, rel, \"\\u22b6\", \"\\\\origof\", true); // not in font\ndefineSymbol(math, main, rel, \"\\u22b7\", \"\\\\imageof\", true); // not in font\ndefineSymbol(math, ams, rel, \"\\u22b8\", \"\\\\multimap\", true);\ndefineSymbol(math, ams, rel, \"\\u21ad\", \"\\\\leftrightsquigarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21c9\", \"\\\\rightrightarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21c4\", \"\\\\rightleftarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21a0\", \"\\\\twoheadrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21a3\", \"\\\\rightarrowtail\", true);\ndefineSymbol(math, ams, rel, \"\\u21ac\", \"\\\\looparrowright\", true);\ndefineSymbol(math, ams, rel, \"\\u21b7\", \"\\\\curvearrowright\", true);\n// unicode-math maps \\u21bb to \\cwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u21bb\", \"\\\\circlearrowright\", true);\ndefineSymbol(math, ams, rel, \"\\u21b1\", \"\\\\Rsh\", true);\ndefineSymbol(math, ams, rel, \"\\u21ca\", \"\\\\downdownarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21be\", \"\\\\upharpoonright\", true);\ndefineSymbol(math, ams, rel, \"\\u21c2\", \"\\\\downharpoonright\", true);\ndefineSymbol(math, ams, rel, \"\\u21dd\", \"\\\\rightsquigarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21dd\", \"\\\\leadsto\");\ndefineSymbol(math, ams, rel, \"\\u21db\", \"\\\\Rrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21be\", \"\\\\restriction\");\ndefineSymbol(math, main, textord, \"\\u2018\", \"`\");\ndefineSymbol(math, main, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, main, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, main, textord, \"$\", \"\\\\textdollar\");\ndefineSymbol(math, main, textord, \"%\", \"\\\\%\");\ndefineSymbol(text, main, textord, \"%\", \"\\\\%\");\ndefineSymbol(math, main, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, main, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, main, textord, \"_\", \"\\\\textunderscore\");\ndefineSymbol(math, main, textord, \"\\u2220\", \"\\\\angle\", true);\ndefineSymbol(math, main, textord, \"\\u221e\", \"\\\\infty\", true);\ndefineSymbol(math, main, textord, \"\\u2032\", \"\\\\prime\");\ndefineSymbol(math, main, textord, \"\\u25b3\", \"\\\\triangle\");\ndefineSymbol(math, main, textord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(math, main, textord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(math, main, textord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(math, main, textord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(math, main, textord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(math, main, textord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(math, main, textord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(math, main, textord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(math, main, textord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(math, main, textord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(math, main, textord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, main, textord, \"A\", \"\\u0391\");\ndefineSymbol(math, main, textord, \"B\", \"\\u0392\");\ndefineSymbol(math, main, textord, \"E\", \"\\u0395\");\ndefineSymbol(math, main, textord, \"Z\", \"\\u0396\");\ndefineSymbol(math, main, textord, \"H\", \"\\u0397\");\ndefineSymbol(math, main, textord, \"I\", \"\\u0399\");\ndefineSymbol(math, main, textord, \"K\", \"\\u039A\");\ndefineSymbol(math, main, textord, \"M\", \"\\u039C\");\ndefineSymbol(math, main, textord, \"N\", \"\\u039D\");\ndefineSymbol(math, main, textord, \"O\", \"\\u039F\");\ndefineSymbol(math, main, textord, \"P\", \"\\u03A1\");\ndefineSymbol(math, main, textord, \"T\", \"\\u03A4\");\ndefineSymbol(math, main, textord, \"X\", \"\\u03A7\");\ndefineSymbol(math, main, textord, \"\\u00ac\", \"\\\\neg\", true);\ndefineSymbol(math, main, textord, \"\\u00ac\", \"\\\\lnot\");\ndefineSymbol(math, main, textord, \"\\u22a4\", \"\\\\top\");\ndefineSymbol(math, main, textord, \"\\u22a5\", \"\\\\bot\");\ndefineSymbol(math, main, textord, \"\\u2205\", \"\\\\emptyset\");\ndefineSymbol(math, ams, textord, \"\\u2205\", \"\\\\varnothing\");\ndefineSymbol(math, main, mathord, \"\\u03b1\", \"\\\\alpha\", true);\ndefineSymbol(math, main, mathord, \"\\u03b2\", \"\\\\beta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b3\", \"\\\\gamma\", true);\ndefineSymbol(math, main, mathord, \"\\u03b4\", \"\\\\delta\", true);\ndefineSymbol(math, main, mathord, \"\\u03f5\", \"\\\\epsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03b6\", \"\\\\zeta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b7\", \"\\\\eta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b8\", \"\\\\theta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b9\", \"\\\\iota\", true);\ndefineSymbol(math, main, mathord, \"\\u03ba\", \"\\\\kappa\", true);\ndefineSymbol(math, main, mathord, \"\\u03bb\", \"\\\\lambda\", true);\ndefineSymbol(math, main, mathord, \"\\u03bc\", \"\\\\mu\", true);\ndefineSymbol(math, main, mathord, \"\\u03bd\", \"\\\\nu\", true);\ndefineSymbol(math, main, mathord, \"\\u03be\", \"\\\\xi\", true);\ndefineSymbol(math, main, mathord, \"\\u03bf\", \"\\\\omicron\", true);\ndefineSymbol(math, main, mathord, \"\\u03c0\", \"\\\\pi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c1\", \"\\\\rho\", true);\ndefineSymbol(math, main, mathord, \"\\u03c3\", \"\\\\sigma\", true);\ndefineSymbol(math, main, mathord, \"\\u03c4\", \"\\\\tau\", true);\ndefineSymbol(math, main, mathord, \"\\u03c5\", \"\\\\upsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03d5\", \"\\\\phi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c7\", \"\\\\chi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c8\", \"\\\\psi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c9\", \"\\\\omega\", true);\ndefineSymbol(math, main, mathord, \"\\u03b5\", \"\\\\varepsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03d1\", \"\\\\vartheta\", true);\ndefineSymbol(math, main, mathord, \"\\u03d6\", \"\\\\varpi\", true);\ndefineSymbol(math, main, mathord, \"\\u03f1\", \"\\\\varrho\", true);\ndefineSymbol(math, main, mathord, \"\\u03c2\", \"\\\\varsigma\", true);\ndefineSymbol(math, main, mathord, \"\\u03c6\", \"\\\\varphi\", true);\ndefineSymbol(math, main, bin, \"\\u2217\", \"*\", true);\ndefineSymbol(math, main, bin, \"+\", \"+\");\ndefineSymbol(math, main, bin, \"\\u2212\", \"-\", true);\ndefineSymbol(math, main, bin, \"\\u22c5\", \"\\\\cdot\", true);\ndefineSymbol(math, main, bin, \"\\u2218\", \"\\\\circ\", true);\ndefineSymbol(math, main, bin, \"\\u00f7\", \"\\\\div\", true);\ndefineSymbol(math, main, bin, \"\\u00b1\", \"\\\\pm\", true);\ndefineSymbol(math, main, bin, \"\\u00d7\", \"\\\\times\", true);\ndefineSymbol(math, main, bin, \"\\u2229\", \"\\\\cap\", true);\ndefineSymbol(math, main, bin, \"\\u222a\", \"\\\\cup\", true);\ndefineSymbol(math, main, bin, \"\\u2216\", \"\\\\setminus\", true);\ndefineSymbol(math, main, bin, \"\\u2227\", \"\\\\land\");\ndefineSymbol(math, main, bin, \"\\u2228\", \"\\\\lor\");\ndefineSymbol(math, main, bin, \"\\u2227\", \"\\\\wedge\", true);\ndefineSymbol(math, main, bin, \"\\u2228\", \"\\\\vee\", true);\ndefineSymbol(math, main, textord, \"\\u221a\", \"\\\\surd\");\ndefineSymbol(math, main, open, \"\\u27e8\", \"\\\\langle\", true);\ndefineSymbol(math, main, open, \"\\u2223\", \"\\\\lvert\");\ndefineSymbol(math, main, open, \"\\u2225\", \"\\\\lVert\");\ndefineSymbol(math, main, close, \"?\", \"?\");\ndefineSymbol(math, main, close, \"!\", \"!\");\ndefineSymbol(math, main, close, \"\\u27e9\", \"\\\\rangle\", true);\ndefineSymbol(math, main, close, \"\\u2223\", \"\\\\rvert\");\ndefineSymbol(math, main, close, \"\\u2225\", \"\\\\rVert\");\ndefineSymbol(math, main, rel, \"=\", \"=\");\ndefineSymbol(math, main, rel, \":\", \":\");\ndefineSymbol(math, main, rel, \"\\u2248\", \"\\\\approx\", true);\ndefineSymbol(math, main, rel, \"\\u2245\", \"\\\\cong\", true);\ndefineSymbol(math, main, rel, \"\\u2265\", \"\\\\ge\");\ndefineSymbol(math, main, rel, \"\\u2265\", \"\\\\geq\", true);\ndefineSymbol(math, main, rel, \"\\u2190\", \"\\\\gets\");\ndefineSymbol(math, main, rel, \">\", \"\\\\gt\", true);\ndefineSymbol(math, main, rel, \"\\u2208\", \"\\\\in\", true);\ndefineSymbol(math, main, rel, \"\\ue020\", \"\\\\@not\");\ndefineSymbol(math, main, rel, \"\\u2282\", \"\\\\subset\", true);\ndefineSymbol(math, main, rel, \"\\u2283\", \"\\\\supset\", true);\ndefineSymbol(math, main, rel, \"\\u2286\", \"\\\\subseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2287\", \"\\\\supseteq\", true);\ndefineSymbol(math, ams, rel, \"\\u2288\", \"\\\\nsubseteq\", true);\ndefineSymbol(math, ams, rel, \"\\u2289\", \"\\\\nsupseteq\", true);\ndefineSymbol(math, main, rel, \"\\u22a8\", \"\\\\models\");\ndefineSymbol(math, main, rel, \"\\u2190\", \"\\\\leftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2264\", \"\\\\le\");\ndefineSymbol(math, main, rel, \"\\u2264\", \"\\\\leq\", true);\ndefineSymbol(math, main, rel, \"<\", \"\\\\lt\", true);\ndefineSymbol(math, main, rel, \"\\u2192\", \"\\\\rightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2192\", \"\\\\to\");\ndefineSymbol(math, ams, rel, \"\\u2271\", \"\\\\ngeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2270\", \"\\\\nleq\", true);\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\space\");\n// Ref: LaTeX Source 2e: \\DeclareRobustCommand{\\nobreakspace}{%\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \" \");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\space\");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(math, main, spacing, \"\", \"\\\\nobreak\");\ndefineSymbol(math, main, spacing, \"\", \"\\\\allowbreak\");\ndefineSymbol(math, main, punct, \",\", \",\");\ndefineSymbol(math, main, punct, \";\", \";\");\ndefineSymbol(math, ams, bin, \"\\u22bc\", \"\\\\barwedge\", true);\ndefineSymbol(math, ams, bin, \"\\u22bb\", \"\\\\veebar\", true);\ndefineSymbol(math, main, bin, \"\\u2299\", \"\\\\odot\", true);\ndefineSymbol(math, main, bin, \"\\u2295\", \"\\\\oplus\", true);\ndefineSymbol(math, main, bin, \"\\u2297\", \"\\\\otimes\", true);\ndefineSymbol(math, main, textord, \"\\u2202\", \"\\\\partial\", true);\ndefineSymbol(math, main, bin, \"\\u2298\", \"\\\\oslash\", true);\ndefineSymbol(math, ams, bin, \"\\u229a\", \"\\\\circledcirc\", true);\ndefineSymbol(math, ams, bin, \"\\u22a1\", \"\\\\boxdot\", true);\ndefineSymbol(math, main, bin, \"\\u25b3\", \"\\\\bigtriangleup\");\ndefineSymbol(math, main, bin, \"\\u25bd\", \"\\\\bigtriangledown\");\ndefineSymbol(math, main, bin, \"\\u2020\", \"\\\\dagger\");\ndefineSymbol(math, main, bin, \"\\u22c4\", \"\\\\diamond\");\ndefineSymbol(math, main, bin, \"\\u22c6\", \"\\\\star\");\ndefineSymbol(math, main, bin, \"\\u25c3\", \"\\\\triangleleft\");\ndefineSymbol(math, main, bin, \"\\u25b9\", \"\\\\triangleright\");\ndefineSymbol(math, main, open, \"{\", \"\\\\{\");\ndefineSymbol(text, main, textord, \"{\", \"\\\\{\");\ndefineSymbol(text, main, textord, \"{\", \"\\\\textbraceleft\");\ndefineSymbol(math, main, close, \"}\", \"\\\\}\");\ndefineSymbol(text, main, textord, \"}\", \"\\\\}\");\ndefineSymbol(text, main, textord, \"}\", \"\\\\textbraceright\");\ndefineSymbol(math, main, open, \"{\", \"\\\\lbrace\");\ndefineSymbol(math, main, close, \"}\", \"\\\\rbrace\");\ndefineSymbol(math, main, open, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(text, main, textord, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(math, main, close, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(text, main, textord, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(math, main, open, \"(\", \"\\\\lparen\", true);\ndefineSymbol(math, main, close, \")\", \"\\\\rparen\", true);\ndefineSymbol(text, main, textord, \"<\", \"\\\\textless\", true); // in T1 fontenc\ndefineSymbol(text, main, textord, \">\", \"\\\\textgreater\", true); // in T1 fontenc\ndefineSymbol(math, main, open, \"\\u230a\", \"\\\\lfloor\", true);\ndefineSymbol(math, main, close, \"\\u230b\", \"\\\\rfloor\", true);\ndefineSymbol(math, main, open, \"\\u2308\", \"\\\\lceil\", true);\ndefineSymbol(math, main, close, \"\\u2309\", \"\\\\rceil\", true);\ndefineSymbol(math, main, textord, \"\\\\\", \"\\\\backslash\");\ndefineSymbol(math, main, textord, \"\\u2223\", \"|\");\ndefineSymbol(math, main, textord, \"\\u2223\", \"\\\\vert\");\ndefineSymbol(text, main, textord, \"|\", \"\\\\textbar\", true); // in T1 fontenc\ndefineSymbol(math, main, textord, \"\\u2225\", \"\\\\|\");\ndefineSymbol(math, main, textord, \"\\u2225\", \"\\\\Vert\");\ndefineSymbol(text, main, textord, \"\\u2225\", \"\\\\textbardbl\");\ndefineSymbol(text, main, textord, \"~\", \"\\\\textasciitilde\");\ndefineSymbol(text, main, textord, \"\\\\\", \"\\\\textbackslash\");\ndefineSymbol(text, main, textord, \"^\", \"\\\\textasciicircum\");\ndefineSymbol(math, main, rel, \"\\u2191\", \"\\\\uparrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d1\", \"\\\\Uparrow\", true);\ndefineSymbol(math, main, rel, \"\\u2193\", \"\\\\downarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d3\", \"\\\\Downarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2195\", \"\\\\updownarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d5\", \"\\\\Updownarrow\", true);\ndefineSymbol(math, main, op, \"\\u2210\", \"\\\\coprod\");\ndefineSymbol(math, main, op, \"\\u22c1\", \"\\\\bigvee\");\ndefineSymbol(math, main, op, \"\\u22c0\", \"\\\\bigwedge\");\ndefineSymbol(math, main, op, \"\\u2a04\", \"\\\\biguplus\");\ndefineSymbol(math, main, op, \"\\u22c2\", \"\\\\bigcap\");\ndefineSymbol(math, main, op, \"\\u22c3\", \"\\\\bigcup\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\int\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\intop\");\ndefineSymbol(math, main, op, \"\\u222c\", \"\\\\iint\");\ndefineSymbol(math, main, op, \"\\u222d\", \"\\\\iiint\");\ndefineSymbol(math, main, op, \"\\u220f\", \"\\\\prod\");\ndefineSymbol(math, main, op, \"\\u2211\", \"\\\\sum\");\ndefineSymbol(math, main, op, \"\\u2a02\", \"\\\\bigotimes\");\ndefineSymbol(math, main, op, \"\\u2a01\", \"\\\\bigoplus\");\ndefineSymbol(math, main, op, \"\\u2a00\", \"\\\\bigodot\");\ndefineSymbol(math, main, op, \"\\u222e\", \"\\\\oint\");\ndefineSymbol(math, main, op, \"\\u222f\", \"\\\\oiint\");\ndefineSymbol(math, main, op, \"\\u2230\", \"\\\\oiiint\");\ndefineSymbol(math, main, op, \"\\u2a06\", \"\\\\bigsqcup\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\smallint\");\ndefineSymbol(text, main, inner, \"\\u2026\", \"\\\\textellipsis\");\ndefineSymbol(math, main, inner, \"\\u2026\", \"\\\\mathellipsis\");\ndefineSymbol(text, main, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, main, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, main, inner, \"\\u22ef\", \"\\\\@cdots\", true);\ndefineSymbol(math, main, inner, \"\\u22f1\", \"\\\\ddots\", true);\n// \\vdots is a macro that uses one of these two symbols (with made-up names):\ndefineSymbol(math, main, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(text, main, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(math, main, accent, \"\\u02ca\", \"\\\\acute\");\ndefineSymbol(math, main, accent, \"\\u02cb\", \"\\\\grave\");\ndefineSymbol(math, main, accent, \"\\u00a8\", \"\\\\ddot\");\ndefineSymbol(math, main, accent, \"\\u007e\", \"\\\\tilde\");\ndefineSymbol(math, main, accent, \"\\u02c9\", \"\\\\bar\");\ndefineSymbol(math, main, accent, \"\\u02d8\", \"\\\\breve\");\ndefineSymbol(math, main, accent, \"\\u02c7\", \"\\\\check\");\ndefineSymbol(math, main, accent, \"\\u005e\", \"\\\\hat\");\ndefineSymbol(math, main, accent, \"\\u20d7\", \"\\\\vec\");\ndefineSymbol(math, main, accent, \"\\u02d9\", \"\\\\dot\");\ndefineSymbol(math, main, accent, \"\\u02da\", \"\\\\mathring\");\n// \\imath and \\jmath should be invariant to \\mathrm, \\mathbf, etc., so use PUA\ndefineSymbol(math, main, mathord, \"\\ue131\", \"\\\\@imath\");\ndefineSymbol(math, main, mathord, \"\\ue237\", \"\\\\@jmath\");\ndefineSymbol(math, main, textord, \"\\u0131\", \"\\u0131\");\ndefineSymbol(math, main, textord, \"\\u0237\", \"\\u0237\");\ndefineSymbol(text, main, textord, \"\\u0131\", \"\\\\i\", true);\ndefineSymbol(text, main, textord, \"\\u0237\", \"\\\\j\", true);\ndefineSymbol(text, main, textord, \"\\u00df\", \"\\\\ss\", true);\ndefineSymbol(text, main, textord, \"\\u00e6\", \"\\\\ae\", true);\ndefineSymbol(text, main, textord, \"\\u0153\", \"\\\\oe\", true);\ndefineSymbol(text, main, textord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(text, main, textord, \"\\u00c6\", \"\\\\AE\", true);\ndefineSymbol(text, main, textord, \"\\u0152\", \"\\\\OE\", true);\ndefineSymbol(text, main, textord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(text, main, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(text, main, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(text, main, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(text, main, accent, \"\\u02dc\", \"\\\\~\"); // tilde\ndefineSymbol(text, main, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(text, main, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(text, main, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(text, main, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(text, main, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(text, main, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(text, main, accent, \"\\u00a8\", '\\\\\"'); // diaeresis\ndefineSymbol(text, main, accent, \"\\u02dd\", \"\\\\H\"); // double acute\ndefineSymbol(text, main, accent, \"\\u25ef\", \"\\\\textcircled\"); // \\bigcirc glyph\n// These ligatures are detected and created in Parser.js's `formLigatures`.\nvar ligatures = {\n  \"--\": true,\n  \"---\": true,\n  \"``\": true,\n  \"''\": true\n};\ndefineSymbol(text, main, textord, \"\\u2013\", \"--\", true);\ndefineSymbol(text, main, textord, \"\\u2013\", \"\\\\textendash\");\ndefineSymbol(text, main, textord, \"\\u2014\", \"---\", true);\ndefineSymbol(text, main, textord, \"\\u2014\", \"\\\\textemdash\");\ndefineSymbol(text, main, textord, \"\\u2018\", \"`\", true);\ndefineSymbol(text, main, textord, \"\\u2018\", \"\\\\textquoteleft\");\ndefineSymbol(text, main, textord, \"\\u2019\", \"'\", true);\ndefineSymbol(text, main, textord, \"\\u2019\", \"\\\\textquoteright\");\ndefineSymbol(text, main, textord, \"\\u201c\", \"``\", true);\ndefineSymbol(text, main, textord, \"\\u201c\", \"\\\\textquotedblleft\");\ndefineSymbol(text, main, textord, \"\\u201d\", \"''\", true);\ndefineSymbol(text, main, textord, \"\\u201d\", \"\\\\textquotedblright\");\n//  \\degree from gensymb package\ndefineSymbol(math, main, textord, \"\\u00b0\", \"\\\\degree\", true);\ndefineSymbol(text, main, textord, \"\\u00b0\", \"\\\\degree\");\n// \\textdegree from inputenc package\ndefineSymbol(text, main, textord, \"\\u00b0\", \"\\\\textdegree\", true);\n// TODO: In LaTeX, \\pounds can generate a different character in text and math\n// mode, but among our fonts, only Main-Regular defines this character \"163\".\ndefineSymbol(math, main, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(math, main, textord, \"\\u00a3\", \"\\\\mathsterling\", true);\ndefineSymbol(text, main, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(text, main, textord, \"\\u00a3\", \"\\\\textsterling\", true);\ndefineSymbol(math, ams, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(text, ams, textord, \"\\u2720\", \"\\\\maltese\");\n// There are lots of symbols which are the same, so we add them in afterwards.\n// All of these are textords in math mode\nvar mathTextSymbols = \"0123456789/@.\\\"\";\nfor (var i = 0; i < mathTextSymbols.length; i++) {\n  var ch = mathTextSymbols.charAt(i);\n  defineSymbol(math, main, textord, ch, ch);\n}\n// All of these are textords in text mode\nvar textSymbols = \"0123456789!@*()-=+\\\";:?/.,\";\nfor (var _i = 0; _i < textSymbols.length; _i++) {\n  var _ch = textSymbols.charAt(_i);\n  defineSymbol(text, main, textord, _ch, _ch);\n}\n// All of these are textords in text mode, and mathords in math mode\nvar letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nfor (var _i2 = 0; _i2 < letters.length; _i2++) {\n  var _ch2 = letters.charAt(_i2);\n  defineSymbol(math, main, mathord, _ch2, _ch2);\n  defineSymbol(text, main, textord, _ch2, _ch2);\n}\n// Blackboard bold and script letters in Unicode range\ndefineSymbol(math, ams, textord, \"C\", \"\\u2102\"); // blackboard bold\ndefineSymbol(text, ams, textord, \"C\", \"\\u2102\");\ndefineSymbol(math, ams, textord, \"H\", \"\\u210D\");\ndefineSymbol(text, ams, textord, \"H\", \"\\u210D\");\ndefineSymbol(math, ams, textord, \"N\", \"\\u2115\");\ndefineSymbol(text, ams, textord, \"N\", \"\\u2115\");\ndefineSymbol(math, ams, textord, \"P\", \"\\u2119\");\ndefineSymbol(text, ams, textord, \"P\", \"\\u2119\");\ndefineSymbol(math, ams, textord, \"Q\", \"\\u211A\");\ndefineSymbol(text, ams, textord, \"Q\", \"\\u211A\");\ndefineSymbol(math, ams, textord, \"R\", \"\\u211D\");\ndefineSymbol(text, ams, textord, \"R\", \"\\u211D\");\ndefineSymbol(math, ams, textord, \"Z\", \"\\u2124\");\ndefineSymbol(text, ams, textord, \"Z\", \"\\u2124\");\ndefineSymbol(math, main, mathord, \"h\", \"\\u210E\"); // italic h, Planck constant\ndefineSymbol(text, main, mathord, \"h\", \"\\u210E\");\n// The next loop loads wide (surrogate pair) characters.\n// We support some letters in the Unicode range U+1D400 to U+1D7FF,\n// Mathematical Alphanumeric Symbols.\n// Some editors do not deal well with wide characters. So don't write the\n// string into this file. Instead, create the string from the surrogate pair.\nvar wideChar;\nfor (var _i3 = 0; _i3 < letters.length; _i3++) {\n  var _ch3 = letters.charAt(_i3);\n  // The hex numbers in the next line are a surrogate pair.\n  // 0xD835 is the high surrogate for all letters in the range we support.\n  // 0xDC00 is the low surrogate for bold A.\n  wideChar = String.fromCharCode(0xD835, 0xDC00 + _i3); // A-Z a-z bold\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDC34 + _i3); // A-Z a-z italic\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDC68 + _i3); // A-Z a-z bold italic\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDD04 + _i3); // A-Z a-z Fraktur\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDD6C + _i3); // A-Z a-z bold Fraktur\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDDA0 + _i3); // A-Z a-z sans-serif\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDDD4 + _i3); // A-Z a-z sans bold\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDE08 + _i3); // A-Z a-z sans italic\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDE70 + _i3); // A-Z a-z monospace\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  if (_i3 < 26) {\n    // KaTeX fonts have only capital letters for blackboard bold and script.\n    // See exception for k below.\n    wideChar = String.fromCharCode(0xD835, 0xDD38 + _i3); // A-Z double struck\n    defineSymbol(math, main, mathord, _ch3, wideChar);\n    defineSymbol(text, main, textord, _ch3, wideChar);\n    wideChar = String.fromCharCode(0xD835, 0xDC9C + _i3); // A-Z script\n    defineSymbol(math, main, mathord, _ch3, wideChar);\n    defineSymbol(text, main, textord, _ch3, wideChar);\n  }\n  // TODO: Add bold script when it is supported by a KaTeX font.\n}\n// \"k\" is the only double struck lower case letter in the KaTeX fonts.\nwideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck\ndefineSymbol(math, main, mathord, \"k\", wideChar);\ndefineSymbol(text, main, textord, \"k\", wideChar);\n// Next, some wide character numerals\nfor (var _i4 = 0; _i4 < 10; _i4++) {\n  var _ch4 = _i4.toString();\n  wideChar = String.fromCharCode(0xD835, 0xDFCE + _i4); // 0-9 bold\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDFE2 + _i4); // 0-9 sans serif\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDFEC + _i4); // 0-9 bold sans\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDFF6 + _i4); // 0-9 monospace\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n}\n// We add these Latin-1 letters as symbols for backwards-compatibility,\n// but they are not actually in the font, nor are they supported by the\n// Unicode accent mechanism, so they fall back to Times font and look ugly.\n// TODO(edemaine): Fix this.\nvar extraLatin = \"\\u00d0\\u00de\\u00fe\";\nfor (var _i5 = 0; _i5 < extraLatin.length; _i5++) {\n  var _ch5 = extraLatin.charAt(_i5);\n  defineSymbol(math, main, mathord, _ch5, _ch5);\n  defineSymbol(text, main, textord, _ch5, _ch5);\n}\n\n/**\n * This file provides support for Unicode range U+1D400 to U+1D7FF,\n * Mathematical Alphanumeric Symbols.\n *\n * Function wideCharacterFont takes a wide character as input and returns\n * the font information necessary to render it properly.\n */\nvar boldUpright = {\n  mathClass: \"mathbf\",\n  textClass: \"textbf\",\n  font: \"Main-Bold\"\n};\nvar italic = {\n  mathClass: \"mathnormal\",\n  textClass: \"textit\",\n  font: \"Math-Italic\"\n};\nvar boldItalic = {\n  mathClass: \"boldsymbol\",\n  textClass: \"boldsymbol\",\n  font: \"Main-BoldItalic\"\n};\nvar script = {\n  mathClass: \"mathscr\",\n  textClass: \"textscr\",\n  font: \"Script-Regular\"\n};\nvar noFont = {\n  mathClass: \"\",\n  textClass: \"\",\n  font: \"\"\n};\nvar fraktur = {\n  mathClass: \"mathfrak\",\n  textClass: \"textfrak\",\n  font: \"Fraktur-Regular\"\n};\nvar doubleStruck = {\n  mathClass: \"mathbb\",\n  textClass: \"textbb\",\n  font: \"AMS-Regular\"\n};\nvar boldFraktur = {\n  mathClass: \"mathboldfrak\",\n  textClass: \"textboldfrak\",\n  font: \"Fraktur-Regular\"\n};\nvar sansSerif = {\n  mathClass: \"mathsf\",\n  textClass: \"textsf\",\n  font: \"SansSerif-Regular\"\n};\nvar boldSansSerif = {\n  mathClass: \"mathboldsf\",\n  textClass: \"textboldsf\",\n  font: \"SansSerif-Bold\"\n};\nvar italicSansSerif = {\n  mathClass: \"mathitsf\",\n  textClass: \"textitsf\",\n  font: \"SansSerif-Italic\"\n};\nvar monospace = {\n  mathClass: \"mathtt\",\n  textClass: \"texttt\",\n  font: \"Typewriter-Regular\"\n};\n/**\n * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf\n * That document sorts characters into groups by font type, say bold or italic.\n *\n * In the arrays below, each object consists of three properties:\n *      * The CSS class of that group when in math mode.\n *      * The CSS class of that group when in text mode.\n *      * The font name, so that KaTeX can get font metrics.\n */\nvar wideLatinLetterData = [boldUpright, boldUpright,\n// A-Z, a-z\nitalic, italic,\n// A-Z, a-z\nboldItalic, boldItalic,\n// A-Z, a-z\n// Map fancy A-Z letters to script, not calligraphic.\n// This aligns with unicode-math and math fonts (except Cambria Math).\nscript, noFont,\n// A-Z script, a-z — no font\nnoFont, noFont,\n// A-Z bold script, a-z bold script — no font\nfraktur, fraktur,\n// A-Z, a-z\ndoubleStruck, doubleStruck,\n// A-Z double-struck, k double-struck\n// Note that we are using a bold font, but font metrics for regular Fraktur.\nboldFraktur, boldFraktur,\n// A-Z, a-z\nsansSerif, sansSerif,\n// A-Z, a-z\nboldSansSerif, boldSansSerif,\n// A-Z, a-z\nitalicSansSerif, italicSansSerif,\n// A-Z, a-z\nnoFont, noFont,\n// A-Z bold italic sans, a-z bold italic sans - no font\nmonospace, monospace // A-Z, a-z\n];\nvar wideNumeralData = [boldUpright,\n// 0-9\nnoFont,\n// 0-9 double-struck. No KaTeX font.\nsansSerif,\n// 0-9\nboldSansSerif,\n// 0-9\nmonospace // 0-9\n];\nvar wideCharacterFont = wideChar => {\n  // IE doesn't support codePointAt(). So work with the surrogate pair.\n  var H = wideChar.charCodeAt(0); // high surrogate\n  var L = wideChar.charCodeAt(1); // low surrogate\n  var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000;\n  if (0x1D400 <= codePoint && codePoint < 0x1D6A4) {\n    // wideLatinLetterData contains exactly 26 chars on each row.\n    // So we can calculate the relevant row. No traverse necessary.\n    var i = Math.floor((codePoint - 0x1D400) / 26);\n    return wideLatinLetterData[i];\n  } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) {\n    // Numerals, ten per row.\n    var _i = Math.floor((codePoint - 0x1D7CE) / 10);\n    return wideNumeralData[_i];\n  } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) {\n    // dotless i or j\n    return wideLatinLetterData[0];\n  } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) {\n    // Greek letters. Not supported, yet.\n    return noFont;\n  } else {\n    // We don't support any wide characters outside 1D400–1D7FF.\n    throw new ParseError(\"Unsupported character: \" + wideChar);\n  }\n};\n\n/* eslint no-console:0 */\n/**\n * Looks up the given symbol in fontMetrics, after applying any symbol\n * replacements defined in symbol.js\n */\nvar lookupSymbol = function lookupSymbol(value, fontName, mode) {\n  // Replace the value with its replaced value from symbol.js\n  if (symbols[mode][value]) {\n    var replacement = symbols[mode][value].replace;\n    if (replacement) {\n      value = replacement;\n    }\n  }\n  return {\n    value,\n    metrics: getCharacterMetrics(value, fontName, mode)\n  };\n};\n/**\n * Makes a symbolNode after translation via the list of symbols in symbols.js.\n * Correctly pulls out metrics for the character, and optionally takes a list of\n * classes to be attached to the node.\n *\n * TODO: make argument order closer to makeSpan\n * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which\n * should if present come first in `classes`.\n * TODO(#953): Make `options` mandatory and always pass it in.\n */\nvar makeSymbol = function makeSymbol(value, fontName, mode, options, classes) {\n  var lookup = lookupSymbol(value, fontName, mode);\n  var metrics = lookup.metrics;\n  value = lookup.value;\n  var symbolNode;\n  if (metrics) {\n    var italic = metrics.italic;\n    if (mode === \"text\" || options && options.font === \"mathit\") {\n      italic = 0;\n    }\n    symbolNode = new SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes);\n  } else {\n    // TODO(emily): Figure out a good way to only print this in development\n    typeof console !== \"undefined\" && console.warn(\"No character metrics \" + (\"for '\" + value + \"' in style '\" + fontName + \"' and mode '\" + mode + \"'\"));\n    symbolNode = new SymbolNode(value, 0, 0, 0, 0, 0, classes);\n  }\n  if (options) {\n    symbolNode.maxFontSize = options.sizeMultiplier;\n    if (options.style.isTight()) {\n      symbolNode.classes.push(\"mtight\");\n    }\n    var color = options.getColor();\n    if (color) {\n      symbolNode.style.color = color;\n    }\n  }\n  return symbolNode;\n};\n/**\n * Makes a symbol in Main-Regular or AMS-Regular.\n * Used for rel, bin, open, close, inner, and punct.\n */\nvar mathsym = function mathsym(value, mode, options, classes) {\n  if (classes === void 0) {\n    classes = [];\n  }\n  // Decide what font to render the symbol in by its entry in the symbols\n  // table.\n  // Have a special case for when the value = \\ because the \\ is used as a\n  // textord in unsupported command errors but cannot be parsed as a regular\n  // text ordinal and is therefore not present as a symbol in the symbols\n  // table for text, as well as a special case for boldsymbol because it\n  // can be used for bold + and -\n  if (options.font === \"boldsymbol\" && lookupSymbol(value, \"Main-Bold\", mode).metrics) {\n    return makeSymbol(value, \"Main-Bold\", mode, options, classes.concat([\"mathbf\"]));\n  } else if (value === \"\\\\\" || symbols[mode][value].font === \"main\") {\n    return makeSymbol(value, \"Main-Regular\", mode, options, classes);\n  } else {\n    return makeSymbol(value, \"AMS-Regular\", mode, options, classes.concat([\"amsrm\"]));\n  }\n};\n/**\n * Determines which of the two font names (Main-Bold and Math-BoldItalic) and\n * corresponding style tags (mathbf or boldsymbol) to use for font \"boldsymbol\",\n * depending on the symbol.  Use this function instead of fontMap for font\n * \"boldsymbol\".\n */\nvar boldSymbol = function boldSymbol(value, mode, type) {\n  if (type !== \"textord\" && lookupSymbol(value, \"Math-BoldItalic\", mode).metrics) {\n    return {\n      fontName: \"Math-BoldItalic\",\n      fontClass: \"boldsymbol\"\n    };\n  } else {\n    // Some glyphs do not exist in Math-BoldItalic so we need to use\n    // Main-Bold instead.\n    return {\n      fontName: \"Main-Bold\",\n      fontClass: \"mathbf\"\n    };\n  }\n};\n/**\n * Makes either a mathord or textord in the correct font and color.\n */\nvar makeOrd = function makeOrd(group, options) {\n  // Spacing nodes are rendered as textord.\n  var type = group.type === \"mathord\" ? \"mathord\" : \"textord\";\n  var mode = group.mode;\n  var text = group.text;\n  var classes = [\"mord\"];\n  var {\n    font,\n    fontFamily,\n    fontWeight,\n    fontShape\n  } = options;\n  // Math mode or Old font (i.e. \\rm)\n  var useFont = mode === \"math\" || mode === \"text\" && !!font;\n  var fontOrFamily = useFont ? font : fontFamily;\n  var wideFontName = \"\";\n  var wideFontClass = \"\";\n  if (text.charCodeAt(0) === 0xD835) {\n    var wideCharData = wideCharacterFont(text);\n    wideFontName = wideCharData.font;\n    wideFontClass = wideCharData[mode + \"Class\"];\n  }\n  if (wideFontName) {\n    // surrogate pairs get special treatment\n    return makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass));\n  } else if (fontOrFamily) {\n    var fontName;\n    var fontClasses;\n    if (fontOrFamily === \"boldsymbol\") {\n      var fontData = boldSymbol(text, mode, type);\n      fontName = fontData.fontName;\n      fontClasses = [fontData.fontClass];\n    } else if (useFont) {\n      fontName = fontMap[font].fontName;\n      fontClasses = [font];\n    } else {\n      fontName = retrieveTextFontName(fontFamily, fontWeight, fontShape);\n      fontClasses = [fontFamily, fontWeight, fontShape];\n    }\n    if (lookupSymbol(text, fontName, mode).metrics) {\n      return makeSymbol(text, fontName, mode, options, classes.concat(fontClasses));\n    } else if (ligatures.hasOwnProperty(text) && fontName.slice(0, 10) === \"Typewriter\") {\n      // Deconstruct ligatures in monospace fonts (\\texttt, \\tt).\n      var parts = [];\n      for (var i = 0; i < text.length; i++) {\n        parts.push(makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses)));\n      }\n      return makeFragment(parts);\n    }\n  }\n  // Makes a symbol in the default font for mathords and textords.\n  if (type === \"mathord\") {\n    return makeSymbol(text, \"Math-Italic\", mode, options, classes.concat([\"mathnormal\"]));\n  } else if (type === \"textord\") {\n    var _font = symbols[mode][text] && symbols[mode][text].font;\n    if (_font === \"ams\") {\n      var _fontName = retrieveTextFontName(\"amsrm\", fontWeight, fontShape);\n      return makeSymbol(text, _fontName, mode, options, classes.concat(\"amsrm\", fontWeight, fontShape));\n    } else if (_font === \"main\" || !_font) {\n      var _fontName2 = retrieveTextFontName(\"textrm\", fontWeight, fontShape);\n      return makeSymbol(text, _fontName2, mode, options, classes.concat(fontWeight, fontShape));\n    } else {\n      // fonts added by plugins\n      var _fontName3 = retrieveTextFontName(_font, fontWeight, fontShape);\n      // We add font name as a css class\n      return makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, fontWeight, fontShape));\n    }\n  } else {\n    throw new Error(\"unexpected type: \" + type + \" in makeOrd\");\n  }\n};\n/**\n * Returns true if subsequent symbolNodes have the same classes, skew, maxFont,\n * and styles. For mathnormal text, the left node must also have zero italic\n * correction so we don't lose spacing between combined glyphs.\n */\nvar canCombine = (prev, next) => {\n  if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize || prev.italic !== 0 && prev.hasClass(\"mathnormal\")) {\n    return false;\n  }\n  // If prev and next both are just \"mbin\"s or \"mord\"s we don't combine them\n  // so that the proper spacing can be preserved.\n  if (prev.classes.length === 1) {\n    var cls = prev.classes[0];\n    if (cls === \"mbin\" || cls === \"mord\") {\n      return false;\n    }\n  }\n  for (var key of Object.keys(prev.style)) {\n    if (prev.style[key] !== next.style[key]) {\n      return false;\n    }\n  }\n  for (var _key of Object.keys(next.style)) {\n    if (prev.style[_key] !== next.style[_key]) {\n      return false;\n    }\n  }\n  return true;\n};\n/**\n * Combine consecutive domTree.symbolNodes into a single symbolNode.\n * Note: this function mutates the argument.\n */\nvar tryCombineChars = chars => {\n  for (var i = 0; i < chars.length - 1; i++) {\n    var prev = chars[i];\n    var next = chars[i + 1];\n    if (prev instanceof SymbolNode && next instanceof SymbolNode && canCombine(prev, next)) {\n      prev.text += next.text;\n      prev.height = Math.max(prev.height, next.height);\n      prev.depth = Math.max(prev.depth, next.depth);\n      // Use the last character's italic correction since we use\n      // it to add padding to the right of the span created from\n      // the combined characters.\n      prev.italic = next.italic;\n      chars.splice(i + 1, 1);\n      i--;\n    }\n  }\n  return chars;\n};\n/**\n * Calculate the height, depth, and maxFontSize of an element based on its\n * children.\n */\nvar sizeElementFromChildren = function sizeElementFromChildren(elem) {\n  var height = 0;\n  var depth = 0;\n  var maxFontSize = 0;\n  for (var i = 0; i < elem.children.length; i++) {\n    var child = elem.children[i];\n    if (child.height > height) {\n      height = child.height;\n    }\n    if (child.depth > depth) {\n      depth = child.depth;\n    }\n    if (child.maxFontSize > maxFontSize) {\n      maxFontSize = child.maxFontSize;\n    }\n  }\n  elem.height = height;\n  elem.depth = depth;\n  elem.maxFontSize = maxFontSize;\n};\n/**\n * Makes a span with the given list of classes, list of children, and options.\n *\n * TODO(#953): Ensure that `options` is always provided (currently some call\n * sites don't pass it) and make the type below mandatory.\n * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which\n * should if present come first in `classes`.\n */\nvar makeSpan = function makeSpan(classes, children, options, style) {\n  var span = new Span(classes, children, options, style);\n  sizeElementFromChildren(span);\n  return span;\n};\n// SVG one is simpler -- doesn't require height, depth, max-font setting.\n// This is also a separate method for typesafety.\nvar makeSvgSpan = (classes, children, options, style) => new Span(classes, children, options, style);\nvar makeLineSpan = function makeLineSpan(className, options, thickness) {\n  var line = makeSpan([className], [], options);\n  line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness);\n  line.style.borderBottomWidth = makeEm(line.height);\n  line.maxFontSize = 1.0;\n  return line;\n};\n/**\n * Makes an anchor with the given href, list of classes, list of children,\n * and options.\n */\nvar makeAnchor = function makeAnchor(href, classes, children, options) {\n  var anchor = new Anchor(href, classes, children, options);\n  sizeElementFromChildren(anchor);\n  return anchor;\n};\n/**\n * Makes a document fragment with the given list of children.\n */\nvar makeFragment = function makeFragment(children) {\n  var fragment = new DocumentFragment(children);\n  sizeElementFromChildren(fragment);\n  return fragment;\n};\n/**\n * Wraps group in a span if it's a document fragment, allowing to apply classes\n * and styles\n */\nvar wrapFragment = function wrapFragment(group, options) {\n  if (group instanceof DocumentFragment) {\n    return makeSpan([], [group], options);\n  }\n  return group;\n};\n// Computes the updated `children` list and the overall depth.\n//\n// This helper function for makeVList makes it easier to enforce type safety by\n// allowing early exits (returns) in the logic.\nvar getVListChildrenAndDepth = function getVListChildrenAndDepth(params) {\n  if (params.positionType === \"individualShift\") {\n    var oldChildren = params.children;\n    var children = [oldChildren[0]];\n    // Add in kerns to the list of params.children to get each element to be\n    // shifted to the correct specified shift\n    var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth;\n    var currPos = _depth;\n    for (var i = 1; i < oldChildren.length; i++) {\n      var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth;\n      var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth);\n      currPos = currPos + diff;\n      children.push({\n        type: \"kern\",\n        size\n      });\n      children.push(oldChildren[i]);\n    }\n    return {\n      children,\n      depth: _depth\n    };\n  }\n  var depth;\n  if (params.positionType === \"top\") {\n    // We always start at the bottom, so calculate the bottom by adding up\n    // all the sizes\n    var bottom = params.positionData;\n    for (var _i = 0; _i < params.children.length; _i++) {\n      var child = params.children[_i];\n      bottom -= child.type === \"kern\" ? child.size : child.elem.height + child.elem.depth;\n    }\n    depth = bottom;\n  } else if (params.positionType === \"bottom\") {\n    depth = -params.positionData;\n  } else {\n    var firstChild = params.children[0];\n    if (firstChild.type !== \"elem\") {\n      throw new Error('First child must have type \"elem\".');\n    }\n    if (params.positionType === \"shift\") {\n      depth = -firstChild.elem.depth - params.positionData;\n    } else if (params.positionType === \"firstBaseline\") {\n      depth = -firstChild.elem.depth;\n    } else {\n      throw new Error(\"Invalid positionType \" + params.positionType + \".\");\n    }\n  }\n  return {\n    children: params.children,\n    depth\n  };\n};\n/**\n * Makes a vertical list by stacking elements and kerns on top of each other.\n * Allows for many different ways of specifying the positioning method.\n *\n * See VListParam documentation above.\n */\nvar makeVList = function makeVList(params, options) {\n  var {\n    children,\n    depth\n  } = getVListChildrenAndDepth(params);\n  // Create a strut that is taller than any list item. The strut is added to\n  // each item, where it will determine the item's baseline. Since it has\n  // `overflow:hidden`, the strut's top edge will sit on the item's line box's\n  // top edge and the strut's bottom edge will sit on the item's baseline,\n  // with no additional line-height spacing. This allows the item baseline to\n  // be positioned precisely without worrying about font ascent and\n  // line-height.\n  var pstrutSize = 0;\n  for (var i = 0; i < children.length; i++) {\n    var child = children[i];\n    if (child.type === \"elem\") {\n      var elem = child.elem;\n      pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height);\n    }\n  }\n  pstrutSize += 2;\n  var pstrut = makeSpan([\"pstrut\"], []);\n  pstrut.style.height = makeEm(pstrutSize);\n  // Create a new list of actual children at the correct offsets\n  var realChildren = [];\n  var minPos = depth;\n  var maxPos = depth;\n  var currPos = depth;\n  for (var _i2 = 0; _i2 < children.length; _i2++) {\n    var _child = children[_i2];\n    if (_child.type === \"kern\") {\n      currPos += _child.size;\n    } else {\n      var _elem = _child.elem;\n      var classes = _child.wrapperClasses || [];\n      var style = _child.wrapperStyle || {};\n      var childWrap = makeSpan(classes, [pstrut, _elem], undefined, style);\n      childWrap.style.top = makeEm(-pstrutSize - currPos - _elem.depth);\n      if (_child.marginLeft) {\n        childWrap.style.marginLeft = _child.marginLeft;\n      }\n      if (_child.marginRight) {\n        childWrap.style.marginRight = _child.marginRight;\n      }\n      realChildren.push(childWrap);\n      currPos += _elem.height + _elem.depth;\n    }\n    minPos = Math.min(minPos, currPos);\n    maxPos = Math.max(maxPos, currPos);\n  }\n  // The vlist contents go in a table-cell with `vertical-align:bottom`.\n  // This cell's bottom edge will determine the containing table's baseline\n  // without overly expanding the containing line-box.\n  var vlist = makeSpan([\"vlist\"], realChildren);\n  vlist.style.height = makeEm(maxPos);\n  // A second row is used if necessary to represent the vlist's depth.\n  var rows;\n  if (minPos < 0) {\n    // We will define depth in an empty span with display: table-cell.\n    // It should render with the height that we define. But Chrome, in\n    // contenteditable mode only, treats that span as if it contains some\n    // text content. And that min-height over-rides our desired height.\n    // So we put another empty span inside the depth strut span.\n    var emptySpan = makeSpan([], []);\n    var depthStrut = makeSpan([\"vlist\"], [emptySpan]);\n    depthStrut.style.height = makeEm(-minPos);\n    // Safari wants the first row to have inline content; otherwise it\n    // puts the bottom of the *second* row on the baseline.\n    var topStrut = makeSpan([\"vlist-s\"], [new SymbolNode(\"\\u200b\")]);\n    rows = [makeSpan([\"vlist-r\"], [vlist, topStrut]), makeSpan([\"vlist-r\"], [depthStrut])];\n  } else {\n    rows = [makeSpan([\"vlist-r\"], [vlist])];\n  }\n  var vtable = makeSpan([\"vlist-t\"], rows);\n  if (rows.length === 2) {\n    vtable.classes.push(\"vlist-t2\");\n  }\n  vtable.height = maxPos;\n  vtable.depth = -minPos;\n  return vtable;\n};\n// Glue is a concept from TeX which is a flexible space between elements in\n// either a vertical or horizontal list. In KaTeX, at least for now, it's\n// static space between elements in a horizontal layout.\nvar makeGlue = (measurement, options) => {\n  // Make an empty span for the space\n  var rule = makeSpan([\"mspace\"], [], options);\n  var size = calculateSize(measurement, options);\n  rule.style.marginRight = makeEm(size);\n  return rule;\n};\n// Takes font options, and returns the appropriate fontLookup name\nvar retrieveTextFontName = (fontFamily, fontWeight, fontShape) => {\n  var baseFontName;\n  var fontStylesName;\n  switch (fontFamily) {\n    case \"amsrm\":\n      baseFontName = \"AMS\";\n      break;\n    case \"textrm\":\n      baseFontName = \"Main\";\n      break;\n    case \"textsf\":\n      baseFontName = \"SansSerif\";\n      break;\n    case \"texttt\":\n      baseFontName = \"Typewriter\";\n      break;\n    default:\n      baseFontName = fontFamily;\n    // use fonts added by a plugin\n  }\n  if (fontWeight === \"textbf\" && fontShape === \"textit\") {\n    fontStylesName = \"BoldItalic\";\n  } else if (fontWeight === \"textbf\") {\n    fontStylesName = \"Bold\";\n  } else if (fontShape === \"textit\") {\n    fontStylesName = \"Italic\";\n  } else {\n    fontStylesName = \"Regular\";\n  }\n  return baseFontName + \"-\" + fontStylesName;\n};\n/**\n * Maps TeX font commands to objects containing:\n * - variant: string used for \"mathvariant\" attribute in buildMathML.js\n * - fontName: the \"style\" parameter to fontMetrics.getCharacterMetrics\n */\n// A map between tex font commands an MathML mathvariant attribute values\nvar fontMap = {\n  // styles\n  \"mathbf\": {\n    variant: \"bold\",\n    fontName: \"Main-Bold\"\n  },\n  \"mathrm\": {\n    variant: \"normal\",\n    fontName: \"Main-Regular\"\n  },\n  \"textit\": {\n    variant: \"italic\",\n    fontName: \"Main-Italic\"\n  },\n  \"mathit\": {\n    variant: \"italic\",\n    fontName: \"Main-Italic\"\n  },\n  \"mathnormal\": {\n    variant: \"italic\",\n    fontName: \"Math-Italic\"\n  },\n  \"mathsfit\": {\n    variant: \"sans-serif-italic\",\n    fontName: \"SansSerif-Italic\"\n  },\n  // \"boldsymbol\" is missing because they require the use of multiple fonts:\n  // Math-BoldItalic and Main-Bold.  This is handled by a special case in\n  // makeOrd which ends up calling boldsymbol.\n  // families\n  \"mathbb\": {\n    variant: \"double-struck\",\n    fontName: \"AMS-Regular\"\n  },\n  \"mathcal\": {\n    variant: \"script\",\n    fontName: \"Caligraphic-Regular\"\n  },\n  \"mathfrak\": {\n    variant: \"fraktur\",\n    fontName: \"Fraktur-Regular\"\n  },\n  \"mathscr\": {\n    variant: \"script\",\n    fontName: \"Script-Regular\"\n  },\n  \"mathsf\": {\n    variant: \"sans-serif\",\n    fontName: \"SansSerif-Regular\"\n  },\n  \"mathtt\": {\n    variant: \"monospace\",\n    fontName: \"Typewriter-Regular\"\n  }\n};\nvar svgData = {\n  //   path, width, height\n  vec: [\"vec\", 0.471, 0.714],\n  // values from the font glyph\n  oiintSize1: [\"oiintSize1\", 0.957, 0.499],\n  // oval to overlay the integrand\n  oiintSize2: [\"oiintSize2\", 1.472, 0.659],\n  oiiintSize1: [\"oiiintSize1\", 1.304, 0.499],\n  oiiintSize2: [\"oiiintSize2\", 1.98, 0.659]\n};\nvar staticSvg = function staticSvg(value, options) {\n  // Create a span with inline SVG for the element.\n  var [pathName, width, height] = svgData[value];\n  var path = new PathNode(pathName);\n  var svgNode = new SvgNode([path], {\n    \"width\": makeEm(width),\n    \"height\": makeEm(height),\n    // Override CSS rule `.katex svg { width: 100% }`\n    \"style\": \"width:\" + makeEm(width),\n    \"viewBox\": \"0 0 \" + 1000 * width + \" \" + 1000 * height,\n    \"preserveAspectRatio\": \"xMinYMin\"\n  });\n  var span = makeSvgSpan([\"overlay\"], [svgNode], options);\n  span.height = height;\n  span.style.height = makeEm(height);\n  span.style.width = makeEm(width);\n  return span;\n};\n\n/**\n * Describes spaces between different classes of atoms.\n */\nvar thinspace = {\n  number: 3,\n  unit: \"mu\"\n};\nvar mediumspace = {\n  number: 4,\n  unit: \"mu\"\n};\nvar thickspace = {\n  number: 5,\n  unit: \"mu\"\n};\n// Spacing relationships for display and text styles\nvar spacings = {\n  mord: {\n    mop: thinspace,\n    mbin: mediumspace,\n    mrel: thickspace,\n    minner: thinspace\n  },\n  mop: {\n    mord: thinspace,\n    mop: thinspace,\n    mrel: thickspace,\n    minner: thinspace\n  },\n  mbin: {\n    mord: mediumspace,\n    mop: mediumspace,\n    mopen: mediumspace,\n    minner: mediumspace\n  },\n  mrel: {\n    mord: thickspace,\n    mop: thickspace,\n    mopen: thickspace,\n    minner: thickspace\n  },\n  mopen: {},\n  mclose: {\n    mop: thinspace,\n    mbin: mediumspace,\n    mrel: thickspace,\n    minner: thinspace\n  },\n  mpunct: {\n    mord: thinspace,\n    mop: thinspace,\n    mrel: thickspace,\n    mopen: thinspace,\n    mclose: thinspace,\n    mpunct: thinspace,\n    minner: thinspace\n  },\n  minner: {\n    mord: thinspace,\n    mop: thinspace,\n    mbin: mediumspace,\n    mrel: thickspace,\n    mopen: thinspace,\n    mpunct: thinspace,\n    minner: thinspace\n  }\n};\n// Spacing relationships for script and scriptscript styles\nvar tightSpacings = {\n  mord: {\n    mop: thinspace\n  },\n  mop: {\n    mord: thinspace,\n    mop: thinspace\n  },\n  mbin: {},\n  mrel: {},\n  mopen: {},\n  mclose: {\n    mop: thinspace\n  },\n  mpunct: {},\n  minner: {\n    mop: thinspace\n  }\n};\n\n/**\n * All registered functions.\n * `functions.js` just exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary.\n */\nvar _functions = {};\n/**\n * All HTML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n *\n * Builders for different node types are stored side by side, but\n * `HtmlBuilder<T>` is contravariant in `T`, so there is no single type\n * argument that makes storing/retrieving them typecheck.  `any` is used\n * as an existential-quantifier escape hatch.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nvar _htmlGroupBuilders = {};\n/**\n * All MathML builders. Should be only used in the `define*` and the `build*ML`\n * functions.  See `_htmlGroupBuilders` above for the rationale behind `any`.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nvar _mathmlGroupBuilders = {};\nfunction defineFunction(data) {\n  var {\n    type,\n    names,\n    htmlBuilder,\n    mathmlBuilder\n  } = data;\n  for (var i = 0; i < names.length; ++i) {\n    // To avoid destructuring and rebuilding an object,\n    // we store the entire FunctionDefSpec object,\n    // even though Parser only needs the FunctionSpec fields.\n    _functions[names[i]] = data;\n  }\n  if (type) {\n    if (htmlBuilder) {\n      _htmlGroupBuilders[type] = htmlBuilder;\n    }\n    if (mathmlBuilder) {\n      _mathmlGroupBuilders[type] = mathmlBuilder;\n    }\n  }\n}\n/**\n * Use this to register only the HTML and MathML builders for a function (e.g.\n * if the function's ParseNode is generated in Parser.js rather than via a\n * stand-alone handler provided to `defineFunction`).\n */\nfunction defineFunctionBuilders(_ref) {\n  var {\n    type,\n    htmlBuilder,\n    mathmlBuilder\n  } = _ref;\n  if (htmlBuilder) {\n    _htmlGroupBuilders[type] = htmlBuilder;\n  }\n  if (mathmlBuilder) {\n    _mathmlGroupBuilders[type] = mathmlBuilder;\n  }\n}\nvar normalizeArgument = function normalizeArgument(arg) {\n  return arg.type === \"ordgroup\" && arg.body.length === 1 ? arg.body[0] : arg;\n};\n// Since the corresponding buildHTML/buildMathML function expects a\n// list of elements, we normalize for different kinds of arguments\nvar ordargument = function ordargument(arg) {\n  return arg.type === \"ordgroup\" ? arg.body : [arg];\n};\n\n/**\n * This file does the main work of building a domTree structure from a parse\n * tree. The entry point is the `buildHTML` function, which takes a parse tree.\n * Then, the buildExpression, buildGroup, and various groupBuilders functions\n * are called, to produce a final HTML tree.\n */\n// Binary atoms (first class `mbin`) change into ordinary atoms (`mord`)\n// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6,\n// and the text before Rule 19.\nvar binLeftCanceller = new Set([\"leftmost\", \"mbin\", \"mopen\", \"mrel\", \"mop\", \"mpunct\"]);\nvar binRightCanceller = new Set([\"rightmost\", \"mrel\", \"mclose\", \"mpunct\"]);\nvar styleMap$1 = {\n  \"display\": Style$1.DISPLAY,\n  \"text\": Style$1.TEXT,\n  \"script\": Style$1.SCRIPT,\n  \"scriptscript\": Style$1.SCRIPTSCRIPT\n};\nvar DomEnum = {\n  mord: \"mord\",\n  mop: \"mop\",\n  mbin: \"mbin\",\n  mrel: \"mrel\",\n  mopen: \"mopen\",\n  mclose: \"mclose\",\n  mpunct: \"mpunct\",\n  minner: \"minner\"\n};\n/**\n * Take a list of nodes, build them in order, and return a list of the built\n * nodes. documentFragments are flattened into their contents, so the\n * returned list contains no fragments. `isRealGroup` is true if `expression`\n * is a real group (no atoms will be added on either side), as opposed to\n * a partial group (e.g. one created by \\color). `surrounding` is an array\n * consisting type of nodes that will be added to the left and right.\n */\nvar buildExpression$1 = function buildExpression(expression, options, isRealGroup, surrounding) {\n  if (surrounding === void 0) {\n    surrounding = [null, null];\n  }\n  // Parse expressions into `groups`.\n  var groups = [];\n  for (var i = 0; i < expression.length; i++) {\n    var output = buildGroup$1(expression[i], options);\n    if (output instanceof DocumentFragment) {\n      var children = output.children;\n      groups.push(...children);\n    } else {\n      groups.push(output);\n    }\n  }\n  // Combine consecutive domTree.symbolNodes into a single symbolNode.\n  tryCombineChars(groups);\n  // If `expression` is a partial group, let the parent handle spacings\n  // to avoid processing groups multiple times.\n  if (!isRealGroup) {\n    return groups;\n  }\n  var glueOptions = options;\n  if (expression.length === 1) {\n    var node = expression[0];\n    if (node.type === \"sizing\") {\n      glueOptions = options.havingSize(node.size);\n    } else if (node.type === \"styling\") {\n      glueOptions = options.havingStyle(styleMap$1[node.style]);\n    }\n  }\n  // Dummy spans for determining spacings between surrounding atoms.\n  // If `expression` has no atoms on the left or right, class \"leftmost\"\n  // or \"rightmost\", respectively, is used to indicate it.\n  var dummyPrev = makeSpan([surrounding[0] || \"leftmost\"], [], options);\n  var dummyNext = makeSpan([surrounding[1] || \"rightmost\"], [], options);\n  // TODO: These code assumes that a node's math class is the first element\n  // of its `classes` array. A later cleanup should ensure this, for\n  // instance by changing the signature of `makeSpan`.\n  // Before determining what spaces to insert, perform bin cancellation.\n  // Binary operators change to ordinary symbols in some contexts.\n  var isRoot = isRealGroup === \"root\";\n  _traverseNonSpaceNodes(groups, (node, prev) => {\n    var prevType = prev.classes[0];\n    var type = node.classes[0];\n    if (prevType === \"mbin\" && binRightCanceller.has(type)) {\n      prev.classes[0] = \"mord\";\n    } else if (type === \"mbin\" && binLeftCanceller.has(prevType)) {\n      node.classes[0] = \"mord\";\n    }\n  }, {\n    node: dummyPrev\n  }, dummyNext, isRoot);\n  _traverseNonSpaceNodes(groups, (node, prev) => {\n    var _tightSpacings$prevTy, _spacings$prevType;\n    var prevType = getTypeOfDomTree(prev);\n    var type = getTypeOfDomTree(node);\n    // 'mtight' indicates that the node is script or scriptscript style.\n    var space = prevType && type ? node.hasClass(\"mtight\") ? (_tightSpacings$prevTy = tightSpacings[prevType]) == null ? void 0 : _tightSpacings$prevTy[type] : (_spacings$prevType = spacings[prevType]) == null ? void 0 : _spacings$prevType[type] : null;\n    if (space) {\n      // Insert glue (spacing) after the `prev`.\n      return makeGlue(space, glueOptions);\n    }\n  }, {\n    node: dummyPrev\n  }, dummyNext, isRoot);\n  return groups;\n};\n// Depth-first traverse non-space `nodes`, calling `callback` with the current and\n// previous node as arguments, optionally returning a node to insert after the\n// previous node. `prev` is an object with the previous node and `insertAfter`\n// function to insert after it. `next` is a node that will be added to the right.\n// Used for bin cancellation and inserting spacings.\nvar _traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next, isRoot) {\n  if (next) {\n    // temporarily append the right node, if exists\n    nodes.push(next);\n  }\n  var i = 0;\n  for (; i < nodes.length; i++) {\n    var node = nodes[i];\n    var partialGroup = checkPartialGroup(node);\n    if (partialGroup) {\n      // Recursive DFS\n      // TODO(ts): partialGroup.children is ReadonlyArray but this\n      // function mutates the array (insertAfter splices into it).\n      _traverseNonSpaceNodes(partialGroup.children, callback, prev, null, isRoot);\n      continue;\n    }\n    // Ignore explicit spaces (e.g., \\;, \\,) when determining what implicit\n    // spacing should go between atoms of different classes\n    var nonspace = !node.hasClass(\"mspace\");\n    if (nonspace) {\n      var result = callback(node, prev.node);\n      if (result) {\n        if (prev.insertAfter) {\n          prev.insertAfter(result);\n        } else {\n          // insert at front\n          nodes.unshift(result);\n          i++;\n        }\n      }\n    }\n    if (nonspace) {\n      prev.node = node;\n    } else if (isRoot && node.hasClass(\"newline\")) {\n      prev.node = makeSpan([\"leftmost\"]); // treat like beginning of line\n    }\n    prev.insertAfter = (index => n => {\n      nodes.splice(index + 1, 0, n);\n      i++;\n    })(i);\n  }\n  if (next) {\n    nodes.pop();\n  }\n};\n// Check if given node is a partial group, i.e., does not affect spacing around.\nvar checkPartialGroup = function checkPartialGroup(node) {\n  if (node instanceof DocumentFragment || node instanceof Anchor || node instanceof Span && node.hasClass(\"enclosing\")) {\n    return node;\n  }\n  return null;\n};\n// Return the outermost node of a domTree.\nvar _getOutermostNode = function getOutermostNode(node, side) {\n  var partialGroup = checkPartialGroup(node);\n  if (partialGroup) {\n    var children = partialGroup.children;\n    if (children.length) {\n      if (side === \"right\") {\n        return _getOutermostNode(children[children.length - 1], \"right\");\n      } else if (side === \"left\") {\n        return _getOutermostNode(children[0], \"left\");\n      }\n    }\n  }\n  return node;\n};\n// Return math atom class (mclass) of a domTree.\n// If `side` is given, it will get the type of the outermost node at given side.\nvar getTypeOfDomTree = function getTypeOfDomTree(node, side) {\n  if (!node) {\n    return null;\n  }\n  if (side) {\n    node = _getOutermostNode(node, side);\n  }\n  // This makes a lot of assumptions as to where the type of atom\n  // appears.  We should do a better job of enforcing this.\n  var className = node.classes[0];\n  return DomEnum[className] || null;\n};\nvar makeNullDelimiter = function makeNullDelimiter(options, classes) {\n  var moreClasses = [\"nulldelimiter\"].concat(options.baseSizingClasses());\n  return makeSpan(classes.concat(moreClasses));\n};\n/**\n * buildGroup is the function that takes a group and calls the correct groupType\n * function for it. It also handles the interaction of size and style changes\n * between parents and children.\n */\nvar buildGroup$1 = function buildGroup(group, options, baseOptions) {\n  if (!group) {\n    return makeSpan();\n  }\n  if (_htmlGroupBuilders[group.type]) {\n    // TODO(ts): groupBuilders is Record<string, HtmlBuilder<any>>;\n    // a type-safe registry would need a mapped type keyed by NodeType.\n    var groupNode = _htmlGroupBuilders[group.type](group, options);\n    // If the size changed between the parent and the current group, account\n    // for that size difference.\n    if (baseOptions && options.size !== baseOptions.size) {\n      groupNode = makeSpan(options.sizingClasses(baseOptions), [groupNode], options);\n      var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;\n      groupNode.height *= multiplier;\n      groupNode.depth *= multiplier;\n    }\n    return groupNode;\n  } else {\n    throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n  }\n};\n/**\n * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`)\n * into an unbreakable HTML node of class .base, with proper struts to\n * guarantee correct vertical extent.  `buildHTML` calls this repeatedly to\n * make up the entire expression as a sequence of unbreakable units.\n */\nfunction buildHTMLUnbreakable(children, options) {\n  // Compute height and depth of this chunk.\n  var body = makeSpan([\"base\"], children, options);\n  // Add strut, which ensures that the top of the HTML element falls at\n  // the height of the expression, and the bottom of the HTML element\n  // falls at the depth of the expression.\n  var strut = makeSpan([\"strut\"]);\n  strut.style.height = makeEm(body.height + body.depth);\n  if (body.depth) {\n    strut.style.verticalAlign = makeEm(-body.depth);\n  }\n  body.children.unshift(strut);\n  return body;\n}\n/**\n * Take an entire parse tree, and build it into an appropriate set of HTML\n * nodes.\n */\nfunction buildHTML(tree, options) {\n  // Strip off outer tag wrapper for processing below.\n  var tag = null;\n  if (tree.length === 1 && tree[0].type === \"tag\") {\n    tag = tree[0].tag;\n    tree = tree[0].body;\n  }\n  // Build the expression contained in the tree\n  var expression = buildExpression$1(tree, options, \"root\");\n  var eqnNum;\n  if (expression.length === 2 && expression[1].hasClass(\"tag\")) {\n    // An environment with automatic equation numbers, e.g. {gather}.\n    eqnNum = expression.pop();\n  }\n  var children = [];\n  // Create one base node for each chunk between potential line breaks.\n  // The TeXBook [p.173] says \"A formula will be broken only after a\n  // relation symbol like $=$ or $<$ or $\\rightarrow$, or after a binary\n  // operation symbol like $+$ or $-$ or $\\times$, where the relation or\n  // binary operation is on the ``outer level'' of the formula (i.e., not\n  // enclosed in {...} and not part of an \\over construction).\"\n  var parts = [];\n  for (var i = 0; i < expression.length; i++) {\n    parts.push(expression[i]);\n    if (expression[i].hasClass(\"mbin\") || expression[i].hasClass(\"mrel\") || expression[i].hasClass(\"allowbreak\")) {\n      // Put any post-operator glue on same line as operator.\n      // Watch for \\nobreak along the way, and stop at \\newline.\n      var nobreak = false;\n      while (i < expression.length - 1 && expression[i + 1].hasClass(\"mspace\") && !expression[i + 1].hasClass(\"newline\")) {\n        i++;\n        parts.push(expression[i]);\n        if (expression[i].hasClass(\"nobreak\")) {\n          nobreak = true;\n        }\n      }\n      // Don't allow break if \\nobreak among the post-operator glue.\n      if (!nobreak) {\n        children.push(buildHTMLUnbreakable(parts, options));\n        parts = [];\n      }\n    } else if (expression[i].hasClass(\"newline\")) {\n      // Write the line except the newline\n      parts.pop();\n      if (parts.length > 0) {\n        children.push(buildHTMLUnbreakable(parts, options));\n        parts = [];\n      }\n      // Put the newline at the top level\n      children.push(expression[i]);\n    }\n  }\n  if (parts.length > 0) {\n    children.push(buildHTMLUnbreakable(parts, options));\n  }\n  // Now, if there was a tag, build it too and append it as a final child.\n  var tagChild;\n  if (tag) {\n    tagChild = buildHTMLUnbreakable(buildExpression$1(tag, options, true), options);\n    tagChild.classes = [\"tag\"];\n    children.push(tagChild);\n  } else if (eqnNum) {\n    children.push(eqnNum);\n  }\n  var htmlNode = makeSpan([\"katex-html\"], children);\n  htmlNode.setAttribute(\"aria-hidden\", \"true\");\n  // Adjust the strut of the tag to be the maximum height of all children\n  // (the height of the enclosing htmlNode) for proper vertical alignment.\n  if (tagChild) {\n    var strut = tagChild.children[0];\n    strut.style.height = makeEm(htmlNode.height + htmlNode.depth);\n    if (htmlNode.depth) {\n      strut.style.verticalAlign = makeEm(-htmlNode.depth);\n    }\n  }\n  return htmlNode;\n}\n\n/**\n * These objects store data about MathML nodes. This is the MathML equivalent\n * of the types in domTree.js. Since MathML handles its own rendering, and\n * since we're mainly using MathML to improve accessibility, we don't manage\n * any of the styling state that the plain DOM nodes do.\n *\n * The `toNode` and `toMarkup` functions work similarly to how they do in\n * domTree.js, creating namespaced DOM nodes and HTML text markup respectively.\n */\nfunction newDocumentFragment(children) {\n  return new DocumentFragment(children);\n}\n/**\n * This node represents a general purpose MathML node of any type. The\n * constructor requires the type of node to create (for example, `\"mo\"` or\n * `\"mspace\"`, corresponding to `<mo>` and `<mspace>` tags).\n */\nclass MathNode {\n  constructor(type, children, classes) {\n    this.type = void 0;\n    this.attributes = void 0;\n    this.children = void 0;\n    this.classes = void 0;\n    this.type = type;\n    this.attributes = {};\n    this.children = children || [];\n    this.classes = classes || [];\n  }\n  /**\n   * Sets an attribute on a MathML node. MathML depends on attributes to convey a\n   * semantic content, so this is used heavily.\n   */\n  setAttribute(name, value) {\n    this.attributes[name] = value;\n  }\n  /**\n   * Gets an attribute on a MathML node.\n   */\n  getAttribute(name) {\n    return this.attributes[name];\n  }\n  /**\n   * Converts the math node into a MathML-namespaced DOM element.\n   */\n  toNode() {\n    var node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", this.type);\n    for (var attr in this.attributes) {\n      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n        node.setAttribute(attr, this.attributes[attr]);\n      }\n    }\n    if (this.classes.length > 0) {\n      node.className = createClass(this.classes);\n    }\n    for (var i = 0; i < this.children.length; i++) {\n      // Combine multiple TextNodes into one TextNode, to prevent\n      // screen readers from reading each as a separate word [#3995]\n      if (this.children[i] instanceof TextNode && this.children[i + 1] instanceof TextNode) {\n        var text = this.children[i].toText() + this.children[++i].toText();\n        while (this.children[i + 1] instanceof TextNode) {\n          text += this.children[++i].toText();\n        }\n        node.appendChild(new TextNode(text).toNode());\n      } else {\n        node.appendChild(this.children[i].toNode());\n      }\n    }\n    return node;\n  }\n  /**\n   * Converts the math node into an HTML markup string.\n   */\n  toMarkup() {\n    var markup = \"<\" + this.type;\n    // Add the attributes\n    for (var attr in this.attributes) {\n      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n        markup += \" \" + attr + \"=\\\"\";\n        markup += escape(this.attributes[attr]);\n        markup += \"\\\"\";\n      }\n    }\n    if (this.classes.length > 0) {\n      markup += \" class =\\\"\" + escape(createClass(this.classes)) + \"\\\"\";\n    }\n    markup += \">\";\n    for (var i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    markup += \"</\" + this.type + \">\";\n    return markup;\n  }\n  /**\n   * Converts the math node into a string, similar to innerText, but escaped.\n   */\n  toText() {\n    return this.children.map(child => child.toText()).join(\"\");\n  }\n}\n/**\n * This node represents a piece of text.\n */\nclass TextNode {\n  constructor(text) {\n    this.text = void 0;\n    this.text = text;\n  }\n  /**\n   * Converts the text node into a DOM text node.\n   */\n  toNode() {\n    return document.createTextNode(this.text);\n  }\n  /**\n   * Converts the text node into escaped HTML markup\n   * (representing the text itself).\n   */\n  toMarkup() {\n    return escape(this.toText());\n  }\n  /**\n   * Converts the text node into a string\n   * (representing the text itself).\n   */\n  toText() {\n    return this.text;\n  }\n}\n/**\n * This node represents a space, but may render as <mspace.../> or as text,\n * depending on the width.\n */\nclass SpaceNode {\n  /**\n   * Create a Space node with width given in CSS ems.\n   */\n  constructor(width) {\n    this.width = void 0;\n    this.character = void 0;\n    this.width = width;\n    // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html\n    // for a table of space-like characters.  We use Unicode\n    // representations instead of &LongNames; as it's not clear how to\n    // make the latter via document.createTextNode.\n    if (width >= 0.05555 && width <= 0.05556) {\n      this.character = \"\\u200a\"; // &VeryThinSpace;\n    } else if (width >= 0.1666 && width <= 0.1667) {\n      this.character = \"\\u2009\"; // &ThinSpace;\n    } else if (width >= 0.2222 && width <= 0.2223) {\n      this.character = \"\\u2005\"; // &MediumSpace;\n    } else if (width >= 0.2777 && width <= 0.2778) {\n      this.character = \"\\u2005\\u200a\"; // &ThickSpace;\n    } else if (width >= -0.05556 && width <= -0.05555) {\n      this.character = \"\\u200a\\u2063\"; // &NegativeVeryThinSpace;\n    } else if (width >= -0.1667 && width <= -0.1666) {\n      this.character = \"\\u2009\\u2063\"; // &NegativeThinSpace;\n    } else if (width >= -0.2223 && width <= -0.2222) {\n      this.character = \"\\u205f\\u2063\"; // &NegativeMediumSpace;\n    } else if (width >= -0.2778 && width <= -0.2777) {\n      this.character = \"\\u2005\\u2063\"; // &NegativeThickSpace;\n    } else {\n      this.character = null;\n    }\n  }\n  /**\n   * Converts the math node into a MathML-namespaced DOM element.\n   */\n  toNode() {\n    if (this.character) {\n      return document.createTextNode(this.character);\n    } else {\n      var node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"mspace\");\n      node.setAttribute(\"width\", makeEm(this.width));\n      return node;\n    }\n  }\n  /**\n   * Converts the math node into an HTML markup string.\n   */\n  toMarkup() {\n    if (this.character) {\n      return \"<mtext>\" + this.character + \"</mtext>\";\n    } else {\n      return \"<mspace width=\\\"\" + makeEm(this.width) + \"\\\"/>\";\n    }\n  }\n  /**\n   * Converts the math node into a string, similar to innerText.\n   */\n  toText() {\n    if (this.character) {\n      return this.character;\n    } else {\n      return \" \";\n    }\n  }\n}\n\n/**\n * This file converts a parse tree into a corresponding MathML tree. The main\n * entry point is the `buildMathML` function, which takes a parse tree from the\n * parser.\n */\nvar noVariantSymbols = new Set([\"\\\\imath\", \"\\\\jmath\"]);\nvar rowLikeTypes = new Set([\"mrow\", \"mtable\"]);\n/**\n * Takes a symbol and converts it into a MathML text node after performing\n * optional replacement from symbols.js.\n */\nvar makeText = function makeText(text, mode, options) {\n  if (symbols[mode][text] && symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.slice(4, 6) === \"tt\" || options.font && options.font.slice(4, 6) === \"tt\"))) {\n    text = symbols[mode][text].replace;\n  }\n  return new TextNode(text);\n};\n/**\n * Wrap the given array of nodes in an <mrow> node if needed, i.e.,\n * unless the array has length 1.  Always returns a single node.\n */\nvar makeRow = function makeRow(body) {\n  if (body.length === 1) {\n    return body[0];\n  } else {\n    return new MathNode(\"mrow\", body);\n  }\n};\nvar mathFontVariants = {\n  mathit: \"italic\",\n  boldsymbol: group => group.type === \"textord\" ? \"bold\" : \"bold-italic\",\n  mathbf: \"bold\",\n  mathbb: \"double-struck\",\n  mathsfit: \"sans-serif-italic\",\n  mathfrak: \"fraktur\",\n  mathscr: \"script\",\n  mathcal: \"script\",\n  mathsf: \"sans-serif\",\n  mathtt: \"monospace\"\n};\n/**\n * Returns the math variant as a string or null if none is required.\n */\nvar getVariant = (group, options) => {\n  // Handle \\text... font specifiers as best we can.\n  // MathML has a limited list of allowable mathvariant specifiers; see\n  // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt\n  if (group.mode === \"text\") {\n    if (options.fontFamily === \"texttt\") {\n      return \"monospace\";\n    } else if (options.fontFamily === \"textsf\") {\n      if (options.fontShape === \"textit\" && options.fontWeight === \"textbf\") {\n        return \"sans-serif-bold-italic\";\n      } else if (options.fontShape === \"textit\") {\n        return \"sans-serif-italic\";\n      } else if (options.fontWeight === \"textbf\") {\n        return \"bold-sans-serif\";\n      } else {\n        return \"sans-serif\";\n      }\n    } else if (options.fontShape === \"textit\" && options.fontWeight === \"textbf\") {\n      return \"bold-italic\";\n    } else if (options.fontShape === \"textit\") {\n      return \"italic\";\n    } else if (options.fontWeight === \"textbf\") {\n      return \"bold\";\n    }\n  }\n  var font = options.font;\n  if (!font || font === \"mathnormal\") {\n    return null;\n  }\n  var mode = group.mode;\n  var mathVariant = mathFontVariants[font];\n  if (mathVariant) {\n    return typeof mathVariant === \"function\" ? mathVariant(group) : mathVariant;\n  }\n  var text = group.text;\n  if (noVariantSymbols.has(text)) {\n    return null;\n  }\n  if (symbols[mode][text]) {\n    var replacement = symbols[mode][text].replace;\n    if (replacement) {\n      text = replacement;\n    }\n  }\n  var fontName = fontMap[font].fontName;\n  if (getCharacterMetrics(text, fontName, mode)) {\n    return fontMap[font].variant;\n  }\n  return null;\n};\n/**\n * Check for <mi>.</mi> which is how a dot renders in MathML,\n * or <mo separator=\"true\" lspace=\"0em\" rspace=\"0em\">,</mo>\n * which is how a braced comma {,} renders in MathML\n */\nfunction isNumberPunctuation(group) {\n  if (!group) {\n    return false;\n  }\n  if (group.type === 'mi' && group.children.length === 1) {\n    var child = group.children[0];\n    return child instanceof TextNode && child.text === '.';\n  } else if (group.type === 'mo' && group.children.length === 1 && group.getAttribute('separator') === 'true' && group.getAttribute('lspace') === '0em' && group.getAttribute('rspace') === '0em') {\n    var _child = group.children[0];\n    return _child instanceof TextNode && _child.text === ',';\n  } else {\n    return false;\n  }\n}\n/**\n * Takes a list of nodes, builds them, and returns a list of the generated\n * MathML nodes.  Also combine consecutive <mtext> outputs into a single\n * <mtext> tag.\n */\nvar buildExpression = function buildExpression(expression, options, isOrdgroup) {\n  if (expression.length === 1) {\n    var group = buildGroup(expression[0], options);\n    if (isOrdgroup && group instanceof MathNode && group.type === \"mo\") {\n      // When TeX writers want to suppress spacing on an operator,\n      // they often put the operator by itself inside braces.\n      group.setAttribute(\"lspace\", \"0em\");\n      group.setAttribute(\"rspace\", \"0em\");\n    }\n    return [group];\n  }\n  var groups = [];\n  var lastGroup;\n  for (var i = 0; i < expression.length; i++) {\n    var _group = buildGroup(expression[i], options);\n    if (_group instanceof MathNode && lastGroup instanceof MathNode) {\n      // Concatenate adjacent <mtext>s\n      if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) {\n        lastGroup.children.push(..._group.children);\n        continue;\n        // Concatenate adjacent <mn>s\n      } else if (_group.type === 'mn' && lastGroup.type === 'mn') {\n        lastGroup.children.push(..._group.children);\n        continue;\n        // Concatenate <mn>...</mn> followed by <mi>.</mi>\n      } else if (isNumberPunctuation(_group) && lastGroup.type === 'mn') {\n        lastGroup.children.push(..._group.children);\n        continue;\n        // Concatenate <mi>.</mi> followed by <mn>...</mn>\n      } else if (_group.type === 'mn' && isNumberPunctuation(lastGroup)) {\n        _group.children = [...lastGroup.children, ..._group.children];\n        groups.pop();\n        // Put preceding <mn>...</mn> or <mi>.</mi> inside base of\n        // <msup><mn>...base...</mn>...exponent...</msup> (or <msub>)\n      } else if ((_group.type === 'msup' || _group.type === 'msub') && _group.children.length >= 1 && (lastGroup.type === 'mn' || isNumberPunctuation(lastGroup))) {\n        var base = _group.children[0];\n        if (base instanceof MathNode && base.type === 'mn') {\n          base.children = [...lastGroup.children, ...base.children];\n          groups.pop();\n        }\n        // \\not\n      } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) {\n        var lastChild = lastGroup.children[0];\n        if (lastChild instanceof TextNode && lastChild.text === '\\u0338' && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) {\n          var child = _group.children[0];\n          if (child instanceof TextNode && child.text.length > 0) {\n            // Overlay with combining character long solidus\n            child.text = child.text.slice(0, 1) + \"\\u0338\" + child.text.slice(1);\n            groups.pop();\n          }\n        }\n      }\n    }\n    groups.push(_group);\n    lastGroup = _group;\n  }\n  return groups;\n};\n/**\n * Equivalent to buildExpression, but wraps the elements in an <mrow>\n * if there's more than one.  Returns a single node instead of an array.\n */\nvar buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) {\n  return makeRow(buildExpression(expression, options, isOrdgroup));\n};\n/**\n * Takes a group from the parser and calls the appropriate groupBuilders function\n * on it to produce a MathML node.\n */\nvar buildGroup = function buildGroup(group, options) {\n  if (!group) {\n    return new MathNode(\"mrow\");\n  }\n  if (_mathmlGroupBuilders[group.type]) {\n    // TODO(ts): MathMLBuilder returns MathDomNode but all concrete\n    // builders return MathNode. Widening the return type here would\n    // require updating all callers that assume MathNode.\n    return _mathmlGroupBuilders[group.type](group, options);\n  } else {\n    throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n  }\n};\n/**\n * Takes a full parse tree and settings and builds a MathML representation of\n * it. In particular, we put the elements from building the parse tree into a\n * <semantics> tag so we can also include that TeX source as an annotation.\n *\n * Note that we actually return a domTree element with a `<math>` inside it so\n * we can do appropriate styling.\n */\nfunction buildMathML(tree, texExpression, options, isDisplayMode, forMathmlOnly) {\n  var expression = buildExpression(tree, options);\n  // TODO: Make a pass thru the MathML similar to buildHTML.traverseNonSpaceNodes\n  // and add spacing nodes. This is necessary only adjacent to math operators\n  // like \\sin or \\lim or to subsup elements that contain math operators.\n  // MathML takes care of the other spacing issues.\n  // Wrap up the expression in an mrow so it is presented in the semantics\n  // tag correctly, unless it's a single <mrow> or <mtable>.\n  var wrapper;\n  if (expression.length === 1 && expression[0] instanceof MathNode && rowLikeTypes.has(expression[0].type)) {\n    wrapper = expression[0];\n  } else {\n    wrapper = new MathNode(\"mrow\", expression);\n  }\n  // Build a TeX annotation of the source\n  var annotation = new MathNode(\"annotation\", [new TextNode(texExpression)]);\n  annotation.setAttribute(\"encoding\", \"application/x-tex\");\n  var semantics = new MathNode(\"semantics\", [wrapper, annotation]);\n  var math = new MathNode(\"math\", [semantics]);\n  math.setAttribute(\"xmlns\", \"http://www.w3.org/1998/Math/MathML\");\n  if (isDisplayMode) {\n    math.setAttribute(\"display\", \"block\");\n  }\n  // You can't style <math> nodes, so we wrap the node in a span.\n  // NOTE: The span class is not typed to have <math> nodes as children, and\n  // we don't want to make the children type more generic since the children\n  // of span are expected to have more fields in `buildHtml` contexts.\n  // The MathNode implements VirtualNode (toNode/toMarkup) which is all that\n  // Span needs from its children for rendering.\n  // TODO(ts): Span's child type is HtmlDomNode, but MathNode only implements\n  // VirtualNode. The double-cast acknowledges this architectural limitation.\n  var wrapperClass = forMathmlOnly ? \"katex\" : \"katex-mathml\";\n  return makeSpan([wrapperClass], [math]);\n}\n\n/**\n * This file contains information about the options that the Parser carries\n * around with it while parsing. Data is held in an `Options` object, and when\n * recursing, a new `Options` object can be created with the `.with*` and\n * `.reset` functions.\n */\nvar sizeStyleMap = [\n// Each element contains [textsize, scriptsize, scriptscriptsize].\n// The size mappings are taken from TeX with \\normalsize=10pt.\n[1, 1, 1],\n// size1: [5, 5, 5]              \\tiny\n[2, 1, 1],\n// size2: [6, 5, 5]\n[3, 1, 1],\n// size3: [7, 5, 5]              \\scriptsize\n[4, 2, 1],\n// size4: [8, 6, 5]              \\footnotesize\n[5, 2, 1],\n// size5: [9, 6, 5]              \\small\n[6, 3, 1],\n// size6: [10, 7, 5]             \\normalsize\n[7, 4, 2],\n// size7: [12, 8, 6]             \\large\n[8, 6, 3],\n// size8: [14.4, 10, 7]          \\Large\n[9, 7, 6],\n// size9: [17.28, 12, 10]        \\LARGE\n[10, 8, 7],\n// size10: [20.74, 14.4, 12]     \\huge\n[11, 10, 9] // size11: [24.88, 20.74, 17.28] \\HUGE\n];\nvar sizeMultipliers = [\n// fontMetrics.js:getGlobalMetrics also uses size indexes, so if\n// you change size indexes, change that function.\n0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488];\nvar sizeAtStyle = function sizeAtStyle(size, style) {\n  return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1];\n};\n/**\n * This is the main options class. It contains the current style, size, color,\n * and font.\n *\n * Options objects should not be modified. To create a new Options with\n * different properties, call a `.having*` method.\n */\nclass Options {\n  constructor(data) {\n    this.style = void 0;\n    this.color = void 0;\n    this.size = void 0;\n    this.textSize = void 0;\n    this.phantom = void 0;\n    // A font family applies to a group of fonts (i.e. SansSerif), while a font\n    // represents a specific font (i.e. SansSerif Bold).\n    // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm\n    this.font = void 0;\n    this.fontFamily = void 0;\n    this.fontWeight = void 0;\n    this.fontShape = void 0;\n    this.sizeMultiplier = void 0;\n    this.maxSize = void 0;\n    this.minRuleThickness = void 0;\n    this._fontMetrics = void 0;\n    this.style = data.style;\n    this.color = data.color;\n    this.size = data.size || Options.BASESIZE;\n    this.textSize = data.textSize || this.size;\n    this.phantom = !!data.phantom;\n    this.font = data.font || \"\";\n    this.fontFamily = data.fontFamily || \"\";\n    this.fontWeight = data.fontWeight || \"\";\n    this.fontShape = data.fontShape || \"\";\n    this.sizeMultiplier = sizeMultipliers[this.size - 1];\n    this.maxSize = data.maxSize;\n    this.minRuleThickness = data.minRuleThickness;\n    this._fontMetrics = undefined;\n  }\n  /**\n   * Returns a new options object with the same properties as \"this\".  Properties\n   * from \"extension\" will be copied to the new options object.\n   */\n  extend(extension) {\n    var data = {\n      style: this.style,\n      size: this.size,\n      textSize: this.textSize,\n      color: this.color,\n      phantom: this.phantom,\n      font: this.font,\n      fontFamily: this.fontFamily,\n      fontWeight: this.fontWeight,\n      fontShape: this.fontShape,\n      maxSize: this.maxSize,\n      minRuleThickness: this.minRuleThickness\n    };\n    Object.assign(data, extension);\n    return new Options(data);\n  }\n  /**\n   * Return an options object with the given style. If `this.style === style`,\n   * returns `this`.\n   */\n  havingStyle(style) {\n    if (this.style === style) {\n      return this;\n    } else {\n      return this.extend({\n        style: style,\n        size: sizeAtStyle(this.textSize, style)\n      });\n    }\n  }\n  /**\n   * Return an options object with a cramped version of the current style. If\n   * the current style is cramped, returns `this`.\n   */\n  havingCrampedStyle() {\n    return this.havingStyle(this.style.cramp());\n  }\n  /**\n   * Return an options object with the given size and in at least `\\textstyle`.\n   * Returns `this` if appropriate.\n   */\n  havingSize(size) {\n    if (this.size === size && this.textSize === size) {\n      return this;\n    } else {\n      return this.extend({\n        style: this.style.text(),\n        size: size,\n        textSize: size,\n        sizeMultiplier: sizeMultipliers[size - 1]\n      });\n    }\n  }\n  /**\n   * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted,\n   * changes to at least `\\textstyle`.\n   */\n  havingBaseStyle(style) {\n    style = style || this.style.text();\n    var wantSize = sizeAtStyle(Options.BASESIZE, style);\n    if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) {\n      return this;\n    } else {\n      return this.extend({\n        style: style,\n        size: wantSize\n      });\n    }\n  }\n  /**\n   * Remove the effect of sizing changes such as \\Huge.\n   * Keep the effect of the current style, such as \\scriptstyle.\n   */\n  havingBaseSizing() {\n    var size;\n    switch (this.style.id) {\n      case 4:\n      case 5:\n        size = 3; // normalsize in scriptstyle\n        break;\n      case 6:\n      case 7:\n        size = 1; // normalsize in scriptscriptstyle\n        break;\n      default:\n        size = 6;\n      // normalsize in textstyle or displaystyle\n    }\n    return this.extend({\n      style: this.style.text(),\n      size: size\n    });\n  }\n  /**\n   * Create a new options object with the given color.\n   */\n  withColor(color) {\n    return this.extend({\n      color: color\n    });\n  }\n  /**\n   * Create a new options object with \"phantom\" set to true.\n   */\n  withPhantom() {\n    return this.extend({\n      phantom: true\n    });\n  }\n  /**\n   * Creates a new options object with the given math font or old text font.\n   * @type {[type]}\n   */\n  withFont(font) {\n    return this.extend({\n      font\n    });\n  }\n  /**\n   * Create a new options objects with the given fontFamily.\n   */\n  withTextFontFamily(fontFamily) {\n    return this.extend({\n      fontFamily,\n      font: \"\"\n    });\n  }\n  /**\n   * Creates a new options object with the given font weight\n   */\n  withTextFontWeight(fontWeight) {\n    return this.extend({\n      fontWeight,\n      font: \"\"\n    });\n  }\n  /**\n   * Creates a new options object with the given font weight\n   */\n  withTextFontShape(fontShape) {\n    return this.extend({\n      fontShape,\n      font: \"\"\n    });\n  }\n  /**\n   * Return the CSS sizing classes required to switch from enclosing options\n   * `oldOptions` to `this`. Returns an array of classes.\n   */\n  sizingClasses(oldOptions) {\n    if (oldOptions.size !== this.size) {\n      return [\"sizing\", \"reset-size\" + oldOptions.size, \"size\" + this.size];\n    } else {\n      return [];\n    }\n  }\n  /**\n   * Return the CSS sizing classes required to switch to the base size. Like\n   * `this.havingSize(BASESIZE).sizingClasses(this)`.\n   */\n  baseSizingClasses() {\n    if (this.size !== Options.BASESIZE) {\n      return [\"sizing\", \"reset-size\" + this.size, \"size\" + Options.BASESIZE];\n    } else {\n      return [];\n    }\n  }\n  /**\n   * Return the font metrics for this size.\n   */\n  fontMetrics() {\n    if (!this._fontMetrics) {\n      this._fontMetrics = getGlobalMetrics(this.size);\n    }\n    return this._fontMetrics;\n  }\n  /**\n   * Gets the CSS color of the current options object\n   */\n  getColor() {\n    if (this.phantom) {\n      return \"transparent\";\n    } else {\n      return this.color;\n    }\n  }\n}\n/**\n * The base size index.\n */\nOptions.BASESIZE = 6;\n\nvar optionsFromSettings = function optionsFromSettings(settings) {\n  return new Options({\n    style: settings.displayMode ? Style$1.DISPLAY : Style$1.TEXT,\n    maxSize: settings.maxSize,\n    minRuleThickness: settings.minRuleThickness\n  });\n};\nvar displayWrap = function displayWrap(node, settings) {\n  if (settings.displayMode) {\n    var classes = [\"katex-display\"];\n    if (settings.leqno) {\n      classes.push(\"leqno\");\n    }\n    if (settings.fleqn) {\n      classes.push(\"fleqn\");\n    }\n    node = makeSpan(classes, [node]);\n  }\n  return node;\n};\nvar buildTree = function buildTree(tree, expression, settings) {\n  var options = optionsFromSettings(settings);\n  var katexNode;\n  if (settings.output === \"mathml\") {\n    return buildMathML(tree, expression, options, settings.displayMode, true);\n  } else if (settings.output === \"html\") {\n    var htmlNode = buildHTML(tree, options);\n    katexNode = makeSpan([\"katex\"], [htmlNode]);\n  } else {\n    var mathMLNode = buildMathML(tree, expression, options, settings.displayMode, false);\n    var _htmlNode = buildHTML(tree, options);\n    katexNode = makeSpan([\"katex\"], [mathMLNode, _htmlNode]);\n  }\n  return displayWrap(katexNode, settings);\n};\nvar buildHTMLTree = function buildHTMLTree(tree, expression, settings) {\n  var options = optionsFromSettings(settings);\n  var htmlNode = buildHTML(tree, options);\n  var katexNode = makeSpan([\"katex\"], [htmlNode]);\n  return displayWrap(katexNode, settings);\n};\n\n/**\n * This file provides support to buildMathML.js and buildHTML.js\n * for stretchy wide elements rendered from SVG files\n * and other CSS trickery.\n */\nvar stretchyCodePoint = {\n  widehat: \"^\",\n  widecheck: \"ˇ\",\n  widetilde: \"~\",\n  utilde: \"~\",\n  overleftarrow: \"\\u2190\",\n  underleftarrow: \"\\u2190\",\n  xleftarrow: \"\\u2190\",\n  overrightarrow: \"\\u2192\",\n  underrightarrow: \"\\u2192\",\n  xrightarrow: \"\\u2192\",\n  underbrace: \"\\u23df\",\n  overbrace: \"\\u23de\",\n  underbracket: \"\\u23b5\",\n  overbracket: \"\\u23b4\",\n  overgroup: \"\\u23e0\",\n  undergroup: \"\\u23e1\",\n  overleftrightarrow: \"\\u2194\",\n  underleftrightarrow: \"\\u2194\",\n  xleftrightarrow: \"\\u2194\",\n  Overrightarrow: \"\\u21d2\",\n  xRightarrow: \"\\u21d2\",\n  overleftharpoon: \"\\u21bc\",\n  xleftharpoonup: \"\\u21bc\",\n  overrightharpoon: \"\\u21c0\",\n  xrightharpoonup: \"\\u21c0\",\n  xLeftarrow: \"\\u21d0\",\n  xLeftrightarrow: \"\\u21d4\",\n  xhookleftarrow: \"\\u21a9\",\n  xhookrightarrow: \"\\u21aa\",\n  xmapsto: \"\\u21a6\",\n  xrightharpoondown: \"\\u21c1\",\n  xleftharpoondown: \"\\u21bd\",\n  xrightleftharpoons: \"\\u21cc\",\n  xleftrightharpoons: \"\\u21cb\",\n  xtwoheadleftarrow: \"\\u219e\",\n  xtwoheadrightarrow: \"\\u21a0\",\n  xlongequal: \"=\",\n  xtofrom: \"\\u21c4\",\n  xrightleftarrows: \"\\u21c4\",\n  xrightequilibrium: \"\\u21cc\",\n  // Not a perfect match.\n  xleftequilibrium: \"\\u21cb\",\n  // None better available.\n  \"\\\\cdrightarrow\": \"\\u2192\",\n  \"\\\\cdleftarrow\": \"\\u2190\",\n  \"\\\\cdlongequal\": \"=\"\n};\nvar stretchyMathML = function stretchyMathML(label) {\n  var node = new MathNode(\"mo\", [new TextNode(stretchyCodePoint[label.replace(/^\\\\/, '')])]);\n  node.setAttribute(\"stretchy\", \"true\");\n  return node;\n};\nvar katexImagesData = {\n  //   path(s), minWidth, height, align\n  overrightarrow: [[\"rightarrow\"], 0.888, 522, \"xMaxYMin\"],\n  overleftarrow: [[\"leftarrow\"], 0.888, 522, \"xMinYMin\"],\n  underrightarrow: [[\"rightarrow\"], 0.888, 522, \"xMaxYMin\"],\n  underleftarrow: [[\"leftarrow\"], 0.888, 522, \"xMinYMin\"],\n  xrightarrow: [[\"rightarrow\"], 1.469, 522, \"xMaxYMin\"],\n  \"\\\\cdrightarrow\": [[\"rightarrow\"], 3.0, 522, \"xMaxYMin\"],\n  // CD minwwidth2.5pc\n  xleftarrow: [[\"leftarrow\"], 1.469, 522, \"xMinYMin\"],\n  \"\\\\cdleftarrow\": [[\"leftarrow\"], 3.0, 522, \"xMinYMin\"],\n  Overrightarrow: [[\"doublerightarrow\"], 0.888, 560, \"xMaxYMin\"],\n  xRightarrow: [[\"doublerightarrow\"], 1.526, 560, \"xMaxYMin\"],\n  xLeftarrow: [[\"doubleleftarrow\"], 1.526, 560, \"xMinYMin\"],\n  overleftharpoon: [[\"leftharpoon\"], 0.888, 522, \"xMinYMin\"],\n  xleftharpoonup: [[\"leftharpoon\"], 0.888, 522, \"xMinYMin\"],\n  xleftharpoondown: [[\"leftharpoondown\"], 0.888, 522, \"xMinYMin\"],\n  overrightharpoon: [[\"rightharpoon\"], 0.888, 522, \"xMaxYMin\"],\n  xrightharpoonup: [[\"rightharpoon\"], 0.888, 522, \"xMaxYMin\"],\n  xrightharpoondown: [[\"rightharpoondown\"], 0.888, 522, \"xMaxYMin\"],\n  xlongequal: [[\"longequal\"], 0.888, 334, \"xMinYMin\"],\n  \"\\\\cdlongequal\": [[\"longequal\"], 3.0, 334, \"xMinYMin\"],\n  xtwoheadleftarrow: [[\"twoheadleftarrow\"], 0.888, 334, \"xMinYMin\"],\n  xtwoheadrightarrow: [[\"twoheadrightarrow\"], 0.888, 334, \"xMaxYMin\"],\n  overleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 0.888, 522],\n  overbrace: [[\"leftbrace\", \"midbrace\", \"rightbrace\"], 1.6, 548],\n  underbrace: [[\"leftbraceunder\", \"midbraceunder\", \"rightbraceunder\"], 1.6, 548],\n  underleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 0.888, 522],\n  xleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 1.75, 522],\n  xLeftrightarrow: [[\"doubleleftarrow\", \"doublerightarrow\"], 1.75, 560],\n  xrightleftharpoons: [[\"leftharpoondownplus\", \"rightharpoonplus\"], 1.75, 716],\n  xleftrightharpoons: [[\"leftharpoonplus\", \"rightharpoondownplus\"], 1.75, 716],\n  xhookleftarrow: [[\"leftarrow\", \"righthook\"], 1.08, 522],\n  xhookrightarrow: [[\"lefthook\", \"rightarrow\"], 1.08, 522],\n  overlinesegment: [[\"leftlinesegment\", \"rightlinesegment\"], 0.888, 522],\n  underlinesegment: [[\"leftlinesegment\", \"rightlinesegment\"], 0.888, 522],\n  overbracket: [[\"leftbracketover\", \"rightbracketover\"], 1.6, 440],\n  underbracket: [[\"leftbracketunder\", \"rightbracketunder\"], 1.6, 410],\n  overgroup: [[\"leftgroup\", \"rightgroup\"], 0.888, 342],\n  undergroup: [[\"leftgroupunder\", \"rightgroupunder\"], 0.888, 342],\n  xmapsto: [[\"leftmapsto\", \"rightarrow\"], 1.5, 522],\n  xtofrom: [[\"leftToFrom\", \"rightToFrom\"], 1.75, 528],\n  // The next three arrows are from the mhchem package.\n  // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the\n  // document as \\xrightarrow or \\xrightleftharpoons. Those have\n  // min-length = 1.75em, so we set min-length on these next three to match.\n  xrightleftarrows: [[\"baraboveleftarrow\", \"rightarrowabovebar\"], 1.75, 901],\n  xrightequilibrium: [[\"baraboveshortleftharpoon\", \"rightharpoonaboveshortbar\"], 1.75, 716],\n  xleftequilibrium: [[\"shortbaraboveleftharpoon\", \"shortrightharpoonabovebar\"], 1.75, 716]\n};\nvar wideAccentLabels = new Set([\"widehat\", \"widecheck\", \"widetilde\", \"utilde\"]);\nvar stretchySvg = function stretchySvg(group, options) {\n  // Create a span with inline SVG for the element.\n  function buildSvgSpan_() {\n    var viewBoxWidth = 400000; // default\n    var label = group.label.slice(1);\n    if (wideAccentLabels.has(label) && 'base' in group) {\n      // There are four SVG images available for each function.\n      // Choose a taller image when there are more characters.\n      var numChars = group.base.type === \"ordgroup\" ? group.base.body.length : 1;\n      var viewBoxHeight;\n      var pathName;\n      var _height;\n      if (numChars > 5) {\n        if (label === \"widehat\" || label === \"widecheck\") {\n          viewBoxHeight = 420;\n          viewBoxWidth = 2364;\n          _height = 0.42;\n          pathName = label + \"4\";\n        } else {\n          viewBoxHeight = 312;\n          viewBoxWidth = 2340;\n          _height = 0.34;\n          pathName = \"tilde4\";\n        }\n      } else {\n        var imgIndex = [1, 1, 2, 2, 3, 3][numChars];\n        if (label === \"widehat\" || label === \"widecheck\") {\n          viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex];\n          viewBoxHeight = [0, 239, 300, 360, 420][imgIndex];\n          _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex];\n          pathName = label + imgIndex;\n        } else {\n          viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex];\n          viewBoxHeight = [0, 260, 286, 306, 312][imgIndex];\n          _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex];\n          pathName = \"tilde\" + imgIndex;\n        }\n      }\n      var path = new PathNode(pathName);\n      var svgNode = new SvgNode([path], {\n        \"width\": \"100%\",\n        \"height\": makeEm(_height),\n        \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + viewBoxHeight,\n        \"preserveAspectRatio\": \"none\"\n      });\n      return {\n        span: makeSvgSpan([], [svgNode], options),\n        minWidth: 0,\n        height: _height\n      };\n    } else {\n      var spans = [];\n      var data = katexImagesData[label];\n      if (!data) {\n        throw new Error(\"No SVG data for \\\"\" + label + \"\\\".\");\n      }\n      var [paths, _minWidth, _viewBoxHeight] = data;\n      var _height2 = _viewBoxHeight / 1000;\n      var numSvgChildren = paths.length;\n      var widthClasses;\n      var aligns;\n      if (numSvgChildren === 1) {\n        if (data.length !== 4) {\n          throw new Error(\"Expected 4-tuple for single-path SVG data \\\"\" + label + \"\\\".\");\n        }\n        widthClasses = [\"hide-tail\"];\n        aligns = [data[3]];\n      } else if (numSvgChildren === 2) {\n        widthClasses = [\"halfarrow-left\", \"halfarrow-right\"];\n        aligns = [\"xMinYMin\", \"xMaxYMin\"];\n      } else if (numSvgChildren === 3) {\n        widthClasses = [\"brace-left\", \"brace-center\", \"brace-right\"];\n        aligns = [\"xMinYMin\", \"xMidYMin\", \"xMaxYMin\"];\n      } else {\n        throw new Error(\"Correct katexImagesData or update code here to support\\n                    \" + numSvgChildren + \" children.\");\n      }\n      for (var i = 0; i < numSvgChildren; i++) {\n        var _path = new PathNode(paths[i]);\n        var _svgNode = new SvgNode([_path], {\n          \"width\": \"400em\",\n          \"height\": makeEm(_height2),\n          \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + _viewBoxHeight,\n          \"preserveAspectRatio\": aligns[i] + \" slice\"\n        });\n        var _span = makeSvgSpan([widthClasses[i]], [_svgNode], options);\n        if (numSvgChildren === 1) {\n          return {\n            span: _span,\n            minWidth: _minWidth,\n            height: _height2\n          };\n        } else {\n          _span.style.height = makeEm(_height2);\n          spans.push(_span);\n        }\n      }\n      return {\n        span: makeSpan([\"stretchy\"], spans, options),\n        minWidth: _minWidth,\n        height: _height2\n      };\n    }\n  } // buildSvgSpan_()\n  var {\n    span,\n    minWidth,\n    height\n  } = buildSvgSpan_();\n  // Note that we are returning span.depth = 0.\n  // Any adjustments relative to the baseline must be done in buildHTML.\n  span.height = height;\n  span.style.height = makeEm(height);\n  if (minWidth > 0) {\n    span.style.minWidth = makeEm(minWidth);\n  }\n  return span;\n};\nvar stretchyEnclose = function stretchyEnclose(inner, label, topPad, bottomPad, options) {\n  // Return an image span for \\cancel, \\bcancel, \\xcancel, \\fbox, or \\angl\n  var img;\n  var totalHeight = inner.height + inner.depth + topPad + bottomPad;\n  if (/fbox|color|angl/.test(label)) {\n    img = makeSpan([\"stretchy\", label], [], options);\n    if (label === \"fbox\") {\n      var color = options.color && options.getColor();\n      if (color) {\n        img.style.borderColor = color;\n      }\n    }\n  } else {\n    // \\cancel, \\bcancel, or \\xcancel\n    // Since \\cancel's SVG is inline and it omits the viewBox attribute,\n    // its stroke-width will not vary with span area.\n    var lines = [];\n    if (/^[bx]cancel$/.test(label)) {\n      lines.push(new LineNode({\n        \"x1\": \"0\",\n        \"y1\": \"0\",\n        \"x2\": \"100%\",\n        \"y2\": \"100%\",\n        \"stroke-width\": \"0.046em\"\n      }));\n    }\n    if (/^x?cancel$/.test(label)) {\n      lines.push(new LineNode({\n        \"x1\": \"0\",\n        \"y1\": \"100%\",\n        \"x2\": \"100%\",\n        \"y2\": \"0\",\n        \"stroke-width\": \"0.046em\"\n      }));\n    }\n    var svgNode = new SvgNode(lines, {\n      \"width\": \"100%\",\n      \"height\": makeEm(totalHeight)\n    });\n    img = makeSvgSpan([], [svgNode], options);\n  }\n  img.height = totalHeight;\n  img.style.height = makeEm(totalHeight);\n  return img;\n};\n\n/**\n * Small module for atom-group constants and type guard.  Kept separate from\n * `symbols.ts` so that consumers (notably `contrib/render-a11y-string`) can\n * pull in `isAtom` without dragging in the ~870-line symbol tables.\n */\n// Some of these have a \"-token\" suffix since these are also used as `ParseNode`\n// types for raw text tokens, and we want to avoid conflicts with higher-level\n// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by\n// looking up the `symbols` map.\nvar ATOMS = {\n  \"bin\": 1,\n  \"close\": 1,\n  \"inner\": 1,\n  \"open\": 1,\n  \"punct\": 1,\n  \"rel\": 1\n};\nvar NON_ATOMS = {\n  \"accent-token\": 1,\n  \"mathord\": 1,\n  \"op-token\": 1,\n  \"spacing\": 1,\n  \"textord\": 1\n};\nfunction isAtom(value) {\n  return value in ATOMS;\n}\n\n/**\n * Asserts that the node is of the given type and returns it with stricter\n * typing. Throws if the node's type does not match.\n */\nfunction assertNodeType(node, type) {\n  if (!node || node.type !== type) {\n    throw new Error(\"Expected node of type \" + type + \", but got \" + (node ? \"node of type \" + node.type : String(node)));\n  }\n  return node;\n}\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction assertSymbolNodeType(node) {\n  var typedNode = checkSymbolNodeType(node);\n  if (!typedNode) {\n    throw new Error(\"Expected node of symbol group type, but got \" + (node ? \"node of type \" + node.type : String(node)));\n  }\n  return typedNode;\n}\n/**\n * Returns the node more strictly typed if it is of the given type. Otherwise,\n * returns null.\n */\nfunction checkSymbolNodeType(node) {\n  if (node && (node.type === \"atom\" || NON_ATOMS.hasOwnProperty(node.type))) {\n    return node;\n  }\n  return null;\n}\n\nvar getBaseSymbol = group => {\n  if (group instanceof SymbolNode) {\n    return group;\n  }\n  if (hasHtmlDomChildren(group) && group.children.length === 1) {\n    return getBaseSymbol(group.children[0]);\n  }\n};\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"accent\", but\n// also \"supsub\" since an accent can affect super/subscripting.\nvar htmlBuilder$a = (grp, options) => {\n  // Accents are handled in the TeXbook pg. 443, rule 12.\n  var base;\n  var group;\n  var supSubGroup;\n  if (grp && grp.type === \"supsub\") {\n    // If our base is a character box, and we have superscripts and\n    // subscripts, the supsub will defer to us. In particular, we want\n    // to attach the superscripts and subscripts to the inner body (so\n    // that the position of the superscripts and subscripts won't be\n    // affected by the height of the accent). We accomplish this by\n    // sticking the base of the accent into the base of the supsub, and\n    // rendering that, while keeping track of where the accent is.\n    // The real accent group is the base of the supsub group\n    group = assertNodeType(grp.base, \"accent\");\n    // The character box is the base of the accent group\n    base = group.base;\n    // Stick the character box into the base of the supsub group\n    grp.base = base;\n    // Rerender the supsub group with its new base, and store that\n    // result.\n    supSubGroup = assertSpan(buildGroup$1(grp, options));\n    // reset original base\n    grp.base = group;\n  } else {\n    group = assertNodeType(grp, \"accent\");\n    base = group.base;\n  }\n  // Build the base group\n  var body = buildGroup$1(base, options.havingCrampedStyle());\n  // Does the accent need to shift for the skew of a character?\n  var mustShift = group.isShifty && isCharacterBox(base);\n  // Calculate the skew of the accent. This is based on the line \"If the\n  // nucleus is not a single character, let s = 0; otherwise set s to the\n  // kern amount for the nucleus followed by the \\skewchar of its font.\"\n  // Note that our skew metrics are just the kern between each character\n  // and the skewchar.\n  var skew = 0;\n  if (mustShift) {\n    var _getBaseSymbol$skew, _getBaseSymbol;\n    // Read the skew from the rendered base symbol.\n    // This preserves font metrics from font wrappers like \\mathbb.\n    skew = (_getBaseSymbol$skew = (_getBaseSymbol = getBaseSymbol(body)) == null ? void 0 : _getBaseSymbol.skew) != null ? _getBaseSymbol$skew : 0;\n  }\n  var accentBelow = group.label === \"\\\\c\";\n  // calculate the amount of space between the body and the accent\n  var clearance = accentBelow ? body.height + body.depth : Math.min(body.height, options.fontMetrics().xHeight);\n  // Build the accent\n  var accentBody;\n  if (!group.isStretchy) {\n    var accent;\n    var width;\n    if (group.label === \"\\\\vec\") {\n      // Before version 0.9, \\vec used the combining font glyph U+20D7.\n      // But browsers, especially Safari, are not consistent in how they\n      // render combining characters when not preceded by a character.\n      // So now we use an SVG.\n      // If Safari reforms, we should consider reverting to the glyph.\n      accent = staticSvg(\"vec\", options);\n      width = svgData.vec[1];\n    } else {\n      accent = makeOrd({\n        type: \"textord\",\n        mode: group.mode,\n        text: group.label\n      }, options);\n      accent = assertSymbolDomNode(accent);\n      // Remove the italic correction of the accent, because it only serves to\n      // shift the accent over to a place we don't want.\n      accent.italic = 0;\n      width = accent.width;\n      if (accentBelow) {\n        clearance += accent.depth;\n      }\n    }\n    accentBody = makeSpan([\"accent-body\"], [accent]);\n    // \"Full\" accents expand the width of the resulting symbol to be\n    // at least the width of the accent, and overlap directly onto the\n    // character without any vertical offset.\n    var accentFull = group.label === \"\\\\textcircled\";\n    if (accentFull) {\n      accentBody.classes.push('accent-full');\n      clearance = body.height;\n    }\n    // Shift the accent over by the skew.\n    var left = skew;\n    // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }`\n    // so that the accent doesn't contribute to the bounding box.\n    // We need to shift the character by its width (effectively half\n    // its width) to compensate.\n    if (!accentFull) {\n      left -= width / 2;\n    }\n    accentBody.style.left = makeEm(left);\n    // \\textcircled uses the \\bigcirc glyph, so it needs some\n    // vertical adjustment to match LaTeX.\n    if (group.label === \"\\\\textcircled\") {\n      accentBody.style.top = \".2em\";\n    }\n    accentBody = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: body\n      }, {\n        type: \"kern\",\n        size: -clearance\n      }, {\n        type: \"elem\",\n        elem: accentBody\n      }]\n    });\n  } else {\n    accentBody = stretchySvg(group, options);\n    accentBody = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: body\n      }, {\n        type: \"elem\",\n        elem: accentBody,\n        wrapperClasses: [\"svg-align\"],\n        wrapperStyle: skew > 0 ? {\n          width: \"calc(100% - \" + makeEm(2 * skew) + \")\",\n          marginLeft: makeEm(2 * skew)\n        } : undefined\n      }]\n    });\n  }\n  var accentWrap = makeSpan([\"mord\", \"accent\"], [accentBody], options);\n  if (supSubGroup) {\n    // Here, we replace the \"base\" child of the supsub with our newly\n    // generated accent.\n    supSubGroup.children[0] = accentWrap;\n    // Since we don't rerun the height calculation after replacing the\n    // accent, we manually recalculate height.\n    supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height);\n    // Accents should always be ords, even when their innards are not.\n    supSubGroup.classes[0] = \"mord\";\n    return supSubGroup;\n  } else {\n    return accentWrap;\n  }\n};\nvar mathmlBuilder$9 = (group, options) => {\n  var accentNode = group.isStretchy ? stretchyMathML(group.label) : new MathNode(\"mo\", [makeText(group.label, group.mode)]);\n  var node = new MathNode(\"mover\", [buildGroup(group.base, options), accentNode]);\n  node.setAttribute(\"accent\", \"true\");\n  return node;\n};\nvar NON_STRETCHY_ACCENT_REGEX = new RegExp([\"\\\\acute\", \"\\\\grave\", \"\\\\ddot\", \"\\\\tilde\", \"\\\\bar\", \"\\\\breve\", \"\\\\check\", \"\\\\hat\", \"\\\\vec\", \"\\\\dot\", \"\\\\mathring\"].map(accent => \"\\\\\" + accent).join(\"|\"));\n// Accents\ndefineFunction({\n  type: \"accent\",\n  names: [\"\\\\acute\", \"\\\\grave\", \"\\\\ddot\", \"\\\\tilde\", \"\\\\bar\", \"\\\\breve\", \"\\\\check\", \"\\\\hat\", \"\\\\vec\", \"\\\\dot\", \"\\\\mathring\", \"\\\\widecheck\", \"\\\\widehat\", \"\\\\widetilde\", \"\\\\overrightarrow\", \"\\\\overleftarrow\", \"\\\\Overrightarrow\", \"\\\\overleftrightarrow\", \"\\\\overgroup\", \"\\\\overlinesegment\", \"\\\\overleftharpoon\", \"\\\\overrightharpoon\"],\n  numArgs: 1,\n  handler: (context, args) => {\n    var base = normalizeArgument(args[0]);\n    var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);\n    var isShifty = !isStretchy || context.funcName === \"\\\\widehat\" || context.funcName === \"\\\\widetilde\" || context.funcName === \"\\\\widecheck\";\n    return {\n      type: \"accent\",\n      mode: context.parser.mode,\n      label: context.funcName,\n      isStretchy: isStretchy,\n      isShifty: isShifty,\n      base: base\n    };\n  },\n  htmlBuilder: htmlBuilder$a,\n  mathmlBuilder: mathmlBuilder$9\n});\n// Text-mode accents\ndefineFunction({\n  type: \"accent\",\n  names: [\"\\\\'\", \"\\\\`\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\c\", \"\\\\r\", \"\\\\H\", \"\\\\v\", \"\\\\textcircled\"],\n  numArgs: 1,\n  allowedInText: true,\n  allowedInMath: true,\n  // unless in strict mode\n  argTypes: [\"primitive\"],\n  handler: (context, args) => {\n    var base = args[0];\n    var mode = context.parser.mode;\n    if (mode === \"math\") {\n      context.parser.settings.reportNonstrict(\"mathVsTextAccents\", \"LaTeX's accent \" + context.funcName + \" works only in text mode\");\n      mode = \"text\";\n    }\n    return {\n      type: \"accent\",\n      mode: mode,\n      label: context.funcName,\n      isStretchy: false,\n      isShifty: true,\n      base: base\n    };\n  }\n});\n\n// Horizontal overlap functions\ndefineFunction({\n  type: \"accentUnder\",\n  names: [\"\\\\underleftarrow\", \"\\\\underrightarrow\", \"\\\\underleftrightarrow\", \"\\\\undergroup\", \"\\\\underlinesegment\", \"\\\\utilde\"],\n  numArgs: 1,\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var base = args[0];\n    return {\n      type: \"accentUnder\",\n      mode: parser.mode,\n      label: funcName,\n      base: base\n    };\n  },\n  htmlBuilder: (group, options) => {\n    // Treat under accents much like underlines.\n    var innerGroup = buildGroup$1(group.base, options);\n    var accentBody = stretchySvg(group, options);\n    var kern = group.label === \"\\\\utilde\" ? 0.12 : 0;\n    // Generate the vlist, with the appropriate kerns\n    var vlist = makeVList({\n      positionType: \"top\",\n      positionData: innerGroup.height,\n      children: [{\n        type: \"elem\",\n        elem: accentBody,\n        wrapperClasses: [\"svg-align\"]\n      }, {\n        type: \"kern\",\n        size: kern\n      }, {\n        type: \"elem\",\n        elem: innerGroup\n      }]\n    });\n    return makeSpan([\"mord\", \"accentunder\"], [vlist], options);\n  },\n  mathmlBuilder: (group, options) => {\n    var accentNode = stretchyMathML(group.label);\n    var node = new MathNode(\"munder\", [buildGroup(group.base, options), accentNode]);\n    node.setAttribute(\"accentunder\", \"true\");\n    return node;\n  }\n});\n\n// Helper function\nvar paddedNode = group => {\n  var node = new MathNode(\"mpadded\", group ? [group] : []);\n  node.setAttribute(\"width\", \"+0.6em\");\n  node.setAttribute(\"lspace\", \"0.3em\");\n  return node;\n};\n// Stretchy arrows with an optional argument\ndefineFunction({\n  type: \"xArrow\",\n  names: [\"\\\\xleftarrow\", \"\\\\xrightarrow\", \"\\\\xLeftarrow\", \"\\\\xRightarrow\", \"\\\\xleftrightarrow\", \"\\\\xLeftrightarrow\", \"\\\\xhookleftarrow\", \"\\\\xhookrightarrow\", \"\\\\xmapsto\", \"\\\\xrightharpoondown\", \"\\\\xrightharpoonup\", \"\\\\xleftharpoondown\", \"\\\\xleftharpoonup\", \"\\\\xrightleftharpoons\", \"\\\\xleftrightharpoons\", \"\\\\xlongequal\", \"\\\\xtwoheadrightarrow\", \"\\\\xtwoheadleftarrow\", \"\\\\xtofrom\",\n  // The next 3 functions are here to support the mhchem extension.\n  // Direct use of these functions is discouraged and may break someday.\n  \"\\\\xrightleftarrows\", \"\\\\xrightequilibrium\", \"\\\\xleftequilibrium\",\n  // The next 3 functions are here only to support the {CD} environment.\n  \"\\\\\\\\cdrightarrow\", \"\\\\\\\\cdleftarrow\", \"\\\\\\\\cdlongequal\"],\n  numArgs: 1,\n  numOptionalArgs: 1,\n  handler(_ref, args, optArgs) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    return {\n      type: \"xArrow\",\n      mode: parser.mode,\n      label: funcName,\n      body: args[0],\n      below: optArgs[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    var style = options.style;\n    // Build the argument groups in the appropriate style.\n    // Ref: amsmath.dtx:   \\hbox{$\\scriptstyle\\mkern#3mu{#6}\\mkern#4mu$}%\n    // Some groups can return document fragments.  Handle those by wrapping\n    // them in a span.\n    var newOptions = options.havingStyle(style.sup());\n    var upperGroup = wrapFragment(buildGroup$1(group.body, newOptions, options), options);\n    var arrowPrefix = group.label.slice(0, 2) === \"\\\\x\" ? \"x\" : \"cd\";\n    upperGroup.classes.push(arrowPrefix + \"-arrow-pad\");\n    var lowerGroup;\n    if (group.below) {\n      // Build the lower group\n      newOptions = options.havingStyle(style.sub());\n      lowerGroup = wrapFragment(buildGroup$1(group.below, newOptions, options), options);\n      lowerGroup.classes.push(arrowPrefix + \"-arrow-pad\");\n    }\n    var arrowBody = stretchySvg(group, options);\n    // Re shift: Note that stretchySvg returned arrowBody.depth = 0.\n    // The point we want on the math axis is at 0.5 * arrowBody.height.\n    var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height;\n    // 2 mu kern. Ref: amsmath.dtx: #7\\if0#2\\else\\mkern#2mu\\fi\n    var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu\n    if (upperGroup.depth > 0.25 || group.label === \"\\\\xleftequilibrium\") {\n      upperShift -= upperGroup.depth; // shift up if depth encroaches\n    }\n    // Generate the vlist\n    var vlist;\n    if (lowerGroup) {\n      var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111;\n      vlist = makeVList({\n        positionType: \"individualShift\",\n        children: [{\n          type: \"elem\",\n          elem: upperGroup,\n          shift: upperShift\n        }, {\n          type: \"elem\",\n          elem: arrowBody,\n          shift: arrowShift,\n          wrapperClasses: [\"svg-align\"]\n        }, {\n          type: \"elem\",\n          elem: lowerGroup,\n          shift: lowerShift\n        }]\n      });\n    } else {\n      vlist = makeVList({\n        positionType: \"individualShift\",\n        children: [{\n          type: \"elem\",\n          elem: upperGroup,\n          shift: upperShift\n        }, {\n          type: \"elem\",\n          elem: arrowBody,\n          shift: arrowShift,\n          wrapperClasses: [\"svg-align\"]\n        }]\n      });\n    }\n    return makeSpan([\"mrel\", \"x-arrow\"], [vlist], options);\n  },\n  mathmlBuilder(group, options) {\n    var arrowNode = stretchyMathML(group.label);\n    arrowNode.setAttribute(\"minsize\", group.label.charAt(0) === \"x\" ? \"1.75em\" : \"3.0em\");\n    var node;\n    if (group.body) {\n      var upperNode = paddedNode(buildGroup(group.body, options));\n      if (group.below) {\n        var lowerNode = paddedNode(buildGroup(group.below, options));\n        node = new MathNode(\"munderover\", [arrowNode, lowerNode, upperNode]);\n      } else {\n        node = new MathNode(\"mover\", [arrowNode, upperNode]);\n      }\n    } else if (group.below) {\n      var _lowerNode = paddedNode(buildGroup(group.below, options));\n      node = new MathNode(\"munder\", [arrowNode, _lowerNode]);\n    } else {\n      // This should never happen.\n      // Parser.js throws an error if there is no argument.\n      node = paddedNode();\n      node = new MathNode(\"mover\", [arrowNode, node]);\n    }\n    return node;\n  }\n});\n\nfunction htmlBuilder$9(group, options) {\n  var elements = buildExpression$1(group.body, options, true);\n  return makeSpan([group.mclass], elements, options);\n}\nfunction mathmlBuilder$8(group, options) {\n  var node;\n  var inner = buildExpression(group.body, options);\n  if (group.mclass === \"minner\") {\n    node = new MathNode(\"mpadded\", inner);\n  } else if (group.mclass === \"mord\") {\n    if (group.isCharacterBox) {\n      node = inner[0];\n      node.type = \"mi\";\n    } else {\n      node = new MathNode(\"mi\", inner);\n    }\n  } else {\n    if (group.isCharacterBox) {\n      node = inner[0];\n      node.type = \"mo\";\n    } else {\n      node = new MathNode(\"mo\", inner);\n    }\n    // Set spacing based on what is the most likely adjacent atom type.\n    // See TeXbook p170.\n    if (group.mclass === \"mbin\") {\n      node.attributes.lspace = \"0.22em\"; // medium space\n      node.attributes.rspace = \"0.22em\";\n    } else if (group.mclass === \"mpunct\") {\n      node.attributes.lspace = \"0em\";\n      node.attributes.rspace = \"0.17em\"; // thinspace\n    } else if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n      node.attributes.lspace = \"0em\";\n      node.attributes.rspace = \"0em\";\n    }\n    // MathML <mo> default space is 5/18 em, so <mrel> needs no action.\n    // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo\n  }\n  return node;\n}\n// Math class commands except \\mathop\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\mathord\", \"\\\\mathbin\", \"\\\\mathrel\", \"\\\\mathopen\", \"\\\\mathclose\", \"\\\\mathpunct\", \"\\\\mathinner\"],\n  numArgs: 1,\n  primitive: true,\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: \"m\" + funcName.slice(5),\n      body: ordargument(body),\n      isCharacterBox: isCharacterBox(body)\n    };\n  },\n  htmlBuilder: htmlBuilder$9,\n  mathmlBuilder: mathmlBuilder$8\n});\nvar binrelClass = arg => {\n  // \\binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.\n  // (by rendering separately and with {}s before and after, and measuring\n  // the change in spacing).  We'll do roughly the same by detecting the\n  // atom type directly.\n  var atom = arg.type === \"ordgroup\" && arg.body.length ? arg.body[0] : arg;\n  if (atom.type === \"atom\" && (atom.family === \"bin\" || atom.family === \"rel\")) {\n    return \"m\" + atom.family;\n  } else {\n    return \"mord\";\n  }\n};\n// \\@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.\n// This is equivalent to \\binrel@{x}\\binrel@@{y} in AMSTeX.\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\@binrel\"],\n  numArgs: 2,\n  handler(_ref2, args) {\n    var {\n      parser\n    } = _ref2;\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: binrelClass(args[0]),\n      body: ordargument(args[1]),\n      isCharacterBox: isCharacterBox(args[1])\n    };\n  }\n});\n// Build a relation or stacked op by placing one symbol on top of another\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\stackrel\", \"\\\\overset\", \"\\\\underset\"],\n  numArgs: 2,\n  handler(_ref3, args) {\n    var {\n      parser,\n      funcName\n    } = _ref3;\n    var baseArg = args[1];\n    var shiftedArg = args[0];\n    var mclass;\n    if (funcName !== \"\\\\stackrel\") {\n      // LaTeX applies \\binrel spacing to \\overset and \\underset.\n      mclass = binrelClass(baseArg);\n    } else {\n      mclass = \"mrel\"; // for \\stackrel\n    }\n    var baseOp = {\n      type: \"op\",\n      mode: baseArg.mode,\n      limits: true,\n      alwaysHandleSupSub: true,\n      parentIsSupSub: false,\n      symbol: false,\n      suppressBaseShift: funcName !== \"\\\\stackrel\",\n      body: ordargument(baseArg)\n    };\n    var supsub = funcName === \"\\\\underset\" ? {\n      type: \"supsub\",\n      mode: shiftedArg.mode,\n      base: baseOp,\n      sub: shiftedArg\n    } : {\n      type: \"supsub\",\n      mode: shiftedArg.mode,\n      base: baseOp,\n      sup: shiftedArg\n    };\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass,\n      body: [supsub],\n      isCharacterBox: isCharacterBox(supsub)\n    };\n  }\n});\n\n// \\pmb is a simulation of bold font.\n// The version of \\pmb in ambsy.sty works by typesetting three copies\n// with small offsets. We use CSS text-shadow.\n// It's a hack. Not as good as a real bold font. Better than nothing.\ndefineFunction({\n  type: \"pmb\",\n  names: [\"\\\\pmb\"],\n  numArgs: 1,\n  allowedInText: true,\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"pmb\",\n      mode: parser.mode,\n      mclass: binrelClass(args[0]),\n      body: ordargument(args[0])\n    };\n  },\n  htmlBuilder(group, options) {\n    var elements = buildExpression$1(group.body, options, true);\n    var node = makeSpan([group.mclass], elements, options);\n    node.style.textShadow = \"0.02em 0.01em 0.04px\";\n    return node;\n  },\n  mathmlBuilder(group, style) {\n    var inner = buildExpression(group.body, style);\n    // Wrap with an <mstyle> element.\n    var node = new MathNode(\"mstyle\", inner);\n    node.setAttribute(\"style\", \"text-shadow: 0.02em 0.01em 0.04px\");\n    return node;\n  }\n});\n\nvar cdArrowFunctionName = {\n  \">\": \"\\\\\\\\cdrightarrow\",\n  \"<\": \"\\\\\\\\cdleftarrow\",\n  \"=\": \"\\\\\\\\cdlongequal\",\n  \"A\": \"\\\\uparrow\",\n  \"V\": \"\\\\downarrow\",\n  \"|\": \"\\\\Vert\",\n  \".\": \"no arrow\"\n};\nvar newCell = () => {\n  // Create an empty cell, to be filled below with parse nodes.\n  // The parseTree from this module must be constructed like the\n  // one created by parseArray(), so an empty CD cell must\n  // be a ParseNode<\"styling\">. And CD is always displaystyle.\n  return {\n    type: \"styling\",\n    body: [],\n    mode: \"math\",\n    style: \"display\",\n    resetFont: true\n  };\n};\nvar isStartOfArrow = node => {\n  return node.type === \"textord\" && node.text === \"@\";\n};\nvar isLabelEnd = (node, endChar) => {\n  return (node.type === \"mathord\" || node.type === \"atom\") && node.text === endChar;\n};\nfunction cdArrow(arrowChar, labels, parser) {\n  // Return a parse tree of an arrow and its labels.\n  // This acts in a way similar to a macro expansion.\n  var funcName = cdArrowFunctionName[arrowChar];\n  switch (funcName) {\n    case \"\\\\\\\\cdrightarrow\":\n    case \"\\\\\\\\cdleftarrow\":\n      return parser.callFunction(funcName, [labels[0]], [labels[1]]);\n    case \"\\\\uparrow\":\n    case \"\\\\downarrow\":\n      {\n        var leftLabel = parser.callFunction(\"\\\\\\\\cdleft\", [labels[0]], []);\n        var bareArrow = {\n          type: \"atom\",\n          text: funcName,\n          mode: \"math\",\n          family: \"rel\"\n        };\n        var sizedArrow = parser.callFunction(\"\\\\Big\", [bareArrow], []);\n        var rightLabel = parser.callFunction(\"\\\\\\\\cdright\", [labels[1]], []);\n        var arrowGroup = {\n          type: \"ordgroup\",\n          mode: \"math\",\n          body: [leftLabel, sizedArrow, rightLabel]\n        };\n        return parser.callFunction(\"\\\\\\\\cdparent\", [arrowGroup], []);\n      }\n    case \"\\\\\\\\cdlongequal\":\n      return parser.callFunction(\"\\\\\\\\cdlongequal\", [], []);\n    case \"\\\\Vert\":\n      {\n        var arrow = {\n          type: \"textord\",\n          text: \"\\\\Vert\",\n          mode: \"math\"\n        };\n        return parser.callFunction(\"\\\\Big\", [arrow], []);\n      }\n    default:\n      return {\n        type: \"textord\",\n        text: \" \",\n        mode: \"math\"\n      };\n  }\n}\nfunction parseCD(parser) {\n  // Get the array's parse nodes with \\\\ temporarily mapped to \\cr.\n  var parsedRows = [];\n  parser.gullet.beginGroup();\n  parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n  parser.gullet.beginGroup();\n  while (true) {\n    // Get the parse nodes for the next row.\n    parsedRows.push(parser.parseExpression(false, \"\\\\\\\\\"));\n    parser.gullet.endGroup();\n    parser.gullet.beginGroup();\n    var next = parser.fetch().text;\n    if (next === \"&\" || next === \"\\\\\\\\\") {\n      parser.consume();\n    } else if (next === \"\\\\end\") {\n      if (parsedRows[parsedRows.length - 1].length === 0) {\n        parsedRows.pop(); // final row ended in \\\\\n      }\n      break;\n    } else {\n      throw new ParseError(\"Expected \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n    }\n  }\n  var row = [];\n  var body = [row];\n  // Loop thru the parse nodes. Collect them into cells and arrows.\n  for (var i = 0; i < parsedRows.length; i++) {\n    // Start a new row.\n    var rowNodes = parsedRows[i];\n    // Create the first cell.\n    var cell = newCell();\n    for (var j = 0; j < rowNodes.length; j++) {\n      if (!isStartOfArrow(rowNodes[j])) {\n        // If a parseNode is not an arrow, it goes into a cell.\n        cell.body.push(rowNodes[j]);\n      } else {\n        // Parse node j is an \"@\", the start of an arrow.\n        // Before starting on the arrow, push the cell into `row`.\n        row.push(cell);\n        // Now collect parseNodes into an arrow.\n        // The character after \"@\" defines the arrow type.\n        j += 1;\n        var arrowChar = assertSymbolNodeType(rowNodes[j]).text;\n        // Create two empty label nodes. We may or may not use them.\n        var labels = new Array(2);\n        labels[0] = {\n          type: \"ordgroup\",\n          mode: \"math\",\n          body: []\n        };\n        labels[1] = {\n          type: \"ordgroup\",\n          mode: \"math\",\n          body: []\n        };\n        // Process the arrow.\n        if (\"=|.\".includes(arrowChar)) ; else if (\"<>AV\".includes(arrowChar)) {\n          // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take\n          // two optional labels. E.g. the right-point arrow syntax is\n          // really:  @>{optional label}>{optional label}>\n          // Collect parseNodes into labels.\n          for (var labelNum = 0; labelNum < 2; labelNum++) {\n            var inLabel = true;\n            for (var k = j + 1; k < rowNodes.length; k++) {\n              if (isLabelEnd(rowNodes[k], arrowChar)) {\n                inLabel = false;\n                j = k;\n                break;\n              }\n              if (isStartOfArrow(rowNodes[k])) {\n                throw new ParseError(\"Missing a \" + arrowChar + \" character to complete a CD arrow.\", rowNodes[k]);\n              }\n              labels[labelNum].body.push(rowNodes[k]);\n            }\n            if (inLabel) {\n              // isLabelEnd never returned a true.\n              throw new ParseError(\"Missing a \" + arrowChar + \" character to complete a CD arrow.\", rowNodes[j]);\n            }\n          }\n        } else {\n          throw new ParseError(\"Expected one of \\\"<>AV=|.\\\" after @\", rowNodes[j]);\n        }\n        // Now join the arrow to its labels.\n        var arrow = cdArrow(arrowChar, labels, parser);\n        // Wrap the arrow in  ParseNode<\"styling\">.\n        // This is done to match parseArray() behavior.\n        var wrappedArrow = {\n          type: \"styling\",\n          body: [arrow],\n          mode: \"math\",\n          style: \"display\",\n          // CD is always displaystyle.\n          resetFont: true\n        };\n        row.push(wrappedArrow);\n        // In CD's syntax, cells are implicit. That is, everything that\n        // is not an arrow gets collected into a cell. So create an empty\n        // cell now. It will collect upcoming parseNodes.\n        cell = newCell();\n      }\n    }\n    if (i % 2 === 0) {\n      // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell\n      // The last cell is not yet pushed into `row`, so:\n      row.push(cell);\n    } else {\n      // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow\n      // Remove the empty cell that was placed at the beginning of `row`.\n      row.shift();\n    }\n    row = [];\n    body.push(row);\n  }\n  // End row group\n  parser.gullet.endGroup();\n  // End array group defining \\\\\n  parser.gullet.endGroup();\n  // define column separation.\n  var cols = new Array(body[0].length).fill({\n    type: \"align\",\n    align: \"c\",\n    pregap: 0.25,\n    // CD package sets \\enskip between columns.\n    postgap: 0.25 // So pre and post each get half an \\enskip, i.e. 0.25em.\n  });\n  return {\n    type: \"array\",\n    mode: \"math\",\n    body,\n    arraystretch: 1,\n    addJot: true,\n    rowGaps: [null],\n    cols,\n    colSeparationType: \"CD\",\n    hLinesBeforeRow: new Array(body.length + 1).fill([])\n  };\n}\n// The functions below are not available for general use.\n// They are here only for internal use by the {CD} environment in placing labels\n// next to vertical arrows.\n// We don't need any such functions for horizontal arrows because we can reuse\n// the functionality that already exists for extensible arrows.\ndefineFunction({\n  type: \"cdlabel\",\n  names: [\"\\\\\\\\cdleft\", \"\\\\\\\\cdright\"],\n  numArgs: 1,\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    return {\n      type: \"cdlabel\",\n      mode: parser.mode,\n      side: funcName.slice(4),\n      label: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    var newOptions = options.havingStyle(options.style.sup());\n    var label = wrapFragment(buildGroup$1(group.label, newOptions, options), options);\n    label.classes.push(\"cd-label-\" + group.side);\n    label.style.bottom = makeEm(0.8 - label.depth);\n    // Zero out label height & depth, so vertical align of arrow is set\n    // by the arrow height, not by the label.\n    label.height = 0;\n    label.depth = 0;\n    return label;\n  },\n  mathmlBuilder(group, options) {\n    var label = new MathNode(\"mrow\", [buildGroup(group.label, options)]);\n    label = new MathNode(\"mpadded\", [label]);\n    label.setAttribute(\"width\", \"0\");\n    if (group.side === \"left\") {\n      label.setAttribute(\"lspace\", \"-1width\");\n    }\n    // We have to guess at vertical alignment. We know the arrow is 1.8em tall,\n    // But we don't know the height or depth of the label.\n    label.setAttribute(\"voffset\", \"0.7em\");\n    label = new MathNode(\"mstyle\", [label]);\n    label.setAttribute(\"displaystyle\", \"false\");\n    label.setAttribute(\"scriptlevel\", \"1\");\n    return label;\n  }\n});\ndefineFunction({\n  type: \"cdlabelparent\",\n  names: [\"\\\\\\\\cdparent\"],\n  numArgs: 1,\n  handler(_ref2, args) {\n    var {\n      parser\n    } = _ref2;\n    return {\n      type: \"cdlabelparent\",\n      mode: parser.mode,\n      fragment: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    // Wrap the vertical arrow and its labels.\n    // The parent gets position: relative. The child gets position: absolute.\n    // So CSS can locate the label correctly.\n    var parent = wrapFragment(buildGroup$1(group.fragment, options), options);\n    parent.classes.push(\"cd-vert-arrow\");\n    return parent;\n  },\n  mathmlBuilder(group, options) {\n    return new MathNode(\"mrow\", [buildGroup(group.fragment, options)]);\n  }\n});\n\n// \\@char is an internal function that takes a grouped decimal argument like\n// {123} and converts into symbol with code 123.  It is used by the *macro*\n// \\char defined in macros.js.\ndefineFunction({\n  type: \"textord\",\n  names: [\"\\\\@char\"],\n  numArgs: 1,\n  allowedInText: true,\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var arg = assertNodeType(args[0], \"ordgroup\");\n    var group = arg.body;\n    var number = \"\";\n    for (var i = 0; i < group.length; i++) {\n      var node = assertNodeType(group[i], \"textord\");\n      number += node.text;\n    }\n    var code = parseInt(number);\n    var text;\n    if (isNaN(code)) {\n      throw new ParseError(\"\\\\@char has non-numeric argument \" + number);\n      // If we drop IE support, the following code could be replaced with\n      // text = String.fromCodePoint(code)\n    } else if (code < 0 || code >= 0x10ffff) {\n      throw new ParseError(\"\\\\@char with invalid code point \" + number);\n    } else if (code <= 0xffff) {\n      text = String.fromCharCode(code);\n    } else {\n      // Astral code point; split into surrogate halves\n      code -= 0x10000;\n      text = String.fromCharCode((code >> 10) + 0xd800, (code & 0x3ff) + 0xdc00);\n    }\n    return {\n      type: \"textord\",\n      mode: parser.mode,\n      text: text\n    };\n  }\n});\n\nvar htmlBuilder$8 = (group, options) => {\n  var elements = buildExpression$1(group.body, options.withColor(group.color), false);\n  // \\color isn't supposed to affect the type of the elements it contains.\n  // To accomplish this, we wrap the results in a fragment, so the inner\n  // elements will be able to directly interact with their neighbors. For\n  // example, `\\color{red}{2 +} 3` has the same spacing as `2 + 3`\n  return makeFragment(elements);\n};\nvar mathmlBuilder$7 = (group, options) => {\n  var inner = buildExpression(group.body, options.withColor(group.color));\n  var node = new MathNode(\"mstyle\", inner);\n  node.setAttribute(\"mathcolor\", group.color);\n  return node;\n};\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\textcolor\"],\n  numArgs: 2,\n  allowedInText: true,\n  argTypes: [\"color\", \"original\"],\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var color = assertNodeType(args[0], \"color-token\").color;\n    var body = args[1];\n    return {\n      type: \"color\",\n      mode: parser.mode,\n      color,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: htmlBuilder$8,\n  mathmlBuilder: mathmlBuilder$7\n});\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\color\"],\n  numArgs: 1,\n  allowedInText: true,\n  argTypes: [\"color\"],\n  handler(_ref2, args) {\n    var {\n      parser,\n      breakOnTokenText\n    } = _ref2;\n    var color = assertNodeType(args[0], \"color-token\").color;\n    // Set macro \\current@color in current namespace to store the current\n    // color, mimicking the behavior of color.sty.\n    // This is currently used just to correctly color a \\right\n    // that follows a \\color command.\n    parser.gullet.macros.set(\"\\\\current@color\", color);\n    // Parse out the implicit body that should be colored.\n    var body = parser.parseExpression(true, breakOnTokenText);\n    return {\n      type: \"color\",\n      mode: parser.mode,\n      color,\n      body\n    };\n  }\n});\n\n// Row breaks within tabular environments, and line breaks at top level\n// \\DeclareRobustCommand\\\\{...\\@xnewline}\ndefineFunction({\n  type: \"cr\",\n  names: [\"\\\\\\\\\"],\n  numArgs: 0,\n  numOptionalArgs: 0,\n  allowedInText: true,\n  handler(_ref, args, optArgs) {\n    var {\n      parser\n    } = _ref;\n    var size = parser.gullet.future().text === \"[\" ? parser.parseSizeGroup(true) : null;\n    var newLine = !parser.settings.displayMode || !parser.settings.useStrictBehavior(\"newLineInDisplayMode\", \"In LaTeX, \\\\\\\\ or \\\\newline \" + \"does nothing in display mode\");\n    return {\n      type: \"cr\",\n      mode: parser.mode,\n      newLine,\n      size: size && assertNodeType(size, \"size\").value\n    };\n  },\n  // The following builders are called only at the top level,\n  // not within tabular/array environments.\n  htmlBuilder(group, options) {\n    var span = makeSpan([\"mspace\"], [], options);\n    if (group.newLine) {\n      span.classes.push(\"newline\");\n      if (group.size) {\n        span.style.marginTop = makeEm(calculateSize(group.size, options));\n      }\n    }\n    return span;\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mspace\");\n    if (group.newLine) {\n      node.setAttribute(\"linebreak\", \"newline\");\n      if (group.size) {\n        node.setAttribute(\"height\", makeEm(calculateSize(group.size, options)));\n      }\n    }\n    return node;\n  }\n});\n\nvar globalMap = {\n  \"\\\\global\": \"\\\\global\",\n  \"\\\\long\": \"\\\\\\\\globallong\",\n  \"\\\\\\\\globallong\": \"\\\\\\\\globallong\",\n  \"\\\\def\": \"\\\\gdef\",\n  \"\\\\gdef\": \"\\\\gdef\",\n  \"\\\\edef\": \"\\\\xdef\",\n  \"\\\\xdef\": \"\\\\xdef\",\n  \"\\\\let\": \"\\\\\\\\globallet\",\n  \"\\\\futurelet\": \"\\\\\\\\globalfuture\"\n};\nvar checkControlSequence = tok => {\n  var name = tok.text;\n  if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n    throw new ParseError(\"Expected a control sequence\", tok);\n  }\n  return name;\n};\nvar getRHS = parser => {\n  var tok = parser.gullet.popToken();\n  if (tok.text === \"=\") {\n    // consume optional equals\n    tok = parser.gullet.popToken();\n    if (tok.text === \" \") {\n      // consume one optional space\n      tok = parser.gullet.popToken();\n    }\n  }\n  return tok;\n};\nvar letCommand = (parser, name, tok, global) => {\n  var macro = parser.gullet.macros.get(tok.text);\n  if (macro == null) {\n    // don't expand it later even if a macro with the same name is defined\n    // e.g., \\let\\foo=\\frac \\def\\frac{\\relax} \\frac12\n    tok.noexpand = true;\n    macro = {\n      tokens: [tok],\n      numArgs: 0,\n      // reproduce the same behavior in expansion\n      unexpandable: !parser.gullet.isExpandable(tok.text)\n    };\n  }\n  parser.gullet.macros.set(name, macro, global);\n};\n// <assignment> -> <non-macro assignment>|<macro assignment>\n// <non-macro assignment> -> <simple assignment>|\\global<non-macro assignment>\n// <macro assignment> -> <definition>|<prefix><macro assignment>\n// <prefix> -> \\global|\\long|\\outer\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\global\", \"\\\\long\", \"\\\\\\\\globallong\" // can’t be entered directly\n  ],\n  numArgs: 0,\n  allowedInText: true,\n  handler(_ref) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    parser.consumeSpaces();\n    var token = parser.fetch();\n    if (globalMap[token.text]) {\n      // KaTeX doesn't have \\par, so ignore \\long\n      if (funcName === \"\\\\global\" || funcName === \"\\\\\\\\globallong\") {\n        token.text = globalMap[token.text];\n      }\n      return assertNodeType(parser.parseFunction(), \"internal\");\n    }\n    throw new ParseError(\"Invalid token after macro prefix\", token);\n  }\n});\n// Basic support for macro definitions: \\def, \\gdef, \\edef, \\xdef\n// <definition> -> <def><control sequence><definition text>\n// <def> -> \\def|\\gdef|\\edef|\\xdef\n// <definition text> -> <parameter text><left brace><balanced text><right brace>\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\def\", \"\\\\gdef\", \"\\\\edef\", \"\\\\xdef\"],\n  numArgs: 0,\n  allowedInText: true,\n  primitive: true,\n  handler(_ref2) {\n    var {\n      parser,\n      funcName\n    } = _ref2;\n    var tok = parser.gullet.popToken();\n    var name = tok.text;\n    if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n      throw new ParseError(\"Expected a control sequence\", tok);\n    }\n    var numArgs = 0;\n    var insert;\n    var delimiters = [[]];\n    // <parameter text> contains no braces\n    while (parser.gullet.future().text !== \"{\") {\n      tok = parser.gullet.popToken();\n      if (tok.text === \"#\") {\n        // If the very last character of the <parameter text> is #, so that\n        // this # is immediately followed by {, TeX will behave as if the {\n        // had been inserted at the right end of both the parameter text\n        // and the replacement text.\n        if (parser.gullet.future().text === \"{\") {\n          insert = parser.gullet.future();\n          delimiters[numArgs].push(\"{\");\n          break;\n        }\n        // A parameter, the first appearance of # must be followed by 1,\n        // the next by 2, and so on; up to nine #’s are allowed\n        tok = parser.gullet.popToken();\n        if (!/^[1-9]$/.test(tok.text)) {\n          throw new ParseError(\"Invalid argument number \\\"\" + tok.text + \"\\\"\");\n        }\n        if (parseInt(tok.text) !== numArgs + 1) {\n          throw new ParseError(\"Argument number \\\"\" + tok.text + \"\\\" out of order\");\n        }\n        numArgs++;\n        delimiters.push([]);\n      } else if (tok.text === \"EOF\") {\n        throw new ParseError(\"Expected a macro definition\");\n      } else {\n        delimiters[numArgs].push(tok.text);\n      }\n    }\n    // replacement text, enclosed in '{' and '}' and properly nested\n    var {\n      tokens\n    } = parser.gullet.consumeArg();\n    if (insert) {\n      tokens.unshift(insert);\n    }\n    if (funcName === \"\\\\edef\" || funcName === \"\\\\xdef\") {\n      tokens = parser.gullet.expandTokens(tokens);\n      tokens.reverse(); // to fit in with stack order\n    }\n    // Final arg is the expansion of the macro\n    parser.gullet.macros.set(name, {\n      tokens,\n      numArgs,\n      delimiters\n    }, funcName === globalMap[funcName]);\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n// <simple assignment> -> <let assignment>\n// <let assignment> -> \\futurelet<control sequence><token><token>\n//     | \\let<control sequence><equals><one optional space><token>\n// <equals> -> <optional spaces>|<optional spaces>=\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\let\", \"\\\\\\\\globallet\" // can’t be entered directly\n  ],\n  numArgs: 0,\n  allowedInText: true,\n  primitive: true,\n  handler(_ref3) {\n    var {\n      parser,\n      funcName\n    } = _ref3;\n    var name = checkControlSequence(parser.gullet.popToken());\n    parser.gullet.consumeSpaces();\n    var tok = getRHS(parser);\n    letCommand(parser, name, tok, funcName === \"\\\\\\\\globallet\");\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\futurelet\", \"\\\\\\\\globalfuture\" // can’t be entered directly\n  ],\n  numArgs: 0,\n  allowedInText: true,\n  primitive: true,\n  handler(_ref4) {\n    var {\n      parser,\n      funcName\n    } = _ref4;\n    var name = checkControlSequence(parser.gullet.popToken());\n    var middle = parser.gullet.popToken();\n    var tok = parser.gullet.popToken();\n    letCommand(parser, name, tok, funcName === \"\\\\\\\\globalfuture\");\n    parser.gullet.pushToken(tok);\n    parser.gullet.pushToken(middle);\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n\n/**\n * This file deals with creating delimiters of various sizes. The TeXbook\n * discusses these routines on page 441-442, in the \"Another subroutine sets box\n * x to a specified variable delimiter\" paragraph.\n *\n * There are three main routines here. `makeSmallDelim` makes a delimiter in the\n * normal font, but in either text, script, or scriptscript style.\n * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1,\n * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of\n * smaller pieces that are stacked on top of one another.\n *\n * The functions take a parameter `center`, which determines if the delimiter\n * should be centered around the axis.\n *\n * Then, there are three exposed functions. `sizedDelim` makes a delimiter in\n * one of the given sizes. This is used for things like `\\bigl`.\n * `customSizedDelim` makes a delimiter with a given total height+depth. It is\n * called in places like `\\sqrt`. `leftRightDelim` makes an appropriate\n * delimiter which surrounds an expression of a given height an depth. It is\n * used in `\\left` and `\\right`.\n */\n/**\n * Get the metrics for a given symbol and font, after transformation (i.e.\n * after following replacement from symbols.js)\n */\nvar getMetrics = function getMetrics(symbol, font, mode) {\n  var replace = symbols.math[symbol] && symbols.math[symbol].replace;\n  var metrics = getCharacterMetrics(replace || symbol, font, mode);\n  if (!metrics) {\n    throw new Error(\"Unsupported symbol \" + symbol + \" and font size \" + font + \".\");\n  }\n  return metrics;\n};\n/**\n * Puts a delimiter span in a given style, and adds appropriate height, depth,\n * and maxFontSizes.\n */\nvar styleWrap = function styleWrap(delim, toStyle, options, classes) {\n  var newOptions = options.havingBaseStyle(toStyle);\n  var span = makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options);\n  var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier;\n  span.height *= delimSizeMultiplier;\n  span.depth *= delimSizeMultiplier;\n  span.maxFontSize = newOptions.sizeMultiplier;\n  return span;\n};\nvar centerSpan = function centerSpan(span, options, style) {\n  var newOptions = options.havingBaseStyle(style);\n  var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight;\n  span.classes.push(\"delimcenter\");\n  span.style.top = makeEm(shift);\n  span.height -= shift;\n  span.depth += shift;\n};\n/**\n * Makes a small delimiter. This is a delimiter that comes in the Main-Regular\n * font, but is restyled to either be in textstyle, scriptstyle, or\n * scriptscriptstyle.\n */\nvar makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) {\n  var text = makeSymbol(delim, \"Main-Regular\", mode, options);\n  var span = styleWrap(text, style, options, classes);\n  if (center) {\n    centerSpan(span, options, style);\n  }\n  return span;\n};\n/**\n * Builds a symbol in the given font size (note size is an integer)\n */\nvar mathrmSize = function mathrmSize(value, size, mode, options) {\n  return makeSymbol(value, \"Size\" + size + \"-Regular\", mode, options);\n};\n/**\n * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2,\n * Size3, or Size4 fonts. It is always rendered in textstyle.\n */\nvar makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) {\n  var inner = mathrmSize(delim, size, mode, options);\n  var span = styleWrap(makeSpan([\"delimsizing\", \"size\" + size], [inner], options), Style$1.TEXT, options, classes);\n  if (center) {\n    centerSpan(span, options, Style$1.TEXT);\n  }\n  return span;\n};\n/**\n * Make a span from a font glyph with the given offset and in the given font.\n * This is used in makeStackedDelim to make the stacking pieces for the delimiter.\n */\nvar makeGlyphSpan = function makeGlyphSpan(symbol, font, mode) {\n  var sizeClass;\n  // Apply the correct CSS class to choose the right font.\n  if (font === \"Size1-Regular\") {\n    sizeClass = \"delim-size1\";\n  } else /* if (font === \"Size4-Regular\") */{\n      sizeClass = \"delim-size4\";\n    }\n  var corner = makeSpan([\"delimsizinginner\", sizeClass], [makeSpan([], [makeSymbol(symbol, font, mode)])]);\n  // Since this will be passed into `makeVList` in the end, wrap the element\n  // in the appropriate tag that VList uses.\n  return {\n    type: \"elem\",\n    elem: corner\n  };\n};\nvar makeInner = function makeInner(ch, height, options) {\n  // Create a span with inline SVG for the inner part of a tall stacked delimiter.\n  var width = fontMetricsData['Size4-Regular'][ch.charCodeAt(0)] ? fontMetricsData['Size4-Regular'][ch.charCodeAt(0)][4] : fontMetricsData['Size1-Regular'][ch.charCodeAt(0)][4];\n  var path = new PathNode(\"inner\", innerPath(ch, Math.round(1000 * height)));\n  var svgNode = new SvgNode([path], {\n    \"width\": makeEm(width),\n    \"height\": makeEm(height),\n    // Override CSS rule `.katex svg { width: 100% }`\n    \"style\": \"width:\" + makeEm(width),\n    \"viewBox\": \"0 0 \" + 1000 * width + \" \" + Math.round(1000 * height),\n    \"preserveAspectRatio\": \"xMinYMin\"\n  });\n  var span = makeSvgSpan([], [svgNode], options);\n  span.height = height;\n  span.style.height = makeEm(height);\n  span.style.width = makeEm(width);\n  return {\n    type: \"elem\",\n    elem: span\n  };\n};\n// Helpers for makeStackedDelim\nvar lapInEms = 0.008;\nvar lap = {\n  type: \"kern\",\n  size: -1 * lapInEms\n};\nvar verts = new Set([\"|\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\vert\"]);\nvar doubleVerts = new Set([\"\\\\|\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\Vert\"]);\n/**\n * Make a stacked delimiter out of a given delimiter, with the total height at\n * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook.\n */\nvar makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) {\n  // There are four parts, the top, an optional middle, a repeated part, and a\n  // bottom.\n  var top;\n  var middle;\n  var repeat;\n  var bottom;\n  var svgLabel = \"\";\n  var viewBoxWidth = 0;\n  top = repeat = bottom = delim;\n  middle = null;\n  // Also keep track of what font the delimiters are in\n  var font = \"Size1-Regular\";\n  // We set the parts and font based on the symbol. Note that we use\n  // '\\u23d0' instead of '|' and '\\u2016' instead of '\\\\|' for the\n  // repeats of the arrows\n  if (delim === \"\\\\uparrow\") {\n    repeat = bottom = \"\\u23d0\";\n  } else if (delim === \"\\\\Uparrow\") {\n    repeat = bottom = \"\\u2016\";\n  } else if (delim === \"\\\\downarrow\") {\n    top = repeat = \"\\u23d0\";\n  } else if (delim === \"\\\\Downarrow\") {\n    top = repeat = \"\\u2016\";\n  } else if (delim === \"\\\\updownarrow\") {\n    top = \"\\\\uparrow\";\n    repeat = \"\\u23d0\";\n    bottom = \"\\\\downarrow\";\n  } else if (delim === \"\\\\Updownarrow\") {\n    top = \"\\\\Uparrow\";\n    repeat = \"\\u2016\";\n    bottom = \"\\\\Downarrow\";\n  } else if (verts.has(delim)) {\n    repeat = \"\\u2223\";\n    svgLabel = \"vert\";\n    viewBoxWidth = 333;\n  } else if (doubleVerts.has(delim)) {\n    repeat = \"\\u2225\";\n    svgLabel = \"doublevert\";\n    viewBoxWidth = 556;\n  } else if (delim === \"[\" || delim === \"\\\\lbrack\") {\n    top = \"\\u23a1\";\n    repeat = \"\\u23a2\";\n    bottom = \"\\u23a3\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lbrack\";\n    viewBoxWidth = 667;\n  } else if (delim === \"]\" || delim === \"\\\\rbrack\") {\n    top = \"\\u23a4\";\n    repeat = \"\\u23a5\";\n    bottom = \"\\u23a6\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rbrack\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\lfloor\" || delim === \"\\u230a\") {\n    repeat = top = \"\\u23a2\";\n    bottom = \"\\u23a3\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lfloor\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\lceil\" || delim === \"\\u2308\") {\n    top = \"\\u23a1\";\n    repeat = bottom = \"\\u23a2\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lceil\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\rfloor\" || delim === \"\\u230b\") {\n    repeat = top = \"\\u23a5\";\n    bottom = \"\\u23a6\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rfloor\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\rceil\" || delim === \"\\u2309\") {\n    top = \"\\u23a4\";\n    repeat = bottom = \"\\u23a5\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rceil\";\n    viewBoxWidth = 667;\n  } else if (delim === \"(\" || delim === \"\\\\lparen\") {\n    top = \"\\u239b\";\n    repeat = \"\\u239c\";\n    bottom = \"\\u239d\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lparen\";\n    viewBoxWidth = 875;\n  } else if (delim === \")\" || delim === \"\\\\rparen\") {\n    top = \"\\u239e\";\n    repeat = \"\\u239f\";\n    bottom = \"\\u23a0\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rparen\";\n    viewBoxWidth = 875;\n  } else if (delim === \"\\\\{\" || delim === \"\\\\lbrace\") {\n    top = \"\\u23a7\";\n    middle = \"\\u23a8\";\n    bottom = \"\\u23a9\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\}\" || delim === \"\\\\rbrace\") {\n    top = \"\\u23ab\";\n    middle = \"\\u23ac\";\n    bottom = \"\\u23ad\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\lgroup\" || delim === \"\\u27ee\") {\n    top = \"\\u23a7\";\n    bottom = \"\\u23a9\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\rgroup\" || delim === \"\\u27ef\") {\n    top = \"\\u23ab\";\n    bottom = \"\\u23ad\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\lmoustache\" || delim === \"\\u23b0\") {\n    top = \"\\u23a7\";\n    bottom = \"\\u23ad\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\rmoustache\" || delim === \"\\u23b1\") {\n    top = \"\\u23ab\";\n    bottom = \"\\u23a9\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  }\n  // Get the metrics of the four sections\n  var topMetrics = getMetrics(top, font, mode);\n  var topHeightTotal = topMetrics.height + topMetrics.depth;\n  var repeatMetrics = getMetrics(repeat, font, mode);\n  var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth;\n  var bottomMetrics = getMetrics(bottom, font, mode);\n  var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth;\n  var middleHeightTotal = 0;\n  var middleFactor = 1;\n  if (middle !== null) {\n    var middleMetrics = getMetrics(middle, font, mode);\n    middleHeightTotal = middleMetrics.height + middleMetrics.depth;\n    middleFactor = 2; // repeat symmetrically above and below middle\n  }\n  // Calculate the minimal height that the delimiter can have.\n  // It is at least the size of the top, bottom, and optional middle combined.\n  var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal;\n  // Compute the number of copies of the repeat symbol we will need\n  var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal)));\n  // Compute the total height of the delimiter including all the symbols\n  var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal;\n  // The center of the delimiter is placed at the center of the axis. Note\n  // that in this context, \"center\" means that the delimiter should be\n  // centered around the axis in the current style, while normally it is\n  // centered around the axis in textstyle.\n  var axisHeight = options.fontMetrics().axisHeight;\n  if (center) {\n    axisHeight *= options.sizeMultiplier;\n  }\n  // Calculate the depth\n  var depth = realHeightTotal / 2 - axisHeight;\n  // Now, we start building the pieces that will go into the vlist\n  // Keep a list of the pieces of the stacked delimiter\n  var stack = [];\n  if (svgLabel.length > 0) {\n    // Instead of stacking glyphs, create a single SVG.\n    // This evades browser problems with imprecise positioning of spans.\n    var midHeight = realHeightTotal - topHeightTotal - bottomHeightTotal;\n    var viewBoxHeight = Math.round(realHeightTotal * 1000);\n    var pathStr = tallDelim(svgLabel, Math.round(midHeight * 1000));\n    var path = new PathNode(svgLabel, pathStr);\n    var width = makeEm(viewBoxWidth / 1000);\n    var height = makeEm(viewBoxHeight / 1000);\n    var svg = new SvgNode([path], {\n      \"width\": width,\n      \"height\": height,\n      \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + viewBoxHeight\n    });\n    var wrapper = makeSvgSpan([], [svg], options);\n    wrapper.height = viewBoxHeight / 1000;\n    wrapper.style.width = width;\n    wrapper.style.height = height;\n    stack.push({\n      type: \"elem\",\n      elem: wrapper\n    });\n  } else {\n    // Stack glyphs\n    // Start by adding the bottom symbol\n    stack.push(makeGlyphSpan(bottom, font, mode));\n    stack.push(lap); // overlap\n    if (middle === null) {\n      // The middle section will be an SVG. Make it an extra 0.016em tall.\n      // We'll overlap by 0.008em at top and bottom.\n      var innerHeight = realHeightTotal - topHeightTotal - bottomHeightTotal + 2 * lapInEms;\n      stack.push(makeInner(repeat, innerHeight, options));\n    } else {\n      // When there is a middle bit, we need the middle part and two repeated\n      // sections\n      var _innerHeight = (realHeightTotal - topHeightTotal - bottomHeightTotal - middleHeightTotal) / 2 + 2 * lapInEms;\n      stack.push(makeInner(repeat, _innerHeight, options));\n      // Now insert the middle of the brace.\n      stack.push(lap);\n      stack.push(makeGlyphSpan(middle, font, mode));\n      stack.push(lap);\n      stack.push(makeInner(repeat, _innerHeight, options));\n    }\n    // Add the top symbol\n    stack.push(lap);\n    stack.push(makeGlyphSpan(top, font, mode));\n  }\n  // Finally, build the vlist\n  var newOptions = options.havingBaseStyle(Style$1.TEXT);\n  var inner = makeVList({\n    positionType: \"bottom\",\n    positionData: depth,\n    children: stack\n  });\n  return styleWrap(makeSpan([\"delimsizing\", \"mult\"], [inner], newOptions), Style$1.TEXT, options, classes);\n};\n// All surds have 0.08em padding above the vinculum inside the SVG.\n// That keeps browser span height rounding error from pinching the line.\nvar vbPad = 80; // padding above the surd, measured inside the viewBox.\nvar emPad = 0.08; // padding, in ems, measured in the document.\nvar sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraVinculum, options) {\n  var path = sqrtPath(sqrtName, extraVinculum, viewBoxHeight);\n  var pathNode = new PathNode(sqrtName, path);\n  var svg = new SvgNode([pathNode], {\n    // Note: 1000:1 ratio of viewBox to document em width.\n    \"width\": \"400em\",\n    \"height\": makeEm(height),\n    \"viewBox\": \"0 0 400000 \" + viewBoxHeight,\n    \"preserveAspectRatio\": \"xMinYMin slice\"\n  });\n  return makeSvgSpan([\"hide-tail\"], [svg], options);\n};\n/**\n * Make a sqrt image of the given height,\n */\nvar makeSqrtImage = function makeSqrtImage(height, options) {\n  // Define a newOptions that removes the effect of size changes such as \\Huge.\n  // We don't pick different a height surd for \\Huge. For it, we scale up.\n  var newOptions = options.havingBaseSizing();\n  // Pick the desired surd glyph from a sequence of surds.\n  var delim = traverseSequence(\"\\\\surd\", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions);\n  var sizeMultiplier = newOptions.sizeMultiplier; // default\n  // The standard sqrt SVGs each have a 0.04em thick vinculum.\n  // If Settings.minRuleThickness is larger than that, we add extraVinculum.\n  var extraVinculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness);\n  // Create a span containing an SVG image of a sqrt symbol.\n  var span;\n  var spanHeight;\n  var texHeight;\n  var viewBoxHeight;\n  var advanceWidth;\n  // We create viewBoxes with 80 units of \"padding\" above each surd.\n  // Then browser rounding error on the parent span height will not\n  // encroach on the ink of the vinculum. But that padding is not\n  // included in the TeX-like `height` used for calculation of\n  // vertical alignment. So texHeight = span.height < span.style.height.\n  if (delim.type === \"small\") {\n    // Get an SVG that is derived from glyph U+221A in font KaTeX-Main.\n    // 1000 unit normal glyph height.\n    viewBoxHeight = 1000 + 1000 * extraVinculum + vbPad;\n    if (height < 1.0) {\n      sizeMultiplier = 1.0; // mimic a \\textfont radical\n    } else if (height < 1.4) {\n      sizeMultiplier = 0.7; // mimic a \\scriptfont radical\n    }\n    spanHeight = (1.0 + extraVinculum + emPad) / sizeMultiplier;\n    texHeight = (1.00 + extraVinculum) / sizeMultiplier;\n    span = sqrtSvg(\"sqrtMain\", spanHeight, viewBoxHeight, extraVinculum, options);\n    span.style.minWidth = \"0.853em\";\n    advanceWidth = 0.833 / sizeMultiplier; // from the font.\n  } else if (delim.type === \"large\") {\n    // These SVGs come from fonts: KaTeX_Size1, _Size2, etc.\n    viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size];\n    texHeight = (sizeToMaxHeight[delim.size] + extraVinculum) / sizeMultiplier;\n    spanHeight = (sizeToMaxHeight[delim.size] + extraVinculum + emPad) / sizeMultiplier;\n    span = sqrtSvg(\"sqrtSize\" + delim.size, spanHeight, viewBoxHeight, extraVinculum, options);\n    span.style.minWidth = \"1.02em\";\n    advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font.\n  } else {\n    // Tall sqrt. In TeX, this would be stacked using multiple glyphs.\n    // We'll use a single SVG to accomplish the same thing.\n    spanHeight = height + extraVinculum + emPad;\n    texHeight = height + extraVinculum;\n    viewBoxHeight = Math.floor(1000 * height + extraVinculum) + vbPad;\n    span = sqrtSvg(\"sqrtTall\", spanHeight, viewBoxHeight, extraVinculum, options);\n    span.style.minWidth = \"0.742em\";\n    advanceWidth = 1.056;\n  }\n  span.height = texHeight;\n  span.style.height = makeEm(spanHeight);\n  return {\n    span,\n    advanceWidth,\n    // Calculate the actual line width.\n    // This actually should depend on the chosen font -- e.g. \\boldmath\n    // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and\n    // have thicker rules.\n    ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraVinculum) * sizeMultiplier\n  };\n};\n// There are three kinds of delimiters, delimiters that stack when they become\n// too large\nvar stackLargeDelimiters = new Set([\"(\", \"\\\\lparen\", \")\", \"\\\\rparen\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\", \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\", \"\\\\lfloor\", \"\\\\rfloor\", \"\\u230a\", \"\\u230b\", \"\\\\lceil\", \"\\\\rceil\", \"\\u2308\", \"\\u2309\", \"\\\\surd\"]);\n// delimiters that always stack\nvar stackAlwaysDelimiters = new Set([\"\\\\uparrow\", \"\\\\downarrow\", \"\\\\updownarrow\", \"\\\\Uparrow\", \"\\\\Downarrow\", \"\\\\Updownarrow\", \"|\", \"\\\\|\", \"\\\\vert\", \"\\\\Vert\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\lgroup\", \"\\\\rgroup\", \"\\u27ee\", \"\\u27ef\", \"\\\\lmoustache\", \"\\\\rmoustache\", \"\\u23b0\", \"\\u23b1\"]);\n// and delimiters that never stack\nvar stackNeverDelimiters = new Set([\"<\", \">\", \"\\\\langle\", \"\\\\rangle\", \"/\", \"\\\\backslash\", \"\\\\lt\", \"\\\\gt\"]);\n// Metrics of the different sizes. Found by looking at TeX's output of\n// $\\bigl| // \\Bigl| \\biggl| \\Biggl| \\showlists$\n// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.\nvar sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];\n/**\n * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4.\n */\nvar makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) {\n  // < and > turn into \\langle and \\rangle in delimiters\n  if (delim === \"<\" || delim === \"\\\\lt\" || delim === \"\\u27e8\") {\n    delim = \"\\\\langle\";\n  } else if (delim === \">\" || delim === \"\\\\gt\" || delim === \"\\u27e9\") {\n    delim = \"\\\\rangle\";\n  }\n  // Sized delimiters are never centered.\n  if (stackLargeDelimiters.has(delim) || stackNeverDelimiters.has(delim)) {\n    return makeLargeDelim(delim, size, false, options, mode, classes);\n  } else if (stackAlwaysDelimiters.has(delim)) {\n    return makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes);\n  } else {\n    throw new ParseError(\"Illegal delimiter: '\" + delim + \"'\");\n  }\n};\n// Delimiters that never stack try small delimiters and large delimiters only\nvar stackNeverDelimiterSequence = [{\n  type: \"small\",\n  style: Style$1.SCRIPTSCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.SCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.TEXT\n}, {\n  type: \"large\",\n  size: 1\n}, {\n  type: \"large\",\n  size: 2\n}, {\n  type: \"large\",\n  size: 3\n}, {\n  type: \"large\",\n  size: 4\n}];\n// Delimiters that always stack try the small delimiters first, then stack\nvar stackAlwaysDelimiterSequence = [{\n  type: \"small\",\n  style: Style$1.SCRIPTSCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.SCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.TEXT\n}, {\n  type: \"stack\"\n}];\n// Delimiters that stack when large try the small and then large delimiters, and\n// stack afterwards\nvar stackLargeDelimiterSequence = [{\n  type: \"small\",\n  style: Style$1.SCRIPTSCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.SCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.TEXT\n}, {\n  type: \"large\",\n  size: 1\n}, {\n  type: \"large\",\n  size: 2\n}, {\n  type: \"large\",\n  size: 3\n}, {\n  type: \"large\",\n  size: 4\n}, {\n  type: \"stack\"\n}];\n/**\n * Get the font used in a delimiter based on what kind of delimiter it is.\n * TODO(#963) Use more specific font family return type once that is introduced.\n */\nvar delimTypeToFont = function delimTypeToFont(type) {\n  if (type.type === \"small\") {\n    return \"Main-Regular\";\n  } else if (type.type === \"large\") {\n    return \"Size\" + type.size + \"-Regular\";\n  } else if (type.type === \"stack\") {\n    return \"Size4-Regular\";\n  } else {\n    var delimKind = type.type;\n    throw new Error(\"Add support for delim type '\" + delimKind + \"' here.\");\n  }\n};\n/**\n * Traverse a sequence of types of delimiters to decide what kind of delimiter\n * should be used to create a delimiter of the given height+depth.\n */\nvar traverseSequence = function traverseSequence(delim, height, sequence, options) {\n  // Here, we choose the index we should start at in the sequences. In smaller\n  // sizes (which correspond to larger numbers in style.size) we start earlier\n  // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts\n  // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2\n  var start = Math.min(2, 3 - options.style.size);\n  for (var i = start; i < sequence.length; i++) {\n    var delimType = sequence[i];\n    if (delimType.type === \"stack\") {\n      // This is always the last delimiter, so we just break the loop now.\n      break;\n    }\n    var metrics = getMetrics(delim, delimTypeToFont(delimType), \"math\");\n    var heightDepth = metrics.height + metrics.depth;\n    // Small delimiters are scaled down versions of the same font, so we\n    // account for the style change size.\n    if (delimType.type === \"small\") {\n      var newOptions = options.havingBaseStyle(delimType.style);\n      heightDepth *= newOptions.sizeMultiplier;\n    }\n    // Check if the delimiter at this size works for the given height.\n    if (heightDepth > height) {\n      return delimType;\n    }\n  }\n  // If we reached the end of the sequence, return the last sequence element.\n  return sequence[sequence.length - 1];\n};\n/**\n * Make a delimiter of a given height+depth, with optional centering. Here, we\n * traverse the sequences, and create a delimiter that the sequence tells us to.\n */\nvar makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) {\n  if (delim === \"<\" || delim === \"\\\\lt\" || delim === \"\\u27e8\") {\n    delim = \"\\\\langle\";\n  } else if (delim === \">\" || delim === \"\\\\gt\" || delim === \"\\u27e9\") {\n    delim = \"\\\\rangle\";\n  }\n  // Decide what sequence to use\n  var sequence;\n  if (stackNeverDelimiters.has(delim)) {\n    sequence = stackNeverDelimiterSequence;\n  } else if (stackLargeDelimiters.has(delim)) {\n    sequence = stackLargeDelimiterSequence;\n  } else {\n    sequence = stackAlwaysDelimiterSequence;\n  }\n  // Look through the sequence\n  var delimType = traverseSequence(delim, height, sequence, options);\n  // Get the delimiter from font glyphs.\n  // Depending on the sequence element we decided on, call the\n  // appropriate function.\n  if (delimType.type === \"small\") {\n    return makeSmallDelim(delim, delimType.style, center, options, mode, classes);\n  } else if (delimType.type === \"large\") {\n    return makeLargeDelim(delim, delimType.size, center, options, mode, classes);\n  } else /* if (delimType.type === \"stack\") */{\n      return makeStackedDelim(delim, height, center, options, mode, classes);\n    }\n};\n/**\n * Make a delimiter for use with `\\left` and `\\right`, given a height and depth\n * of an expression that the delimiters surround.\n */\nvar makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) {\n  // We always center \\left/\\right delimiters, so the axis is always shifted\n  var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier;\n  // Taken from TeX source, tex.web, function make_left_right\n  var delimiterFactor = 901;\n  var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm;\n  var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight);\n  var totalHeight = Math.max(\n  // In real TeX, calculations are done using integral values which are\n  // 65536 per pt, or 655360 per em. So, the division here truncates in\n  // TeX but doesn't here, producing different results. If we wanted to\n  // exactly match TeX's calculation, we could do\n  //   Math.floor(655360 * maxDistFromAxis / 500) *\n  //    delimiterFactor / 655360\n  // (To see the difference, compare\n  //    x^{x^{\\left(\\rule{0.1em}{0.68em}\\right)}}\n  // in TeX and KaTeX)\n  maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend);\n  // Finally, we defer to `makeCustomSizedDelim` with our calculated total\n  // height\n  return makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes);\n};\n\n// Extra data needed for the delimiter handler down below\nvar delimiterSizes = {\n  \"\\\\bigl\": {\n    mclass: \"mopen\",\n    size: 1\n  },\n  \"\\\\Bigl\": {\n    mclass: \"mopen\",\n    size: 2\n  },\n  \"\\\\biggl\": {\n    mclass: \"mopen\",\n    size: 3\n  },\n  \"\\\\Biggl\": {\n    mclass: \"mopen\",\n    size: 4\n  },\n  \"\\\\bigr\": {\n    mclass: \"mclose\",\n    size: 1\n  },\n  \"\\\\Bigr\": {\n    mclass: \"mclose\",\n    size: 2\n  },\n  \"\\\\biggr\": {\n    mclass: \"mclose\",\n    size: 3\n  },\n  \"\\\\Biggr\": {\n    mclass: \"mclose\",\n    size: 4\n  },\n  \"\\\\bigm\": {\n    mclass: \"mrel\",\n    size: 1\n  },\n  \"\\\\Bigm\": {\n    mclass: \"mrel\",\n    size: 2\n  },\n  \"\\\\biggm\": {\n    mclass: \"mrel\",\n    size: 3\n  },\n  \"\\\\Biggm\": {\n    mclass: \"mrel\",\n    size: 4\n  },\n  \"\\\\big\": {\n    mclass: \"mord\",\n    size: 1\n  },\n  \"\\\\Big\": {\n    mclass: \"mord\",\n    size: 2\n  },\n  \"\\\\bigg\": {\n    mclass: \"mord\",\n    size: 3\n  },\n  \"\\\\Bigg\": {\n    mclass: \"mord\",\n    size: 4\n  }\n};\nvar delimiters = new Set([\"(\", \"\\\\lparen\", \")\", \"\\\\rparen\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\", \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\", \"\\\\lfloor\", \"\\\\rfloor\", \"\\u230a\", \"\\u230b\", \"\\\\lceil\", \"\\\\rceil\", \"\\u2308\", \"\\u2309\", \"<\", \">\", \"\\\\langle\", \"\\u27e8\", \"\\\\rangle\", \"\\u27e9\", \"\\\\lt\", \"\\\\gt\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\lgroup\", \"\\\\rgroup\", \"\\u27ee\", \"\\u27ef\", \"\\\\lmoustache\", \"\\\\rmoustache\", \"\\u23b0\", \"\\u23b1\", \"/\", \"\\\\backslash\", \"|\", \"\\\\vert\", \"\\\\|\", \"\\\\Vert\", \"\\\\uparrow\", \"\\\\Uparrow\", \"\\\\downarrow\", \"\\\\Downarrow\", \"\\\\updownarrow\", \"\\\\Updownarrow\", \".\"]);\nfunction isMiddleDelimNode(node) {\n  return 'isMiddle' in node;\n}\n// Delimiter functions\nfunction checkDelimiter(delim, context) {\n  var symDelim = checkSymbolNodeType(delim);\n  if (symDelim && delimiters.has(symDelim.text)) {\n    return symDelim;\n  } else if (symDelim) {\n    throw new ParseError(\"Invalid delimiter '\" + symDelim.text + \"' after '\" + context.funcName + \"'\", delim);\n  } else {\n    throw new ParseError(\"Invalid delimiter type '\" + delim.type + \"'\", delim);\n  }\n}\ndefineFunction({\n  type: \"delimsizing\",\n  names: [\"\\\\bigl\", \"\\\\Bigl\", \"\\\\biggl\", \"\\\\Biggl\", \"\\\\bigr\", \"\\\\Bigr\", \"\\\\biggr\", \"\\\\Biggr\", \"\\\\bigm\", \"\\\\Bigm\", \"\\\\biggm\", \"\\\\Biggm\", \"\\\\big\", \"\\\\Big\", \"\\\\bigg\", \"\\\\Bigg\"],\n  numArgs: 1,\n  argTypes: [\"primitive\"],\n  handler: (context, args) => {\n    var delim = checkDelimiter(args[0], context);\n    return {\n      type: \"delimsizing\",\n      mode: context.parser.mode,\n      size: delimiterSizes[context.funcName].size,\n      mclass: delimiterSizes[context.funcName].mclass,\n      delim: delim.text\n    };\n  },\n  htmlBuilder: (group, options) => {\n    if (group.delim === \".\") {\n      // Empty delimiters still count as elements, even though they don't\n      // show anything.\n      return makeSpan([group.mclass]);\n    }\n    return makeSizedDelim(group.delim, group.size, options, group.mode, [group.mclass]);\n  },\n  mathmlBuilder: group => {\n    var children = [];\n    if (group.delim !== \".\") {\n      children.push(makeText(group.delim, group.mode));\n    }\n    var node = new MathNode(\"mo\", children);\n    if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n      // Only some of the delimsizing functions act as fences, and they\n      // return \"mopen\" or \"mclose\" mclass.\n      node.setAttribute(\"fence\", \"true\");\n    } else {\n      // Explicitly disable fencing if it's not a fence, to override the\n      // defaults.\n      node.setAttribute(\"fence\", \"false\");\n    }\n    node.setAttribute(\"stretchy\", \"true\");\n    var size = makeEm(sizeToMaxHeight[group.size]);\n    node.setAttribute(\"minsize\", size);\n    node.setAttribute(\"maxsize\", size);\n    return node;\n  }\n});\nfunction assertParsed(group) {\n  if (!group.body) {\n    throw new Error(\"Bug: The leftright ParseNode wasn't fully parsed.\");\n  }\n}\ndefineFunction({\n  type: \"leftright-right\",\n  names: [\"\\\\right\"],\n  numArgs: 1,\n  primitive: true,\n  handler: (context, args) => {\n    // \\left case below triggers parsing of \\right in\n    //   `const right = parser.parseFunction();`\n    // uses this return value.\n    var color = context.parser.gullet.macros.get(\"\\\\current@color\");\n    if (color && typeof color !== \"string\") {\n      throw new ParseError(\"\\\\current@color set to non-string in \\\\right\");\n    }\n    return {\n      type: \"leftright-right\",\n      mode: context.parser.mode,\n      delim: checkDelimiter(args[0], context).text,\n      color // undefined if not set via \\color\n    };\n  }\n});\ndefineFunction({\n  type: \"leftright\",\n  names: [\"\\\\left\"],\n  numArgs: 1,\n  primitive: true,\n  handler: (context, args) => {\n    var delim = checkDelimiter(args[0], context);\n    var parser = context.parser;\n    // Parse out the implicit body\n    ++parser.leftrightDepth;\n    // parseExpression stops before '\\\\right'\n    var body = parser.parseExpression(false);\n    --parser.leftrightDepth;\n    // Check the next token\n    parser.expect(\"\\\\right\", false);\n    var right = assertNodeType(parser.parseFunction(), \"leftright-right\");\n    return {\n      type: \"leftright\",\n      mode: parser.mode,\n      body,\n      left: delim.text,\n      right: right.delim,\n      rightColor: right.color\n    };\n  },\n  htmlBuilder: (group, options) => {\n    assertParsed(group);\n    // Build the inner expression\n    var inner = buildExpression$1(group.body, options, true, [\"mopen\", \"mclose\"]);\n    var innerHeight = 0;\n    var innerDepth = 0;\n    var hadMiddle = false;\n    // Calculate its height and depth\n    for (var i = 0; i < inner.length; i++) {\n      var node = inner[i];\n      if (isMiddleDelimNode(node)) {\n        hadMiddle = true;\n      } else {\n        innerHeight = Math.max(inner[i].height, innerHeight);\n        innerDepth = Math.max(inner[i].depth, innerDepth);\n      }\n    }\n    // The size of delimiters is the same, regardless of what style we are\n    // in. Thus, to correctly calculate the size of delimiter we need around\n    // a group, we scale down the inner size based on the size.\n    innerHeight *= options.sizeMultiplier;\n    innerDepth *= options.sizeMultiplier;\n    var leftDelim;\n    if (group.left === \".\") {\n      // Empty delimiters in \\left and \\right make null delimiter spaces.\n      leftDelim = makeNullDelimiter(options, [\"mopen\"]);\n    } else {\n      // Otherwise, use leftRightDelim to generate the correct sized\n      // delimiter.\n      leftDelim = makeLeftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, [\"mopen\"]);\n    }\n    // Add it to the beginning of the expression\n    inner.unshift(leftDelim);\n    // Handle middle delimiters\n    if (hadMiddle) {\n      for (var _i = 1; _i < inner.length; _i++) {\n        var middleDelim = inner[_i];\n        if (isMiddleDelimNode(middleDelim)) {\n          var isMiddle = middleDelim.isMiddle;\n          // Apply the options that were active when \\middle was called\n          inner[_i] = makeLeftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []);\n        }\n      }\n    }\n    var rightDelim;\n    // Same for the right delimiter, but using color specified by \\color\n    if (group.right === \".\") {\n      rightDelim = makeNullDelimiter(options, [\"mclose\"]);\n    } else {\n      var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options;\n      rightDelim = makeLeftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, [\"mclose\"]);\n    }\n    // Add it to the end of the expression.\n    inner.push(rightDelim);\n    return makeSpan([\"minner\"], inner, options);\n  },\n  mathmlBuilder: (group, options) => {\n    assertParsed(group);\n    var inner = buildExpression(group.body, options);\n    if (group.left !== \".\") {\n      var leftNode = new MathNode(\"mo\", [makeText(group.left, group.mode)]);\n      leftNode.setAttribute(\"fence\", \"true\");\n      inner.unshift(leftNode);\n    }\n    if (group.right !== \".\") {\n      var rightNode = new MathNode(\"mo\", [makeText(group.right, group.mode)]);\n      rightNode.setAttribute(\"fence\", \"true\");\n      if (group.rightColor) {\n        rightNode.setAttribute(\"mathcolor\", group.rightColor);\n      }\n      inner.push(rightNode);\n    }\n    return makeRow(inner);\n  }\n});\ndefineFunction({\n  type: \"middle\",\n  names: [\"\\\\middle\"],\n  numArgs: 1,\n  primitive: true,\n  handler: (context, args) => {\n    var delim = checkDelimiter(args[0], context);\n    if (!context.parser.leftrightDepth) {\n      throw new ParseError(\"\\\\middle without preceding \\\\left\", delim);\n    }\n    return {\n      type: \"middle\",\n      mode: context.parser.mode,\n      delim: delim.text\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var middleDelim;\n    if (group.delim === \".\") {\n      middleDelim = makeNullDelimiter(options, []);\n    } else {\n      middleDelim = makeSizedDelim(group.delim, 1, options, group.mode, []);\n      // Patch an ad-hoc property onto the node so the \\left/\\right\n      // builder can reconstruct appropriately sized middle delimiters.\n      // isMiddle is not part of HtmlDomNode; the read side uses\n      // isMiddleDelimNode() to check before accessing.\n      middleDelim.isMiddle = {\n        delim: group.delim,\n        options\n      };\n    }\n    return middleDelim;\n  },\n  mathmlBuilder: (group, options) => {\n    // A Firefox \\middle will stretch a character vertically only if it\n    // is in the fence part of the operator dictionary at:\n    // https://www.w3.org/TR/MathML3/appendixc.html.\n    // So we need to avoid U+2223 and use plain \"|\" instead.\n    var textNode = group.delim === \"\\\\vert\" || group.delim === \"|\" ? makeText(\"|\", \"text\") : makeText(group.delim, group.mode);\n    var middleNode = new MathNode(\"mo\", [textNode]);\n    middleNode.setAttribute(\"fence\", \"true\");\n    // MathML gives 5/18em spacing to each <mo> element.\n    // \\middle should get delimiter spacing instead.\n    middleNode.setAttribute(\"lspace\", \"0.05em\");\n    middleNode.setAttribute(\"rspace\", \"0.05em\");\n    return middleNode;\n  }\n});\n\nvar htmlBuilder$7 = (group, options) => {\n  // \\cancel, \\bcancel, \\xcancel, \\sout, \\fbox, \\colorbox, \\fcolorbox, \\phase\n  // Some groups can return document fragments.  Handle those by wrapping\n  // them in a span.\n  var inner = wrapFragment(buildGroup$1(group.body, options), options);\n  var label = group.label.slice(1);\n  var scale = options.sizeMultiplier;\n  var img;\n  var imgShift;\n  // In the LaTeX cancel package, line geometry is slightly different\n  // depending on whether the subject is wider than it is tall, or vice versa.\n  // We don't know the width of a group, so as a proxy, we test if\n  // the subject is a single character. This captures most of the\n  // subjects that should get the \"tall\" treatment.\n  var isSingleChar = isCharacterBox(group.body);\n  if (label === \"sout\") {\n    img = makeSpan([\"stretchy\", \"sout\"]);\n    img.height = options.fontMetrics().defaultRuleThickness / scale;\n    imgShift = -0.5 * options.fontMetrics().xHeight;\n  } else if (label === \"phase\") {\n    // Set a couple of dimensions from the steinmetz package.\n    var lineWeight = calculateSize({\n      number: 0.6,\n      unit: \"pt\"\n    }, options);\n    var clearance = calculateSize({\n      number: 0.35,\n      unit: \"ex\"\n    }, options);\n    // Prevent size changes like \\Huge from affecting line thickness\n    var newOptions = options.havingBaseSizing();\n    scale = scale / newOptions.sizeMultiplier;\n    var angleHeight = inner.height + inner.depth + lineWeight + clearance;\n    // Reserve a left pad for the angle.\n    inner.style.paddingLeft = makeEm(angleHeight / 2 + lineWeight);\n    // Create an SVG\n    var viewBoxHeight = Math.floor(1000 * angleHeight * scale);\n    var path = phasePath(viewBoxHeight);\n    var svgNode = new SvgNode([new PathNode(\"phase\", path)], {\n      \"width\": \"400em\",\n      \"height\": makeEm(viewBoxHeight / 1000),\n      \"viewBox\": \"0 0 400000 \" + viewBoxHeight,\n      \"preserveAspectRatio\": \"xMinYMin slice\"\n    });\n    // Wrap it in a span with overflow: hidden.\n    img = makeSvgSpan([\"hide-tail\"], [svgNode], options);\n    img.style.height = makeEm(angleHeight);\n    imgShift = inner.depth + lineWeight + clearance;\n  } else {\n    // Add horizontal padding\n    if (/cancel/.test(label)) {\n      if (!isSingleChar) {\n        inner.classes.push(\"cancel-pad\");\n      }\n    } else if (label === \"angl\") {\n      inner.classes.push(\"anglpad\");\n    } else {\n      inner.classes.push(\"boxpad\");\n    }\n    // Add vertical padding\n    var topPad;\n    var bottomPad;\n    var ruleThickness = 0;\n    // ref: cancel package: \\advance\\totalheight2\\p@ % \"+2\"\n    if (/box/.test(label)) {\n      ruleThickness = Math.max(options.fontMetrics().fboxrule,\n      // default\n      options.minRuleThickness);\n      topPad = options.fontMetrics().fboxsep + (label === \"colorbox\" ? 0 : ruleThickness);\n      bottomPad = topPad;\n    } else if (label === \"angl\") {\n      ruleThickness = Math.max(options.fontMetrics().defaultRuleThickness, options.minRuleThickness);\n      topPad = 4 * ruleThickness; // gap = 3 × line, plus the line itself.\n      bottomPad = Math.max(0, 0.25 - inner.depth);\n    } else {\n      topPad = isSingleChar ? 0.2 : 0;\n      bottomPad = topPad;\n    }\n    img = stretchyEnclose(inner, label, topPad, bottomPad, options);\n    if (/fbox|boxed|fcolorbox/.test(label)) {\n      img.style.borderStyle = \"solid\";\n      img.style.borderWidth = makeEm(ruleThickness);\n    } else if (label === \"angl\" && ruleThickness !== 0.049) {\n      img.style.borderTopWidth = makeEm(ruleThickness);\n      img.style.borderRightWidth = makeEm(ruleThickness);\n    }\n    imgShift = inner.depth + bottomPad;\n    if (group.backgroundColor) {\n      img.style.backgroundColor = group.backgroundColor;\n      if (group.borderColor) {\n        img.style.borderColor = group.borderColor;\n      }\n    }\n  }\n  var vlist;\n  if (group.backgroundColor) {\n    vlist = makeVList({\n      positionType: \"individualShift\",\n      children: [\n      // Put the color background behind inner;\n      {\n        type: \"elem\",\n        elem: img,\n        shift: imgShift\n      }, {\n        type: \"elem\",\n        elem: inner,\n        shift: 0\n      }]\n    });\n  } else {\n    var classes = /cancel|phase/.test(label) ? [\"svg-align\"] : [];\n    vlist = makeVList({\n      positionType: \"individualShift\",\n      children: [\n      // Write the \\cancel stroke on top of inner.\n      {\n        type: \"elem\",\n        elem: inner,\n        shift: 0\n      }, {\n        type: \"elem\",\n        elem: img,\n        shift: imgShift,\n        wrapperClasses: classes\n      }]\n    });\n  }\n  if (/cancel/.test(label)) {\n    // The cancel package documentation says that cancel lines add their height\n    // to the expression, but tests show that isn't how it actually works.\n    vlist.height = inner.height;\n    vlist.depth = inner.depth;\n  }\n  if (/cancel/.test(label) && !isSingleChar) {\n    // cancel does not create horiz space for its line extension.\n    return makeSpan([\"mord\", \"cancel-lap\"], [vlist], options);\n  } else {\n    return makeSpan([\"mord\"], [vlist], options);\n  }\n};\nvar mathmlBuilder$6 = (group, options) => {\n  var fboxsep;\n  var node = new MathNode(group.label.includes(\"colorbox\") ? \"mpadded\" : \"menclose\", [buildGroup(group.body, options)]);\n  switch (group.label) {\n    case \"\\\\cancel\":\n      node.setAttribute(\"notation\", \"updiagonalstrike\");\n      break;\n    case \"\\\\bcancel\":\n      node.setAttribute(\"notation\", \"downdiagonalstrike\");\n      break;\n    case \"\\\\phase\":\n      node.setAttribute(\"notation\", \"phasorangle\");\n      break;\n    case \"\\\\sout\":\n      node.setAttribute(\"notation\", \"horizontalstrike\");\n      break;\n    case \"\\\\fbox\":\n      node.setAttribute(\"notation\", \"box\");\n      break;\n    case \"\\\\angl\":\n      node.setAttribute(\"notation\", \"actuarial\");\n      break;\n    case \"\\\\fcolorbox\":\n    case \"\\\\colorbox\":\n      // <menclose> doesn't have a good notation option. So use <mpadded>\n      // instead. Set some attributes that come included with <menclose>.\n      fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm;\n      node.setAttribute(\"width\", \"+\" + 2 * fboxsep + \"pt\");\n      node.setAttribute(\"height\", \"+\" + 2 * fboxsep + \"pt\");\n      node.setAttribute(\"lspace\", fboxsep + \"pt\"); //\n      node.setAttribute(\"voffset\", fboxsep + \"pt\");\n      if (group.label === \"\\\\fcolorbox\") {\n        var thk = Math.max(options.fontMetrics().fboxrule,\n        // default\n        options.minRuleThickness);\n        node.setAttribute(\"style\", \"border: \" + makeEm(thk) + \" solid \" + group.borderColor);\n      }\n      break;\n    case \"\\\\xcancel\":\n      node.setAttribute(\"notation\", \"updiagonalstrike downdiagonalstrike\");\n      break;\n  }\n  if (group.backgroundColor) {\n    node.setAttribute(\"mathbackground\", group.backgroundColor);\n  }\n  return node;\n};\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\colorbox\"],\n  numArgs: 2,\n  allowedInText: true,\n  argTypes: [\"color\", \"hbox\"],\n  handler(_ref, args, optArgs) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var color = assertNodeType(args[0], \"color-token\").color;\n    var body = args[1];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      backgroundColor: color,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$7,\n  mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\fcolorbox\"],\n  numArgs: 3,\n  allowedInText: true,\n  argTypes: [\"color\", \"color\", \"hbox\"],\n  handler(_ref2, args, optArgs) {\n    var {\n      parser,\n      funcName\n    } = _ref2;\n    var borderColor = assertNodeType(args[0], \"color-token\").color;\n    var backgroundColor = assertNodeType(args[1], \"color-token\").color;\n    var body = args[2];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      backgroundColor,\n      borderColor,\n      body\n    };\n  }\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\fbox\"],\n  numArgs: 1,\n  argTypes: [\"hbox\"],\n  allowedInText: true,\n  handler(_ref3, args) {\n    var {\n      parser\n    } = _ref3;\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: \"\\\\fbox\",\n      body: args[0]\n    };\n  }\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\cancel\", \"\\\\bcancel\", \"\\\\xcancel\", \"\\\\phase\"],\n  numArgs: 1,\n  handler(_ref4, args) {\n    var {\n      parser,\n      funcName\n    } = _ref4;\n    var body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  }\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\sout\"],\n  numArgs: 1,\n  allowedInText: true,\n  handler(_ref5, args) {\n    var {\n      parser,\n      funcName\n    } = _ref5;\n    if (parser.mode === \"math\") {\n      parser.settings.reportNonstrict(\"mathVsSout\", \"LaTeX's \\\\sout works only in text mode\");\n    }\n    var body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  }\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\angl\"],\n  numArgs: 1,\n  argTypes: [\"hbox\"],\n  allowedInText: false,\n  handler(_ref6, args) {\n    var {\n      parser\n    } = _ref6;\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: \"\\\\angl\",\n      body: args[0]\n    };\n  }\n});\n\n/**\n * All registered environments.\n * `environments.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `environments.js`.\n */\nvar _environments = {};\nfunction defineEnvironment(_ref) {\n  var {\n    type,\n    names,\n    props,\n    handler,\n    htmlBuilder,\n    mathmlBuilder\n  } = _ref;\n  // Set default values of environments.\n  var data = {\n    type,\n    numArgs: props.numArgs || 0,\n    allowedInText: false,\n    numOptionalArgs: 0,\n    handler\n  };\n  for (var i = 0; i < names.length; ++i) {\n    // TODO: The value type of _environments should be a type union of all\n    // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is\n    // an existential type.\n    _environments[names[i]] = data;\n  }\n  if (htmlBuilder) {\n    _htmlGroupBuilders[type] = htmlBuilder;\n  }\n  if (mathmlBuilder) {\n    _mathmlGroupBuilders[type] = mathmlBuilder;\n  }\n}\n\n/**\n * All registered global/built-in macros.\n * `macros.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `macros.js`.\n */\nvar _macros = {};\n// This function might one day accept an additional argument and do more things.\nfunction defineMacro(name, body) {\n  _macros[name] = body;\n}\n\n/**\n * Lexing or parsing positional information for error reporting.\n * This object is immutable.\n */\nclass SourceLocation {\n  // End offset, zero-based exclusive.\n  constructor(lexer, start, end) {\n    // The + prefix indicates that these fields aren't writeable\n    this.lexer = void 0;\n    // Lexer holding the input string.\n    this.start = void 0;\n    // Start offset, zero-based inclusive.\n    this.end = void 0;\n    this.lexer = lexer;\n    this.start = start;\n    this.end = end;\n  }\n  /**\n   * Merges two `SourceLocation`s from location providers, given they are\n   * provided in order of appearance.\n   * - Returns the first one's location if only the first is provided.\n   * - Returns a merged range of the first and the last if both are provided\n   *   and their lexers match.\n   * - Otherwise, returns null.\n   */\n  static range(first, second) {\n    if (!second) {\n      return first && first.loc;\n    } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {\n      return null;\n    } else {\n      return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);\n    }\n  }\n}\n\n/**\n * The resulting token returned from `lex`.\n *\n * It consists of the token text plus some position information.\n * The position information is essentially a range in an input string,\n * but instead of referencing the bare input string, we refer to the lexer.\n * That way it is possible to attach extra metadata to the input string,\n * like for example a file name or similar.\n *\n * The position information is optional, so it is OK to construct synthetic\n * tokens if appropriate. Not providing available position information may\n * lead to degraded error reporting, though.\n */\nclass Token {\n  // used in \\noexpand\n  constructor(text,\n  // the text of this token\n  loc) {\n    this.text = void 0;\n    this.loc = void 0;\n    this.noexpand = void 0;\n    // don't expand the token\n    this.treatAsRelax = void 0;\n    this.text = text;\n    this.loc = loc;\n  }\n  /**\n   * Given a pair of tokens (this and endToken), compute a `Token` encompassing\n   * the whole input range enclosed by these two.\n   */\n  range(endToken,\n  // last token of the range, inclusive\n  text) {\n    return new Token(text, SourceLocation.range(this, endToken));\n  }\n}\n\n// Helper functions\nfunction getHLines(parser) {\n  // Return an array. The array length = number of hlines.\n  // Each element in the array tells if the line is dashed.\n  var hlineInfo = [];\n  parser.consumeSpaces();\n  var nxt = parser.fetch().text;\n  if (nxt === \"\\\\relax\") {\n    // \\relax is an artifact of the \\cr macro below\n    parser.consume();\n    parser.consumeSpaces();\n    nxt = parser.fetch().text;\n  }\n  while (nxt === \"\\\\hline\" || nxt === \"\\\\hdashline\") {\n    parser.consume();\n    hlineInfo.push(nxt === \"\\\\hdashline\");\n    parser.consumeSpaces();\n    nxt = parser.fetch().text;\n  }\n  return hlineInfo;\n}\nvar validateAmsEnvironmentContext = context => {\n  var settings = context.parser.settings;\n  if (!settings.displayMode) {\n    throw new ParseError(\"{\" + context.envName + \"} can be used only in\" + \" display mode.\");\n  }\n};\nvar gatherEnvironments = new Set([\"gather\", \"gather*\"]);\n// autoTag (an argument to parseArray) can be one of three values:\n// * undefined: Regular (not-top-level) array; no tags on each row\n// * true: Automatic equation numbering, overridable by \\tag\n// * false: Tags allowed on each row, but no automatic numbering\n// This function *doesn't* work with the \"split\" environment name.\nfunction getAutoTag(name) {\n  if (!name.includes(\"ed\")) {\n    return !name.includes(\"*\");\n  }\n  // return undefined;\n}\n/**\n * Parse the body of the environment, with rows delimited by \\\\ and\n * columns delimited by &, and create a nested list in row-major order\n * with one group per cell.  If given an optional argument style\n * (\"text\", \"display\", etc.), then each cell is cast into that style.\n */\nfunction parseArray(parser, _ref, style) {\n  var {\n    hskipBeforeAndAfter,\n    addJot,\n    cols,\n    arraystretch,\n    colSeparationType,\n    autoTag,\n    singleRow,\n    emptySingleRow,\n    maxNumCols,\n    leqno\n  } = _ref;\n  parser.gullet.beginGroup();\n  if (!singleRow) {\n    // \\cr is equivalent to \\\\ without the optional size argument (see below)\n    // TODO: provide helpful error when \\cr is used outside array environment\n    parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n  }\n  // Get current arraystretch if it's not set by the environment\n  if (!arraystretch) {\n    var stretch = parser.gullet.expandMacroAsText(\"\\\\arraystretch\");\n    if (stretch == null) {\n      // Default \\arraystretch from lttab.dtx\n      arraystretch = 1;\n    } else {\n      arraystretch = parseFloat(stretch);\n      if (!arraystretch || arraystretch < 0) {\n        throw new ParseError(\"Invalid \\\\arraystretch: \" + stretch);\n      }\n    }\n  }\n  // Start group for first cell\n  parser.gullet.beginGroup();\n  var row = [];\n  var body = [row];\n  var rowGaps = [];\n  var hLinesBeforeRow = [];\n  var tags = autoTag != null ? [] : undefined;\n  // amsmath uses \\global\\@eqnswtrue and \\global\\@eqnswfalse to represent\n  // whether this row should have an equation number.  Simulate this with\n  // a \\@eqnsw macro set to 1 or 0.\n  function beginRow() {\n    if (autoTag) {\n      parser.gullet.macros.set(\"\\\\@eqnsw\", \"1\", true);\n    }\n  }\n  function endRow() {\n    if (tags) {\n      if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n        tags.push(parser.subparse([new Token(\"\\\\df@tag\")]));\n        parser.gullet.macros.set(\"\\\\df@tag\", undefined, true);\n      } else {\n        tags.push(Boolean(autoTag) && parser.gullet.macros.get(\"\\\\@eqnsw\") === \"1\");\n      }\n    }\n  }\n  beginRow();\n  // Test for \\hline at the top of the array.\n  hLinesBeforeRow.push(getHLines(parser));\n  while (true) {\n    // Parse each cell in its own group (namespace)\n    var cellBody = parser.parseExpression(false, singleRow ? \"\\\\end\" : \"\\\\\\\\\");\n    parser.gullet.endGroup();\n    parser.gullet.beginGroup();\n    var cell = {\n      type: \"ordgroup\",\n      mode: parser.mode,\n      body: cellBody\n    };\n    if (style) {\n      cell = {\n        type: \"styling\",\n        mode: parser.mode,\n        style,\n        resetFont: true,\n        body: [cell]\n      };\n    }\n    row.push(cell);\n    var next = parser.fetch().text;\n    if (next === \"&\") {\n      if (maxNumCols && row.length === maxNumCols) {\n        if (singleRow || colSeparationType) {\n          // {equation} or {split}\n          throw new ParseError(\"Too many tab characters: &\", parser.nextToken);\n        } else {\n          // {array} environment\n          parser.settings.reportNonstrict(\"textEnv\", \"Too few columns \" + \"specified in the {array} column argument.\");\n        }\n      }\n      parser.consume();\n    } else if (next === \"\\\\end\") {\n      endRow();\n      // Arrays terminate newlines with `\\crcr` which consumes a `\\cr` if\n      // the last line is empty.  However, AMS environments keep the\n      // empty row if it's the only one.\n      // NOTE: Currently, `cell` is the last item added into `row`.\n      if (row.length === 1 && cell.type === \"styling\" && cell.body.length === 1 && cell.body[0].type === \"ordgroup\" && cell.body[0].body.length === 0 && (body.length > 1 || !emptySingleRow)) {\n        body.pop();\n      }\n      if (hLinesBeforeRow.length < body.length + 1) {\n        hLinesBeforeRow.push([]);\n      }\n      break;\n    } else if (next === \"\\\\\\\\\") {\n      parser.consume();\n      var size = void 0;\n      // \\def\\Let@{\\let\\\\\\math@cr}\n      // \\def\\math@cr{...\\math@cr@}\n      // \\def\\math@cr@{\\new@ifnextchar[\\math@cr@@{\\math@cr@@[\\z@]}}\n      // \\def\\math@cr@@[#1]{...\\math@cr@@@...}\n      // \\def\\math@cr@@@{\\cr}\n      if (parser.gullet.future().text !== \" \") {\n        size = parser.parseSizeGroup(true);\n      }\n      rowGaps.push(size ? size.value : null);\n      endRow();\n      // check for \\hline(s) following the row separator\n      hLinesBeforeRow.push(getHLines(parser));\n      row = [];\n      body.push(row);\n      beginRow();\n    } else {\n      throw new ParseError(\"Expected & or \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n    }\n  }\n  // End cell group\n  parser.gullet.endGroup();\n  // End array group defining \\cr\n  parser.gullet.endGroup();\n  return {\n    type: \"array\",\n    mode: parser.mode,\n    addJot,\n    arraystretch,\n    body,\n    cols,\n    rowGaps,\n    hskipBeforeAndAfter,\n    hLinesBeforeRow,\n    colSeparationType,\n    tags,\n    leqno\n  };\n}\n// Decides on a style for cells in an array according to whether the given\n// environment name starts with the letter 'd'.\nfunction dCellStyle(envName) {\n  if (envName.slice(0, 1) === \"d\") {\n    return \"display\";\n  } else {\n    return \"text\";\n  }\n}\nvar htmlBuilder$6 = function htmlBuilder(group, options) {\n  var r;\n  var c;\n  var nr = group.body.length;\n  var hLinesBeforeRow = group.hLinesBeforeRow;\n  var nc = 0;\n  var body = new Array(nr);\n  var hlines = [];\n  var ruleThickness = Math.max(\n  // From LaTeX \\showthe\\arrayrulewidth. Equals 0.04 em.\n  options.fontMetrics().arrayRuleWidth, options.minRuleThickness);\n  // Horizontal spacing\n  var pt = 1 / options.fontMetrics().ptPerEm;\n  var arraycolsep = 5 * pt; // default value, i.e. \\arraycolsep in article.cls\n  if (group.colSeparationType && group.colSeparationType === \"small\") {\n    // We're in a {smallmatrix}. Default column space is \\thickspace,\n    // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}.\n    // But that needs adjustment because LaTeX applies \\scriptstyle to the\n    // entire array, including the colspace, but this function applies\n    // \\scriptstyle only inside each element.\n    var localMultiplier = options.havingStyle(Style$1.SCRIPT).sizeMultiplier;\n    arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier);\n  }\n  // Vertical spacing\n  var baselineskip = group.colSeparationType === \"CD\" ? calculateSize({\n    number: 3,\n    unit: \"ex\"\n  }, options) : 12 * pt; // see size10.clo\n  // Default \\jot from ltmath.dtx\n  // TODO(edemaine): allow overriding \\jot via \\setlength (#687)\n  var jot = 3 * pt;\n  var arrayskip = group.arraystretch * baselineskip;\n  var arstrutHeight = 0.7 * arrayskip; // \\strutbox in ltfsstrc.dtx and\n  var arstrutDepth = 0.3 * arrayskip; // \\@arstrutbox in lttab.dtx\n  var totalHeight = 0;\n  // Set a position for \\hline(s) at the top of the array, if any.\n  function setHLinePos(hlinesInGap) {\n    for (var i = 0; i < hlinesInGap.length; ++i) {\n      if (i > 0) {\n        totalHeight += 0.25;\n      }\n      hlines.push({\n        pos: totalHeight,\n        isDashed: hlinesInGap[i]\n      });\n    }\n  }\n  setHLinePos(hLinesBeforeRow[0]);\n  for (r = 0; r < group.body.length; ++r) {\n    var inrow = group.body[r];\n    var height = arstrutHeight; // \\@array adds an \\@arstrut\n    var depth = arstrutDepth; // to each tow (via the template)\n    if (nc < inrow.length) {\n      nc = inrow.length;\n    }\n    var outrow = {\n      cells: new Array(inrow.length),\n      height: 0,\n      depth: 0,\n      pos: 0\n    };\n    for (c = 0; c < inrow.length; ++c) {\n      var elt = buildGroup$1(inrow[c], options);\n      if (depth < elt.depth) {\n        depth = elt.depth;\n      }\n      if (height < elt.height) {\n        height = elt.height;\n      }\n      outrow.cells[c] = elt;\n    }\n    var rowGap = group.rowGaps[r];\n    var gap = 0;\n    if (rowGap) {\n      gap = calculateSize(rowGap, options);\n      if (gap > 0) {\n        // \\@argarraycr\n        gap += arstrutDepth;\n        if (depth < gap) {\n          depth = gap; // \\@xargarraycr\n        }\n        gap = 0;\n      }\n    }\n    // In AMS multiline environments such as aligned and gathered, rows\n    // correspond to lines that have additional \\jot added between lines\n    // via \\openup.\n    // We simulate this by adding \\jot depth to each row except the last.\n    if (group.addJot && r < group.body.length - 1) {\n      depth += jot;\n    }\n    outrow.height = height;\n    outrow.depth = depth;\n    totalHeight += height;\n    outrow.pos = totalHeight;\n    totalHeight += depth + gap; // \\@yargarraycr\n    body[r] = outrow;\n    // Set a position for \\hline(s), if any.\n    setHLinePos(hLinesBeforeRow[r + 1]);\n  }\n  var offset = totalHeight / 2 + options.fontMetrics().axisHeight;\n  var colDescriptions = group.cols || [];\n  var cols = [];\n  var colSep;\n  var colDescrNum;\n  var tagSpans = [];\n  if (group.tags && group.tags.some(tag => tag)) {\n    // An environment with manual tags and/or automatic equation numbers.\n    // Create node(s), the latter of which trigger CSS counter increment.\n    for (r = 0; r < nr; ++r) {\n      var rw = body[r];\n      var shift = rw.pos - offset;\n      var tag = group.tags[r];\n      var tagSpan = void 0;\n      if (tag === true) {\n        // automatic numbering\n        tagSpan = makeSpan([\"eqn-num\"], [], options);\n      } else if (tag === false) {\n        // \\nonumber/\\notag or starred environment\n        tagSpan = makeSpan([], [], options);\n      } else {\n        // manual \\tag\n        tagSpan = makeSpan([], buildExpression$1(tag, options, true), options);\n      }\n      tagSpan.depth = rw.depth;\n      tagSpan.height = rw.height;\n      tagSpans.push({\n        type: \"elem\",\n        elem: tagSpan,\n        shift\n      });\n    }\n  }\n  for (c = 0, colDescrNum = 0;\n  // Continue while either there are more columns or more column\n  // descriptions, so trailing separators don't get lost.\n  c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) {\n    var _colDescr3;\n    var colDescr = colDescriptions[colDescrNum];\n    var firstSeparator = true;\n    while (((_colDescr = colDescr) == null ? void 0 : _colDescr.type) === \"separator\") {\n      var _colDescr;\n      // If there is more than one separator in a row, add a space\n      // between them.\n      if (!firstSeparator) {\n        colSep = makeSpan([\"arraycolsep\"], []);\n        colSep.style.width = makeEm(options.fontMetrics().doubleRuleSep);\n        cols.push(colSep);\n      }\n      if (colDescr.separator === \"|\" || colDescr.separator === \":\") {\n        var lineType = colDescr.separator === \"|\" ? \"solid\" : \"dashed\";\n        var separator = makeSpan([\"vertical-separator\"], [], options);\n        separator.style.height = makeEm(totalHeight);\n        separator.style.borderRightWidth = makeEm(ruleThickness);\n        separator.style.borderRightStyle = lineType;\n        separator.style.margin = \"0 \" + makeEm(-ruleThickness / 2);\n        var _shift = totalHeight - offset;\n        if (_shift) {\n          separator.style.verticalAlign = makeEm(-_shift);\n        }\n        cols.push(separator);\n      } else {\n        throw new ParseError(\"Invalid separator type: \" + colDescr.separator);\n      }\n      colDescrNum++;\n      colDescr = colDescriptions[colDescrNum];\n      firstSeparator = false;\n    }\n    if (c >= nc) {\n      continue;\n    }\n    var sepwidth = void 0;\n    if (c > 0 || group.hskipBeforeAndAfter) {\n      var _colDescr$pregap, _colDescr2;\n      sepwidth = (_colDescr$pregap = (_colDescr2 = colDescr) == null ? void 0 : _colDescr2.pregap) != null ? _colDescr$pregap : arraycolsep;\n      if (sepwidth !== 0) {\n        colSep = makeSpan([\"arraycolsep\"], []);\n        colSep.style.width = makeEm(sepwidth);\n        cols.push(colSep);\n      }\n    }\n    var colElems = [];\n    for (r = 0; r < nr; ++r) {\n      var row = body[r];\n      var elem = row.cells[c];\n      if (!elem) {\n        continue;\n      }\n      var _shift2 = row.pos - offset;\n      elem.depth = row.depth;\n      elem.height = row.height;\n      colElems.push({\n        type: \"elem\",\n        elem: elem,\n        shift: _shift2\n      });\n    }\n    var colVList = makeVList({\n      positionType: \"individualShift\",\n      children: colElems\n    });\n    var colSpan = makeSpan([\"col-align-\" + (((_colDescr3 = colDescr) == null ? void 0 : _colDescr3.align) || \"c\")], [colVList]);\n    cols.push(colSpan);\n    if (c < nc - 1 || group.hskipBeforeAndAfter) {\n      var _colDescr$postgap, _colDescr4;\n      sepwidth = (_colDescr$postgap = (_colDescr4 = colDescr) == null ? void 0 : _colDescr4.postgap) != null ? _colDescr$postgap : arraycolsep;\n      if (sepwidth !== 0) {\n        colSep = makeSpan([\"arraycolsep\"], []);\n        colSep.style.width = makeEm(sepwidth);\n        cols.push(colSep);\n      }\n    }\n  }\n  var tableBody = makeSpan([\"mtable\"], cols);\n  // Add \\hline(s), if any.\n  if (hlines.length > 0) {\n    var line = makeLineSpan(\"hline\", options, ruleThickness);\n    var dashes = makeLineSpan(\"hdashline\", options, ruleThickness);\n    var vListElems = [{\n      type: \"elem\",\n      elem: tableBody,\n      shift: 0\n    }];\n    while (hlines.length > 0) {\n      var hline = hlines.pop();\n      var lineShift = hline.pos - offset;\n      if (hline.isDashed) {\n        vListElems.push({\n          type: \"elem\",\n          elem: dashes,\n          shift: lineShift\n        });\n      } else {\n        vListElems.push({\n          type: \"elem\",\n          elem: line,\n          shift: lineShift\n        });\n      }\n    }\n    tableBody = makeVList({\n      positionType: \"individualShift\",\n      children: vListElems\n    });\n  }\n  if (tagSpans.length === 0) {\n    return makeSpan([\"mord\"], [tableBody], options);\n  } else {\n    var eqnNumCol = makeVList({\n      positionType: \"individualShift\",\n      children: tagSpans\n    });\n    var tagCol = makeSpan([\"tag\"], [eqnNumCol], options);\n    return makeFragment([tableBody, tagCol]);\n  }\n};\nvar alignMap = {\n  c: \"center \",\n  l: \"left \",\n  r: \"right \"\n};\nvar mathmlBuilder$5 = function mathmlBuilder(group, options) {\n  var tbl = [];\n  var glue = new MathNode(\"mtd\", [], [\"mtr-glue\"]);\n  var tag = new MathNode(\"mtd\", [], [\"mml-eqn-num\"]);\n  for (var i = 0; i < group.body.length; i++) {\n    var rw = group.body[i];\n    var row = [];\n    for (var j = 0; j < rw.length; j++) {\n      row.push(new MathNode(\"mtd\", [buildGroup(rw[j], options)]));\n    }\n    if (group.tags && group.tags[i]) {\n      row.unshift(glue);\n      row.push(glue);\n      if (group.leqno) {\n        row.unshift(tag);\n      } else {\n        row.push(tag);\n      }\n    }\n    tbl.push(new MathNode(\"mtr\", row));\n  }\n  var table = new MathNode(\"mtable\", tbl);\n  // Set column alignment, row spacing, column spacing, and\n  // array lines by setting attributes on the table element.\n  // Set the row spacing. In MathML, we specify a gap distance.\n  // We do not use rowGap[] because MathML automatically increases\n  // cell height with the height/depth of the element content.\n  // LaTeX \\arraystretch multiplies the row baseline-to-baseline distance.\n  // We simulate this by adding (arraystretch - 1)em to the gap. This\n  // does a reasonable job of adjusting arrays containing 1 em tall content.\n  // The 0.16 and 0.09 values are found empirically. They produce an array\n  // similar to LaTeX and in which content does not interfere with \\hlines.\n  var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray}\n  : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0);\n  table.setAttribute(\"rowspacing\", makeEm(gap));\n  // MathML table lines go only between cells.\n  // To place a line on an edge we'll use <menclose>, if necessary.\n  var menclose = \"\";\n  var align = \"\";\n  if (group.cols && group.cols.length > 0) {\n    // Find column alignment, column spacing, and  vertical lines.\n    var cols = group.cols;\n    var columnLines = \"\";\n    var prevTypeWasAlign = false;\n    var iStart = 0;\n    var iEnd = cols.length;\n    if (cols[0].type === \"separator\") {\n      menclose += \"top \";\n      iStart = 1;\n    }\n    if (cols[cols.length - 1].type === \"separator\") {\n      menclose += \"bottom \";\n      iEnd -= 1;\n    }\n    for (var _i = iStart; _i < iEnd; _i++) {\n      var col = cols[_i];\n      if (col.type === \"align\") {\n        align += alignMap[col.align];\n        if (prevTypeWasAlign) {\n          columnLines += \"none \";\n        }\n        prevTypeWasAlign = true;\n      } else if (col.type === \"separator\") {\n        // MathML accepts only single lines between cells.\n        // So we read only the first of consecutive separators.\n        if (prevTypeWasAlign) {\n          columnLines += col.separator === \"|\" ? \"solid \" : \"dashed \";\n          prevTypeWasAlign = false;\n        }\n      }\n    }\n    table.setAttribute(\"columnalign\", align.trim());\n    if (/[sd]/.test(columnLines)) {\n      table.setAttribute(\"columnlines\", columnLines.trim());\n    }\n  }\n  // Set column spacing.\n  if (group.colSeparationType === \"align\") {\n    var _cols = group.cols || [];\n    var spacing = \"\";\n    for (var _i2 = 1; _i2 < _cols.length; _i2++) {\n      spacing += _i2 % 2 ? \"0em \" : \"1em \";\n    }\n    table.setAttribute(\"columnspacing\", spacing.trim());\n  } else if (group.colSeparationType === \"alignat\" || group.colSeparationType === \"gather\") {\n    table.setAttribute(\"columnspacing\", \"0em\");\n  } else if (group.colSeparationType === \"small\") {\n    table.setAttribute(\"columnspacing\", \"0.2778em\");\n  } else if (group.colSeparationType === \"CD\") {\n    table.setAttribute(\"columnspacing\", \"0.5em\");\n  } else {\n    table.setAttribute(\"columnspacing\", \"1em\");\n  }\n  // Address \\hline and \\hdashline\n  var rowLines = \"\";\n  var hlines = group.hLinesBeforeRow;\n  menclose += hlines[0].length > 0 ? \"left \" : \"\";\n  menclose += hlines[hlines.length - 1].length > 0 ? \"right \" : \"\";\n  for (var _i3 = 1; _i3 < hlines.length - 1; _i3++) {\n    rowLines += hlines[_i3].length === 0 ? \"none \"\n    // MathML accepts only a single line between rows. Read one element.\n    : hlines[_i3][0] ? \"dashed \" : \"solid \";\n  }\n  if (/[sd]/.test(rowLines)) {\n    table.setAttribute(\"rowlines\", rowLines.trim());\n  }\n  if (menclose !== \"\") {\n    table = new MathNode(\"menclose\", [table]);\n    table.setAttribute(\"notation\", menclose.trim());\n  }\n  if (group.arraystretch && group.arraystretch < 1) {\n    // A small array. Wrap in scriptstyle so row gap is not too large.\n    table = new MathNode(\"mstyle\", [table]);\n    table.setAttribute(\"scriptlevel\", \"1\");\n  }\n  return table;\n};\n// Convenience function for align, align*, aligned, alignat, alignat*, alignedat.\nvar alignedHandler = function alignedHandler(context, args) {\n  if (!context.envName.includes(\"ed\")) {\n    validateAmsEnvironmentContext(context);\n  }\n  var cols = [];\n  var isSplit = context.envName === \"split\";\n  var res = parseArray(context.parser, {\n    cols,\n    addJot: true,\n    autoTag: isSplit ? undefined : getAutoTag(context.envName),\n    emptySingleRow: true,\n    colSeparationType: context.envName.includes(\"at\") ? \"alignat\" : \"align\",\n    maxNumCols: isSplit ? 2 : undefined,\n    leqno: context.parser.settings.leqno\n  }, \"display\");\n  // Determining number of columns.\n  // 1. If the first argument is given, we use it as a number of columns,\n  //    and makes sure that each row doesn't exceed that number.\n  // 2. Otherwise, just count number of columns = maximum number\n  //    of cells in each row (\"aligned\" mode -- isAligned will be true).\n  //\n  // At the same time, prepend empty group {} at beginning of every second\n  // cell in each row (starting with second cell) so that operators become\n  // binary.  This behavior is implemented in amsmath's \\start@aligned.\n  var numMaths = 0;\n  var numCols = 0;\n  var emptyGroup = {\n    type: \"ordgroup\",\n    mode: context.mode,\n    body: []\n  };\n  if (args[0] && args[0].type === \"ordgroup\") {\n    var arg0 = \"\";\n    for (var i = 0; i < args[0].body.length; i++) {\n      var textord = assertNodeType(args[0].body[i], \"textord\");\n      arg0 += textord.text;\n    }\n    numMaths = Number(arg0);\n    numCols = numMaths * 2;\n  }\n  var isAligned = !numCols;\n  res.body.forEach(function (row) {\n    for (var _i4 = 1; _i4 < row.length; _i4 += 2) {\n      // Modify ordgroup node within styling node\n      var styling = assertNodeType(row[_i4], \"styling\");\n      var ordgroup = assertNodeType(styling.body[0], \"ordgroup\");\n      ordgroup.body.unshift(emptyGroup);\n    }\n    if (!isAligned) {\n      // Case 1\n      var curMaths = row.length / 2;\n      if (numMaths < curMaths) {\n        throw new ParseError(\"Too many math in a row: \" + (\"expected \" + numMaths + \", but got \" + curMaths), row[0]);\n      }\n    } else if (numCols < row.length) {\n      // Case 2\n      numCols = row.length;\n    }\n  });\n  // Adjusting alignment.\n  // In aligned mode, we add one \\qquad between columns;\n  // otherwise we add nothing.\n  for (var _i5 = 0; _i5 < numCols; ++_i5) {\n    var align = \"r\";\n    var pregap = 0;\n    if (_i5 % 2 === 1) {\n      align = \"l\";\n    } else if (_i5 > 0 && isAligned) {\n      // \"aligned\" mode.\n      pregap = 1; // add one \\quad\n    }\n    cols[_i5] = {\n      type: \"align\",\n      align: align,\n      pregap: pregap,\n      postgap: 0\n    };\n  }\n  res.colSeparationType = isAligned ? \"align\" : \"alignat\";\n  return res;\n};\n// Arrays are part of LaTeX, defined in lttab.dtx so its documentation\n// is part of the source2e.pdf file of LaTeX2e source documentation.\n// {darray} is an {array} environment where cells are set in \\displaystyle,\n// as defined in nccmath.sty.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"array\", \"darray\"],\n  props: {\n    numArgs: 1\n  },\n  handler(context, args) {\n    // Since no types are specified above, the two possibilities are\n    // - The argument is wrapped in {} or [], in which case Parser's\n    //   parseGroup() returns an \"ordgroup\" wrapping some symbol node.\n    // - The argument is a bare symbol node.\n    var symNode = checkSymbolNodeType(args[0]);\n    var colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n    var cols = colalign.map(function (nde) {\n      var node = assertSymbolNodeType(nde);\n      var ca = node.text;\n      if (\"lcr\".includes(ca)) {\n        return {\n          type: \"align\",\n          align: ca\n        };\n      } else if (ca === \"|\") {\n        return {\n          type: \"separator\",\n          separator: \"|\"\n        };\n      } else if (ca === \":\") {\n        return {\n          type: \"separator\",\n          separator: \":\"\n        };\n      }\n      throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n    });\n    var res = {\n      cols,\n      hskipBeforeAndAfter: true,\n      // \\@preamble in lttab.dtx\n      maxNumCols: cols.length\n    };\n    return parseArray(context.parser, res, dCellStyle(context.envName));\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// The matrix environments of amsmath builds on the array environment\n// of LaTeX, which is discussed above.\n// The mathtools package adds starred versions of the same environments.\n// These have an optional argument to choose left|center|right justification.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"matrix\", \"pmatrix\", \"bmatrix\", \"Bmatrix\", \"vmatrix\", \"Vmatrix\", \"matrix*\", \"pmatrix*\", \"bmatrix*\", \"Bmatrix*\", \"vmatrix*\", \"Vmatrix*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    var delimiters = {\n      \"matrix\": null,\n      \"pmatrix\": [\"(\", \")\"],\n      \"bmatrix\": [\"[\", \"]\"],\n      \"Bmatrix\": [\"\\\\{\", \"\\\\}\"],\n      \"vmatrix\": [\"|\", \"|\"],\n      \"Vmatrix\": [\"\\\\Vert\", \"\\\\Vert\"]\n    }[context.envName.replace(\"*\", \"\")];\n    // \\hskip -\\arraycolsep in amsmath\n    var colAlign = \"c\";\n    var payload = {\n      hskipBeforeAndAfter: false,\n      cols: [{\n        type: \"align\",\n        align: colAlign\n      }]\n    };\n    if (context.envName.charAt(context.envName.length - 1) === \"*\") {\n      // It's one of the mathtools starred functions.\n      // Parse the optional alignment argument.\n      var parser = context.parser;\n      parser.consumeSpaces();\n      if (parser.fetch().text === \"[\") {\n        parser.consume();\n        parser.consumeSpaces();\n        colAlign = parser.fetch().text;\n        if (!\"lcr\".includes(colAlign)) {\n          throw new ParseError(\"Expected l or c or r\", parser.nextToken);\n        }\n        parser.consume();\n        parser.consumeSpaces();\n        parser.expect(\"]\");\n        parser.consume();\n        payload.cols = [{\n          type: \"align\",\n          align: colAlign\n        }];\n      }\n    }\n    var res = parseArray(context.parser, payload, dCellStyle(context.envName));\n    // Populate cols with the correct number of column alignment specs.\n    var numCols = Math.max(0, ...res.body.map(row => row.length));\n    res.cols = new Array(numCols).fill({\n      type: \"align\",\n      align: colAlign\n    });\n    return delimiters ? {\n      type: \"leftright\",\n      mode: context.mode,\n      body: [res],\n      left: delimiters[0],\n      right: delimiters[1],\n      rightColor: undefined // \\right uninfluenced by \\color in array\n    } : res;\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"smallmatrix\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    var payload = {\n      arraystretch: 0.5\n    };\n    var res = parseArray(context.parser, payload, \"script\");\n    res.colSeparationType = \"small\";\n    return res;\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"subarray\"],\n  props: {\n    numArgs: 1\n  },\n  handler(context, args) {\n    // Parsing of {subarray} is similar to {array}\n    var symNode = checkSymbolNodeType(args[0]);\n    var colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n    var cols = colalign.map(function (nde) {\n      var node = assertSymbolNodeType(nde);\n      var ca = node.text;\n      // {subarray} only recognizes \"l\" & \"c\"\n      if (\"lc\".includes(ca)) {\n        return {\n          type: \"align\",\n          align: ca\n        };\n      }\n      throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n    });\n    if (cols.length > 1) {\n      throw new ParseError(\"{subarray} can contain only one column\");\n    }\n    var payload = {\n      cols,\n      hskipBeforeAndAfter: false,\n      arraystretch: 0.5\n    };\n    var res = parseArray(context.parser, payload, \"script\");\n    if (res.body.length > 0 && res.body[0].length > 1) {\n      throw new ParseError(\"{subarray} can contain only one column\");\n    }\n    return res;\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// A cases environment (in amsmath.sty) is almost equivalent to\n// \\def\\arraystretch{1.2}%\n// \\left\\{\\begin{array}{@{}l@{\\quad}l@{}} … \\end{array}\\right.\n// {dcases} is a {cases} environment where cells are set in \\displaystyle,\n// as defined in mathtools.sty.\n// {rcases} is another mathtools environment. It's brace is on the right side.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"cases\", \"dcases\", \"rcases\", \"drcases\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    var payload = {\n      arraystretch: 1.2,\n      cols: [{\n        type: \"align\",\n        align: \"l\",\n        pregap: 0,\n        // TODO(kevinb) get the current style.\n        // For now we use the metrics for TEXT style which is what we were\n        // doing before.  Before attempting to get the current style we\n        // should look at TeX's behavior especially for \\over and matrices.\n        postgap: 1.0 /* 1em quad */\n      }, {\n        type: \"align\",\n        align: \"l\",\n        pregap: 0,\n        postgap: 0\n      }]\n    };\n    var res = parseArray(context.parser, payload, dCellStyle(context.envName));\n    return {\n      type: \"leftright\",\n      mode: context.mode,\n      body: [res],\n      left: context.envName.includes(\"r\") ? \".\" : \"\\\\{\",\n      right: context.envName.includes(\"r\") ? \"\\\\}\" : \".\",\n      rightColor: undefined\n    };\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// In the align environment, one uses ampersands, &, to specify number of\n// columns in each row, and to locate spacing between each column.\n// align gets automatic numbering. align* and aligned do not.\n// The alignedat environment can be used in math mode.\n// Note that we assume \\nomallineskiplimit to be zero,\n// so that \\strut@ is the same as \\strut.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"align\", \"align*\", \"aligned\", \"split\"],\n  props: {\n    numArgs: 0\n  },\n  handler: alignedHandler,\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// A gathered environment is like an array environment with one centered\n// column, but where rows are considered lines so get \\jot line spacing\n// and contents are set in \\displaystyle.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"gathered\", \"gather\", \"gather*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    if (gatherEnvironments.has(context.envName)) {\n      validateAmsEnvironmentContext(context);\n    }\n    var res = {\n      cols: [{\n        type: \"align\",\n        align: \"c\"\n      }],\n      addJot: true,\n      colSeparationType: \"gather\",\n      autoTag: getAutoTag(context.envName),\n      emptySingleRow: true,\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// alignat environment is like an align environment, but one must explicitly\n// specify maximum number of columns in each row, and can adjust spacing between\n// each columns.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"alignat\", \"alignat*\", \"alignedat\"],\n  props: {\n    numArgs: 1\n  },\n  handler: alignedHandler,\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"equation\", \"equation*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    var res = {\n      autoTag: getAutoTag(context.envName),\n      emptySingleRow: true,\n      singleRow: true,\n      maxNumCols: 1,\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"CD\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    return parseCD(context.parser);\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineMacro(\"\\\\nonumber\", \"\\\\gdef\\\\@eqnsw{0}\");\ndefineMacro(\"\\\\notag\", \"\\\\nonumber\");\n// Catch \\hline outside array environment\ndefineFunction({\n  type: \"text\",\n  // Doesn't matter what this is.\n  names: [\"\\\\hline\", \"\\\\hdashline\"],\n  numArgs: 0,\n  allowedInText: true,\n  allowedInMath: true,\n  handler(context, args) {\n    throw new ParseError(context.funcName + \" valid only within array environment\");\n  }\n});\n\nvar environments = _environments;\n\n// Environment delimiters. HTML/MathML rendering is defined in the corresponding\n// defineEnvironment definitions.\ndefineFunction({\n  type: \"environment\",\n  names: [\"\\\\begin\", \"\\\\end\"],\n  numArgs: 1,\n  argTypes: [\"text\"],\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var nameGroup = args[0];\n    if (nameGroup.type !== \"ordgroup\") {\n      throw new ParseError(\"Invalid environment name\", nameGroup);\n    }\n    var envName = \"\";\n    for (var i = 0; i < nameGroup.body.length; ++i) {\n      envName += assertNodeType(nameGroup.body[i], \"textord\").text;\n    }\n    if (funcName === \"\\\\begin\") {\n      // begin...end is similar to left...right\n      if (!environments.hasOwnProperty(envName)) {\n        throw new ParseError(\"No such environment: \" + envName, nameGroup);\n      }\n      // Build the environment object. Arguments and other information will\n      // be made available to the begin and end methods using properties.\n      var env = environments[envName];\n      var {\n        args: _args,\n        optArgs\n      } = parser.parseArguments(\"\\\\begin{\" + envName + \"}\", env);\n      var context = {\n        mode: parser.mode,\n        envName,\n        parser\n      };\n      var result = env.handler(context, _args, optArgs);\n      parser.expect(\"\\\\end\", false);\n      var endNameToken = parser.nextToken;\n      var end = assertNodeType(parser.parseFunction(), \"environment\");\n      if (end.name !== envName) {\n        throw new ParseError(\"Mismatch: \\\\begin{\" + envName + \"} matched by \\\\end{\" + end.name + \"}\", endNameToken);\n      }\n      // env.handler returns the specific node type (e.g. \"array\"),\n      // not \"environment\". This cast is unavoidable: defineFunction\n      // requires the handler to return ParseNode<\"environment\"> but\n      // \\begin delegates to environment handlers with different types.\n      return result;\n    }\n    return {\n      type: \"environment\",\n      mode: parser.mode,\n      name: envName,\n      nameGroup\n    };\n  }\n});\n\n// TODO(kevinb): implement \\\\sl and \\\\sc\nvar htmlBuilder$5 = (group, options) => {\n  var font = group.font;\n  var newOptions = options.withFont(font);\n  return buildGroup$1(group.body, newOptions);\n};\nvar mathmlBuilder$4 = (group, options) => {\n  var font = group.font;\n  var newOptions = options.withFont(font);\n  return buildGroup(group.body, newOptions);\n};\nvar fontAliases = {\n  \"\\\\Bbb\": \"\\\\mathbb\",\n  \"\\\\bold\": \"\\\\mathbf\",\n  \"\\\\frak\": \"\\\\mathfrak\"\n};\ndefineFunction({\n  type: \"font\",\n  names: [\n  // styles, except \\boldsymbol defined below\n  \"\\\\mathrm\", \"\\\\mathit\", \"\\\\mathbf\", \"\\\\mathnormal\", \"\\\\mathsfit\",\n  // families\n  \"\\\\mathbb\", \"\\\\mathcal\", \"\\\\mathfrak\", \"\\\\mathscr\", \"\\\\mathsf\", \"\\\\mathtt\",\n  // aliases, except \\bm defined below\n  \"\\\\Bbb\", \"\\\\bold\", \"\\\\frak\"],\n  numArgs: 1,\n  allowedInArgument: true,\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = normalizeArgument(args[0]);\n    var func = funcName in fontAliases ? fontAliases[funcName] : funcName;\n    return {\n      type: \"font\",\n      mode: parser.mode,\n      font: func.slice(1),\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$5,\n  mathmlBuilder: mathmlBuilder$4\n});\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\boldsymbol\", \"\\\\bm\"],\n  numArgs: 1,\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var body = args[0];\n    // amsbsy.sty's \\boldsymbol uses \\binrel spacing to inherit the\n    // argument's bin|rel|ord status\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: binrelClass(body),\n      body: [{\n        type: \"font\",\n        mode: parser.mode,\n        font: \"boldsymbol\",\n        body\n      }],\n      isCharacterBox: isCharacterBox(body)\n    };\n  }\n});\n// Old font changing functions\ndefineFunction({\n  type: \"font\",\n  names: [\"\\\\rm\", \"\\\\sf\", \"\\\\tt\", \"\\\\bf\", \"\\\\it\", \"\\\\cal\"],\n  numArgs: 0,\n  allowedInText: true,\n  handler: (_ref3, args) => {\n    var {\n      parser,\n      funcName,\n      breakOnTokenText\n    } = _ref3;\n    var {\n      mode\n    } = parser;\n    var body = parser.parseExpression(true, breakOnTokenText);\n    return {\n      type: \"font\",\n      mode: mode,\n      font: \"math\" + funcName.slice(1),\n      body: {\n        type: \"ordgroup\",\n        mode: parser.mode,\n        body\n      }\n    };\n  }\n});\n\nvar htmlBuilder$4 = (group, options) => {\n  // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e).\n  var style = options.style;\n  var nstyle = style.fracNum();\n  var dstyle = style.fracDen();\n  var newOptions;\n  newOptions = options.havingStyle(nstyle);\n  var numerm = buildGroup$1(group.numer, newOptions, options);\n  if (group.continued) {\n    // \\cfrac inserts a \\strut into the numerator.\n    // Get \\strut dimensions from TeXbook page 353.\n    var hStrut = 8.5 / options.fontMetrics().ptPerEm;\n    var dStrut = 3.5 / options.fontMetrics().ptPerEm;\n    numerm.height = numerm.height < hStrut ? hStrut : numerm.height;\n    numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth;\n  }\n  newOptions = options.havingStyle(dstyle);\n  var denomm = buildGroup$1(group.denom, newOptions, options);\n  var rule;\n  var ruleWidth;\n  var ruleSpacing;\n  if (group.hasBarLine) {\n    if (group.barSize) {\n      ruleWidth = calculateSize(group.barSize, options);\n      rule = makeLineSpan(\"frac-line\", options, ruleWidth);\n    } else {\n      rule = makeLineSpan(\"frac-line\", options);\n    }\n    ruleWidth = rule.height;\n    ruleSpacing = rule.height;\n  } else {\n    rule = null;\n    ruleWidth = 0;\n    ruleSpacing = options.fontMetrics().defaultRuleThickness;\n  }\n  // Rule 15b\n  var numShift;\n  var clearance;\n  var denomShift;\n  if (style.size === Style$1.DISPLAY.size) {\n    numShift = options.fontMetrics().num1;\n    if (ruleWidth > 0) {\n      clearance = 3 * ruleSpacing;\n    } else {\n      clearance = 7 * ruleSpacing;\n    }\n    denomShift = options.fontMetrics().denom1;\n  } else {\n    if (ruleWidth > 0) {\n      numShift = options.fontMetrics().num2;\n      clearance = ruleSpacing;\n    } else {\n      numShift = options.fontMetrics().num3;\n      clearance = 3 * ruleSpacing;\n    }\n    denomShift = options.fontMetrics().denom2;\n  }\n  var frac;\n  if (!rule) {\n    // Rule 15c\n    var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift);\n    if (candidateClearance < clearance) {\n      numShift += 0.5 * (clearance - candidateClearance);\n      denomShift += 0.5 * (clearance - candidateClearance);\n    }\n    frac = makeVList({\n      positionType: \"individualShift\",\n      children: [{\n        type: \"elem\",\n        elem: denomm,\n        shift: denomShift\n      }, {\n        type: \"elem\",\n        elem: numerm,\n        shift: -numShift\n      }]\n    });\n  } else {\n    // Rule 15d\n    var axisHeight = options.fontMetrics().axisHeight;\n    if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) {\n      numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth));\n    }\n    if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) {\n      denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift));\n    }\n    var midShift = -(axisHeight - 0.5 * ruleWidth);\n    frac = makeVList({\n      positionType: \"individualShift\",\n      children: [{\n        type: \"elem\",\n        elem: denomm,\n        shift: denomShift\n      }, {\n        type: \"elem\",\n        elem: rule,\n        shift: midShift\n      }, {\n        type: \"elem\",\n        elem: numerm,\n        shift: -numShift\n      }]\n    });\n  }\n  // Since we manually change the style sometimes (with \\dfrac or \\tfrac),\n  // account for the possible size change here.\n  newOptions = options.havingStyle(style);\n  frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier;\n  frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier;\n  // Rule 15e\n  var delimSize;\n  if (style.size === Style$1.DISPLAY.size) {\n    delimSize = options.fontMetrics().delim1;\n  } else if (style.size === Style$1.SCRIPTSCRIPT.size) {\n    delimSize = options.havingStyle(Style$1.SCRIPT).fontMetrics().delim2;\n  } else {\n    delimSize = options.fontMetrics().delim2;\n  }\n  var leftDelim;\n  var rightDelim;\n  if (group.leftDelim == null) {\n    leftDelim = makeNullDelimiter(options, [\"mopen\"]);\n  } else {\n    leftDelim = makeCustomSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, [\"mopen\"]);\n  }\n  if (group.continued) {\n    rightDelim = makeSpan([]); // zero width for \\cfrac\n  } else if (group.rightDelim == null) {\n    rightDelim = makeNullDelimiter(options, [\"mclose\"]);\n  } else {\n    rightDelim = makeCustomSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, [\"mclose\"]);\n  }\n  return makeSpan([\"mord\"].concat(newOptions.sizingClasses(options)), [leftDelim, makeSpan([\"mfrac\"], [frac]), rightDelim], options);\n};\nvar mathmlBuilder$3 = (group, options) => {\n  var node = new MathNode(\"mfrac\", [buildGroup(group.numer, options), buildGroup(group.denom, options)]);\n  if (!group.hasBarLine) {\n    node.setAttribute(\"linethickness\", \"0px\");\n  } else if (group.barSize) {\n    var ruleWidth = calculateSize(group.barSize, options);\n    node.setAttribute(\"linethickness\", makeEm(ruleWidth));\n  }\n  if (group.leftDelim != null || group.rightDelim != null) {\n    var withDelims = [];\n    if (group.leftDelim != null) {\n      var leftOp = new MathNode(\"mo\", [new TextNode(group.leftDelim.replace(\"\\\\\", \"\"))]);\n      leftOp.setAttribute(\"fence\", \"true\");\n      withDelims.push(leftOp);\n    }\n    withDelims.push(node);\n    if (group.rightDelim != null) {\n      var rightOp = new MathNode(\"mo\", [new TextNode(group.rightDelim.replace(\"\\\\\", \"\"))]);\n      rightOp.setAttribute(\"fence\", \"true\");\n      withDelims.push(rightOp);\n    }\n    return makeRow(withDelims);\n  }\n  return node;\n};\nvar wrapWithStyle = (frac, style) => {\n  if (!style) {\n    return frac;\n  }\n  var wrapper = {\n    type: \"styling\",\n    mode: frac.mode,\n    style,\n    body: [frac]\n  };\n  // @ts-ignore defineFunction handler needs to return ParseNode<\"genfrac\">\n  return wrapper;\n};\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\cfrac\", \"\\\\dfrac\", \"\\\\frac\", \"\\\\tfrac\", \"\\\\dbinom\", \"\\\\binom\", \"\\\\tbinom\", \"\\\\\\\\atopfrac\",\n  // can’t be entered directly\n  \"\\\\\\\\bracefrac\", \"\\\\\\\\brackfrac\" // ditto\n  ],\n  numArgs: 2,\n  allowedInArgument: true,\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var numer = args[0];\n    var denom = args[1];\n    var hasBarLine;\n    var leftDelim = null;\n    var rightDelim = null;\n    switch (funcName) {\n      case \"\\\\cfrac\":\n      case \"\\\\dfrac\":\n      case \"\\\\frac\":\n      case \"\\\\tfrac\":\n        hasBarLine = true;\n        break;\n      case \"\\\\\\\\atopfrac\":\n        hasBarLine = false;\n        break;\n      case \"\\\\dbinom\":\n      case \"\\\\binom\":\n      case \"\\\\tbinom\":\n        hasBarLine = false;\n        leftDelim = \"(\";\n        rightDelim = \")\";\n        break;\n      case \"\\\\\\\\bracefrac\":\n        hasBarLine = false;\n        leftDelim = \"\\\\{\";\n        rightDelim = \"\\\\}\";\n        break;\n      case \"\\\\\\\\brackfrac\":\n        hasBarLine = false;\n        leftDelim = \"[\";\n        rightDelim = \"]\";\n        break;\n      default:\n        throw new Error(\"Unrecognized genfrac command\");\n    }\n    var continued = funcName === \"\\\\cfrac\";\n    var style = null;\n    if (continued || funcName.startsWith(\"\\\\d\")) {\n      style = \"display\";\n    } else if (funcName.startsWith(\"\\\\t\")) {\n      style = \"text\";\n    }\n    return wrapWithStyle({\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued,\n      hasBarLine,\n      leftDelim,\n      rightDelim,\n      barSize: null\n    }, style);\n  },\n  htmlBuilder: htmlBuilder$4,\n  mathmlBuilder: mathmlBuilder$3\n});\n// Infix generalized fractions -- these are not rendered directly, but replaced\n// immediately by one of the variants above.\ndefineFunction({\n  type: \"infix\",\n  names: [\"\\\\over\", \"\\\\choose\", \"\\\\atop\", \"\\\\brace\", \"\\\\brack\"],\n  numArgs: 0,\n  infix: true,\n  handler(_ref2) {\n    var {\n      parser,\n      funcName,\n      token\n    } = _ref2;\n    var replaceWith;\n    switch (funcName) {\n      case \"\\\\over\":\n        replaceWith = \"\\\\frac\";\n        break;\n      case \"\\\\choose\":\n        replaceWith = \"\\\\binom\";\n        break;\n      case \"\\\\atop\":\n        replaceWith = \"\\\\\\\\atopfrac\";\n        break;\n      case \"\\\\brace\":\n        replaceWith = \"\\\\\\\\bracefrac\";\n        break;\n      case \"\\\\brack\":\n        replaceWith = \"\\\\\\\\brackfrac\";\n        break;\n      default:\n        throw new Error(\"Unrecognized infix genfrac command\");\n    }\n    return {\n      type: \"infix\",\n      mode: parser.mode,\n      replaceWith,\n      token\n    };\n  }\n});\nvar stylArray = [\"display\", \"text\", \"script\", \"scriptscript\"];\nvar delimFromValue = function delimFromValue(delimString) {\n  var delim = null;\n  if (delimString.length > 0) {\n    delim = delimString;\n    delim = delim === \".\" ? null : delim;\n  }\n  return delim;\n};\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\genfrac\"],\n  numArgs: 6,\n  allowedInArgument: true,\n  argTypes: [\"math\", \"math\", \"size\", \"text\", \"math\", \"math\"],\n  handler(_ref3, args) {\n    var {\n      parser\n    } = _ref3;\n    var numer = args[4];\n    var denom = args[5];\n    // Look into the parse nodes to get the desired delimiters.\n    var leftNode = normalizeArgument(args[0]);\n    var leftDelim = leftNode.type === \"atom\" && leftNode.family === \"open\" ? delimFromValue(leftNode.text) : null;\n    var rightNode = normalizeArgument(args[1]);\n    var rightDelim = rightNode.type === \"atom\" && rightNode.family === \"close\" ? delimFromValue(rightNode.text) : null;\n    var barNode = assertNodeType(args[2], \"size\");\n    var hasBarLine;\n    var barSize = null;\n    if (barNode.isBlank) {\n      // \\genfrac acts differently than \\above.\n      // \\genfrac treats an empty size group as a signal to use a\n      // standard bar size. \\above would see size = 0 and omit the bar.\n      hasBarLine = true;\n    } else {\n      barSize = barNode.value;\n      hasBarLine = barSize.number > 0;\n    }\n    // Find out if we want displaystyle, textstyle, etc.\n    var size = null;\n    var styl = args[3];\n    if (styl.type === \"ordgroup\") {\n      if (styl.body.length > 0) {\n        var textOrd = assertNodeType(styl.body[0], \"textord\");\n        size = stylArray[Number(textOrd.text)];\n      }\n    } else {\n      styl = assertNodeType(styl, \"textord\");\n      size = stylArray[Number(styl.text)];\n    }\n    return wrapWithStyle({\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued: false,\n      hasBarLine,\n      barSize,\n      leftDelim,\n      rightDelim\n    }, size);\n  }\n});\n// \\above is an infix fraction that also defines a fraction bar size.\ndefineFunction({\n  type: \"infix\",\n  names: [\"\\\\above\"],\n  numArgs: 1,\n  argTypes: [\"size\"],\n  infix: true,\n  handler(_ref4, args) {\n    var {\n      parser,\n      funcName,\n      token\n    } = _ref4;\n    return {\n      type: \"infix\",\n      mode: parser.mode,\n      replaceWith: \"\\\\\\\\abovefrac\",\n      size: assertNodeType(args[0], \"size\").value,\n      token\n    };\n  }\n});\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\\\\\abovefrac\"],\n  numArgs: 3,\n  argTypes: [\"math\", \"size\", \"math\"],\n  handler: (_ref5, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref5;\n    var numer = args[0];\n    var barSize = assertNodeType(args[1], \"infix\").size;\n    if (!barSize) {\n      throw new Error(\"\\\\\\\\abovefrac expected size, but got \" + String(barSize));\n    }\n    var denom = args[2];\n    var hasBarLine = barSize.number > 0;\n    return {\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued: false,\n      hasBarLine,\n      barSize,\n      leftDelim: null,\n      rightDelim: null\n    };\n  }\n});\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"horizBrace\", but\n// also \"supsub\" since an over/underbrace can affect super/subscripting.\nvar htmlBuilder$3 = (grp, options) => {\n  var style = options.style;\n  // Pull out the `ParseNode<\"horizBrace\">` if `grp` is a \"supsub\" node.\n  var supSubGroup;\n  var group;\n  if (grp.type === \"supsub\") {\n    // Ref: LaTeX source2e: }}}}\\limits}\n    // i.e. LaTeX treats the brace similar to an op and passes it\n    // with \\limits, so we need to assign supsub style.\n    supSubGroup = grp.sup ? buildGroup$1(grp.sup, options.havingStyle(style.sup()), options) : buildGroup$1(grp.sub, options.havingStyle(style.sub()), options);\n    group = assertNodeType(grp.base, \"horizBrace\");\n  } else {\n    group = assertNodeType(grp, \"horizBrace\");\n  }\n  // Build the base group\n  var body = buildGroup$1(group.base, options.havingBaseStyle(Style$1.DISPLAY));\n  // Create the stretchy element\n  var braceBody = stretchySvg(group, options);\n  // Generate the vlist, with the appropriate kerns        ┏━━━━━━━━┓\n  // This first vlist contains the content and the brace:   equation\n  var vlist;\n  if (group.isOver) {\n    vlist = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: body\n      }, {\n        type: \"kern\",\n        size: 0.1\n      }, {\n        type: \"elem\",\n        elem: braceBody,\n        wrapperClasses: [\"svg-align\"]\n      }]\n    });\n  } else {\n    vlist = makeVList({\n      positionType: \"bottom\",\n      positionData: body.depth + 0.1 + braceBody.height,\n      children: [{\n        type: \"elem\",\n        elem: braceBody,\n        wrapperClasses: [\"svg-align\"]\n      }, {\n        type: \"kern\",\n        size: 0.1\n      }, {\n        type: \"elem\",\n        elem: body\n      }]\n    });\n  }\n  if (supSubGroup) {\n    // To write the supsub, wrap the first vlist in another vlist:\n    // They can't all go in the same vlist, because the note might be\n    // wider than the equation. We want the equation to control the\n    // brace width.\n    //      note          long note           long note\n    //   ┏━━━━━━━━┓   or    ┏━━━┓     not    ┏━━━━━━━━━┓\n    //    equation           eqn                 eqn\n    var vSpan = makeSpan([\"minner\", group.isOver ? \"mover\" : \"munder\"], [vlist], options);\n    if (group.isOver) {\n      vlist = makeVList({\n        positionType: \"firstBaseline\",\n        children: [{\n          type: \"elem\",\n          elem: vSpan\n        }, {\n          type: \"kern\",\n          size: 0.2\n        }, {\n          type: \"elem\",\n          elem: supSubGroup\n        }]\n      });\n    } else {\n      vlist = makeVList({\n        positionType: \"bottom\",\n        positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth,\n        children: [{\n          type: \"elem\",\n          elem: supSubGroup\n        }, {\n          type: \"kern\",\n          size: 0.2\n        }, {\n          type: \"elem\",\n          elem: vSpan\n        }]\n      });\n    }\n  }\n  return makeSpan([\"minner\", group.isOver ? \"mover\" : \"munder\"], [vlist], options);\n};\nvar mathmlBuilder$2 = (group, options) => {\n  var accentNode = stretchyMathML(group.label);\n  return new MathNode(group.isOver ? \"mover\" : \"munder\", [buildGroup(group.base, options), accentNode]);\n};\n// Horizontal stretchy braces\ndefineFunction({\n  type: \"horizBrace\",\n  names: [\"\\\\overbrace\", \"\\\\underbrace\", \"\\\\overbracket\", \"\\\\underbracket\"],\n  numArgs: 1,\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    return {\n      type: \"horizBrace\",\n      mode: parser.mode,\n      label: funcName,\n      isOver: funcName.includes(\"\\\\over\"),\n      base: args[0]\n    };\n  },\n  htmlBuilder: htmlBuilder$3,\n  mathmlBuilder: mathmlBuilder$2\n});\n\ndefineFunction({\n  type: \"href\",\n  names: [\"\\\\href\"],\n  numArgs: 2,\n  argTypes: [\"url\", \"original\"],\n  allowedInText: true,\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    var body = args[1];\n    var href = assertNodeType(args[0], \"url\").url;\n    if (!parser.settings.isTrusted({\n      command: \"\\\\href\",\n      url: href\n    })) {\n      return parser.formatUnsupportedCmd(\"\\\\href\");\n    }\n    return {\n      type: \"href\",\n      mode: parser.mode,\n      href,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.body, options, false);\n    return makeAnchor(group.href, [], elements, options);\n  },\n  mathmlBuilder: (group, options) => {\n    var math = buildExpressionRow(group.body, options);\n    if (!(math instanceof MathNode)) {\n      math = new MathNode(\"mrow\", [math]);\n    }\n    math.setAttribute(\"href\", group.href);\n    return math;\n  }\n});\ndefineFunction({\n  type: \"href\",\n  names: [\"\\\\url\"],\n  numArgs: 1,\n  argTypes: [\"url\"],\n  allowedInText: true,\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var href = assertNodeType(args[0], \"url\").url;\n    if (!parser.settings.isTrusted({\n      command: \"\\\\url\",\n      url: href\n    })) {\n      return parser.formatUnsupportedCmd(\"\\\\url\");\n    }\n    var chars = [];\n    for (var i = 0; i < href.length; i++) {\n      var c = href[i];\n      if (c === \"~\") {\n        c = \"\\\\textasciitilde\";\n      }\n      chars.push({\n        type: \"textord\",\n        mode: \"text\",\n        text: c\n      });\n    }\n    var body = {\n      type: \"text\",\n      mode: parser.mode,\n      font: \"\\\\texttt\",\n      body: chars\n    };\n    return {\n      type: \"href\",\n      mode: parser.mode,\n      href,\n      body: ordargument(body)\n    };\n  }\n});\n\n// \\hbox is provided for compatibility with LaTeX \\vcenter.\n// In LaTeX, \\vcenter can act only on a box, as in\n// \\vcenter{\\hbox{$\\frac{a+b}{\\dfrac{c}{d}}$}}\n// This function by itself doesn't do anything but prevent a soft line break.\ndefineFunction({\n  type: \"hbox\",\n  names: [\"\\\\hbox\"],\n  numArgs: 1,\n  argTypes: [\"text\"],\n  allowedInText: true,\n  primitive: true,\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"hbox\",\n      mode: parser.mode,\n      body: ordargument(args[0])\n    };\n  },\n  htmlBuilder(group, options) {\n    var elements = buildExpression$1(group.body, options.withFont(''), false);\n    return makeFragment(elements);\n  },\n  mathmlBuilder(group, options) {\n    return new MathNode(\"mrow\", buildExpression(group.body, options.withFont('')));\n  }\n});\n\ndefineFunction({\n  type: \"html\",\n  names: [\"\\\\htmlClass\", \"\\\\htmlId\", \"\\\\htmlStyle\", \"\\\\htmlData\"],\n  numArgs: 2,\n  argTypes: [\"raw\", \"original\"],\n  allowedInText: true,\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName,\n      token\n    } = _ref;\n    var value = assertNodeType(args[0], \"raw\").string;\n    var body = args[1];\n    if (parser.settings.strict) {\n      parser.settings.reportNonstrict(\"htmlExtension\", \"HTML extension is disabled on strict mode\");\n    }\n    var trustContext;\n    var attributes = {};\n    switch (funcName) {\n      case \"\\\\htmlClass\":\n        attributes.class = value;\n        trustContext = {\n          command: \"\\\\htmlClass\",\n          class: value\n        };\n        break;\n      case \"\\\\htmlId\":\n        attributes.id = value;\n        trustContext = {\n          command: \"\\\\htmlId\",\n          id: value\n        };\n        break;\n      case \"\\\\htmlStyle\":\n        attributes.style = value;\n        trustContext = {\n          command: \"\\\\htmlStyle\",\n          style: value\n        };\n        break;\n      case \"\\\\htmlData\":\n        {\n          var data = value.split(\",\");\n          for (var i = 0; i < data.length; i++) {\n            var item = data[i];\n            var firstEquals = item.indexOf(\"=\");\n            if (firstEquals < 0) {\n              throw new ParseError(\"\\\\htmlData key/value '\" + item + \"'\" + \" missing equals sign\");\n            }\n            var key = item.slice(0, firstEquals);\n            var _value = item.slice(firstEquals + 1);\n            attributes[\"data-\" + key.trim()] = _value;\n          }\n          trustContext = {\n            command: \"\\\\htmlData\",\n            attributes\n          };\n          break;\n        }\n      default:\n        throw new Error(\"Unrecognized html command\");\n    }\n    if (!parser.settings.isTrusted(trustContext)) {\n      return parser.formatUnsupportedCmd(funcName);\n    }\n    return {\n      type: \"html\",\n      mode: parser.mode,\n      attributes,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.body, options, false);\n    var classes = [\"enclosing\"];\n    if (group.attributes.class) {\n      classes.push(...group.attributes.class.trim().split(/\\s+/));\n    }\n    var span = makeSpan(classes, elements, options);\n    for (var attr in group.attributes) {\n      if (attr !== \"class\" && group.attributes.hasOwnProperty(attr)) {\n        span.setAttribute(attr, group.attributes[attr]);\n      }\n    }\n    return span;\n  },\n  mathmlBuilder: (group, options) => {\n    return buildExpressionRow(group.body, options);\n  }\n});\n\ndefineFunction({\n  type: \"htmlmathml\",\n  names: [\"\\\\html@mathml\"],\n  numArgs: 2,\n  allowedInArgument: true,\n  allowedInText: true,\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"htmlmathml\",\n      mode: parser.mode,\n      html: ordargument(args[0]),\n      mathml: ordargument(args[1])\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.html, options, false);\n    return makeFragment(elements);\n  },\n  mathmlBuilder: (group, options) => {\n    return buildExpressionRow(group.mathml, options);\n  }\n});\n\nvar sizeData = function sizeData(str) {\n  if (/^[-+]? *(\\d+(\\.\\d*)?|\\.\\d+)$/.test(str)) {\n    // str is a number with no unit specified.\n    // default unit is bp, per graphix package.\n    return {\n      number: +str,\n      unit: \"bp\"\n    };\n  } else {\n    var match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(str);\n    if (!match) {\n      throw new ParseError(\"Invalid size: '\" + str + \"' in \\\\includegraphics\");\n    }\n    var data = {\n      number: +(match[1] + match[2]),\n      // sign + magnitude, cast to number\n      unit: match[3]\n    };\n    if (!validUnit(data)) {\n      throw new ParseError(\"Invalid unit: '\" + data.unit + \"' in \\\\includegraphics.\");\n    }\n    return data;\n  }\n};\ndefineFunction({\n  type: \"includegraphics\",\n  names: [\"\\\\includegraphics\"],\n  numArgs: 1,\n  numOptionalArgs: 1,\n  argTypes: [\"raw\", \"url\"],\n  allowedInText: false,\n  handler: (_ref, args, optArgs) => {\n    var {\n      parser\n    } = _ref;\n    var width = {\n      number: 0,\n      unit: \"em\"\n    };\n    var height = {\n      number: 0.9,\n      unit: \"em\"\n    }; // sorta character sized.\n    var totalheight = {\n      number: 0,\n      unit: \"em\"\n    };\n    var alt = \"\";\n    if (optArgs[0]) {\n      var attributeStr = assertNodeType(optArgs[0], \"raw\").string;\n      // Parser.js does not parse key/value pairs. We get a string.\n      var attributes = attributeStr.split(\",\");\n      for (var i = 0; i < attributes.length; i++) {\n        var keyVal = attributes[i].split(\"=\");\n        if (keyVal.length === 2) {\n          var str = keyVal[1].trim();\n          switch (keyVal[0].trim()) {\n            case \"alt\":\n              alt = str;\n              break;\n            case \"width\":\n              width = sizeData(str);\n              break;\n            case \"height\":\n              height = sizeData(str);\n              break;\n            case \"totalheight\":\n              totalheight = sizeData(str);\n              break;\n            default:\n              throw new ParseError(\"Invalid key: '\" + keyVal[0] + \"' in \\\\includegraphics.\");\n          }\n        }\n      }\n    }\n    var src = assertNodeType(args[0], \"url\").url;\n    if (alt === \"\") {\n      // No alt given. Use the file name. Strip away the path.\n      alt = src;\n      alt = alt.replace(/^.*[\\\\/]/, '');\n      alt = alt.substring(0, alt.lastIndexOf('.'));\n    }\n    if (!parser.settings.isTrusted({\n      command: \"\\\\includegraphics\",\n      url: src\n    })) {\n      return parser.formatUnsupportedCmd(\"\\\\includegraphics\");\n    }\n    return {\n      type: \"includegraphics\",\n      mode: parser.mode,\n      alt: alt,\n      width: width,\n      height: height,\n      totalheight: totalheight,\n      src: src\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var height = calculateSize(group.height, options);\n    var depth = 0;\n    if (group.totalheight.number > 0) {\n      depth = calculateSize(group.totalheight, options) - height;\n    }\n    var width = 0;\n    if (group.width.number > 0) {\n      width = calculateSize(group.width, options);\n    }\n    var style = {\n      height: makeEm(height + depth)\n    };\n    if (width > 0) {\n      style.width = makeEm(width);\n    }\n    if (depth > 0) {\n      style.verticalAlign = makeEm(-depth);\n    }\n    var node = new Img(group.src, group.alt, style);\n    node.height = height;\n    node.depth = depth;\n    return node;\n  },\n  mathmlBuilder: (group, options) => {\n    var node = new MathNode(\"mglyph\", []);\n    node.setAttribute(\"alt\", group.alt);\n    var height = calculateSize(group.height, options);\n    var depth = 0;\n    if (group.totalheight.number > 0) {\n      depth = calculateSize(group.totalheight, options) - height;\n      node.setAttribute(\"valign\", makeEm(-depth));\n    }\n    node.setAttribute(\"height\", makeEm(height + depth));\n    if (group.width.number > 0) {\n      var width = calculateSize(group.width, options);\n      node.setAttribute(\"width\", makeEm(width));\n    }\n    node.setAttribute(\"src\", group.src);\n    return node;\n  }\n});\n\n// Horizontal spacing commands\n// TODO: \\hskip and \\mskip should support plus and minus in lengths\ndefineFunction({\n  type: \"kern\",\n  names: [\"\\\\kern\", \"\\\\mkern\", \"\\\\hskip\", \"\\\\mskip\"],\n  numArgs: 1,\n  argTypes: [\"size\"],\n  primitive: true,\n  allowedInText: true,\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var size = assertNodeType(args[0], \"size\");\n    if (parser.settings.strict) {\n      var mathFunction = funcName[1] === 'm'; // \\mkern, \\mskip\n      var muUnit = size.value.unit === 'mu';\n      if (mathFunction) {\n        if (!muUnit) {\n          parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" supports only mu units, \" + (\"not \" + size.value.unit + \" units\"));\n        }\n        if (parser.mode !== \"math\") {\n          parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" works only in math mode\");\n        }\n      } else {\n        // !mathFunction\n        if (muUnit) {\n          parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" doesn't support mu units\");\n        }\n      }\n    }\n    return {\n      type: \"kern\",\n      mode: parser.mode,\n      dimension: size.value\n    };\n  },\n  htmlBuilder(group, options) {\n    return makeGlue(group.dimension, options);\n  },\n  mathmlBuilder(group, options) {\n    var dimension = calculateSize(group.dimension, options);\n    return new SpaceNode(dimension);\n  }\n});\n\n// Horizontal overlap functions\ndefineFunction({\n  type: \"lap\",\n  names: [\"\\\\mathllap\", \"\\\\mathrlap\", \"\\\\mathclap\"],\n  numArgs: 1,\n  allowedInText: true,\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"lap\",\n      mode: parser.mode,\n      alignment: funcName.slice(5),\n      body\n    };\n  },\n  htmlBuilder: (group, options) => {\n    // mathllap, mathrlap, mathclap\n    var inner;\n    if (group.alignment === \"clap\") {\n      // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/\n      inner = makeSpan([], [buildGroup$1(group.body, options)]);\n      // wrap, since CSS will center a .clap > .inner > span\n      inner = makeSpan([\"inner\"], [inner], options);\n    } else {\n      inner = makeSpan([\"inner\"], [buildGroup$1(group.body, options)]);\n    }\n    var fix = makeSpan([\"fix\"], []);\n    var node = makeSpan([group.alignment], [inner, fix], options);\n    // At this point, we have correctly set horizontal alignment of the\n    // two items involved in the lap.\n    // Next, use a strut to set the height of the HTML bounding box.\n    // Otherwise, a tall argument may be misplaced.\n    // This code resolved issue #1153\n    var strut = makeSpan([\"strut\"]);\n    strut.style.height = makeEm(node.height + node.depth);\n    if (node.depth) {\n      strut.style.verticalAlign = makeEm(-node.depth);\n    }\n    node.children.unshift(strut);\n    // Next, prevent vertical misplacement when next to something tall.\n    // This code resolves issue #1234\n    node = makeSpan([\"thinbox\"], [node], options);\n    return makeSpan([\"mord\", \"vbox\"], [node], options);\n  },\n  mathmlBuilder: (group, options) => {\n    // mathllap, mathrlap, mathclap\n    var node = new MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n    if (group.alignment !== \"rlap\") {\n      var offset = group.alignment === \"llap\" ? \"-1\" : \"-0.5\";\n      node.setAttribute(\"lspace\", offset + \"width\");\n    }\n    node.setAttribute(\"width\", \"0px\");\n    return node;\n  }\n});\n\n// Switching from text mode back to math mode\ndefineFunction({\n  type: \"styling\",\n  names: [\"\\\\(\", \"$\"],\n  numArgs: 0,\n  allowedInText: true,\n  allowedInMath: false,\n  handler(_ref, args) {\n    var {\n      funcName,\n      parser\n    } = _ref;\n    var outerMode = parser.mode;\n    parser.switchMode(\"math\");\n    var close = funcName === \"\\\\(\" ? \"\\\\)\" : \"$\";\n    var body = parser.parseExpression(false, close);\n    parser.expect(close);\n    parser.switchMode(outerMode);\n    return {\n      type: \"styling\",\n      mode: parser.mode,\n      style: \"text\",\n      resetFont: true,\n      body\n    };\n  }\n});\n// Check for extra closing math delimiters\ndefineFunction({\n  type: \"text\",\n  // Doesn't matter what this is.\n  names: [\"\\\\)\", \"\\\\]\"],\n  numArgs: 0,\n  allowedInText: true,\n  allowedInMath: false,\n  handler(context, args) {\n    throw new ParseError(\"Mismatched \" + context.funcName);\n  }\n});\n\nvar chooseMathStyle = (group, options) => {\n  switch (options.style.size) {\n    case Style$1.DISPLAY.size:\n      return group.display;\n    case Style$1.TEXT.size:\n      return group.text;\n    case Style$1.SCRIPT.size:\n      return group.script;\n    case Style$1.SCRIPTSCRIPT.size:\n      return group.scriptscript;\n    default:\n      return group.text;\n  }\n};\ndefineFunction({\n  type: \"mathchoice\",\n  names: [\"\\\\mathchoice\"],\n  numArgs: 4,\n  primitive: true,\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"mathchoice\",\n      mode: parser.mode,\n      display: ordargument(args[0]),\n      text: ordargument(args[1]),\n      script: ordargument(args[2]),\n      scriptscript: ordargument(args[3])\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var body = chooseMathStyle(group, options);\n    var elements = buildExpression$1(body, options, false);\n    return makeFragment(elements);\n  },\n  mathmlBuilder: (group, options) => {\n    var body = chooseMathStyle(group, options);\n    return buildExpressionRow(body, options);\n  }\n});\n\n// For an operator with limits, assemble the base, sup, and sub into a span.\nvar assembleSupSub = (base, supGroup, subGroup, options, style, slant, baseShift) => {\n  base = makeSpan([], [base]);\n  var subIsSingleCharacter = subGroup && isCharacterBox(subGroup);\n  var sub;\n  var sup;\n  // We manually have to handle the superscripts and subscripts. This,\n  // aside from the kern calculations, is copied from supsub.\n  if (supGroup) {\n    var elem = buildGroup$1(supGroup, options.havingStyle(style.sup()), options);\n    sup = {\n      elem,\n      kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth)\n    };\n  }\n  if (subGroup) {\n    var _elem = buildGroup$1(subGroup, options.havingStyle(style.sub()), options);\n    sub = {\n      elem: _elem,\n      kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height)\n    };\n  }\n  // Build the final group as a vlist of the possible subscript, base,\n  // and possible superscript.\n  var finalGroup;\n  if (sup && sub) {\n    var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift;\n    finalGroup = makeVList({\n      positionType: \"bottom\",\n      positionData: bottom,\n      children: [{\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }, {\n        type: \"elem\",\n        elem: sub.elem,\n        marginLeft: makeEm(-slant)\n      }, {\n        type: \"kern\",\n        size: sub.kern\n      }, {\n        type: \"elem\",\n        elem: base\n      }, {\n        type: \"kern\",\n        size: sup.kern\n      }, {\n        type: \"elem\",\n        elem: sup.elem,\n        marginLeft: makeEm(slant)\n      }, {\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }]\n    });\n  } else if (sub) {\n    var top = base.height - baseShift;\n    // Shift the limits by the slant of the symbol. Note\n    // that we are supposed to shift the limits by 1/2 of the slant,\n    // but since we are centering the limits adding a full slant of\n    // margin will shift by 1/2 that.\n    finalGroup = makeVList({\n      positionType: \"top\",\n      positionData: top,\n      children: [{\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }, {\n        type: \"elem\",\n        elem: sub.elem,\n        marginLeft: makeEm(-slant)\n      }, {\n        type: \"kern\",\n        size: sub.kern\n      }, {\n        type: \"elem\",\n        elem: base\n      }]\n    });\n  } else if (sup) {\n    var _bottom = base.depth + baseShift;\n    finalGroup = makeVList({\n      positionType: \"bottom\",\n      positionData: _bottom,\n      children: [{\n        type: \"elem\",\n        elem: base\n      }, {\n        type: \"kern\",\n        size: sup.kern\n      }, {\n        type: \"elem\",\n        elem: sup.elem,\n        marginLeft: makeEm(slant)\n      }, {\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }]\n    });\n  } else {\n    // This case probably shouldn't occur (this would mean the\n    // supsub was sending us a group with no superscript or\n    // subscript) but be safe.\n    return base;\n  }\n  var parts = [finalGroup];\n  if (sub && slant !== 0 && !subIsSingleCharacter) {\n    // A negative margin-left was applied to the lower limit.\n    // Avoid an overlap by placing a spacer on the left on the group.\n    var spacer = makeSpan([\"mspace\"], [], options);\n    spacer.style.marginRight = makeEm(slant);\n    parts.unshift(spacer);\n  }\n  return makeSpan([\"mop\", \"op-limits\"], parts, options);\n};\n\n// Limits, symbols\n// Most operators have a large successor symbol, but these don't.\nvar noSuccessor = new Set([\"\\\\smallint\"]);\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"op\", but also\n// \"supsub\" since some of them (like \\int) can affect super/subscripting.\nvar htmlBuilder$2 = (grp, options) => {\n  // Operators are handled in the TeXbook pg. 443-444, rule 13(a).\n  var supGroup;\n  var subGroup;\n  var hasLimits = false;\n  var group;\n  if (grp.type === \"supsub\") {\n    // If we have limits, supsub will pass us its group to handle. Pull\n    // out the superscript and subscript and set the group to the op in\n    // its base.\n    supGroup = grp.sup;\n    subGroup = grp.sub;\n    group = assertNodeType(grp.base, \"op\");\n    hasLimits = true;\n  } else {\n    group = assertNodeType(grp, \"op\");\n  }\n  var style = options.style;\n  var large = false;\n  if (style.size === Style$1.DISPLAY.size && group.symbol && !noSuccessor.has(group.name)) {\n    // Most symbol operators get larger in displaystyle (rule 13)\n    large = true;\n  }\n  var base;\n  // Italic correction from the symbol glyph, captured before the symbol\n  // may be wrapped in a vlist (for \\oiint/\\oiiint).  Stays 0 for non-symbol ops.\n  var symbolItalic;\n  if (group.symbol) {\n    // If this is a symbol, create the symbol.\n    var fontName = large ? \"Size2-Regular\" : \"Size1-Regular\";\n    var stash = \"\";\n    if (group.name === \"\\\\oiint\" || group.name === \"\\\\oiiint\") {\n      // No font glyphs yet, so use a glyph w/o the oval.\n      // TODO: When font glyphs are available, delete this code.\n      stash = group.name.slice(1);\n      group.name = stash === \"oiint\" ? \"\\\\iint\" : \"\\\\iiint\";\n    }\n    base = makeSymbol(group.name, fontName, \"math\", options, [\"mop\", \"op-symbol\", large ? \"large-op\" : \"small-op\"]);\n    symbolItalic = base.italic;\n    if (stash.length > 0) {\n      // We're in \\oiint or \\oiiint. Overlay the oval.\n      // TODO: When font glyphs are available, delete this code.\n      var oval = staticSvg(stash + \"Size\" + (large ? \"2\" : \"1\"), options);\n      base = makeVList({\n        positionType: \"individualShift\",\n        children: [{\n          type: \"elem\",\n          elem: base,\n          shift: 0\n        }, {\n          type: \"elem\",\n          elem: oval,\n          shift: large ? 0.08 : 0\n        }]\n      });\n      group.name = \"\\\\\" + stash;\n      base.classes.unshift(\"mop\");\n      // Carry the italic correction from the original symbol to the\n      // vlist wrapper so supsub can use it for subscript positioning.\n      base.italic = symbolItalic;\n    }\n  } else if (group.body) {\n    // If this is a list, compose that list.\n    var inner = buildExpression$1(group.body, options, true);\n    if (inner.length === 1 && inner[0] instanceof SymbolNode) {\n      base = inner[0];\n      base.classes[0] = \"mop\"; // replace old mclass\n    } else {\n      base = makeSpan([\"mop\"], inner, options);\n    }\n  } else {\n    // Otherwise, this is a text operator. Build the text from the\n    // operator's name.\n    var output = [];\n    for (var i = 1; i < group.name.length; i++) {\n      output.push(mathsym(group.name[i], group.mode, options));\n    }\n    base = makeSpan([\"mop\"], output, options);\n  }\n  // If content of op is a single symbol, shift it vertically.\n  var baseShift = 0;\n  var slant = 0;\n  if ((base instanceof SymbolNode || group.name === \"\\\\oiint\" || group.name === \"\\\\oiiint\") && !group.suppressBaseShift) {\n    var _base$italic;\n    // We suppress the shift of the base of \\overset and \\underset. Otherwise,\n    // shift the symbol so its center lies on the axis (rule 13). It\n    // appears that our fonts have the centers of the symbols already\n    // almost on the axis, so these numbers are very small. Note we\n    // don't actually apply this here, but instead it is used either in\n    // the vlist creation or separately when there are no limits.\n    baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight;\n    // The slant of the symbol is just its italic correction.\n    // SymbolNode carries .italic natively; Span (for \\oiint/\\oiiint)\n    // only has it set when nonzero, so default to 0.\n    slant = (_base$italic = base.italic) != null ? _base$italic : 0;\n  }\n  if (hasLimits) {\n    return assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift);\n  } else {\n    if (baseShift) {\n      base.style.position = \"relative\";\n      base.style.top = makeEm(baseShift);\n    }\n    return base;\n  }\n};\nvar mathmlBuilder$1 = (group, options) => {\n  var node;\n  if (group.symbol) {\n    // This is a symbol. Just add the symbol.\n    node = new MathNode(\"mo\", [makeText(group.name, group.mode)]);\n    if (noSuccessor.has(group.name)) {\n      node.setAttribute(\"largeop\", \"false\");\n    }\n  } else if (group.body) {\n    // This is an operator with children. Add them.\n    node = new MathNode(\"mo\", buildExpression(group.body, options));\n  } else {\n    // This is a text operator. Add all the characters from the\n    // operator's name.\n    node = new MathNode(\"mi\", [new TextNode(group.name.slice(1))]);\n    // Append an <mo>&ApplyFunction;</mo>.\n    // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n    var operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n    if (group.parentIsSupSub) {\n      node = new MathNode(\"mrow\", [node, operator]);\n    } else {\n      node = newDocumentFragment([node, operator]);\n    }\n  }\n  return node;\n};\nvar singleCharBigOps = {\n  \"\\u220F\": \"\\\\prod\",\n  \"\\u2210\": \"\\\\coprod\",\n  \"\\u2211\": \"\\\\sum\",\n  \"\\u22c0\": \"\\\\bigwedge\",\n  \"\\u22c1\": \"\\\\bigvee\",\n  \"\\u22c2\": \"\\\\bigcap\",\n  \"\\u22c3\": \"\\\\bigcup\",\n  \"\\u2a00\": \"\\\\bigodot\",\n  \"\\u2a01\": \"\\\\bigoplus\",\n  \"\\u2a02\": \"\\\\bigotimes\",\n  \"\\u2a04\": \"\\\\biguplus\",\n  \"\\u2a06\": \"\\\\bigsqcup\"\n};\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\coprod\", \"\\\\bigvee\", \"\\\\bigwedge\", \"\\\\biguplus\", \"\\\\bigcap\", \"\\\\bigcup\", \"\\\\intop\", \"\\\\prod\", \"\\\\sum\", \"\\\\bigotimes\", \"\\\\bigoplus\", \"\\\\bigodot\", \"\\\\bigsqcup\", \"\\\\smallint\", \"\\u220F\", \"\\u2210\", \"\\u2211\", \"\\u22c0\", \"\\u22c1\", \"\\u22c2\", \"\\u22c3\", \"\\u2a00\", \"\\u2a01\", \"\\u2a02\", \"\\u2a04\", \"\\u2a06\"],\n  numArgs: 0,\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var fName = funcName;\n    if (fName.length === 1) {\n      fName = singleCharBigOps[fName];\n    }\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: true,\n      name: fName\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\mathop\"],\n  numArgs: 1,\n  primitive: true,\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var body = args[0];\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: false,\n      body: ordargument(body)\n    };\n  }\n});\n// There are 2 flags for operators; whether they produce limits in\n// displaystyle, and whether they are symbols and should grow in\n// displaystyle. These four groups cover the four possible choices.\nvar singleCharIntegrals = {\n  \"\\u222b\": \"\\\\int\",\n  \"\\u222c\": \"\\\\iint\",\n  \"\\u222d\": \"\\\\iiint\",\n  \"\\u222e\": \"\\\\oint\",\n  \"\\u222f\": \"\\\\oiint\",\n  \"\\u2230\": \"\\\\oiiint\"\n};\n// No limits, not symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\arcsin\", \"\\\\arccos\", \"\\\\arctan\", \"\\\\arctg\", \"\\\\arcctg\", \"\\\\arg\", \"\\\\ch\", \"\\\\cos\", \"\\\\cosec\", \"\\\\cosh\", \"\\\\cot\", \"\\\\cotg\", \"\\\\coth\", \"\\\\csc\", \"\\\\ctg\", \"\\\\cth\", \"\\\\deg\", \"\\\\dim\", \"\\\\exp\", \"\\\\hom\", \"\\\\ker\", \"\\\\lg\", \"\\\\ln\", \"\\\\log\", \"\\\\sec\", \"\\\\sin\", \"\\\\sinh\", \"\\\\sh\", \"\\\\tan\", \"\\\\tanh\", \"\\\\tg\", \"\\\\th\"],\n  numArgs: 0,\n  handler(_ref3) {\n    var {\n      parser,\n      funcName\n    } = _ref3;\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: false,\n      name: funcName\n    };\n  }\n});\n// Limits, not symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\det\", \"\\\\gcd\", \"\\\\inf\", \"\\\\lim\", \"\\\\max\", \"\\\\min\", \"\\\\Pr\", \"\\\\sup\"],\n  numArgs: 0,\n  handler(_ref4) {\n    var {\n      parser,\n      funcName\n    } = _ref4;\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: false,\n      name: funcName\n    };\n  }\n});\n// No limits, symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\int\", \"\\\\iint\", \"\\\\iiint\", \"\\\\oint\", \"\\\\oiint\", \"\\\\oiiint\", \"\\u222b\", \"\\u222c\", \"\\u222d\", \"\\u222e\", \"\\u222f\", \"\\u2230\"],\n  numArgs: 0,\n  allowedInArgument: true,\n  handler(_ref5) {\n    var {\n      parser,\n      funcName\n    } = _ref5;\n    var fName = funcName;\n    if (fName.length === 1) {\n      fName = singleCharIntegrals[fName];\n    }\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: true,\n      name: fName\n    };\n  }\n});\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only\n// \"operatorname\", but also  \"supsub\" since \\operatorname* can\n// affect super/subscripting.\nvar htmlBuilder$1 = (grp, options) => {\n  // Operators are handled in the TeXbook pg. 443-444, rule 13(a).\n  var supGroup;\n  var subGroup;\n  var hasLimits = false;\n  var group;\n  if (grp.type === \"supsub\") {\n    // If we have limits, supsub will pass us its group to handle. Pull\n    // out the superscript and subscript and set the group to the op in\n    // its base.\n    supGroup = grp.sup;\n    subGroup = grp.sub;\n    group = assertNodeType(grp.base, \"operatorname\");\n    hasLimits = true;\n  } else {\n    group = assertNodeType(grp, \"operatorname\");\n  }\n  var base;\n  if (group.body.length > 0) {\n    var body = group.body.map(child => {\n      var childText = \"text\" in child ? child.text : undefined;\n      if (typeof childText === \"string\") {\n        return {\n          type: \"textord\",\n          mode: child.mode,\n          text: childText\n        };\n      } else {\n        return child;\n      }\n    });\n    // Consolidate function names into symbol characters.\n    var expression = buildExpression$1(body, options.withFont(\"mathrm\"), true);\n    for (var i = 0; i < expression.length; i++) {\n      var child = expression[i];\n      if (child instanceof SymbolNode) {\n        // Per amsopn package,\n        // change minus to hyphen and \\ast to asterisk\n        child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n      }\n    }\n    base = makeSpan([\"mop\"], expression, options);\n  } else {\n    base = makeSpan([\"mop\"], [], options);\n  }\n  if (hasLimits) {\n    return assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0);\n  } else {\n    return base;\n  }\n};\nvar mathmlBuilder = (group, options) => {\n  // The steps taken here are similar to the html version.\n  var expression = buildExpression(group.body, options.withFont(\"mathrm\"));\n  // Is expression a string or has it something like a fraction?\n  var isAllString = true; // default\n  for (var i = 0; i < expression.length; i++) {\n    var node = expression[i];\n    if (node instanceof SpaceNode) ; else if (node instanceof MathNode) {\n      switch (node.type) {\n        case \"mi\":\n        case \"mn\":\n        case \"mspace\":\n        case \"mtext\":\n          break;\n        // Do nothing yet.\n        case \"mo\":\n          {\n            var child = node.children[0];\n            if (node.children.length === 1 && child instanceof TextNode) {\n              child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n            } else {\n              isAllString = false;\n            }\n            break;\n          }\n        default:\n          isAllString = false;\n      }\n    } else {\n      isAllString = false;\n    }\n  }\n  if (isAllString) {\n    // Write a single TextNode instead of multiple nested tags.\n    var word = expression.map(node => node.toText()).join(\"\");\n    expression = [new TextNode(word)];\n  }\n  var identifier = new MathNode(\"mi\", expression);\n  identifier.setAttribute(\"mathvariant\", \"normal\");\n  // \\u2061 is the same as &ApplyFunction;\n  // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp\n  var operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n  if (group.parentIsSupSub) {\n    return new MathNode(\"mrow\", [identifier, operator]);\n  } else {\n    return newDocumentFragment([identifier, operator]);\n  }\n};\n// \\operatorname\n// amsopn.dtx: \\mathop{#1\\kern\\z@\\operator@font#3}\\newmcodes@\ndefineFunction({\n  type: \"operatorname\",\n  names: [\"\\\\operatorname@\", \"\\\\operatornamewithlimits\"],\n  numArgs: 1,\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"operatorname\",\n      mode: parser.mode,\n      body: ordargument(body),\n      alwaysHandleSupSub: funcName === \"\\\\operatornamewithlimits\",\n      limits: false,\n      parentIsSupSub: false\n    };\n  },\n  htmlBuilder: htmlBuilder$1,\n  mathmlBuilder\n});\ndefineMacro(\"\\\\operatorname\", \"\\\\@ifstar\\\\operatornamewithlimits\\\\operatorname@\");\n\ndefineFunctionBuilders({\n  type: \"ordgroup\",\n  htmlBuilder(group, options) {\n    if (group.semisimple) {\n      return makeFragment(buildExpression$1(group.body, options, false));\n    }\n    return makeSpan([\"mord\"], buildExpression$1(group.body, options, true), options);\n  },\n  mathmlBuilder(group, options) {\n    return buildExpressionRow(group.body, options, true);\n  }\n});\n\ndefineFunction({\n  type: \"overline\",\n  names: [\"\\\\overline\"],\n  numArgs: 1,\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"overline\",\n      mode: parser.mode,\n      body\n    };\n  },\n  htmlBuilder(group, options) {\n    // Overlines are handled in the TeXbook pg 443, Rule 9.\n    // Build the inner group in the cramped style.\n    var innerGroup = buildGroup$1(group.body, options.havingCrampedStyle());\n    // Create the line above the body\n    var line = makeLineSpan(\"overline-line\", options);\n    // Generate the vlist, with the appropriate kerns\n    var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;\n    var vlist = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: innerGroup\n      }, {\n        type: \"kern\",\n        size: 3 * defaultRuleThickness\n      }, {\n        type: \"elem\",\n        elem: line\n      }, {\n        type: \"kern\",\n        size: defaultRuleThickness\n      }]\n    });\n    return makeSpan([\"mord\", \"overline\"], [vlist], options);\n  },\n  mathmlBuilder(group, options) {\n    var operator = new MathNode(\"mo\", [new TextNode(\"\\u203e\")]);\n    operator.setAttribute(\"stretchy\", \"true\");\n    var node = new MathNode(\"mover\", [buildGroup(group.body, options), operator]);\n    node.setAttribute(\"accent\", \"true\");\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"phantom\",\n  names: [\"\\\\phantom\"],\n  numArgs: 1,\n  allowedInText: true,\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"phantom\",\n      mode: parser.mode,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.body, options.withPhantom(), false);\n    // \\phantom isn't supposed to affect the elements it contains.\n    // See \"color\" for more details.\n    return makeFragment(elements);\n  },\n  mathmlBuilder: (group, options) => {\n    var inner = buildExpression(group.body, options);\n    return new MathNode(\"mphantom\", inner);\n  }\n});\ndefineMacro(\"\\\\hphantom\", \"\\\\smash{\\\\phantom{#1}}\");\ndefineFunction({\n  type: \"vphantom\",\n  names: [\"\\\\vphantom\"],\n  numArgs: 1,\n  allowedInText: true,\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var body = args[0];\n    return {\n      type: \"vphantom\",\n      mode: parser.mode,\n      body\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var inner = makeSpan([\"inner\"], [buildGroup$1(group.body, options.withPhantom())]);\n    var fix = makeSpan([\"fix\"], []);\n    return makeSpan([\"mord\", \"rlap\"], [inner, fix], options);\n  },\n  mathmlBuilder: (group, options) => {\n    var inner = buildExpression(ordargument(group.body), options);\n    var phantom = new MathNode(\"mphantom\", inner);\n    var node = new MathNode(\"mpadded\", [phantom]);\n    node.setAttribute(\"width\", \"0px\");\n    return node;\n  }\n});\n\n// Box manipulation\ndefineFunction({\n  type: \"raisebox\",\n  names: [\"\\\\raisebox\"],\n  numArgs: 2,\n  argTypes: [\"size\", \"hbox\"],\n  allowedInText: true,\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var amount = assertNodeType(args[0], \"size\").value;\n    var body = args[1];\n    return {\n      type: \"raisebox\",\n      mode: parser.mode,\n      dy: amount,\n      body\n    };\n  },\n  htmlBuilder(group, options) {\n    var body = buildGroup$1(group.body, options);\n    var dy = calculateSize(group.dy, options);\n    return makeVList({\n      positionType: \"shift\",\n      positionData: -dy,\n      children: [{\n        type: \"elem\",\n        elem: body\n      }]\n    });\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n    var dy = group.dy.number + group.dy.unit;\n    node.setAttribute(\"voffset\", dy);\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\relax\"],\n  numArgs: 0,\n  allowedInText: true,\n  allowedInArgument: true,\n  handler(_ref) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n\ndefineFunction({\n  type: \"rule\",\n  names: [\"\\\\rule\"],\n  numArgs: 2,\n  numOptionalArgs: 1,\n  allowedInText: true,\n  allowedInMath: true,\n  argTypes: [\"size\", \"size\", \"size\"],\n  handler(_ref, args, optArgs) {\n    var {\n      parser\n    } = _ref;\n    var shift = optArgs[0];\n    var width = assertNodeType(args[0], \"size\");\n    var height = assertNodeType(args[1], \"size\");\n    return {\n      type: \"rule\",\n      mode: parser.mode,\n      shift: shift && assertNodeType(shift, \"size\").value,\n      width: width.value,\n      height: height.value\n    };\n  },\n  htmlBuilder(group, options) {\n    // Make an empty span for the rule\n    var rule = makeSpan([\"mord\", \"rule\"], [], options);\n    // Calculate the shift, width, and height of the rule, and account for units\n    var width = calculateSize(group.width, options);\n    var height = calculateSize(group.height, options);\n    var shift = group.shift ? calculateSize(group.shift, options) : 0;\n    // Style the rule to the right size\n    rule.style.borderRightWidth = makeEm(width);\n    rule.style.borderTopWidth = makeEm(height);\n    rule.style.bottom = makeEm(shift);\n    // Record the height and width\n    rule.width = width;\n    rule.height = height + shift;\n    rule.depth = -shift;\n    // Font size is the number large enough that the browser will\n    // reserve at least `absHeight` space above the baseline.\n    // The 1.125 factor was empirically determined\n    rule.maxFontSize = height * 1.125 * options.sizeMultiplier;\n    return rule;\n  },\n  mathmlBuilder(group, options) {\n    var width = calculateSize(group.width, options);\n    var height = calculateSize(group.height, options);\n    var shift = group.shift ? calculateSize(group.shift, options) : 0;\n    var color = options.color && options.getColor() || \"black\";\n    var rule = new MathNode(\"mspace\");\n    rule.setAttribute(\"mathbackground\", color);\n    rule.setAttribute(\"width\", makeEm(width));\n    rule.setAttribute(\"height\", makeEm(height));\n    var wrapper = new MathNode(\"mpadded\", [rule]);\n    if (shift >= 0) {\n      wrapper.setAttribute(\"height\", makeEm(shift));\n    } else {\n      wrapper.setAttribute(\"height\", makeEm(shift));\n      wrapper.setAttribute(\"depth\", makeEm(-shift));\n    }\n    wrapper.setAttribute(\"voffset\", makeEm(shift));\n    return wrapper;\n  }\n});\n\nfunction sizingGroup(value, options, baseOptions) {\n  var inner = buildExpression$1(value, options, false);\n  var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;\n  // Add size-resetting classes to the inner list and set maxFontSize\n  // manually. Handle nested size changes.\n  for (var i = 0; i < inner.length; i++) {\n    var pos = inner[i].classes.indexOf(\"sizing\");\n    if (pos < 0) {\n      Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions));\n    } else if (inner[i].classes[pos + 1] === \"reset-size\" + options.size) {\n      // This is a nested size change: e.g., inner[i] is the \"b\" in\n      // `\\Huge a \\small b`. Override the old size (the `reset-` class)\n      // but not the new size.\n      inner[i].classes[pos + 1] = \"reset-size\" + baseOptions.size;\n    }\n    inner[i].height *= multiplier;\n    inner[i].depth *= multiplier;\n  }\n  return makeFragment(inner);\n}\nvar sizeFuncs = [\"\\\\tiny\", \"\\\\sixptsize\", \"\\\\scriptsize\", \"\\\\footnotesize\", \"\\\\small\", \"\\\\normalsize\", \"\\\\large\", \"\\\\Large\", \"\\\\LARGE\", \"\\\\huge\", \"\\\\Huge\"];\nvar htmlBuilder = (group, options) => {\n  // Handle sizing operators like \\Huge. Real TeX doesn't actually allow\n  // these functions inside of math expressions, so we do some special\n  // handling.\n  var newOptions = options.havingSize(group.size);\n  return sizingGroup(group.body, newOptions, options);\n};\ndefineFunction({\n  type: \"sizing\",\n  names: sizeFuncs,\n  numArgs: 0,\n  allowedInText: true,\n  handler: (_ref, args) => {\n    var {\n      breakOnTokenText,\n      funcName,\n      parser\n    } = _ref;\n    var body = parser.parseExpression(false, breakOnTokenText);\n    return {\n      type: \"sizing\",\n      mode: parser.mode,\n      // Figure out what size to use based on the list of functions above\n      size: sizeFuncs.indexOf(funcName) + 1,\n      body\n    };\n  },\n  htmlBuilder,\n  mathmlBuilder: (group, options) => {\n    var newOptions = options.havingSize(group.size);\n    var inner = buildExpression(group.body, newOptions);\n    var node = new MathNode(\"mstyle\", inner);\n    // TODO(emily): This doesn't produce the correct size for nested size\n    // changes, because we don't keep state of what style we're currently\n    // in, so we can't reset the size to normal before changing it.  Now\n    // that we're passing an options parameter we should be able to fix\n    // this.\n    node.setAttribute(\"mathsize\", makeEm(newOptions.sizeMultiplier));\n    return node;\n  }\n});\n\n// smash, with optional [tb], as in AMS\ndefineFunction({\n  type: \"smash\",\n  names: [\"\\\\smash\"],\n  numArgs: 1,\n  numOptionalArgs: 1,\n  allowedInText: true,\n  handler: (_ref, args, optArgs) => {\n    var {\n      parser\n    } = _ref;\n    var smashHeight = false;\n    var smashDepth = false;\n    var tbArg = optArgs[0] && assertNodeType(optArgs[0], \"ordgroup\");\n    if (tbArg) {\n      // Optional [tb] argument is engaged.\n      // ref: amsmath: \\renewcommand{\\smash}[1][tb]{%\n      //               def\\mb@t{\\ht}\\def\\mb@b{\\dp}\\def\\mb@tb{\\ht\\z@\\z@\\dp}%\n      var letter;\n      for (var i = 0; i < tbArg.body.length; ++i) {\n        var node = tbArg.body[i];\n        letter = assertSymbolNodeType(node).text;\n        if (letter === \"t\") {\n          smashHeight = true;\n        } else if (letter === \"b\") {\n          smashDepth = true;\n        } else {\n          smashHeight = false;\n          smashDepth = false;\n          break;\n        }\n      }\n    } else {\n      smashHeight = true;\n      smashDepth = true;\n    }\n    var body = args[0];\n    return {\n      type: \"smash\",\n      mode: parser.mode,\n      body,\n      smashHeight,\n      smashDepth\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var node = makeSpan([], [buildGroup$1(group.body, options)]);\n    if (!group.smashHeight && !group.smashDepth) {\n      return node;\n    }\n    if (group.smashHeight) {\n      node.height = 0;\n    }\n    if (group.smashDepth) {\n      node.depth = 0;\n    }\n    if (group.smashHeight && group.smashDepth) {\n      // Symmetric \\smash can stay in inline layout.\n      return makeSpan([\"mord\", \"smash\"], [node], options);\n    }\n    // In order to influence makeVList for asymmetric smashing, we have to\n    // reset the children.\n    if (node.children) {\n      for (var i = 0; i < node.children.length; i++) {\n        if (group.smashHeight) {\n          node.children[i].height = 0;\n        }\n        if (group.smashDepth) {\n          node.children[i].depth = 0;\n        }\n      }\n    }\n    // At this point, we've reset the TeX-like height and depth values.\n    // But the span still has an HTML line height.\n    // makeVList applies \"display: table-cell\", which prevents the browser\n    // from acting on that line height. So we'll call makeVList now.\n    var smashedNode = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: node\n      }]\n    });\n    // For spacing, TeX treats \\smash as a math group (same spacing as ord).\n    return makeSpan([\"mord\"], [smashedNode], options);\n  },\n  mathmlBuilder: (group, options) => {\n    var node = new MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n    if (group.smashHeight) {\n      node.setAttribute(\"height\", \"0px\");\n    }\n    if (group.smashDepth) {\n      node.setAttribute(\"depth\", \"0px\");\n    }\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"sqrt\",\n  names: [\"\\\\sqrt\"],\n  numArgs: 1,\n  numOptionalArgs: 1,\n  handler(_ref, args, optArgs) {\n    var {\n      parser\n    } = _ref;\n    var index = optArgs[0];\n    var body = args[0];\n    return {\n      type: \"sqrt\",\n      mode: parser.mode,\n      body,\n      index\n    };\n  },\n  htmlBuilder(group, options) {\n    // Square roots are handled in the TeXbook pg. 443, Rule 11.\n    // First, we do the same steps as in overline to build the inner group\n    // and line\n    var inner = buildGroup$1(group.body, options.havingCrampedStyle());\n    if (inner.height === 0) {\n      // Render a small surd.\n      inner.height = options.fontMetrics().xHeight;\n    }\n    // Some groups can return document fragments.  Handle those by wrapping\n    // them in a span.\n    inner = wrapFragment(inner, options);\n    // Calculate the minimum size for the \\surd delimiter\n    var metrics = options.fontMetrics();\n    var theta = metrics.defaultRuleThickness;\n    var phi = theta;\n    if (options.style.id < Style$1.TEXT.id) {\n      phi = options.fontMetrics().xHeight;\n    }\n    // Calculate the clearance between the body and line\n    var lineClearance = theta + phi / 4;\n    var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta;\n    // Create a sqrt SVG of the required minimum size\n    var {\n      span: img,\n      ruleWidth,\n      advanceWidth\n    } = makeSqrtImage(minDelimiterHeight, options);\n    var delimDepth = img.height - ruleWidth;\n    // Adjust the clearance based on the delimiter size\n    if (delimDepth > inner.height + inner.depth + lineClearance) {\n      lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2;\n    }\n    // Shift the sqrt image\n    var imgShift = img.height - inner.height - lineClearance - ruleWidth;\n    inner.style.paddingLeft = makeEm(advanceWidth);\n    // Overlay the image and the argument.\n    var body = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: inner,\n        wrapperClasses: [\"svg-align\"]\n      }, {\n        type: \"kern\",\n        size: -(inner.height + imgShift)\n      }, {\n        type: \"elem\",\n        elem: img\n      }, {\n        type: \"kern\",\n        size: ruleWidth\n      }]\n    });\n    if (!group.index) {\n      return makeSpan([\"mord\", \"sqrt\"], [body], options);\n    } else {\n      // Handle the optional root index\n      // The index is always in scriptscript style\n      var newOptions = options.havingStyle(Style$1.SCRIPTSCRIPT);\n      var rootm = buildGroup$1(group.index, newOptions, options);\n      // The amount the index is shifted by. This is taken from the TeX\n      // source, in the definition of `\\r@@t`.\n      var toShift = 0.6 * (body.height - body.depth);\n      // Build a VList with the superscript shifted up correctly\n      var rootVList = makeVList({\n        positionType: \"shift\",\n        positionData: -toShift,\n        children: [{\n          type: \"elem\",\n          elem: rootm\n        }]\n      });\n      // Add a class surrounding it so we can add on the appropriate\n      // kerning\n      var rootVListWrap = makeSpan([\"root\"], [rootVList]);\n      return makeSpan([\"mord\", \"sqrt\"], [rootVListWrap, body], options);\n    }\n  },\n  mathmlBuilder(group, options) {\n    var {\n      body,\n      index\n    } = group;\n    return index ? new MathNode(\"mroot\", [buildGroup(body, options), buildGroup(index, options)]) : new MathNode(\"msqrt\", [buildGroup(body, options)]);\n  }\n});\n\nvar styleMap = {\n  \"display\": Style$1.DISPLAY,\n  \"text\": Style$1.TEXT,\n  \"script\": Style$1.SCRIPT,\n  \"scriptscript\": Style$1.SCRIPTSCRIPT\n};\nfunction isStyleStr(s) {\n  return s in styleMap;\n}\ndefineFunction({\n  type: \"styling\",\n  names: [\"\\\\displaystyle\", \"\\\\textstyle\", \"\\\\scriptstyle\", \"\\\\scriptscriptstyle\"],\n  numArgs: 0,\n  allowedInText: true,\n  primitive: true,\n  handler(_ref, args) {\n    var {\n      breakOnTokenText,\n      funcName,\n      parser\n    } = _ref;\n    // parse out the implicit body\n    var body = parser.parseExpression(true, breakOnTokenText);\n    // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g.\n    // here and in buildHTML and de-dupe the enumeration of all the styles).\n    var style = funcName.slice(1, funcName.length - 5);\n    if (!isStyleStr(style)) {\n      throw new Error(\"Unknown style: \" + style);\n    }\n    return {\n      type: \"styling\",\n      mode: parser.mode,\n      // Figure out what style to use by pulling out the style from\n      // the function name\n      style,\n      body\n    };\n  },\n  htmlBuilder(group, options) {\n    // Style changes are handled in the TeXbook on pg. 442, Rule 3.\n    var newStyle = styleMap[group.style];\n    var newOptions = options.havingStyle(newStyle);\n    if (group.resetFont) {\n      newOptions = newOptions.withFont('');\n    }\n    return sizingGroup(group.body, newOptions, options);\n  },\n  mathmlBuilder(group, options) {\n    // Figure out what style we're changing to.\n    var newStyle = styleMap[group.style];\n    var newOptions = options.havingStyle(newStyle);\n    if (group.resetFont) {\n      newOptions = newOptions.withFont('');\n    }\n    var inner = buildExpression(group.body, newOptions);\n    var node = new MathNode(\"mstyle\", inner);\n    var styleAttributes = {\n      \"display\": [\"0\", \"true\"],\n      \"text\": [\"0\", \"false\"],\n      \"script\": [\"1\", \"false\"],\n      \"scriptscript\": [\"2\", \"false\"]\n    };\n    var attr = styleAttributes[group.style];\n    node.setAttribute(\"scriptlevel\", attr[0]);\n    node.setAttribute(\"displaystyle\", attr[1]);\n    return node;\n  }\n});\n\n/**\n * Sometimes, groups perform special rules when they have superscripts or\n * subscripts attached to them. This function lets the `supsub` group know that\n * Sometimes, groups perform special rules when they have superscripts or\n * its inner element should handle the superscripts and subscripts instead of\n * handling them itself.\n */\nvar htmlBuilderDelegate = function htmlBuilderDelegate(group, options) {\n  var base = group.base;\n  if (!base) {\n    return null;\n  } else if (base.type === \"op\") {\n    // Operators handle supsubs differently when they have limits\n    // (e.g. `\\displaystyle\\sum_2^3`)\n    var delegate = base.limits && (options.style.size === Style$1.DISPLAY.size || base.alwaysHandleSupSub);\n    return delegate ? htmlBuilder$2 : null;\n  } else if (base.type === \"operatorname\") {\n    var _delegate = base.alwaysHandleSupSub && (options.style.size === Style$1.DISPLAY.size || base.limits);\n    return _delegate ? htmlBuilder$1 : null;\n  } else if (base.type === \"accent\") {\n    return isCharacterBox(base.base) ? htmlBuilder$a : null;\n  } else if (base.type === \"horizBrace\") {\n    var isSup = !group.sub;\n    return isSup === base.isOver ? htmlBuilder$3 : null;\n  } else {\n    return null;\n  }\n};\n// Super scripts and subscripts, whose precise placement can depend on other\n// functions that precede them.\ndefineFunctionBuilders({\n  type: \"supsub\",\n  htmlBuilder(group, options) {\n    // Superscript and subscripts are handled in the TeXbook on page\n    // 445-446, rules 18(a-f).\n    // Here is where we defer to the inner group if it should handle\n    // superscripts and subscripts itself.\n    var builderDelegate = htmlBuilderDelegate(group, options);\n    if (builderDelegate) {\n      return builderDelegate(group, options);\n    }\n    var {\n      base: valueBase,\n      sup: valueSup,\n      sub: valueSub\n    } = group;\n    var base = buildGroup$1(valueBase, options);\n    var supm;\n    var subm;\n    var metrics = options.fontMetrics();\n    // Rule 18a\n    var supShift = 0;\n    var subShift = 0;\n    var isCharBox = valueBase && isCharacterBox(valueBase);\n    if (valueSup) {\n      var newOptions = options.havingStyle(options.style.sup());\n      supm = buildGroup$1(valueSup, newOptions, options);\n      if (!isCharBox) {\n        supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier;\n      }\n    }\n    if (valueSub) {\n      var _newOptions = options.havingStyle(options.style.sub());\n      subm = buildGroup$1(valueSub, _newOptions, options);\n      if (!isCharBox) {\n        subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier;\n      }\n    }\n    // Rule 18c\n    var minSupShift;\n    if (options.style === Style$1.DISPLAY) {\n      minSupShift = metrics.sup1;\n    } else if (options.style.cramped) {\n      minSupShift = metrics.sup3;\n    } else {\n      minSupShift = metrics.sup2;\n    }\n    // scriptspace is a font-size-independent size, so scale it\n    // appropriately for use as the marginRight.\n    var multiplier = options.sizeMultiplier;\n    var marginRight = makeEm(0.5 / metrics.ptPerEm / multiplier);\n    var marginLeft = null;\n    if (subm) {\n      // Subscripts shouldn't be shifted by the base's italic correction.\n      // Account for that by shifting the subscript back the appropriate\n      // amount. Note we only do this when the base is a single symbol.\n      var isOiint = group.base && group.base.type === \"op\" && group.base.name && (group.base.name === \"\\\\oiint\" || group.base.name === \"\\\\oiiint\");\n      if (base instanceof SymbolNode || isOiint) {\n        var _base$italic;\n        // SymbolNode has .italic natively; for \\oiint/\\oiiint the\n        // op builder stores .italic on the wrapping Span.\n        marginLeft = makeEm(-((_base$italic = base.italic) != null ? _base$italic : 0));\n      }\n    }\n    var supsub;\n    if (supm && subm) {\n      supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);\n      subShift = Math.max(subShift, metrics.sub2);\n      var ruleWidth = metrics.defaultRuleThickness;\n      // Rule 18e\n      var maxWidth = 4 * ruleWidth;\n      if (supShift - supm.depth - (subm.height - subShift) < maxWidth) {\n        subShift = maxWidth - (supShift - supm.depth) + subm.height;\n        var psi = 0.8 * metrics.xHeight - (supShift - supm.depth);\n        if (psi > 0) {\n          supShift += psi;\n          subShift -= psi;\n        }\n      }\n      var vlistElem = [{\n        type: \"elem\",\n        elem: subm,\n        shift: subShift,\n        marginRight,\n        marginLeft\n      }, {\n        type: \"elem\",\n        elem: supm,\n        shift: -supShift,\n        marginRight\n      }];\n      supsub = makeVList({\n        positionType: \"individualShift\",\n        children: vlistElem\n      });\n    } else if (subm) {\n      // Rule 18b\n      subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight);\n      var _vlistElem = [{\n        type: \"elem\",\n        elem: subm,\n        marginLeft,\n        marginRight\n      }];\n      supsub = makeVList({\n        positionType: \"shift\",\n        positionData: subShift,\n        children: _vlistElem\n      });\n    } else if (supm) {\n      // Rule 18c, d\n      supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);\n      supsub = makeVList({\n        positionType: \"shift\",\n        positionData: -supShift,\n        children: [{\n          type: \"elem\",\n          elem: supm,\n          marginRight\n        }]\n      });\n    } else {\n      throw new Error(\"supsub must have either sup or sub.\");\n    }\n    // Wrap the supsub vlist in a span.msupsub to reset text-align.\n    var mclass = getTypeOfDomTree(base, \"right\") || \"mord\";\n    return makeSpan([mclass], [base, makeSpan([\"msupsub\"], [supsub])], options);\n  },\n  mathmlBuilder(group, options) {\n    // Is the inner group a relevant horizontal brace?\n    var isBrace = false;\n    var isOver;\n    var isSup;\n    if (group.base && group.base.type === \"horizBrace\") {\n      isSup = !!group.sup;\n      if (isSup === group.base.isOver) {\n        isBrace = true;\n        isOver = group.base.isOver;\n      }\n    }\n    if (group.base && (group.base.type === \"op\" || group.base.type === \"operatorname\")) {\n      group.base.parentIsSupSub = true;\n    }\n    var children = [buildGroup(group.base, options)];\n    if (group.sub) {\n      children.push(buildGroup(group.sub, options));\n    }\n    if (group.sup) {\n      children.push(buildGroup(group.sup, options));\n    }\n    var nodeType;\n    if (isBrace) {\n      nodeType = isOver ? \"mover\" : \"munder\";\n    } else if (!group.sub) {\n      var base = group.base;\n      if (base && base.type === \"op\" && base.limits && (options.style === Style$1.DISPLAY || base.alwaysHandleSupSub)) {\n        nodeType = \"mover\";\n      } else if (base && base.type === \"operatorname\" && base.alwaysHandleSupSub && (base.limits || options.style === Style$1.DISPLAY)) {\n        nodeType = \"mover\";\n      } else {\n        nodeType = \"msup\";\n      }\n    } else if (!group.sup) {\n      var _base = group.base;\n      if (_base && _base.type === \"op\" && _base.limits && (options.style === Style$1.DISPLAY || _base.alwaysHandleSupSub)) {\n        nodeType = \"munder\";\n      } else if (_base && _base.type === \"operatorname\" && _base.alwaysHandleSupSub && (_base.limits || options.style === Style$1.DISPLAY)) {\n        nodeType = \"munder\";\n      } else {\n        nodeType = \"msub\";\n      }\n    } else {\n      var _base2 = group.base;\n      if (_base2 && _base2.type === \"op\" && _base2.limits && options.style === Style$1.DISPLAY) {\n        nodeType = \"munderover\";\n      } else if (_base2 && _base2.type === \"operatorname\" && _base2.alwaysHandleSupSub && (options.style === Style$1.DISPLAY || _base2.limits)) {\n        nodeType = \"munderover\";\n      } else {\n        nodeType = \"msubsup\";\n      }\n    }\n    return new MathNode(nodeType, children);\n  }\n});\n\n// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js.\ndefineFunctionBuilders({\n  type: \"atom\",\n  htmlBuilder(group, options) {\n    return mathsym(group.text, group.mode, options, [\"m\" + group.family]);\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mo\", [makeText(group.text, group.mode)]);\n    if (group.family === \"bin\") {\n      var variant = getVariant(group, options);\n      if (variant === \"bold-italic\") {\n        node.setAttribute(\"mathvariant\", variant);\n      }\n    } else if (group.family === \"punct\") {\n      node.setAttribute(\"separator\", \"true\");\n    } else if (group.family === \"open\" || group.family === \"close\") {\n      // Delims built here should not stretch vertically.\n      // See delimsizing.js for stretchy delims.\n      node.setAttribute(\"stretchy\", \"false\");\n    }\n    return node;\n  }\n});\n\n// \"mathord\" and \"textord\" ParseNodes created in Parser.js from symbol Groups in\n// src/symbols.js.\nvar defaultVariant = {\n  \"mi\": \"italic\",\n  \"mn\": \"normal\",\n  \"mtext\": \"normal\"\n};\ndefineFunctionBuilders({\n  type: \"mathord\",\n  htmlBuilder(group, options) {\n    return makeOrd(group, options);\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mi\", [makeText(group.text, group.mode, options)]);\n    var variant = getVariant(group, options) || \"italic\";\n    if (variant !== defaultVariant[node.type]) {\n      node.setAttribute(\"mathvariant\", variant);\n    }\n    return node;\n  }\n});\ndefineFunctionBuilders({\n  type: \"textord\",\n  htmlBuilder(group, options) {\n    return makeOrd(group, options);\n  },\n  mathmlBuilder(group, options) {\n    var text = makeText(group.text, group.mode, options);\n    var variant = getVariant(group, options) || \"normal\";\n    var node;\n    if (group.mode === 'text') {\n      node = new MathNode(\"mtext\", [text]);\n    } else if (/[0-9]/.test(group.text)) {\n      node = new MathNode(\"mn\", [text]);\n    } else if (group.text === \"\\\\prime\") {\n      node = new MathNode(\"mo\", [text]);\n    } else {\n      node = new MathNode(\"mi\", [text]);\n    }\n    if (variant !== defaultVariant[node.type]) {\n      node.setAttribute(\"mathvariant\", variant);\n    }\n    return node;\n  }\n});\n\n// A map of CSS-based spacing functions to their CSS class.\nvar cssSpace = {\n  \"\\\\nobreak\": \"nobreak\",\n  \"\\\\allowbreak\": \"allowbreak\"\n};\n// A lookup table to determine whether a spacing function/symbol should be\n// treated like a regular space character.  If a symbol or command is a key\n// in this table, then it should be a regular space character.  Furthermore,\n// the associated value may have a `className` specifying an extra CSS class\n// to add to the created `span`.\nvar regularSpace = {\n  \" \": {},\n  \"\\\\ \": {},\n  \"~\": {\n    className: \"nobreak\"\n  },\n  \"\\\\space\": {},\n  \"\\\\nobreakspace\": {\n    className: \"nobreak\"\n  }\n};\n// ParseNode<\"spacing\"> created in Parser.js from the \"spacing\" symbol Groups in\n// src/symbols.js.\ndefineFunctionBuilders({\n  type: \"spacing\",\n  htmlBuilder(group, options) {\n    if (regularSpace.hasOwnProperty(group.text)) {\n      var className = regularSpace[group.text].className || \"\";\n      // Spaces are generated by adding an actual space. Each of these\n      // things has an entry in the symbols table, so these will be turned\n      // into appropriate outputs.\n      if (group.mode === \"text\") {\n        var ord = makeOrd(group, options);\n        ord.classes.push(className);\n        return ord;\n      } else {\n        return makeSpan([\"mspace\", className], [mathsym(group.text, group.mode, options)], options);\n      }\n    } else if (cssSpace.hasOwnProperty(group.text)) {\n      // Spaces based on just a CSS class.\n      return makeSpan([\"mspace\", cssSpace[group.text]], [], options);\n    } else {\n      throw new ParseError(\"Unknown type of space \\\"\" + group.text + \"\\\"\");\n    }\n  },\n  mathmlBuilder(group, options) {\n    var node;\n    if (regularSpace.hasOwnProperty(group.text)) {\n      node = new MathNode(\"mtext\", [new TextNode(\"\\u00a0\")]);\n    } else if (cssSpace.hasOwnProperty(group.text)) {\n      // CSS-based MathML spaces (\\nobreak, \\allowbreak) are ignored\n      return new MathNode(\"mspace\");\n    } else {\n      throw new ParseError(\"Unknown type of space \\\"\" + group.text + \"\\\"\");\n    }\n    return node;\n  }\n});\n\nvar pad = () => {\n  var padNode = new MathNode(\"mtd\", []);\n  padNode.setAttribute(\"width\", \"50%\");\n  return padNode;\n};\ndefineFunctionBuilders({\n  type: \"tag\",\n  mathmlBuilder(group, options) {\n    var table = new MathNode(\"mtable\", [new MathNode(\"mtr\", [pad(), new MathNode(\"mtd\", [buildExpressionRow(group.body, options)]), pad(), new MathNode(\"mtd\", [buildExpressionRow(group.tag, options)])])]);\n    table.setAttribute(\"width\", \"100%\");\n    return table;\n    // TODO: Left-aligned tags.\n    // Currently, the group and options passed here do not contain\n    // enough info to set tag alignment. `leqno` is in Settings but it is\n    // not passed to Options. On the HTML side, leqno is\n    // set by a CSS class applied in buildTree.js. That would have worked\n    // in MathML if browsers supported <mlabeledtr>. Since they don't, we\n    // need to rewrite the way this function is called.\n  }\n});\n\n// Non-mathy text, possibly in a font\nvar textFontFamilies = {\n  \"\\\\text\": undefined,\n  \"\\\\textrm\": \"textrm\",\n  \"\\\\textsf\": \"textsf\",\n  \"\\\\texttt\": \"texttt\",\n  \"\\\\textnormal\": \"textrm\"\n};\nvar textFontWeights = {\n  \"\\\\textbf\": \"textbf\",\n  \"\\\\textmd\": \"textmd\"\n};\nvar textFontShapes = {\n  \"\\\\textit\": \"textit\",\n  \"\\\\textup\": \"textup\"\n};\nvar optionsWithFont = (group, options) => {\n  var font = group.font;\n  // Checks if the argument is a font family or a font style.\n  if (!font) {\n    return options;\n  } else if (textFontFamilies[font]) {\n    return options.withTextFontFamily(textFontFamilies[font]);\n  } else if (textFontWeights[font]) {\n    return options.withTextFontWeight(textFontWeights[font]);\n  } else if (font === \"\\\\emph\") {\n    return options.fontShape === \"textit\" ? options.withTextFontShape(\"textup\") : options.withTextFontShape(\"textit\");\n  }\n  return options.withTextFontShape(textFontShapes[font]);\n};\ndefineFunction({\n  type: \"text\",\n  names: [\n  // Font families\n  \"\\\\text\", \"\\\\textrm\", \"\\\\textsf\", \"\\\\texttt\", \"\\\\textnormal\",\n  // Font weights\n  \"\\\\textbf\", \"\\\\textmd\",\n  // Font Shapes\n  \"\\\\textit\", \"\\\\textup\", \"\\\\emph\"],\n  numArgs: 1,\n  argTypes: [\"text\"],\n  allowedInArgument: true,\n  allowedInText: true,\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"text\",\n      mode: parser.mode,\n      body: ordargument(body),\n      font: funcName\n    };\n  },\n  htmlBuilder(group, options) {\n    var newOptions = optionsWithFont(group, options);\n    var inner = buildExpression$1(group.body, newOptions, true);\n    return makeSpan([\"mord\", \"text\"], inner, newOptions);\n  },\n  mathmlBuilder(group, options) {\n    var newOptions = optionsWithFont(group, options);\n    return buildExpressionRow(group.body, newOptions);\n  }\n});\n\ndefineFunction({\n  type: \"underline\",\n  names: [\"\\\\underline\"],\n  numArgs: 1,\n  allowedInText: true,\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"underline\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    // Underlines are handled in the TeXbook pg 443, Rule 10.\n    // Build the inner group.\n    var innerGroup = buildGroup$1(group.body, options);\n    // Create the line to go below the body\n    var line = makeLineSpan(\"underline-line\", options);\n    // Generate the vlist, with the appropriate kerns\n    var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;\n    var vlist = makeVList({\n      positionType: \"top\",\n      positionData: innerGroup.height,\n      children: [{\n        type: \"kern\",\n        size: defaultRuleThickness\n      }, {\n        type: \"elem\",\n        elem: line\n      }, {\n        type: \"kern\",\n        size: 3 * defaultRuleThickness\n      }, {\n        type: \"elem\",\n        elem: innerGroup\n      }]\n    });\n    return makeSpan([\"mord\", \"underline\"], [vlist], options);\n  },\n  mathmlBuilder(group, options) {\n    var operator = new MathNode(\"mo\", [new TextNode(\"\\u203e\")]);\n    operator.setAttribute(\"stretchy\", \"true\");\n    var node = new MathNode(\"munder\", [buildGroup(group.body, options), operator]);\n    node.setAttribute(\"accentunder\", \"true\");\n    return node;\n  }\n});\n\n// \\vcenter:  Vertically center the argument group on the math axis.\ndefineFunction({\n  type: \"vcenter\",\n  names: [\"\\\\vcenter\"],\n  numArgs: 1,\n  argTypes: [\"original\"],\n  // In LaTeX, \\vcenter can act only on a box.\n  allowedInText: false,\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"vcenter\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    var body = buildGroup$1(group.body, options);\n    var axisHeight = options.fontMetrics().axisHeight;\n    var dy = 0.5 * (body.height - axisHeight - (body.depth + axisHeight));\n    return makeVList({\n      positionType: \"shift\",\n      positionData: dy,\n      children: [{\n        type: \"elem\",\n        elem: body\n      }]\n    });\n  },\n  mathmlBuilder(group, options) {\n    // There is no way to do this in MathML.\n    // Write a class as a breadcrumb in case some post-processor wants\n    // to perform a vcenter adjustment.\n    // Wrap in mrow to ensure valid MathML when placed inside mo (e.g., \\mathrel)\n    var mpadded = new MathNode(\"mpadded\", [buildGroup(group.body, options)], [\"vcenter\"]);\n    return new MathNode(\"mrow\", [mpadded]);\n  }\n});\n\ndefineFunction({\n  type: \"verb\",\n  names: [\"\\\\verb\"],\n  numArgs: 0,\n  allowedInText: true,\n  handler(context, args, optArgs) {\n    // \\verb and \\verb* are dealt with directly in Parser.js.\n    // If we end up here, it's because of a failure to match the two delimiters\n    // in the regex in Lexer.js.  LaTeX raises the following error when \\verb is\n    // terminated by end of line (or file).\n    throw new ParseError(\"\\\\verb ended by end of line instead of matching delimiter\");\n  },\n  htmlBuilder(group, options) {\n    var text = makeVerb(group);\n    var body = [];\n    // \\verb enters text mode and therefore is sized like \\textstyle\n    var newOptions = options.havingStyle(options.style.text());\n    for (var i = 0; i < text.length; i++) {\n      var c = text[i];\n      if (c === '~') {\n        c = '\\\\textasciitilde';\n      }\n      body.push(makeSymbol(c, \"Typewriter-Regular\", group.mode, newOptions, [\"mord\", \"texttt\"]));\n    }\n    return makeSpan([\"mord\", \"text\"].concat(newOptions.sizingClasses(options)), tryCombineChars(body), newOptions);\n  },\n  mathmlBuilder(group, options) {\n    var text = new TextNode(makeVerb(group));\n    var node = new MathNode(\"mtext\", [text]);\n    node.setAttribute(\"mathvariant\", \"monospace\");\n    return node;\n  }\n});\n/**\n * Converts verb group into body string.\n *\n * \\verb* replaces each space with an open box \\u2423\n * \\verb replaces each space with a no-break space \\xA0\n */\nvar makeVerb = group => group.body.replace(/ /g, group.star ? '\\u2423' : '\\xA0');\n\n/** Include this to ensure that all functions are defined. */\nvar functions = _functions;\n\n/**\n * The Lexer class handles tokenizing the input in various ways. Since our\n * parser expects us to be able to backtrack, the lexer allows lexing from any\n * given starting point.\n *\n * Its main exposed function is the `lex` function, which takes a position to\n * lex from and a type of token to lex. It defers to the appropriate `_innerLex`\n * function.\n *\n * The various `_innerLex` functions perform the actual lexing of different\n * kinds.\n */\n/* The following tokenRegex\n * - matches typical whitespace (but not NBSP etc.) using its first group\n * - does not match any control character \\x00-\\x1f except whitespace\n * - does not match a bare backslash\n * - matches any ASCII character except those just mentioned\n * - does not match the BMP private use area \\uE000-\\uF8FF\n * - does not match bare surrogate code units\n * - matches any BMP character except for those just described\n * - matches any valid Unicode surrogate pair\n * - matches a backslash followed by one or more whitespace characters\n * - matches a backslash followed by one or more letters then whitespace\n * - matches a backslash followed by any BMP character\n * Capturing groups:\n *   [1] regular whitespace\n *   [2] backslash followed by whitespace\n *   [3] anything else, which may include:\n *     [4] left character of \\verb*\n *     [5] left character of \\verb\n *     [6] backslash followed by word, excluding any trailing whitespace\n * Just because the Lexer matches something doesn't mean it's valid input:\n * If there is no matching function or symbol definition, the Parser will\n * still reject the input.\n */\nvar spaceRegexString = \"[ \\r\\n\\t]\";\nvar controlWordRegexString = \"\\\\\\\\[a-zA-Z@]+\";\nvar controlSymbolRegexString = \"\\\\\\\\[^\\uD800-\\uDFFF]\";\nvar controlWordWhitespaceRegexString = \"(\" + controlWordRegexString + \")\" + spaceRegexString + \"*\";\nvar controlSpaceRegexString = \"\\\\\\\\(\\n|[ \\r\\t]+\\n?)[ \\r\\t]*\";\nvar combiningDiacriticalMarkString = \"[\\u0300-\\u036f]\";\nvar combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + \"+$\");\nvar tokenRegexString = \"(\" + spaceRegexString + \"+)|\" + (// whitespace\ncontrolSpaceRegexString + \"|\") +\n// \\whitespace\n\"([!-\\\\[\\\\]-\\u2027\\u202A-\\uD7FF\\uF900-\\uFFFF]\" + (// single codepoint\ncombiningDiacriticalMarkString + \"*\") +\n// ...plus accents\n\"|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\" + (// surrogate pair\ncombiningDiacriticalMarkString + \"*\") +\n// ...plus accents\n\"|\\\\\\\\verb\\\\*([^]).*?\\\\4\" +\n// \\verb*\n\"|\\\\\\\\verb([^*a-zA-Z]).*?\\\\5\" + (// \\verb unstarred\n\"|\" + controlWordWhitespaceRegexString) + (// \\macroName + spaces\n\"|\" + controlSymbolRegexString + \")\"); // \\\\, \\', etc.\n/** Main Lexer class */\nclass Lexer {\n  constructor(input, settings) {\n    this.input = void 0;\n    this.settings = void 0;\n    this.tokenRegex = void 0;\n    // Category codes. The lexer only supports comment characters (14) for now.\n    // MacroExpander additionally distinguishes active (13).\n    this.catcodes = void 0;\n    // Separate accents from characters\n    this.input = input;\n    this.settings = settings;\n    this.tokenRegex = new RegExp(tokenRegexString, 'g');\n    this.catcodes = {\n      \"%\": 14,\n      // comment character\n      \"~\": 13 // active character\n    };\n  }\n  setCatcode(char, code) {\n    this.catcodes[char] = code;\n  }\n  /**\n   * This function lexes a single token.\n   */\n  lex() {\n    var input = this.input;\n    var pos = this.tokenRegex.lastIndex;\n    if (pos === input.length) {\n      return new Token(\"EOF\", new SourceLocation(this, pos, pos));\n    }\n    var match = this.tokenRegex.exec(input);\n    if (match === null || match.index !== pos) {\n      throw new ParseError(\"Unexpected character: '\" + input[pos] + \"'\", new Token(input[pos], new SourceLocation(this, pos, pos + 1)));\n    }\n    var text = match[6] || match[3] || (match[2] ? \"\\\\ \" : \" \");\n    if (this.catcodes[text] === 14) {\n      // comment character\n      var nlIndex = input.indexOf('\\n', this.tokenRegex.lastIndex);\n      if (nlIndex === -1) {\n        this.tokenRegex.lastIndex = input.length; // EOF\n        this.settings.reportNonstrict(\"commentAtEnd\", \"% comment has no terminating newline; LaTeX would \" + \"fail because of commenting the end of math mode (e.g. $)\");\n      } else {\n        this.tokenRegex.lastIndex = nlIndex + 1;\n      }\n      return this.lex();\n    }\n    return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));\n  }\n}\n\n/**\n * A `Namespace` refers to a space of nameable things like macros or lengths,\n * which can be `set` either globally or local to a nested group, using an\n * undo stack similar to how TeX implements this functionality.\n * Performance-wise, `get` and local `set` take constant time, while global\n * `set` takes time proportional to the depth of group nesting.\n */\nclass Namespace {\n  /**\n   * Both arguments are optional.  The first argument is an object of\n   * built-in mappings which never change.  The second argument is an object\n   * of initial (global-level) mappings, which will constantly change\n   * according to any global/top-level `set`s done.\n   */\n  constructor(builtins, globalMacros) {\n    if (builtins === void 0) {\n      builtins = {};\n    }\n    if (globalMacros === void 0) {\n      globalMacros = {};\n    }\n    this.current = void 0;\n    this.builtins = void 0;\n    this.undefStack = void 0;\n    this.current = globalMacros;\n    this.builtins = builtins;\n    this.undefStack = [];\n  }\n  /**\n   * Start a new nested group, affecting future local `set`s.\n   */\n  beginGroup() {\n    this.undefStack.push({});\n  }\n  /**\n   * End current nested group, restoring values before the group began.\n   */\n  endGroup() {\n    if (this.undefStack.length === 0) {\n      throw new ParseError(\"Unbalanced namespace destruction: attempt \" + \"to pop global namespace; please report this as a bug\");\n    }\n    var undefs = this.undefStack.pop();\n    for (var undef in undefs) {\n      if (undefs.hasOwnProperty(undef)) {\n        if (undefs[undef] == null) {\n          delete this.current[undef];\n        } else {\n          this.current[undef] = undefs[undef];\n        }\n      }\n    }\n  }\n  /**\n   * Ends all currently nested groups (if any), restoring values before the\n   * groups began.  Useful in case of an error in the middle of parsing.\n   */\n  endGroups() {\n    while (this.undefStack.length > 0) {\n      this.endGroup();\n    }\n  }\n  /**\n   * Detect whether `name` has a definition.  Equivalent to\n   * `get(name) != null`.\n   */\n  has(name) {\n    return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name);\n  }\n  /**\n   * Get the current value of a name, or `undefined` if there is no value.\n   *\n   * Note: Do not use `if (namespace.get(...))` to detect whether a macro\n   * is defined, as the definition may be the empty string which evaluates\n   * to `false` in JavaScript.  Use `if (namespace.get(...) != null)` or\n   * `if (namespace.has(...))`.\n   */\n  get(name) {\n    if (this.current.hasOwnProperty(name)) {\n      return this.current[name];\n    } else {\n      return this.builtins[name];\n    }\n  }\n  /**\n   * Set the current value of a name, and optionally set it globally too.\n   * Local set() sets the current value and (when appropriate) adds an undo\n   * operation to the undo stack.  Global set() may change the undo\n   * operation at every level, so takes time linear in their number.\n   * A value of undefined means to delete existing definitions.\n   */\n  set(name, value, global) {\n    if (global === void 0) {\n      global = false;\n    }\n    if (global) {\n      // Global set is equivalent to setting in all groups.  Simulate this\n      // by destroying any undos currently scheduled for this name,\n      // and adding an undo with the *new* value (in case it later gets\n      // locally reset within this environment).\n      for (var i = 0; i < this.undefStack.length; i++) {\n        delete this.undefStack[i][name];\n      }\n      if (this.undefStack.length > 0) {\n        this.undefStack[this.undefStack.length - 1][name] = value;\n      }\n    } else {\n      // Undo this set at end of this group (possibly to `undefined`),\n      // unless an undo is already in place, in which case that older\n      // value is the correct one.\n      var top = this.undefStack[this.undefStack.length - 1];\n      if (top && !top.hasOwnProperty(name)) {\n        top[name] = this.current[name];\n      }\n    }\n    if (value == null) {\n      delete this.current[name];\n    } else {\n      this.current[name] = value;\n    }\n  }\n}\n\n/**\n * Predefined macros for KaTeX.\n * This can be used to define some commands in terms of others.\n */\nvar macros = _macros;\n//////////////////////////////////////////////////////////////////////\n// macro tools\ndefineMacro(\"\\\\noexpand\", function (context) {\n  // The expansion is the token itself; but that token is interpreted\n  // as if its meaning were ‘\\relax’ if it is a control sequence that\n  // would ordinarily be expanded by TeX’s expansion rules.\n  var t = context.popToken();\n  if (context.isExpandable(t.text)) {\n    t.noexpand = true;\n    t.treatAsRelax = true;\n  }\n  return {\n    tokens: [t],\n    numArgs: 0\n  };\n});\ndefineMacro(\"\\\\expandafter\", function (context) {\n  // TeX first reads the token that comes immediately after \\expandafter,\n  // without expanding it; let’s call this token t. Then TeX reads the\n  // token that comes after t (and possibly more tokens, if that token\n  // has an argument), replacing it by its expansion. Finally TeX puts\n  // t back in front of that expansion.\n  var t = context.popToken();\n  context.expandOnce(true); // expand only an expandable token\n  return {\n    tokens: [t],\n    numArgs: 0\n  };\n});\n// LaTeX's \\@firstoftwo{#1}{#2} expands to #1, skipping #2\n// TeX source: \\long\\def\\@firstoftwo#1#2{#1}\ndefineMacro(\"\\\\@firstoftwo\", function (context) {\n  var args = context.consumeArgs(2);\n  return {\n    tokens: args[0],\n    numArgs: 0\n  };\n});\n// LaTeX's \\@secondoftwo{#1}{#2} expands to #2, skipping #1\n// TeX source: \\long\\def\\@secondoftwo#1#2{#2}\ndefineMacro(\"\\\\@secondoftwo\", function (context) {\n  var args = context.consumeArgs(2);\n  return {\n    tokens: args[1],\n    numArgs: 0\n  };\n});\n// LaTeX's \\@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)\n// symbol that isn't a space, consuming any spaces but not consuming the\n// first nonspace character.  If that nonspace character matches #1, then\n// the macro expands to #2; otherwise, it expands to #3.\ndefineMacro(\"\\\\@ifnextchar\", function (context) {\n  var args = context.consumeArgs(3); // symbol, if, else\n  context.consumeSpaces();\n  var nextToken = context.future();\n  if (args[0].length === 1 && args[0][0].text === nextToken.text) {\n    return {\n      tokens: args[1],\n      numArgs: 0\n    };\n  } else {\n    return {\n      tokens: args[2],\n      numArgs: 0\n    };\n  }\n});\n// LaTeX's \\@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.\n// If it is `*`, then it consumes the symbol, and the macro expands to #1;\n// otherwise, the macro expands to #2 (without consuming the symbol).\n// TeX source: \\def\\@ifstar#1{\\@ifnextchar *{\\@firstoftwo{#1}}}\ndefineMacro(\"\\\\@ifstar\", \"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\");\n// LaTeX's \\TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode\ndefineMacro(\"\\\\TextOrMath\", function (context) {\n  var args = context.consumeArgs(2);\n  if (context.mode === 'text') {\n    return {\n      tokens: args[0],\n      numArgs: 0\n    };\n  } else {\n    return {\n      tokens: args[1],\n      numArgs: 0\n    };\n  }\n});\n// Lookup table for parsing numbers in base 8 through 16\nvar digitToNumber = {\n  \"0\": 0,\n  \"1\": 1,\n  \"2\": 2,\n  \"3\": 3,\n  \"4\": 4,\n  \"5\": 5,\n  \"6\": 6,\n  \"7\": 7,\n  \"8\": 8,\n  \"9\": 9,\n  \"a\": 10,\n  \"A\": 10,\n  \"b\": 11,\n  \"B\": 11,\n  \"c\": 12,\n  \"C\": 12,\n  \"d\": 13,\n  \"D\": 13,\n  \"e\": 14,\n  \"E\": 14,\n  \"f\": 15,\n  \"F\": 15\n};\n// TeX \\char makes a literal character (catcode 12) using the following forms:\n// (see The TeXBook, p. 43)\n//   \\char123  -- decimal\n//   \\char'123 -- octal\n//   \\char\"123 -- hex\n//   \\char`x   -- character that can be written (i.e. isn't active)\n//   \\char`\\x  -- character that cannot be written (e.g. %)\n// These all refer to characters from the font, so we turn them into special\n// calls to a function \\@char dealt with in the Parser.\ndefineMacro(\"\\\\char\", function (context) {\n  var token = context.popToken();\n  var base;\n  var number = 0;\n  if (token.text === \"'\") {\n    base = 8;\n    token = context.popToken();\n  } else if (token.text === '\"') {\n    base = 16;\n    token = context.popToken();\n  } else if (token.text === \"`\") {\n    token = context.popToken();\n    if (token.text[0] === \"\\\\\") {\n      number = token.text.charCodeAt(1);\n    } else if (token.text === \"EOF\") {\n      throw new ParseError(\"\\\\char` missing argument\");\n    } else {\n      number = token.text.charCodeAt(0);\n    }\n  } else {\n    base = 10;\n  }\n  if (base) {\n    // Parse a number in the given base, starting with first `token`.\n    number = digitToNumber[token.text];\n    if (number == null || number >= base) {\n      throw new ParseError(\"Invalid base-\" + base + \" digit \" + token.text);\n    }\n    var digit;\n    while ((digit = digitToNumber[context.future().text]) != null && digit < base) {\n      number *= base;\n      number += digit;\n      context.popToken();\n    }\n  }\n  return \"\\\\@char{\" + number + \"}\";\n});\n// \\newcommand{\\macro}[args]{definition}\n// \\renewcommand{\\macro}[args]{definition}\n// TODO: Optional arguments: \\newcommand{\\macro}[args][default]{definition}\nvar newcommand = (context, existsOK, nonexistsOK, skipIfExists) => {\n  var arg = context.consumeArg().tokens;\n  if (arg.length !== 1) {\n    throw new ParseError(\"\\\\newcommand's first argument must be a macro name\");\n  }\n  var name = arg[0].text;\n  var exists = context.isDefined(name);\n  if (exists && !existsOK) {\n    throw new ParseError(\"\\\\newcommand{\" + name + \"} attempting to redefine \" + (name + \"; use \\\\renewcommand\"));\n  }\n  if (!exists && !nonexistsOK) {\n    throw new ParseError(\"\\\\renewcommand{\" + name + \"} when command \" + name + \" \" + \"does not yet exist; use \\\\newcommand\");\n  }\n  var numArgs = 0;\n  arg = context.consumeArg().tokens;\n  if (arg.length === 1 && arg[0].text === \"[\") {\n    var argText = '';\n    var token = context.expandNextToken();\n    while (token.text !== \"]\" && token.text !== \"EOF\") {\n      // TODO: Should properly expand arg, e.g., ignore {}s\n      argText += token.text;\n      token = context.expandNextToken();\n    }\n    if (!argText.match(/^\\s*[0-9]+\\s*$/)) {\n      throw new ParseError(\"Invalid number of arguments: \" + argText);\n    }\n    numArgs = parseInt(argText);\n    arg = context.consumeArg().tokens;\n  }\n  if (!(exists && skipIfExists)) {\n    // Final arg is the expansion of the macro\n    context.macros.set(name, {\n      tokens: arg,\n      numArgs\n    });\n  }\n  return '';\n};\ndefineMacro(\"\\\\newcommand\", context => newcommand(context, false, true, false));\ndefineMacro(\"\\\\renewcommand\", context => newcommand(context, true, false, false));\ndefineMacro(\"\\\\providecommand\", context => newcommand(context, true, true, true));\n// terminal (console) tools\ndefineMacro(\"\\\\message\", context => {\n  var arg = context.consumeArgs(1)[0];\n  // eslint-disable-next-line no-console\n  console.log(arg.reverse().map(token => token.text).join(\"\"));\n  return '';\n});\ndefineMacro(\"\\\\errmessage\", context => {\n  var arg = context.consumeArgs(1)[0];\n  // eslint-disable-next-line no-console\n  console.error(arg.reverse().map(token => token.text).join(\"\"));\n  return '';\n});\ndefineMacro(\"\\\\show\", context => {\n  var tok = context.popToken();\n  var name = tok.text;\n  // eslint-disable-next-line no-console\n  console.log(tok, context.macros.get(name), functions[name], symbols.math[name], symbols.text[name]);\n  return '';\n});\n//////////////////////////////////////////////////////////////////////\n// Grouping\n// \\let\\bgroup={ \\let\\egroup=}\ndefineMacro(\"\\\\bgroup\", \"{\");\ndefineMacro(\"\\\\egroup\", \"}\");\n// Symbols from latex.ltx:\n// \\def~{\\nobreakspace{}}\n// \\def\\lq{`}\n// \\def\\rq{'}\n// \\def \\aa {\\r a}\n// \\def \\AA {\\r A}\ndefineMacro(\"~\", \"\\\\nobreakspace\");\ndefineMacro(\"\\\\lq\", \"`\");\ndefineMacro(\"\\\\rq\", \"'\");\ndefineMacro(\"\\\\aa\", \"\\\\r a\");\ndefineMacro(\"\\\\AA\", \"\\\\r A\");\n// Copyright (C) and registered (R) symbols. Use raw symbol in MathML.\n// \\DeclareTextCommandDefault{\\textcopyright}{\\textcircled{c}}\n// \\DeclareTextCommandDefault{\\textregistered}{\\textcircled{%\n//      \\check@mathfonts\\fontsize\\sf@size\\z@\\math@fontsfalse\\selectfont R}}\n// \\DeclareRobustCommand{\\copyright}{%\n//    \\ifmmode{\\nfss@text{\\textcopyright}}\\else\\textcopyright\\fi}\ndefineMacro(\"\\\\textcopyright\", \"\\\\html@mathml{\\\\textcircled{c}}{\\\\char`©}\");\ndefineMacro(\"\\\\copyright\", \"\\\\TextOrMath{\\\\textcopyright}{\\\\text{\\\\textcopyright}}\");\ndefineMacro(\"\\\\textregistered\", \"\\\\html@mathml{\\\\textcircled{\\\\scriptsize R}}{\\\\char`®}\");\n// Characters omitted from Unicode range 1D400–1D7FF\ndefineMacro(\"\\u212C\", \"\\\\mathscr{B}\"); // script\ndefineMacro(\"\\u2130\", \"\\\\mathscr{E}\");\ndefineMacro(\"\\u2131\", \"\\\\mathscr{F}\");\ndefineMacro(\"\\u210B\", \"\\\\mathscr{H}\");\ndefineMacro(\"\\u2110\", \"\\\\mathscr{I}\");\ndefineMacro(\"\\u2112\", \"\\\\mathscr{L}\");\ndefineMacro(\"\\u2133\", \"\\\\mathscr{M}\");\ndefineMacro(\"\\u211B\", \"\\\\mathscr{R}\");\ndefineMacro(\"\\u212D\", \"\\\\mathfrak{C}\"); // Fraktur\ndefineMacro(\"\\u210C\", \"\\\\mathfrak{H}\");\ndefineMacro(\"\\u2128\", \"\\\\mathfrak{Z}\");\n// Define \\Bbbk with a macro that works in both HTML and MathML.\ndefineMacro(\"\\\\Bbbk\", \"\\\\Bbb{k}\");\n// \\llap and \\rlap render their contents in text mode\ndefineMacro(\"\\\\llap\", \"\\\\mathllap{\\\\textrm{#1}}\");\ndefineMacro(\"\\\\rlap\", \"\\\\mathrlap{\\\\textrm{#1}}\");\ndefineMacro(\"\\\\clap\", \"\\\\mathclap{\\\\textrm{#1}}\");\n// \\mathstrut from the TeXbook, p 360\ndefineMacro(\"\\\\mathstrut\", \"\\\\vphantom{(}\");\n// \\underbar from TeXbook p 353\ndefineMacro(\"\\\\underbar\", \"\\\\underline{\\\\text{#1}}\");\n// \\not is defined by base/fontmath.ltx via\n// \\DeclareMathSymbol{\\not}{\\mathrel}{symbols}{\"36}\n// It's thus treated like a \\mathrel, but defined by a symbol that has zero\n// width but extends to the right.  We use \\rlap to get that spacing.\n// For MathML we write U+0338 here. buildMathML.js will then do the overlay.\ndefineMacro(\"\\\\not\", \"\\\\html@mathml{\\\\mathrel{\\\\mathrlap\\\\@not}\\\\nobreak}\" + \"{\\\\char\\\"338}\");\n// Negated symbols from base/fontmath.ltx:\n// \\def\\neq{\\not=} \\let\\ne=\\neq\n// \\DeclareRobustCommand\n//   \\notin{\\mathrel{\\m@th\\mathpalette\\c@ncel\\in}}\n// \\def\\c@ncel#1#2{\\m@th\\ooalign{$\\hfil#1\\mkern1mu/\\hfil$\\crcr$#1#2$}}\ndefineMacro(\"\\\\neq\", \"\\\\html@mathml{\\\\mathrel{\\\\not=}}{\\\\mathrel{\\\\char`≠}}\");\ndefineMacro(\"\\\\ne\", \"\\\\neq\");\ndefineMacro(\"\\u2260\", \"\\\\neq\");\ndefineMacro(\"\\\\notin\", \"\\\\html@mathml{\\\\mathrel{{\\\\in}\\\\mathllap{/\\\\mskip1mu}}}\" + \"{\\\\mathrel{\\\\char`∉}}\");\ndefineMacro(\"\\u2209\", \"\\\\notin\");\n// Unicode stacked relations\ndefineMacro(\"\\u2258\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\kern{-1em}\\\\raisebox{0.4em}{$\\\\scriptsize\\\\frown$}}\" + \"}{\\\\mathrel{\\\\char`\\u2258}}\");\ndefineMacro(\"\\u2259\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\wedge}{=}}{\\\\mathrel{\\\\char`\\u2258}}\");\ndefineMacro(\"\\u225A\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\vee}{=}}{\\\\mathrel{\\\\char`\\u225A}}\");\ndefineMacro(\"\\u225B\", \"\\\\html@mathml{\\\\stackrel{\\\\scriptsize\\\\star}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225B}}\");\ndefineMacro(\"\\u225D\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{def}}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225D}}\");\ndefineMacro(\"\\u225E\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{m}}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225E}}\");\ndefineMacro(\"\\u225F\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny?}{=}}{\\\\mathrel{\\\\char`\\u225F}}\");\n// Misc Unicode\ndefineMacro(\"\\u27C2\", \"\\\\perp\");\ndefineMacro(\"\\u203C\", \"\\\\mathclose{!\\\\mkern-0.8mu!}\");\ndefineMacro(\"\\u220C\", \"\\\\notni\");\ndefineMacro(\"\\u231C\", \"\\\\ulcorner\");\ndefineMacro(\"\\u231D\", \"\\\\urcorner\");\ndefineMacro(\"\\u231E\", \"\\\\llcorner\");\ndefineMacro(\"\\u231F\", \"\\\\lrcorner\");\ndefineMacro(\"\\u00A9\", \"\\\\copyright\");\ndefineMacro(\"\\u00AE\", \"\\\\textregistered\");\n// The KaTeX fonts have corners at codepoints that don't match Unicode.\n// For MathML purposes, use the Unicode code point.\ndefineMacro(\"\\\\ulcorner\", \"\\\\html@mathml{\\\\@ulcorner}{\\\\mathop{\\\\char\\\"231c}}\");\ndefineMacro(\"\\\\urcorner\", \"\\\\html@mathml{\\\\@urcorner}{\\\\mathop{\\\\char\\\"231d}}\");\ndefineMacro(\"\\\\llcorner\", \"\\\\html@mathml{\\\\@llcorner}{\\\\mathop{\\\\char\\\"231e}}\");\ndefineMacro(\"\\\\lrcorner\", \"\\\\html@mathml{\\\\@lrcorner}{\\\\mathop{\\\\char\\\"231f}}\");\n//////////////////////////////////////////////////////////////////////\n// LaTeX_2ε\n// \\vdots{\\vbox{\\baselineskip4\\p@  \\lineskiplimit\\z@\n// \\kern6\\p@\\hbox{.}\\hbox{.}\\hbox{.}}}\n// We'll call \\varvdots, which gets a glyph from symbols.js.\n// The zero-width rule gets us an equivalent to the vertical 6pt kern.\ndefineMacro(\"\\\\vdots\", \"{\\\\varvdots\\\\rule{0pt}{15pt}}\");\ndefineMacro(\"\\u22ee\", \"\\\\vdots\");\n//////////////////////////////////////////////////////////////////////\n// amsmath.sty\n// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf\n// Italic Greek capital letters.  AMS defines these with \\DeclareMathSymbol,\n// but they are equivalent to \\mathit{\\Letter}.\ndefineMacro(\"\\\\varGamma\", \"\\\\mathit{\\\\Gamma}\");\ndefineMacro(\"\\\\varDelta\", \"\\\\mathit{\\\\Delta}\");\ndefineMacro(\"\\\\varTheta\", \"\\\\mathit{\\\\Theta}\");\ndefineMacro(\"\\\\varLambda\", \"\\\\mathit{\\\\Lambda}\");\ndefineMacro(\"\\\\varXi\", \"\\\\mathit{\\\\Xi}\");\ndefineMacro(\"\\\\varPi\", \"\\\\mathit{\\\\Pi}\");\ndefineMacro(\"\\\\varSigma\", \"\\\\mathit{\\\\Sigma}\");\ndefineMacro(\"\\\\varUpsilon\", \"\\\\mathit{\\\\Upsilon}\");\ndefineMacro(\"\\\\varPhi\", \"\\\\mathit{\\\\Phi}\");\ndefineMacro(\"\\\\varPsi\", \"\\\\mathit{\\\\Psi}\");\ndefineMacro(\"\\\\varOmega\", \"\\\\mathit{\\\\Omega}\");\n//\\newcommand{\\substack}[1]{\\subarray{c}#1\\endsubarray}\ndefineMacro(\"\\\\substack\", \"\\\\begin{subarray}{c}#1\\\\end{subarray}\");\n// \\renewcommand{\\colon}{\\nobreak\\mskip2mu\\mathpunct{}\\nonscript\n// \\mkern-\\thinmuskip{:}\\mskip6muplus1mu\\relax}\ndefineMacro(\"\\\\colon\", \"\\\\nobreak\\\\mskip2mu\\\\mathpunct{}\" + \"\\\\mathchoice{\\\\mkern-3mu}{\\\\mkern-3mu}{}{}{:}\\\\mskip6mu\\\\relax\");\n// \\newcommand{\\boxed}[1]{\\fbox{\\m@th$\\displaystyle#1$}}\ndefineMacro(\"\\\\boxed\", \"\\\\fbox{$\\\\displaystyle{#1}$}\");\n// \\def\\iff{\\DOTSB\\;\\Longleftrightarrow\\;}\n// \\def\\implies{\\DOTSB\\;\\Longrightarrow\\;}\n// \\def\\impliedby{\\DOTSB\\;\\Longleftarrow\\;}\ndefineMacro(\"\\\\iff\", \"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\");\ndefineMacro(\"\\\\implies\", \"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\");\ndefineMacro(\"\\\\impliedby\", \"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\");\n// \\def\\dddot#1{{\\mathop{#1}\\limits^{\\vbox to-1.4\\ex@{\\kern-\\tw@\\ex@\n//  \\hbox{\\normalfont ...}\\vss}}}}\n// We use \\overset which avoids the vertical shift of \\mathop.\ndefineMacro(\"\\\\dddot\", \"{\\\\overset{\\\\raisebox{-0.1ex}{\\\\normalsize ...}}{#1}}\");\ndefineMacro(\"\\\\ddddot\", \"{\\\\overset{\\\\raisebox{-0.1ex}{\\\\normalsize ....}}{#1}}\");\n// AMSMath's automatic \\dots, based on \\mdots@@ macro.\nvar dotsByToken = {\n  ',': '\\\\dotsc',\n  '\\\\not': '\\\\dotsb',\n  // \\keybin@ checks for the following:\n  '+': '\\\\dotsb',\n  '=': '\\\\dotsb',\n  '<': '\\\\dotsb',\n  '>': '\\\\dotsb',\n  '-': '\\\\dotsb',\n  '*': '\\\\dotsb',\n  ':': '\\\\dotsb',\n  // Symbols whose definition starts with \\DOTSB:\n  '\\\\DOTSB': '\\\\dotsb',\n  '\\\\coprod': '\\\\dotsb',\n  '\\\\bigvee': '\\\\dotsb',\n  '\\\\bigwedge': '\\\\dotsb',\n  '\\\\biguplus': '\\\\dotsb',\n  '\\\\bigcap': '\\\\dotsb',\n  '\\\\bigcup': '\\\\dotsb',\n  '\\\\prod': '\\\\dotsb',\n  '\\\\sum': '\\\\dotsb',\n  '\\\\bigotimes': '\\\\dotsb',\n  '\\\\bigoplus': '\\\\dotsb',\n  '\\\\bigodot': '\\\\dotsb',\n  '\\\\bigsqcup': '\\\\dotsb',\n  '\\\\And': '\\\\dotsb',\n  '\\\\longrightarrow': '\\\\dotsb',\n  '\\\\Longrightarrow': '\\\\dotsb',\n  '\\\\longleftarrow': '\\\\dotsb',\n  '\\\\Longleftarrow': '\\\\dotsb',\n  '\\\\longleftrightarrow': '\\\\dotsb',\n  '\\\\Longleftrightarrow': '\\\\dotsb',\n  '\\\\mapsto': '\\\\dotsb',\n  '\\\\longmapsto': '\\\\dotsb',\n  '\\\\hookrightarrow': '\\\\dotsb',\n  '\\\\doteq': '\\\\dotsb',\n  // Symbols whose definition starts with \\mathbin:\n  '\\\\mathbin': '\\\\dotsb',\n  // Symbols whose definition starts with \\mathrel:\n  '\\\\mathrel': '\\\\dotsb',\n  '\\\\relbar': '\\\\dotsb',\n  '\\\\Relbar': '\\\\dotsb',\n  '\\\\xrightarrow': '\\\\dotsb',\n  '\\\\xleftarrow': '\\\\dotsb',\n  // Symbols whose definition starts with \\DOTSI:\n  '\\\\DOTSI': '\\\\dotsi',\n  '\\\\int': '\\\\dotsi',\n  '\\\\oint': '\\\\dotsi',\n  '\\\\iint': '\\\\dotsi',\n  '\\\\iiint': '\\\\dotsi',\n  '\\\\iiiint': '\\\\dotsi',\n  '\\\\idotsint': '\\\\dotsi',\n  // Symbols whose definition starts with \\DOTSX:\n  '\\\\DOTSX': '\\\\dotsx'\n};\nvar dotsbGroups = new Set(['bin', 'rel']);\ndefineMacro(\"\\\\dots\", function (context) {\n  // TODO: If used in text mode, should expand to \\textellipsis.\n  // However, in KaTeX, \\textellipsis and \\ldots behave the same\n  // (in text mode), and it's unlikely we'd see any of the math commands\n  // that affect the behavior of \\dots when in text mode.  So fine for now\n  // (until we support \\ifmmode ... \\else ... \\fi).\n  var thedots = '\\\\dotso';\n  var next = context.expandAfterFuture().text;\n  if (next in dotsByToken) {\n    thedots = dotsByToken[next];\n  } else if (next.slice(0, 4) === '\\\\not') {\n    thedots = '\\\\dotsb';\n  } else if (next in symbols.math) {\n    if (dotsbGroups.has(symbols.math[next].group)) {\n      thedots = '\\\\dotsb';\n    }\n  }\n  return thedots;\n});\nvar spaceAfterDots = {\n  // \\rightdelim@ checks for the following:\n  ')': true,\n  ']': true,\n  '\\\\rbrack': true,\n  '\\\\}': true,\n  '\\\\rbrace': true,\n  '\\\\rangle': true,\n  '\\\\rceil': true,\n  '\\\\rfloor': true,\n  '\\\\rgroup': true,\n  '\\\\rmoustache': true,\n  '\\\\right': true,\n  '\\\\bigr': true,\n  '\\\\biggr': true,\n  '\\\\Bigr': true,\n  '\\\\Biggr': true,\n  // \\extra@ also tests for the following:\n  '$': true,\n  // \\extrap@ checks for the following:\n  ';': true,\n  '.': true,\n  ',': true\n};\ndefineMacro(\"\\\\dotso\", function (context) {\n  var next = context.future().text;\n  if (next in spaceAfterDots) {\n    return \"\\\\ldots\\\\,\";\n  } else {\n    return \"\\\\ldots\";\n  }\n});\ndefineMacro(\"\\\\dotsc\", function (context) {\n  var next = context.future().text;\n  // \\dotsc uses \\extra@ but not \\extrap@, instead specially checking for\n  // ';' and '.', but doesn't check for ','.\n  if (next in spaceAfterDots && next !== ',') {\n    return \"\\\\ldots\\\\,\";\n  } else {\n    return \"\\\\ldots\";\n  }\n});\ndefineMacro(\"\\\\cdots\", function (context) {\n  var next = context.future().text;\n  if (next in spaceAfterDots) {\n    return \"\\\\@cdots\\\\,\";\n  } else {\n    return \"\\\\@cdots\";\n  }\n});\ndefineMacro(\"\\\\dotsb\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsm\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsi\", \"\\\\!\\\\cdots\");\n// amsmath doesn't actually define \\dotsx, but \\dots followed by a macro\n// starting with \\DOTSX implies \\dotso, and then \\extra@ detects this case\n// and forces the added `\\,`.\ndefineMacro(\"\\\\dotsx\", \"\\\\ldots\\\\,\");\n// \\let\\DOTSI\\relax\n// \\let\\DOTSB\\relax\n// \\let\\DOTSX\\relax\ndefineMacro(\"\\\\DOTSI\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSB\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSX\", \"\\\\relax\");\n// Spacing, based on amsmath.sty's override of LaTeX defaults\n// \\DeclareRobustCommand{\\tmspace}[3]{%\n//   \\ifmmode\\mskip#1#2\\else\\kern#1#3\\fi\\relax}\ndefineMacro(\"\\\\tmspace\", \"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\");\n// \\renewcommand{\\,}{\\tmspace+\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\,\", \"\\\\tmspace+{3mu}{.1667em}\");\n// \\let\\thinspace\\,\ndefineMacro(\"\\\\thinspace\", \"\\\\,\");\n// \\def\\>{\\mskip\\medmuskip}\n// \\renewcommand{\\:}{\\tmspace+\\medmuskip{.2222em}}\n// TODO: \\> and math mode of \\: should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\>\", \"\\\\mskip{4mu}\");\ndefineMacro(\"\\\\:\", \"\\\\tmspace+{4mu}{.2222em}\");\n// \\let\\medspace\\:\ndefineMacro(\"\\\\medspace\", \"\\\\:\");\n// \\renewcommand{\\;}{\\tmspace+\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip = 5mu plus 5mu\ndefineMacro(\"\\\\;\", \"\\\\tmspace+{5mu}{.2777em}\");\n// \\let\\thickspace\\;\ndefineMacro(\"\\\\thickspace\", \"\\\\;\");\n// \\renewcommand{\\!}{\\tmspace-\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\!\", \"\\\\tmspace-{3mu}{.1667em}\");\n// \\let\\negthinspace\\!\ndefineMacro(\"\\\\negthinspace\", \"\\\\!\");\n// \\newcommand{\\negmedspace}{\\tmspace-\\medmuskip{.2222em}}\n// TODO: math mode should use \\medmuskip\ndefineMacro(\"\\\\negmedspace\", \"\\\\tmspace-{4mu}{.2222em}\");\n// \\newcommand{\\negthickspace}{\\tmspace-\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip\ndefineMacro(\"\\\\negthickspace\", \"\\\\tmspace-{5mu}{.277em}\");\n// \\def\\enspace{\\kern.5em }\ndefineMacro(\"\\\\enspace\", \"\\\\kern.5em \");\n// \\def\\enskip{\\hskip.5em\\relax}\ndefineMacro(\"\\\\enskip\", \"\\\\hskip.5em\\\\relax\");\n// \\def\\quad{\\hskip1em\\relax}\ndefineMacro(\"\\\\quad\", \"\\\\hskip1em\\\\relax\");\n// \\def\\qquad{\\hskip2em\\relax}\ndefineMacro(\"\\\\qquad\", \"\\\\hskip2em\\\\relax\");\n// \\tag@in@display form of \\tag\ndefineMacro(\"\\\\tag\", \"\\\\@ifstar\\\\tag@literal\\\\tag@paren\");\ndefineMacro(\"\\\\tag@paren\", \"\\\\tag@literal{({#1})}\");\ndefineMacro(\"\\\\tag@literal\", context => {\n  if (context.macros.get(\"\\\\df@tag\")) {\n    throw new ParseError(\"Multiple \\\\tag\");\n  }\n  return \"\\\\gdef\\\\df@tag{\\\\text{#1}}\";\n});\n// \\renewcommand{\\bmod}{\\nonscript\\mskip-\\medmuskip\\mkern5mu\\mathbin\n//   {\\operator@font mod}\\penalty900\n//   \\mkern5mu\\nonscript\\mskip-\\medmuskip}\n// \\newcommand{\\pod}[1]{\\allowbreak\n//   \\if@display\\mkern18mu\\else\\mkern8mu\\fi(#1)}\n// \\renewcommand{\\pmod}[1]{\\pod{{\\operator@font mod}\\mkern6mu#1}}\n// \\newcommand{\\mod}[1]{\\allowbreak\\if@display\\mkern18mu\n//   \\else\\mkern12mu\\fi{\\operator@font mod}\\,\\,#1}\n// TODO: math mode should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\bmod\", \"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\" + \"\\\\mathbin{\\\\rm mod}\" + \"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\");\ndefineMacro(\"\\\\pod\", \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\");\ndefineMacro(\"\\\\pmod\", \"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\");\ndefineMacro(\"\\\\mod\", \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}\" + \"{\\\\rm mod}\\\\,\\\\,#1\");\n//////////////////////////////////////////////////////////////////////\n// LaTeX source2e\n// \\expandafter\\let\\expandafter\\@normalcr\n//     \\csname\\expandafter\\@gobble\\string\\\\ \\endcsname\n// \\DeclareRobustCommand\\newline{\\@normalcr\\relax}\ndefineMacro(\"\\\\newline\", \"\\\\\\\\\\\\relax\");\n// \\def\\TeX{T\\kern-.1667em\\lower.5ex\\hbox{E}\\kern-.125emX\\@}\n// TODO: Doesn't normally work in math mode because \\@ fails.  KaTeX doesn't\n// support \\@ yet, so that's omitted, and we add \\text so that the result\n// doesn't look funny in math mode.\ndefineMacro(\"\\\\TeX\", \"\\\\textrm{\\\\html@mathml{\" + \"T\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125emX\" + \"}{TeX}}\");\n// \\DeclareRobustCommand{\\LaTeX}{L\\kern-.36em%\n//         {\\sbox\\z@ T%\n//          \\vbox to\\ht\\z@{\\hbox{\\check@mathfonts\n//                               \\fontsize\\sf@size\\z@\n//                               \\math@fontsfalse\\selectfont\n//                               A}%\n//                         \\vss}%\n//         }%\n//         \\kern-.15em%\n//         \\TeX}\n// This code aligns the top of the A with the T (from the perspective of TeX's\n// boxes, though visually the A appears to extend above slightly).\n// We compute the corresponding \\raisebox when A is rendered in \\normalsize\n// \\scriptstyle, which has a scale factor of 0.7 (see Options.js).\nvar latexRaiseA = makeEm(fontMetricsData['Main-Regular'][\"T\".charCodeAt(0)][1] - 0.7 * fontMetricsData['Main-Regular'][\"A\".charCodeAt(0)][1]);\ndefineMacro(\"\\\\LaTeX\", \"\\\\textrm{\\\\html@mathml{\" + (\"L\\\\kern-.36em\\\\raisebox{\" + latexRaiseA + \"}{\\\\scriptstyle A}\") + \"\\\\kern-.15em\\\\TeX}{LaTeX}}\");\n// New KaTeX logo based on tweaking LaTeX logo\ndefineMacro(\"\\\\KaTeX\", \"\\\\textrm{\\\\html@mathml{\" + (\"K\\\\kern-.17em\\\\raisebox{\" + latexRaiseA + \"}{\\\\scriptstyle A}\") + \"\\\\kern-.15em\\\\TeX}{KaTeX}}\");\n// \\DeclareRobustCommand\\hspace{\\@ifstar\\@hspacer\\@hspace}\n// \\def\\@hspace#1{\\hskip  #1\\relax}\n// \\def\\@hspacer#1{\\vrule \\@width\\z@\\nobreak\n//                 \\hskip #1\\hskip \\z@skip}\ndefineMacro(\"\\\\hspace\", \"\\\\@ifstar\\\\@hspacer\\\\@hspace\");\ndefineMacro(\"\\\\@hspace\", \"\\\\hskip #1\\\\relax\");\ndefineMacro(\"\\\\@hspacer\", \"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\");\n//////////////////////////////////////////////////////////////////////\n// mathtools.sty\n//\\providecommand\\ordinarycolon{:}\ndefineMacro(\"\\\\ordinarycolon\", \":\");\n//\\def\\vcentcolon{\\mathrel{\\mathop\\ordinarycolon}}\n//TODO(edemaine): Not yet centered. Fix via \\raisebox or #726\ndefineMacro(\"\\\\vcentcolon\", \"\\\\mathrel{\\\\mathop\\\\ordinarycolon}\");\n// \\providecommand*\\dblcolon{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}\ndefineMacro(\"\\\\dblcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-.9mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2237}}\");\n// \\providecommand*\\coloneqq{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}\ndefineMacro(\"\\\\coloneqq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}=}}\" + \"{\\\\mathop{\\\\char\\\"2254}}\"); // ≔\n// \\providecommand*\\Coloneqq{\\dblcolon\\mathrel{\\mkern-1.2mu}=}\ndefineMacro(\"\\\\Coloneqq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}=}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"3d}}\");\n// \\providecommand*\\coloneq{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\coloneq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"2212}}\");\n// \\providecommand*\\Coloneq{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\Coloneq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"2212}}\");\n// \\providecommand*\\eqqcolon{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}\ndefineMacro(\"\\\\eqqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2255}}\"); // ≕\n// \\providecommand*\\Eqqcolon{=\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}\" + \"{\\\\mathop{\\\\char\\\"3d\\\\char\\\"2237}}\");\n// \\providecommand*\\eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}\ndefineMacro(\"\\\\eqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2239}}\");\n// \\providecommand*\\Eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}\" + \"{\\\\mathop{\\\\char\\\"2212\\\\char\\\"2237}}\");\n// \\providecommand*\\colonapprox{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\colonapprox\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"2248}}\");\n// \\providecommand*\\Colonapprox{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\Colonapprox\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"2248}}\");\n// \\providecommand*\\colonsim{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\colonsim\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"223c}}\");\n// \\providecommand*\\Colonsim{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\Colonsim\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"223c}}\");\n// Some Unicode characters are implemented with macros to mathtools functions.\ndefineMacro(\"\\u2237\", \"\\\\dblcolon\"); // ::\ndefineMacro(\"\\u2239\", \"\\\\eqcolon\"); // -:\ndefineMacro(\"\\u2254\", \"\\\\coloneqq\"); // :=\ndefineMacro(\"\\u2255\", \"\\\\eqqcolon\"); // =:\ndefineMacro(\"\\u2A74\", \"\\\\Coloneqq\"); // ::=\n//////////////////////////////////////////////////////////////////////\n// colonequals.sty\n// Alternate names for mathtools's macros:\ndefineMacro(\"\\\\ratio\", \"\\\\vcentcolon\");\ndefineMacro(\"\\\\coloncolon\", \"\\\\dblcolon\");\ndefineMacro(\"\\\\colonequals\", \"\\\\coloneqq\");\ndefineMacro(\"\\\\coloncolonequals\", \"\\\\Coloneqq\");\ndefineMacro(\"\\\\equalscolon\", \"\\\\eqqcolon\");\ndefineMacro(\"\\\\equalscoloncolon\", \"\\\\Eqqcolon\");\ndefineMacro(\"\\\\colonminus\", \"\\\\coloneq\");\ndefineMacro(\"\\\\coloncolonminus\", \"\\\\Coloneq\");\ndefineMacro(\"\\\\minuscolon\", \"\\\\eqcolon\");\ndefineMacro(\"\\\\minuscoloncolon\", \"\\\\Eqcolon\");\n// \\colonapprox name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonapprox\", \"\\\\Colonapprox\");\n// \\colonsim name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonsim\", \"\\\\Colonsim\");\n// Additional macros, implemented by analogy with mathtools definitions:\ndefineMacro(\"\\\\simcolon\", \"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\");\ndefineMacro(\"\\\\simcoloncolon\", \"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\");\ndefineMacro(\"\\\\approxcolon\", \"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\");\ndefineMacro(\"\\\\approxcoloncolon\", \"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\");\n// Present in newtxmath, pxfonts and txfonts\ndefineMacro(\"\\\\notni\", \"\\\\html@mathml{\\\\not\\\\ni}{\\\\mathrel{\\\\char`\\u220C}}\");\ndefineMacro(\"\\\\limsup\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,sup}\");\ndefineMacro(\"\\\\liminf\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,inf}\");\n//////////////////////////////////////////////////////////////////////\n// From amsopn.sty\ndefineMacro(\"\\\\injlim\", \"\\\\DOTSB\\\\operatorname*{inj\\\\,lim}\");\ndefineMacro(\"\\\\projlim\", \"\\\\DOTSB\\\\operatorname*{proj\\\\,lim}\");\ndefineMacro(\"\\\\varlimsup\", \"\\\\DOTSB\\\\operatorname*{\\\\overline{lim}}\");\ndefineMacro(\"\\\\varliminf\", \"\\\\DOTSB\\\\operatorname*{\\\\underline{lim}}\");\ndefineMacro(\"\\\\varinjlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underrightarrow{lim}}\");\ndefineMacro(\"\\\\varprojlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underleftarrow{lim}}\");\n//////////////////////////////////////////////////////////////////////\n// MathML alternates for KaTeX glyphs in the Unicode private area\ndefineMacro(\"\\\\gvertneqq\", \"\\\\html@mathml{\\\\@gvertneqq}{\\u2269}\");\ndefineMacro(\"\\\\lvertneqq\", \"\\\\html@mathml{\\\\@lvertneqq}{\\u2268}\");\ndefineMacro(\"\\\\ngeqq\", \"\\\\html@mathml{\\\\@ngeqq}{\\u2271}\");\ndefineMacro(\"\\\\ngeqslant\", \"\\\\html@mathml{\\\\@ngeqslant}{\\u2271}\");\ndefineMacro(\"\\\\nleqq\", \"\\\\html@mathml{\\\\@nleqq}{\\u2270}\");\ndefineMacro(\"\\\\nleqslant\", \"\\\\html@mathml{\\\\@nleqslant}{\\u2270}\");\ndefineMacro(\"\\\\nshortmid\", \"\\\\html@mathml{\\\\@nshortmid}{∤}\");\ndefineMacro(\"\\\\nshortparallel\", \"\\\\html@mathml{\\\\@nshortparallel}{∦}\");\ndefineMacro(\"\\\\nsubseteqq\", \"\\\\html@mathml{\\\\@nsubseteqq}{\\u2288}\");\ndefineMacro(\"\\\\nsupseteqq\", \"\\\\html@mathml{\\\\@nsupseteqq}{\\u2289}\");\ndefineMacro(\"\\\\varsubsetneq\", \"\\\\html@mathml{\\\\@varsubsetneq}{⊊}\");\ndefineMacro(\"\\\\varsubsetneqq\", \"\\\\html@mathml{\\\\@varsubsetneqq}{⫋}\");\ndefineMacro(\"\\\\varsupsetneq\", \"\\\\html@mathml{\\\\@varsupsetneq}{⊋}\");\ndefineMacro(\"\\\\varsupsetneqq\", \"\\\\html@mathml{\\\\@varsupsetneqq}{⫌}\");\ndefineMacro(\"\\\\imath\", \"\\\\html@mathml{\\\\@imath}{\\u0131}\");\ndefineMacro(\"\\\\jmath\", \"\\\\html@mathml{\\\\@jmath}{\\u0237}\");\n//////////////////////////////////////////////////////////////////////\n// stmaryrd and semantic\n// The stmaryrd and semantic packages render the next four items by calling a\n// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros.\ndefineMacro(\"\\\\llbracket\", \"\\\\html@mathml{\" + \"\\\\mathopen{[\\\\mkern-3.2mu[}}\" + \"{\\\\mathopen{\\\\char`\\u27e6}}\");\ndefineMacro(\"\\\\rrbracket\", \"\\\\html@mathml{\" + \"\\\\mathclose{]\\\\mkern-3.2mu]}}\" + \"{\\\\mathclose{\\\\char`\\u27e7}}\");\ndefineMacro(\"\\u27e6\", \"\\\\llbracket\"); // blackboard bold [\ndefineMacro(\"\\u27e7\", \"\\\\rrbracket\"); // blackboard bold ]\ndefineMacro(\"\\\\lBrace\", \"\\\\html@mathml{\" + \"\\\\mathopen{\\\\{\\\\mkern-3.2mu[}}\" + \"{\\\\mathopen{\\\\char`\\u2983}}\");\ndefineMacro(\"\\\\rBrace\", \"\\\\html@mathml{\" + \"\\\\mathclose{]\\\\mkern-3.2mu\\\\}}}\" + \"{\\\\mathclose{\\\\char`\\u2984}}\");\ndefineMacro(\"\\u2983\", \"\\\\lBrace\"); // blackboard bold {\ndefineMacro(\"\\u2984\", \"\\\\rBrace\"); // blackboard bold }\n// TODO: Create variable sized versions of the last two items. I believe that\n// will require new font glyphs.\n// The stmaryrd function `\\minuso` provides a \"Plimsoll\" symbol that\n// superimposes the characters \\circ and \\mathminus. Used in chemistry.\ndefineMacro(\"\\\\minuso\", \"\\\\mathbin{\\\\html@mathml{\" + \"{\\\\mathrlap{\\\\mathchoice{\\\\kern{0.145em}}{\\\\kern{0.145em}}\" + \"{\\\\kern{0.1015em}}{\\\\kern{0.0725em}}\\\\circ}{-}}}\" + \"{\\\\char`⦵}}\");\ndefineMacro(\"⦵\", \"\\\\minuso\");\n//////////////////////////////////////////////////////////////////////\n// texvc.sty\n// The texvc package contains macros available in mediawiki pages.\n// We omit the functions deprecated at\n// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax\n// We also omit texvc's \\O, which conflicts with \\text{\\O}\ndefineMacro(\"\\\\darr\", \"\\\\downarrow\");\ndefineMacro(\"\\\\dArr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\Darr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\lang\", \"\\\\langle\");\ndefineMacro(\"\\\\rang\", \"\\\\rangle\");\ndefineMacro(\"\\\\uarr\", \"\\\\uparrow\");\ndefineMacro(\"\\\\uArr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\Uarr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\N\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\R\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Z\", \"\\\\mathbb{Z}\");\ndefineMacro(\"\\\\alef\", \"\\\\aleph\");\ndefineMacro(\"\\\\alefsym\", \"\\\\aleph\");\ndefineMacro(\"\\\\Alpha\", \"\\\\mathrm{A}\");\ndefineMacro(\"\\\\Beta\", \"\\\\mathrm{B}\");\ndefineMacro(\"\\\\bull\", \"\\\\bullet\");\ndefineMacro(\"\\\\Chi\", \"\\\\mathrm{X}\");\ndefineMacro(\"\\\\clubs\", \"\\\\clubsuit\");\ndefineMacro(\"\\\\cnums\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Complex\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Dagger\", \"\\\\ddagger\");\ndefineMacro(\"\\\\diamonds\", \"\\\\diamondsuit\");\ndefineMacro(\"\\\\empty\", \"\\\\emptyset\");\ndefineMacro(\"\\\\Epsilon\", \"\\\\mathrm{E}\");\ndefineMacro(\"\\\\Eta\", \"\\\\mathrm{H}\");\ndefineMacro(\"\\\\exist\", \"\\\\exists\");\ndefineMacro(\"\\\\harr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\hArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Harr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\hearts\", \"\\\\heartsuit\");\ndefineMacro(\"\\\\image\", \"\\\\Im\");\ndefineMacro(\"\\\\infin\", \"\\\\infty\");\ndefineMacro(\"\\\\Iota\", \"\\\\mathrm{I}\");\ndefineMacro(\"\\\\isin\", \"\\\\in\");\ndefineMacro(\"\\\\Kappa\", \"\\\\mathrm{K}\");\ndefineMacro(\"\\\\larr\", \"\\\\leftarrow\");\ndefineMacro(\"\\\\lArr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\Larr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\lrarr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\lrArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Lrarr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Mu\", \"\\\\mathrm{M}\");\ndefineMacro(\"\\\\natnums\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\Nu\", \"\\\\mathrm{N}\");\ndefineMacro(\"\\\\Omicron\", \"\\\\mathrm{O}\");\ndefineMacro(\"\\\\plusmn\", \"\\\\pm\");\ndefineMacro(\"\\\\rarr\", \"\\\\rightarrow\");\ndefineMacro(\"\\\\rArr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\Rarr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\real\", \"\\\\Re\");\ndefineMacro(\"\\\\reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Rho\", \"\\\\mathrm{P}\");\ndefineMacro(\"\\\\sdot\", \"\\\\cdot\");\ndefineMacro(\"\\\\sect\", \"\\\\S\");\ndefineMacro(\"\\\\spades\", \"\\\\spadesuit\");\ndefineMacro(\"\\\\sub\", \"\\\\subset\");\ndefineMacro(\"\\\\sube\", \"\\\\subseteq\");\ndefineMacro(\"\\\\supe\", \"\\\\supseteq\");\ndefineMacro(\"\\\\Tau\", \"\\\\mathrm{T}\");\ndefineMacro(\"\\\\thetasym\", \"\\\\vartheta\");\n// TODO: defineMacro(\"\\\\varcoppa\", \"\\\\\\mbox{\\\\coppa}\");\ndefineMacro(\"\\\\weierp\", \"\\\\wp\");\ndefineMacro(\"\\\\Zeta\", \"\\\\mathrm{Z}\");\n//////////////////////////////////////////////////////////////////////\n// statmath.sty\n// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf\ndefineMacro(\"\\\\argmin\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,min}\");\ndefineMacro(\"\\\\argmax\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,max}\");\ndefineMacro(\"\\\\plim\", \"\\\\DOTSB\\\\mathop{\\\\operatorname{plim}}\\\\limits\");\n//////////////////////////////////////////////////////////////////////\n// braket.sty\n// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf\ndefineMacro(\"\\\\bra\", \"\\\\mathinner{\\\\langle{#1}|}\");\ndefineMacro(\"\\\\ket\", \"\\\\mathinner{|{#1}\\\\rangle}\");\ndefineMacro(\"\\\\braket\", \"\\\\mathinner{\\\\langle{#1}\\\\rangle}\");\ndefineMacro(\"\\\\Bra\", \"\\\\left\\\\langle#1\\\\right|\");\ndefineMacro(\"\\\\Ket\", \"\\\\left|#1\\\\right\\\\rangle\");\nvar braketHelper = one => context => {\n  var left = context.consumeArg().tokens;\n  var middle = context.consumeArg().tokens;\n  var middleDouble = context.consumeArg().tokens;\n  var right = context.consumeArg().tokens;\n  var oldMiddle = context.macros.get(\"|\");\n  var oldMiddleDouble = context.macros.get(\"\\\\|\");\n  context.macros.beginGroup();\n  var midMacro = double => context => {\n    if (one) {\n      // Only modify the first instance of | or \\|\n      context.macros.set(\"|\", oldMiddle);\n      if (middleDouble.length) {\n        context.macros.set(\"\\\\|\", oldMiddleDouble);\n      }\n    }\n    var doubled = double;\n    if (!double && middleDouble.length) {\n      // Mimic \\@ifnextchar\n      var nextToken = context.future();\n      if (nextToken.text === \"|\") {\n        context.popToken();\n        doubled = true;\n      }\n    }\n    return {\n      tokens: doubled ? middleDouble : middle,\n      numArgs: 0\n    };\n  };\n  context.macros.set(\"|\", midMacro(false));\n  if (middleDouble.length) {\n    context.macros.set(\"\\\\|\", midMacro(true));\n  }\n  var arg = context.consumeArg().tokens;\n  var expanded = context.expandTokens([...right, ...arg, ...left // reversed\n  ]);\n  context.macros.endGroup();\n  return {\n    tokens: expanded.reverse(),\n    numArgs: 0\n  };\n};\ndefineMacro(\"\\\\bra@ket\", braketHelper(false));\ndefineMacro(\"\\\\bra@set\", braketHelper(true));\ndefineMacro(\"\\\\Braket\", \"\\\\bra@ket{\\\\left\\\\langle}\" + \"{\\\\,\\\\middle\\\\vert\\\\,}{\\\\,\\\\middle\\\\vert\\\\,}{\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\Set\", \"\\\\bra@set{\\\\left\\\\{\\\\:}\" + \"{\\\\;\\\\middle\\\\vert\\\\;}{\\\\;\\\\middle\\\\Vert\\\\;}{\\\\:\\\\right\\\\}}\");\ndefineMacro(\"\\\\set\", \"\\\\bra@set{\\\\{\\\\,}{\\\\mid}{}{\\\\,\\\\}}\");\n// has no support for special || or \\|\n//////////////////////////////////////////////////////////////////////\n// actuarialangle.dtx\ndefineMacro(\"\\\\angln\", \"{\\\\angl n}\");\n// Custom Khan Academy colors, should be moved to an optional package\ndefineMacro(\"\\\\blue\", \"\\\\textcolor{##6495ed}{#1}\");\ndefineMacro(\"\\\\orange\", \"\\\\textcolor{##ffa500}{#1}\");\ndefineMacro(\"\\\\pink\", \"\\\\textcolor{##ff00af}{#1}\");\ndefineMacro(\"\\\\red\", \"\\\\textcolor{##df0030}{#1}\");\ndefineMacro(\"\\\\green\", \"\\\\textcolor{##28ae7b}{#1}\");\ndefineMacro(\"\\\\gray\", \"\\\\textcolor{gray}{#1}\");\ndefineMacro(\"\\\\purple\", \"\\\\textcolor{##9d38bd}{#1}\");\ndefineMacro(\"\\\\blueA\", \"\\\\textcolor{##ccfaff}{#1}\");\ndefineMacro(\"\\\\blueB\", \"\\\\textcolor{##80f6ff}{#1}\");\ndefineMacro(\"\\\\blueC\", \"\\\\textcolor{##63d9ea}{#1}\");\ndefineMacro(\"\\\\blueD\", \"\\\\textcolor{##11accd}{#1}\");\ndefineMacro(\"\\\\blueE\", \"\\\\textcolor{##0c7f99}{#1}\");\ndefineMacro(\"\\\\tealA\", \"\\\\textcolor{##94fff5}{#1}\");\ndefineMacro(\"\\\\tealB\", \"\\\\textcolor{##26edd5}{#1}\");\ndefineMacro(\"\\\\tealC\", \"\\\\textcolor{##01d1c1}{#1}\");\ndefineMacro(\"\\\\tealD\", \"\\\\textcolor{##01a995}{#1}\");\ndefineMacro(\"\\\\tealE\", \"\\\\textcolor{##208170}{#1}\");\ndefineMacro(\"\\\\greenA\", \"\\\\textcolor{##b6ffb0}{#1}\");\ndefineMacro(\"\\\\greenB\", \"\\\\textcolor{##8af281}{#1}\");\ndefineMacro(\"\\\\greenC\", \"\\\\textcolor{##74cf70}{#1}\");\ndefineMacro(\"\\\\greenD\", \"\\\\textcolor{##1fab54}{#1}\");\ndefineMacro(\"\\\\greenE\", \"\\\\textcolor{##0d923f}{#1}\");\ndefineMacro(\"\\\\goldA\", \"\\\\textcolor{##ffd0a9}{#1}\");\ndefineMacro(\"\\\\goldB\", \"\\\\textcolor{##ffbb71}{#1}\");\ndefineMacro(\"\\\\goldC\", \"\\\\textcolor{##ff9c39}{#1}\");\ndefineMacro(\"\\\\goldD\", \"\\\\textcolor{##e07d10}{#1}\");\ndefineMacro(\"\\\\goldE\", \"\\\\textcolor{##a75a05}{#1}\");\ndefineMacro(\"\\\\redA\", \"\\\\textcolor{##fca9a9}{#1}\");\ndefineMacro(\"\\\\redB\", \"\\\\textcolor{##ff8482}{#1}\");\ndefineMacro(\"\\\\redC\", \"\\\\textcolor{##f9685d}{#1}\");\ndefineMacro(\"\\\\redD\", \"\\\\textcolor{##e84d39}{#1}\");\ndefineMacro(\"\\\\redE\", \"\\\\textcolor{##bc2612}{#1}\");\ndefineMacro(\"\\\\maroonA\", \"\\\\textcolor{##ffbde0}{#1}\");\ndefineMacro(\"\\\\maroonB\", \"\\\\textcolor{##ff92c6}{#1}\");\ndefineMacro(\"\\\\maroonC\", \"\\\\textcolor{##ed5fa6}{#1}\");\ndefineMacro(\"\\\\maroonD\", \"\\\\textcolor{##ca337c}{#1}\");\ndefineMacro(\"\\\\maroonE\", \"\\\\textcolor{##9e034e}{#1}\");\ndefineMacro(\"\\\\purpleA\", \"\\\\textcolor{##ddd7ff}{#1}\");\ndefineMacro(\"\\\\purpleB\", \"\\\\textcolor{##c6b9fc}{#1}\");\ndefineMacro(\"\\\\purpleC\", \"\\\\textcolor{##aa87ff}{#1}\");\ndefineMacro(\"\\\\purpleD\", \"\\\\textcolor{##7854ab}{#1}\");\ndefineMacro(\"\\\\purpleE\", \"\\\\textcolor{##543b78}{#1}\");\ndefineMacro(\"\\\\mintA\", \"\\\\textcolor{##f5f9e8}{#1}\");\ndefineMacro(\"\\\\mintB\", \"\\\\textcolor{##edf2df}{#1}\");\ndefineMacro(\"\\\\mintC\", \"\\\\textcolor{##e0e5cc}{#1}\");\ndefineMacro(\"\\\\grayA\", \"\\\\textcolor{##f6f7f7}{#1}\");\ndefineMacro(\"\\\\grayB\", \"\\\\textcolor{##f0f1f2}{#1}\");\ndefineMacro(\"\\\\grayC\", \"\\\\textcolor{##e3e5e6}{#1}\");\ndefineMacro(\"\\\\grayD\", \"\\\\textcolor{##d6d8da}{#1}\");\ndefineMacro(\"\\\\grayE\", \"\\\\textcolor{##babec2}{#1}\");\ndefineMacro(\"\\\\grayF\", \"\\\\textcolor{##888d93}{#1}\");\ndefineMacro(\"\\\\grayG\", \"\\\\textcolor{##626569}{#1}\");\ndefineMacro(\"\\\\grayH\", \"\\\\textcolor{##3b3e40}{#1}\");\ndefineMacro(\"\\\\grayI\", \"\\\\textcolor{##21242c}{#1}\");\ndefineMacro(\"\\\\kaBlue\", \"\\\\textcolor{##314453}{#1}\");\ndefineMacro(\"\\\\kaGreen\", \"\\\\textcolor{##71B307}{#1}\");\n\n/**\n * This file contains the “gullet” where macros are expanded\n * until only non-macro tokens remain.\n */\n// List of commands that act like macros but aren't defined as a macro,\n// function, or symbol.  Used in `isDefined`.\nvar implicitCommands = {\n  \"^\": true,\n  // Parser.js\n  \"_\": true,\n  // Parser.js\n  \"\\\\limits\": true,\n  // Parser.js\n  \"\\\\nolimits\": true // Parser.js\n};\nclass MacroExpander {\n  constructor(input, settings, mode) {\n    this.settings = void 0;\n    this.expansionCount = void 0;\n    this.lexer = void 0;\n    this.macros = void 0;\n    this.stack = void 0;\n    this.mode = void 0;\n    this.settings = settings;\n    this.expansionCount = 0;\n    this.feed(input);\n    // Make new global namespace\n    this.macros = new Namespace(macros, settings.macros);\n    this.mode = mode;\n    this.stack = []; // contains tokens in REVERSE order\n  }\n  /**\n   * Feed a new input string to the same MacroExpander\n   * (with existing macros etc.).\n   */\n  feed(input) {\n    this.lexer = new Lexer(input, this.settings);\n  }\n  /**\n   * Switches between \"text\" and \"math\" modes.\n   */\n  switchMode(newMode) {\n    this.mode = newMode;\n  }\n  /**\n   * Start a new group nesting within all namespaces.\n   */\n  beginGroup() {\n    this.macros.beginGroup();\n  }\n  /**\n   * End current group nesting within all namespaces.\n   */\n  endGroup() {\n    this.macros.endGroup();\n  }\n  /**\n   * Ends all currently nested groups (if any), restoring values before the\n   * groups began.  Useful in case of an error in the middle of parsing.\n   */\n  endGroups() {\n    this.macros.endGroups();\n  }\n  /**\n   * Returns the topmost token on the stack, without expanding it.\n   * Similar in behavior to TeX's `\\futurelet`.\n   */\n  future() {\n    if (this.stack.length === 0) {\n      this.pushToken(this.lexer.lex());\n    }\n    return this.stack[this.stack.length - 1];\n  }\n  /**\n   * Remove and return the next unexpanded token.\n   */\n  popToken() {\n    this.future(); // ensure non-empty stack\n    return this.stack.pop();\n  }\n  /**\n   * Add a given token to the token stack.  In particular, this get be used\n   * to put back a token returned from one of the other methods.\n   */\n  pushToken(token) {\n    this.stack.push(token);\n  }\n  /**\n   * Append an array of tokens to the token stack.\n   */\n  pushTokens(tokens) {\n    this.stack.push(...tokens);\n  }\n  /**\n   * Find an macro argument without expanding tokens and append the array of\n   * tokens to the token stack. Uses Token as a container for the result.\n   */\n  scanArgument(isOptional) {\n    var start;\n    var end;\n    var tokens;\n    if (isOptional) {\n      this.consumeSpaces(); // \\@ifnextchar gobbles any space following it\n      if (this.future().text !== \"[\") {\n        return null;\n      }\n      start = this.popToken(); // don't include [ in tokens\n      ({\n        tokens,\n        end\n      } = this.consumeArg([\"]\"]));\n    } else {\n      ({\n        tokens,\n        start,\n        end\n      } = this.consumeArg());\n    }\n    // indicate the end of an argument\n    this.pushToken(new Token(\"EOF\", end.loc));\n    this.pushTokens(tokens);\n    return new Token(\"\", SourceLocation.range(start, end));\n  }\n  /**\n   * Consume all following space tokens, without expansion.\n   */\n  consumeSpaces() {\n    for (;;) {\n      var token = this.future();\n      if (token.text === \" \") {\n        this.stack.pop();\n      } else {\n        break;\n      }\n    }\n  }\n  /**\n   * Consume an argument from the token stream, and return the resulting array\n   * of tokens and start/end token.\n   */\n  consumeArg(delims) {\n    // The argument for a delimited parameter is the shortest (possibly\n    // empty) sequence of tokens with properly nested {...} groups that is\n    // followed ... by this particular list of non-parameter tokens.\n    // The argument for an undelimited parameter is the next nonblank\n    // token, unless that token is ‘{’, when the argument will be the\n    // entire {...} group that follows.\n    var tokens = [];\n    var isDelimited = delims && delims.length > 0;\n    if (!isDelimited) {\n      // Ignore spaces between arguments.  As the TeXbook says:\n      // \"After you have said ‘\\def\\row#1#2{...}’, you are allowed to\n      //  put spaces between the arguments (e.g., ‘\\row x n’), because\n      //  TeX doesn’t use single spaces as undelimited arguments.\"\n      this.consumeSpaces();\n    }\n    var start = this.future();\n    var tok;\n    var depth = 0;\n    var match = 0;\n    do {\n      tok = this.popToken();\n      tokens.push(tok);\n      if (tok.text === \"{\") {\n        ++depth;\n      } else if (tok.text === \"}\") {\n        --depth;\n        if (depth === -1) {\n          throw new ParseError(\"Extra }\", tok);\n        }\n      } else if (tok.text === \"EOF\") {\n        throw new ParseError(\"Unexpected end of input in a macro argument\" + \", expected '\" + (delims && isDelimited ? delims[match] : \"}\") + \"'\", tok);\n      }\n      if (delims && isDelimited) {\n        if ((depth === 0 || depth === 1 && delims[match] === \"{\") && tok.text === delims[match]) {\n          ++match;\n          if (match === delims.length) {\n            // don't include delims in tokens\n            tokens.splice(-match, match);\n            break;\n          }\n        } else {\n          match = 0;\n        }\n      }\n    } while (depth !== 0 || isDelimited);\n    // If the argument found ... has the form ‘{<nested tokens>}’,\n    // ... the outermost braces enclosing the argument are removed\n    if (start.text === \"{\" && tokens[tokens.length - 1].text === \"}\") {\n      tokens.pop();\n      tokens.shift();\n    }\n    tokens.reverse(); // to fit in with stack order\n    return {\n      tokens,\n      start,\n      end: tok\n    };\n  }\n  /**\n   * Consume the specified number of (delimited) arguments from the token\n   * stream and return the resulting array of arguments.\n   */\n  consumeArgs(numArgs, delimiters) {\n    if (delimiters) {\n      if (delimiters.length !== numArgs + 1) {\n        throw new ParseError(\"The length of delimiters doesn't match the number of args!\");\n      }\n      var delims = delimiters[0];\n      for (var i = 0; i < delims.length; i++) {\n        var tok = this.popToken();\n        if (delims[i] !== tok.text) {\n          throw new ParseError(\"Use of the macro doesn't match its definition\", tok);\n        }\n      }\n    }\n    var args = [];\n    for (var _i = 0; _i < numArgs; _i++) {\n      args.push(this.consumeArg(delimiters && delimiters[_i + 1]).tokens);\n    }\n    return args;\n  }\n  /**\n   * Increment `expansionCount` by the specified amount.\n   * Throw an error if it exceeds `maxExpand`.\n   */\n  countExpansion(amount) {\n    this.expansionCount += amount;\n    if (this.expansionCount > this.settings.maxExpand) {\n      throw new ParseError(\"Too many expansions: infinite loop or \" + \"need to increase maxExpand setting\");\n    }\n  }\n  /**\n   * Expand the next token only once if possible.\n   *\n   * If the token is expanded, the resulting tokens will be pushed onto\n   * the stack in reverse order, and the number of such tokens will be\n   * returned.  This number might be zero or positive.\n   *\n   * If not, the return value is `false`, and the next token remains at the\n   * top of the stack.\n   *\n   * In either case, the next token will be on the top of the stack,\n   * or the stack will be empty (in case of empty expansion\n   * and no other tokens).\n   *\n   * Used to implement `expandAfterFuture` and `expandNextToken`.\n   *\n   * If expandableOnly, only expandable tokens are expanded and\n   * an undefined control sequence results in an error.\n   */\n  expandOnce(expandableOnly) {\n    var topToken = this.popToken();\n    var name = topToken.text;\n    var expansion = !topToken.noexpand ? this._getExpansion(name) : null;\n    if (expansion == null || expandableOnly && expansion.unexpandable) {\n      if (expandableOnly && expansion == null && name[0] === \"\\\\\" && !this.isDefined(name)) {\n        throw new ParseError(\"Undefined control sequence: \" + name);\n      }\n      this.pushToken(topToken);\n      return false;\n    }\n    this.countExpansion(1);\n    var tokens = expansion.tokens;\n    var args = this.consumeArgs(expansion.numArgs, expansion.delimiters);\n    if (expansion.numArgs) {\n      // paste arguments in place of the placeholders\n      tokens = tokens.slice(); // make a shallow copy\n      for (var i = tokens.length - 1; i >= 0; --i) {\n        var tok = tokens[i];\n        if (tok.text === \"#\") {\n          if (i === 0) {\n            throw new ParseError(\"Incomplete placeholder at end of macro body\", tok);\n          }\n          tok = tokens[--i]; // next token on stack\n          if (tok.text === \"#\") {\n            // ## → #\n            tokens.splice(i + 1, 1); // drop first #\n          } else if (/^[1-9]$/.test(tok.text)) {\n            // replace the placeholder with the indicated argument\n            tokens.splice(i, 2, ...args[+tok.text - 1]);\n          } else {\n            throw new ParseError(\"Not a valid argument number\", tok);\n          }\n        }\n      }\n    }\n    // Concatenate expansion onto top of stack.\n    this.pushTokens(tokens);\n    return tokens.length;\n  }\n  /**\n   * Expand the next token only once (if possible), and return the resulting\n   * top token on the stack (without removing anything from the stack).\n   * Similar in behavior to TeX's `\\expandafter\\futurelet`.\n   * Equivalent to expandOnce() followed by future().\n   */\n  expandAfterFuture() {\n    this.expandOnce();\n    return this.future();\n  }\n  /**\n   * Recursively expand first token, then return first non-expandable token.\n   */\n  expandNextToken() {\n    for (;;) {\n      if (this.expandOnce() === false) {\n        // fully expanded\n        var token = this.stack.pop();\n        // the token after \\noexpand is interpreted as if its meaning\n        // were ‘\\relax’\n        if (token.treatAsRelax) {\n          token.text = \"\\\\relax\";\n        }\n        return token;\n      }\n    }\n  }\n  /**\n   * Fully expand the given macro name and return the resulting list of\n   * tokens, or return `undefined` if no such macro is defined.\n   */\n  expandMacro(name) {\n    return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined;\n  }\n  /**\n   * Fully expand the given token stream and return the resulting list of\n   * tokens.  Note that the input tokens are in reverse order, but the\n   * output tokens are in forward order.\n   */\n  expandTokens(tokens) {\n    var output = [];\n    var oldStackLength = this.stack.length;\n    this.pushTokens(tokens);\n    while (this.stack.length > oldStackLength) {\n      // Expand only expandable tokens\n      if (this.expandOnce(true) === false) {\n        // fully expanded\n        var token = this.stack.pop();\n        if (token.treatAsRelax) {\n          // the expansion of \\noexpand is the token itself\n          token.noexpand = false;\n          token.treatAsRelax = false;\n        }\n        output.push(token);\n      }\n    }\n    // Count all of these tokens as additional expansions, to prevent\n    // exponential blowup from linearly many \\edef's.\n    this.countExpansion(output.length);\n    return output;\n  }\n  /**\n   * Fully expand the given macro name and return the result as a string,\n   * or return `undefined` if no such macro is defined.\n   */\n  expandMacroAsText(name) {\n    var tokens = this.expandMacro(name);\n    if (tokens) {\n      return tokens.map(token => token.text).join(\"\");\n    } else {\n      return tokens;\n    }\n  }\n  /**\n   * Returns the expanded macro as a reversed array of tokens and a macro\n   * argument count.  Or returns `null` if no such macro.\n   */\n  _getExpansion(name) {\n    var definition = this.macros.get(name);\n    if (definition == null) {\n      // mainly checking for undefined here\n      return definition;\n    }\n    // If a single character has an associated catcode other than 13\n    // (active character), then don't expand it.\n    if (name.length === 1) {\n      var catcode = this.lexer.catcodes[name];\n      if (catcode != null && catcode !== 13) {\n        return;\n      }\n    }\n    var expansion = typeof definition === \"function\" ? definition(this) : definition;\n    if (typeof expansion === \"string\") {\n      var numArgs = 0;\n      if (expansion.includes(\"#\")) {\n        var stripped = expansion.replace(/##/g, \"\");\n        while (stripped.includes(\"#\" + (numArgs + 1))) {\n          ++numArgs;\n        }\n      }\n      var bodyLexer = new Lexer(expansion, this.settings);\n      var tokens = [];\n      var tok = bodyLexer.lex();\n      while (tok.text !== \"EOF\") {\n        tokens.push(tok);\n        tok = bodyLexer.lex();\n      }\n      tokens.reverse(); // to fit in with stack using push and pop\n      var expanded = {\n        tokens,\n        numArgs\n      };\n      return expanded;\n    }\n    return expansion;\n  }\n  /**\n   * Determine whether a command is currently \"defined\" (has some\n   * functionality), meaning that it's a macro (in the current group),\n   * a function, a symbol, or one of the special commands listed in\n   * `implicitCommands`.\n   */\n  isDefined(name) {\n    return this.macros.has(name) || functions.hasOwnProperty(name) || symbols.math.hasOwnProperty(name) || symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name);\n  }\n  /**\n   * Determine whether a command is expandable.\n   */\n  isExpandable(name) {\n    var macro = this.macros.get(name);\n    return macro != null ? typeof macro === \"string\" || typeof macro === \"function\" || !macro.unexpandable : functions.hasOwnProperty(name) && !functions[name].primitive;\n  }\n}\n\n// Helpers for Parser.js handling of Unicode (sub|super)script characters.\nvar unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;\nvar uSubsAndSups = Object.freeze({\n  '₊': '+',\n  '₋': '-',\n  '₌': '=',\n  '₍': '(',\n  '₎': ')',\n  '₀': '0',\n  '₁': '1',\n  '₂': '2',\n  '₃': '3',\n  '₄': '4',\n  '₅': '5',\n  '₆': '6',\n  '₇': '7',\n  '₈': '8',\n  '₉': '9',\n  '\\u2090': 'a',\n  '\\u2091': 'e',\n  '\\u2095': 'h',\n  '\\u1D62': 'i',\n  '\\u2C7C': 'j',\n  '\\u2096': 'k',\n  '\\u2097': 'l',\n  '\\u2098': 'm',\n  '\\u2099': 'n',\n  '\\u2092': 'o',\n  '\\u209A': 'p',\n  '\\u1D63': 'r',\n  '\\u209B': 's',\n  '\\u209C': 't',\n  '\\u1D64': 'u',\n  '\\u1D65': 'v',\n  '\\u2093': 'x',\n  '\\u1D66': 'β',\n  '\\u1D67': 'γ',\n  '\\u1D68': 'ρ',\n  '\\u1D69': '\\u03d5',\n  '\\u1D6A': 'χ',\n  '⁺': '+',\n  '⁻': '-',\n  '⁼': '=',\n  '⁽': '(',\n  '⁾': ')',\n  '⁰': '0',\n  '¹': '1',\n  '²': '2',\n  '³': '3',\n  '⁴': '4',\n  '⁵': '5',\n  '⁶': '6',\n  '⁷': '7',\n  '⁸': '8',\n  '⁹': '9',\n  '\\u1D2C': 'A',\n  '\\u1D2E': 'B',\n  '\\u1D30': 'D',\n  '\\u1D31': 'E',\n  '\\u1D33': 'G',\n  '\\u1D34': 'H',\n  '\\u1D35': 'I',\n  '\\u1D36': 'J',\n  '\\u1D37': 'K',\n  '\\u1D38': 'L',\n  '\\u1D39': 'M',\n  '\\u1D3A': 'N',\n  '\\u1D3C': 'O',\n  '\\u1D3E': 'P',\n  '\\u1D3F': 'R',\n  '\\u1D40': 'T',\n  '\\u1D41': 'U',\n  '\\u2C7D': 'V',\n  '\\u1D42': 'W',\n  '\\u1D43': 'a',\n  '\\u1D47': 'b',\n  '\\u1D9C': 'c',\n  '\\u1D48': 'd',\n  '\\u1D49': 'e',\n  '\\u1DA0': 'f',\n  '\\u1D4D': 'g',\n  '\\u02B0': 'h',\n  '\\u2071': 'i',\n  '\\u02B2': 'j',\n  '\\u1D4F': 'k',\n  '\\u02E1': 'l',\n  '\\u1D50': 'm',\n  '\\u207F': 'n',\n  '\\u1D52': 'o',\n  '\\u1D56': 'p',\n  '\\u02B3': 'r',\n  '\\u02E2': 's',\n  '\\u1D57': 't',\n  '\\u1D58': 'u',\n  '\\u1D5B': 'v',\n  '\\u02B7': 'w',\n  '\\u02E3': 'x',\n  '\\u02B8': 'y',\n  '\\u1DBB': 'z',\n  '\\u1D5D': 'β',\n  '\\u1D5E': 'γ',\n  '\\u1D5F': 'δ',\n  '\\u1D60': '\\u03d5',\n  '\\u1D61': 'χ',\n  '\\u1DBF': 'θ'\n});\n\n/* eslint no-constant-condition:0 */\n// Pre-evaluate both modules as unicodeSymbols require String.normalize()\nvar unicodeAccents = {\n  \"́\": {\n    \"text\": \"\\\\'\",\n    \"math\": \"\\\\acute\"\n  },\n  \"̀\": {\n    \"text\": \"\\\\`\",\n    \"math\": \"\\\\grave\"\n  },\n  \"̈\": {\n    \"text\": \"\\\\\\\"\",\n    \"math\": \"\\\\ddot\"\n  },\n  \"̃\": {\n    \"text\": \"\\\\~\",\n    \"math\": \"\\\\tilde\"\n  },\n  \"̄\": {\n    \"text\": \"\\\\=\",\n    \"math\": \"\\\\bar\"\n  },\n  \"̆\": {\n    \"text\": \"\\\\u\",\n    \"math\": \"\\\\breve\"\n  },\n  \"̌\": {\n    \"text\": \"\\\\v\",\n    \"math\": \"\\\\check\"\n  },\n  \"̂\": {\n    \"text\": \"\\\\^\",\n    \"math\": \"\\\\hat\"\n  },\n  \"̇\": {\n    \"text\": \"\\\\.\",\n    \"math\": \"\\\\dot\"\n  },\n  \"̊\": {\n    \"text\": \"\\\\r\",\n    \"math\": \"\\\\mathring\"\n  },\n  \"̋\": {\n    \"text\": \"\\\\H\"\n  },\n  \"̧\": {\n    \"text\": \"\\\\c\"\n  }\n};\nvar unicodeSymbols = {\n  \"á\": \"á\",\n  \"à\": \"à\",\n  \"ä\": \"ä\",\n  \"ǟ\": \"ǟ\",\n  \"ã\": \"ã\",\n  \"ā\": \"ā\",\n  \"ă\": \"ă\",\n  \"ắ\": \"ắ\",\n  \"ằ\": \"ằ\",\n  \"ẵ\": \"ẵ\",\n  \"ǎ\": \"ǎ\",\n  \"â\": \"â\",\n  \"ấ\": \"ấ\",\n  \"ầ\": \"ầ\",\n  \"ẫ\": \"ẫ\",\n  \"ȧ\": \"ȧ\",\n  \"ǡ\": \"ǡ\",\n  \"å\": \"å\",\n  \"ǻ\": \"ǻ\",\n  \"ḃ\": \"ḃ\",\n  \"ć\": \"ć\",\n  \"ḉ\": \"ḉ\",\n  \"č\": \"č\",\n  \"ĉ\": \"ĉ\",\n  \"ċ\": \"ċ\",\n  \"ç\": \"ç\",\n  \"ď\": \"ď\",\n  \"ḋ\": \"ḋ\",\n  \"ḑ\": \"ḑ\",\n  \"é\": \"é\",\n  \"è\": \"è\",\n  \"ë\": \"ë\",\n  \"ẽ\": \"ẽ\",\n  \"ē\": \"ē\",\n  \"ḗ\": \"ḗ\",\n  \"ḕ\": \"ḕ\",\n  \"ĕ\": \"ĕ\",\n  \"ḝ\": \"ḝ\",\n  \"ě\": \"ě\",\n  \"ê\": \"ê\",\n  \"ế\": \"ế\",\n  \"ề\": \"ề\",\n  \"ễ\": \"ễ\",\n  \"ė\": \"ė\",\n  \"ȩ\": \"ȩ\",\n  \"ḟ\": \"ḟ\",\n  \"ǵ\": \"ǵ\",\n  \"ḡ\": \"ḡ\",\n  \"ğ\": \"ğ\",\n  \"ǧ\": \"ǧ\",\n  \"ĝ\": \"ĝ\",\n  \"ġ\": \"ġ\",\n  \"ģ\": \"ģ\",\n  \"ḧ\": \"ḧ\",\n  \"ȟ\": \"ȟ\",\n  \"ĥ\": \"ĥ\",\n  \"ḣ\": \"ḣ\",\n  \"ḩ\": \"ḩ\",\n  \"í\": \"í\",\n  \"ì\": \"ì\",\n  \"ï\": \"ï\",\n  \"ḯ\": \"ḯ\",\n  \"ĩ\": \"ĩ\",\n  \"ī\": \"ī\",\n  \"ĭ\": \"ĭ\",\n  \"ǐ\": \"ǐ\",\n  \"î\": \"î\",\n  \"ǰ\": \"ǰ\",\n  \"ĵ\": \"ĵ\",\n  \"ḱ\": \"ḱ\",\n  \"ǩ\": \"ǩ\",\n  \"ķ\": \"ķ\",\n  \"ĺ\": \"ĺ\",\n  \"ľ\": \"ľ\",\n  \"ļ\": \"ļ\",\n  \"ḿ\": \"ḿ\",\n  \"ṁ\": \"ṁ\",\n  \"ń\": \"ń\",\n  \"ǹ\": \"ǹ\",\n  \"ñ\": \"ñ\",\n  \"ň\": \"ň\",\n  \"ṅ\": \"ṅ\",\n  \"ņ\": \"ņ\",\n  \"ó\": \"ó\",\n  \"ò\": \"ò\",\n  \"ö\": \"ö\",\n  \"ȫ\": \"ȫ\",\n  \"õ\": \"õ\",\n  \"ṍ\": \"ṍ\",\n  \"ṏ\": \"ṏ\",\n  \"ȭ\": \"ȭ\",\n  \"ō\": \"ō\",\n  \"ṓ\": \"ṓ\",\n  \"ṑ\": \"ṑ\",\n  \"ŏ\": \"ŏ\",\n  \"ǒ\": \"ǒ\",\n  \"ô\": \"ô\",\n  \"ố\": \"ố\",\n  \"ồ\": \"ồ\",\n  \"ỗ\": \"ỗ\",\n  \"ȯ\": \"ȯ\",\n  \"ȱ\": \"ȱ\",\n  \"ő\": \"ő\",\n  \"ṕ\": \"ṕ\",\n  \"ṗ\": \"ṗ\",\n  \"ŕ\": \"ŕ\",\n  \"ř\": \"ř\",\n  \"ṙ\": \"ṙ\",\n  \"ŗ\": \"ŗ\",\n  \"ś\": \"ś\",\n  \"ṥ\": \"ṥ\",\n  \"š\": \"š\",\n  \"ṧ\": \"ṧ\",\n  \"ŝ\": \"ŝ\",\n  \"ṡ\": \"ṡ\",\n  \"ş\": \"ş\",\n  \"ẗ\": \"ẗ\",\n  \"ť\": \"ť\",\n  \"ṫ\": \"ṫ\",\n  \"ţ\": \"ţ\",\n  \"ú\": \"ú\",\n  \"ù\": \"ù\",\n  \"ü\": \"ü\",\n  \"ǘ\": \"ǘ\",\n  \"ǜ\": \"ǜ\",\n  \"ǖ\": \"ǖ\",\n  \"ǚ\": \"ǚ\",\n  \"ũ\": \"ũ\",\n  \"ṹ\": \"ṹ\",\n  \"ū\": \"ū\",\n  \"ṻ\": \"ṻ\",\n  \"ŭ\": \"ŭ\",\n  \"ǔ\": \"ǔ\",\n  \"û\": \"û\",\n  \"ů\": \"ů\",\n  \"ű\": \"ű\",\n  \"ṽ\": \"ṽ\",\n  \"ẃ\": \"ẃ\",\n  \"ẁ\": \"ẁ\",\n  \"ẅ\": \"ẅ\",\n  \"ŵ\": \"ŵ\",\n  \"ẇ\": \"ẇ\",\n  \"ẘ\": \"ẘ\",\n  \"ẍ\": \"ẍ\",\n  \"ẋ\": \"ẋ\",\n  \"ý\": \"ý\",\n  \"ỳ\": \"ỳ\",\n  \"ÿ\": \"ÿ\",\n  \"ỹ\": \"ỹ\",\n  \"ȳ\": \"ȳ\",\n  \"ŷ\": \"ŷ\",\n  \"ẏ\": \"ẏ\",\n  \"ẙ\": \"ẙ\",\n  \"ź\": \"ź\",\n  \"ž\": \"ž\",\n  \"ẑ\": \"ẑ\",\n  \"ż\": \"ż\",\n  \"Á\": \"Á\",\n  \"À\": \"À\",\n  \"Ä\": \"Ä\",\n  \"Ǟ\": \"Ǟ\",\n  \"Ã\": \"Ã\",\n  \"Ā\": \"Ā\",\n  \"Ă\": \"Ă\",\n  \"Ắ\": \"Ắ\",\n  \"Ằ\": \"Ằ\",\n  \"Ẵ\": \"Ẵ\",\n  \"Ǎ\": \"Ǎ\",\n  \"Â\": \"Â\",\n  \"Ấ\": \"Ấ\",\n  \"Ầ\": \"Ầ\",\n  \"Ẫ\": \"Ẫ\",\n  \"Ȧ\": \"Ȧ\",\n  \"Ǡ\": \"Ǡ\",\n  \"Å\": \"Å\",\n  \"Ǻ\": \"Ǻ\",\n  \"Ḃ\": \"Ḃ\",\n  \"Ć\": \"Ć\",\n  \"Ḉ\": \"Ḉ\",\n  \"Č\": \"Č\",\n  \"Ĉ\": \"Ĉ\",\n  \"Ċ\": \"Ċ\",\n  \"Ç\": \"Ç\",\n  \"Ď\": \"Ď\",\n  \"Ḋ\": \"Ḋ\",\n  \"Ḑ\": \"Ḑ\",\n  \"É\": \"É\",\n  \"È\": \"È\",\n  \"Ë\": \"Ë\",\n  \"Ẽ\": \"Ẽ\",\n  \"Ē\": \"Ē\",\n  \"Ḗ\": \"Ḗ\",\n  \"Ḕ\": \"Ḕ\",\n  \"Ĕ\": \"Ĕ\",\n  \"Ḝ\": \"Ḝ\",\n  \"Ě\": \"Ě\",\n  \"Ê\": \"Ê\",\n  \"Ế\": \"Ế\",\n  \"Ề\": \"Ề\",\n  \"Ễ\": \"Ễ\",\n  \"Ė\": \"Ė\",\n  \"Ȩ\": \"Ȩ\",\n  \"Ḟ\": \"Ḟ\",\n  \"Ǵ\": \"Ǵ\",\n  \"Ḡ\": \"Ḡ\",\n  \"Ğ\": \"Ğ\",\n  \"Ǧ\": \"Ǧ\",\n  \"Ĝ\": \"Ĝ\",\n  \"Ġ\": \"Ġ\",\n  \"Ģ\": \"Ģ\",\n  \"Ḧ\": \"Ḧ\",\n  \"Ȟ\": \"Ȟ\",\n  \"Ĥ\": \"Ĥ\",\n  \"Ḣ\": \"Ḣ\",\n  \"Ḩ\": \"Ḩ\",\n  \"Í\": \"Í\",\n  \"Ì\": \"Ì\",\n  \"Ï\": \"Ï\",\n  \"Ḯ\": \"Ḯ\",\n  \"Ĩ\": \"Ĩ\",\n  \"Ī\": \"Ī\",\n  \"Ĭ\": \"Ĭ\",\n  \"Ǐ\": \"Ǐ\",\n  \"Î\": \"Î\",\n  \"İ\": \"İ\",\n  \"Ĵ\": \"Ĵ\",\n  \"Ḱ\": \"Ḱ\",\n  \"Ǩ\": \"Ǩ\",\n  \"Ķ\": \"Ķ\",\n  \"Ĺ\": \"Ĺ\",\n  \"Ľ\": \"Ľ\",\n  \"Ļ\": \"Ļ\",\n  \"Ḿ\": \"Ḿ\",\n  \"Ṁ\": \"Ṁ\",\n  \"Ń\": \"Ń\",\n  \"Ǹ\": \"Ǹ\",\n  \"Ñ\": \"Ñ\",\n  \"Ň\": \"Ň\",\n  \"Ṅ\": \"Ṅ\",\n  \"Ņ\": \"Ņ\",\n  \"Ó\": \"Ó\",\n  \"Ò\": \"Ò\",\n  \"Ö\": \"Ö\",\n  \"Ȫ\": \"Ȫ\",\n  \"Õ\": \"Õ\",\n  \"Ṍ\": \"Ṍ\",\n  \"Ṏ\": \"Ṏ\",\n  \"Ȭ\": \"Ȭ\",\n  \"Ō\": \"Ō\",\n  \"Ṓ\": \"Ṓ\",\n  \"Ṑ\": \"Ṑ\",\n  \"Ŏ\": \"Ŏ\",\n  \"Ǒ\": \"Ǒ\",\n  \"Ô\": \"Ô\",\n  \"Ố\": \"Ố\",\n  \"Ồ\": \"Ồ\",\n  \"Ỗ\": \"Ỗ\",\n  \"Ȯ\": \"Ȯ\",\n  \"Ȱ\": \"Ȱ\",\n  \"Ő\": \"Ő\",\n  \"Ṕ\": \"Ṕ\",\n  \"Ṗ\": \"Ṗ\",\n  \"Ŕ\": \"Ŕ\",\n  \"Ř\": \"Ř\",\n  \"Ṙ\": \"Ṙ\",\n  \"Ŗ\": \"Ŗ\",\n  \"Ś\": \"Ś\",\n  \"Ṥ\": \"Ṥ\",\n  \"Š\": \"Š\",\n  \"Ṧ\": \"Ṧ\",\n  \"Ŝ\": \"Ŝ\",\n  \"Ṡ\": \"Ṡ\",\n  \"Ş\": \"Ş\",\n  \"Ť\": \"Ť\",\n  \"Ṫ\": \"Ṫ\",\n  \"Ţ\": \"Ţ\",\n  \"Ú\": \"Ú\",\n  \"Ù\": \"Ù\",\n  \"Ü\": \"Ü\",\n  \"Ǘ\": \"Ǘ\",\n  \"Ǜ\": \"Ǜ\",\n  \"Ǖ\": \"Ǖ\",\n  \"Ǚ\": \"Ǚ\",\n  \"Ũ\": \"Ũ\",\n  \"Ṹ\": \"Ṹ\",\n  \"Ū\": \"Ū\",\n  \"Ṻ\": \"Ṻ\",\n  \"Ŭ\": \"Ŭ\",\n  \"Ǔ\": \"Ǔ\",\n  \"Û\": \"Û\",\n  \"Ů\": \"Ů\",\n  \"Ű\": \"Ű\",\n  \"Ṽ\": \"Ṽ\",\n  \"Ẃ\": \"Ẃ\",\n  \"Ẁ\": \"Ẁ\",\n  \"Ẅ\": \"Ẅ\",\n  \"Ŵ\": \"Ŵ\",\n  \"Ẇ\": \"Ẇ\",\n  \"Ẍ\": \"Ẍ\",\n  \"Ẋ\": \"Ẋ\",\n  \"Ý\": \"Ý\",\n  \"Ỳ\": \"Ỳ\",\n  \"Ÿ\": \"Ÿ\",\n  \"Ỹ\": \"Ỹ\",\n  \"Ȳ\": \"Ȳ\",\n  \"Ŷ\": \"Ŷ\",\n  \"Ẏ\": \"Ẏ\",\n  \"Ź\": \"Ź\",\n  \"Ž\": \"Ž\",\n  \"Ẑ\": \"Ẑ\",\n  \"Ż\": \"Ż\",\n  \"ά\": \"ά\",\n  \"ὰ\": \"ὰ\",\n  \"ᾱ\": \"ᾱ\",\n  \"ᾰ\": \"ᾰ\",\n  \"έ\": \"έ\",\n  \"ὲ\": \"ὲ\",\n  \"ή\": \"ή\",\n  \"ὴ\": \"ὴ\",\n  \"ί\": \"ί\",\n  \"ὶ\": \"ὶ\",\n  \"ϊ\": \"ϊ\",\n  \"ΐ\": \"ΐ\",\n  \"ῒ\": \"ῒ\",\n  \"ῑ\": \"ῑ\",\n  \"ῐ\": \"ῐ\",\n  \"ό\": \"ό\",\n  \"ὸ\": \"ὸ\",\n  \"ύ\": \"ύ\",\n  \"ὺ\": \"ὺ\",\n  \"ϋ\": \"ϋ\",\n  \"ΰ\": \"ΰ\",\n  \"ῢ\": \"ῢ\",\n  \"ῡ\": \"ῡ\",\n  \"ῠ\": \"ῠ\",\n  \"ώ\": \"ώ\",\n  \"ὼ\": \"ὼ\",\n  \"Ύ\": \"Ύ\",\n  \"Ὺ\": \"Ὺ\",\n  \"Ϋ\": \"Ϋ\",\n  \"Ῡ\": \"Ῡ\",\n  \"Ῠ\": \"Ῠ\",\n  \"Ώ\": \"Ώ\",\n  \"Ὼ\": \"Ὼ\"\n};\n/**\n * This file contains the parser used to parse out a TeX expression from the\n * input. Since TeX isn't context-free, standard parsers don't work particularly\n * well.\n *\n * The strategy of this parser is as such:\n *\n * The main functions (the `.parse...` ones) take a position in the current\n * parse string to parse tokens from. The lexer (found in Lexer.js, stored at\n * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When\n * individual tokens are needed at a position, the lexer is called to pull out a\n * token, which is then used.\n *\n * The parser has a property called \"mode\" indicating the mode that\n * the parser is currently in. Currently it has to be one of \"math\" or\n * \"text\", which denotes whether the current environment is a math-y\n * one or a text-y one (e.g. inside \\text). Currently, this serves to\n * limit the functions which can be used in text mode.\n *\n * The main functions then return an object which contains the useful data that\n * was parsed at its given point, and a new position at the end of the parsed\n * data. The main functions can call each other and continue the parsing by\n * using the returned position as a new starting point.\n *\n * There are also extra `.handle...` functions, which pull out some reused\n * functionality into self-contained functions.\n *\n * The functions return ParseNodes.\n */\nclass Parser {\n  constructor(input, settings) {\n    this.mode = void 0;\n    this.gullet = void 0;\n    this.settings = void 0;\n    this.leftrightDepth = void 0;\n    this.nextToken = void 0;\n    // Start in math mode\n    this.mode = \"math\";\n    // Create a new macro expander (gullet) and (indirectly via that) also a\n    // new lexer (mouth) for this parser (stomach, in the language of TeX)\n    this.gullet = new MacroExpander(input, settings, this.mode);\n    // Store the settings for use in parsing\n    this.settings = settings;\n    // Count leftright depth (for \\middle errors)\n    this.leftrightDepth = 0;\n    this.nextToken = null;\n  }\n  /**\n   * Checks a result to make sure it has the right type, and throws an\n   * appropriate error otherwise.\n   */\n  expect(text, consume) {\n    if (consume === void 0) {\n      consume = true;\n    }\n    if (this.fetch().text !== text) {\n      throw new ParseError(\"Expected '\" + text + \"', got '\" + this.fetch().text + \"'\", this.fetch());\n    }\n    if (consume) {\n      this.consume();\n    }\n  }\n  /**\n   * Discards the current lookahead token, considering it consumed.\n   */\n  consume() {\n    this.nextToken = null;\n  }\n  /**\n   * Return the current lookahead token, or if there isn't one (at the\n   * beginning, or if the previous lookahead token was consume()d),\n   * fetch the next token as the new lookahead token and return it.\n   */\n  fetch() {\n    if (this.nextToken == null) {\n      this.nextToken = this.gullet.expandNextToken();\n    }\n    return this.nextToken;\n  }\n  /**\n   * Switches between \"text\" and \"math\" modes.\n   */\n  switchMode(newMode) {\n    this.mode = newMode;\n    this.gullet.switchMode(newMode);\n  }\n  /**\n   * Main parsing function, which parses an entire input.\n   */\n  parse() {\n    if (!this.settings.globalGroup) {\n      // Create a group namespace for the math expression.\n      // (LaTeX creates a new group for every $...$, $$...$$, \\[...\\].)\n      this.gullet.beginGroup();\n    }\n    // Use old \\color behavior (same as LaTeX's \\textcolor) if requested.\n    // We do this within the group for the math expression, so it doesn't\n    // pollute settings.macros.\n    if (this.settings.colorIsTextColor) {\n      this.gullet.macros.set(\"\\\\color\", \"\\\\textcolor\");\n    }\n    try {\n      // Try to parse the input\n      var parse = this.parseExpression(false);\n      // If we succeeded, make sure there's an EOF at the end\n      this.expect(\"EOF\");\n      // End the group namespace for the expression\n      if (!this.settings.globalGroup) {\n        this.gullet.endGroup();\n      }\n      return parse;\n      // Close any leftover groups in case of a parse error.\n    } finally {\n      this.gullet.endGroups();\n    }\n  }\n  /**\n   * Fully parse a separate sequence of tokens as a separate job.\n   * Tokens should be specified in reverse order, as in a MacroDefinition.\n   */\n  subparse(tokens) {\n    // Save the next token from the current job.\n    var oldToken = this.nextToken;\n    this.consume();\n    // Run the new job, terminating it with an excess '}'\n    this.gullet.pushToken(new Token(\"}\"));\n    this.gullet.pushTokens(tokens);\n    var parse = this.parseExpression(false);\n    this.expect(\"}\");\n    // Restore the next token from the current job.\n    this.nextToken = oldToken;\n    return parse;\n  }\n  /**\n   * Parses an \"expression\", which is a list of atoms.\n   *\n   * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This\n   *                 happens when functions have higher precedence than infix\n   *                 nodes in implicit parses.\n   *\n   * `breakOnTokenText`: The text of the token that the expression should end\n   *                     with, or `null` if something else should end the\n   *                     expression.\n   */\n  parseExpression(breakOnInfix, breakOnTokenText) {\n    var body = [];\n    // Keep adding atoms to the body until we can't parse any more atoms (either\n    // we reached the end, a }, or a \\right)\n    while (true) {\n      // Ignore spaces in math mode\n      if (this.mode === \"math\") {\n        this.consumeSpaces();\n      }\n      var lex = this.fetch();\n      if (Parser.endOfExpression.has(lex.text)) {\n        break;\n      }\n      if (breakOnTokenText && lex.text === breakOnTokenText) {\n        break;\n      }\n      if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {\n        break;\n      }\n      var atom = this.parseAtom(breakOnTokenText);\n      if (!atom) {\n        break;\n      } else if (atom.type === \"internal\") {\n        // Internal nodes do not appear in parse tree\n        continue;\n      }\n      body.push(atom);\n    }\n    if (this.mode === \"text\") {\n      this.formLigatures(body);\n    }\n    return this.handleInfixNodes(body);\n  }\n  /**\n   * Rewrites infix operators such as \\over with corresponding commands such\n   * as \\frac.\n   *\n   * There can only be one infix operator per group.  If there's more than one\n   * then the expression is ambiguous.  This can be resolved by adding {}.\n   */\n  handleInfixNodes(body) {\n    var overIndex = -1;\n    var funcName;\n    for (var i = 0; i < body.length; i++) {\n      var node = body[i];\n      if (node.type === \"infix\") {\n        if (overIndex !== -1) {\n          throw new ParseError(\"only one infix operator per group\", node.token);\n        }\n        overIndex = i;\n        funcName = node.replaceWith;\n      }\n    }\n    if (overIndex !== -1 && funcName) {\n      var numerNode;\n      var denomNode;\n      var numerBody = body.slice(0, overIndex);\n      var denomBody = body.slice(overIndex + 1);\n      if (numerBody.length === 1 && numerBody[0].type === \"ordgroup\") {\n        numerNode = numerBody[0];\n      } else {\n        numerNode = {\n          type: \"ordgroup\",\n          mode: this.mode,\n          body: numerBody\n        };\n      }\n      if (denomBody.length === 1 && denomBody[0].type === \"ordgroup\") {\n        denomNode = denomBody[0];\n      } else {\n        denomNode = {\n          type: \"ordgroup\",\n          mode: this.mode,\n          body: denomBody\n        };\n      }\n      var _node;\n      if (funcName === \"\\\\\\\\abovefrac\") {\n        _node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);\n      } else {\n        _node = this.callFunction(funcName, [numerNode, denomNode], []);\n      }\n      return [_node];\n    } else {\n      return body;\n    }\n  }\n  /**\n   * Handle a subscript or superscript with nice errors.\n   */\n  handleSupSubscript(name) {\n    var symbolToken = this.fetch();\n    var symbol = symbolToken.text;\n    this.consume();\n    this.consumeSpaces(); // ignore spaces before sup/subscript argument\n    // Skip over allowed internal nodes such as \\relax\n    var group;\n    do {\n      var _group;\n      group = this.parseGroup(name);\n    } while (((_group = group) == null ? void 0 : _group.type) === \"internal\");\n    if (!group) {\n      throw new ParseError(\"Expected group after '\" + symbol + \"'\", symbolToken);\n    }\n    return group;\n  }\n  /**\n   * Converts the textual input of an unsupported command into a text node\n   * contained within a color node whose color is determined by errorColor\n   */\n  formatUnsupportedCmd(text) {\n    var textordArray = [];\n    for (var i = 0; i < text.length; i++) {\n      textordArray.push({\n        type: \"textord\",\n        mode: \"text\",\n        text: text[i]\n      });\n    }\n    var textNode = {\n      type: \"text\",\n      mode: this.mode,\n      body: textordArray\n    };\n    var colorNode = {\n      type: \"color\",\n      mode: this.mode,\n      color: this.settings.errorColor,\n      body: [textNode]\n    };\n    return colorNode;\n  }\n  /**\n   * Parses a group with optional super/subscripts.\n   */\n  parseAtom(breakOnTokenText) {\n    // The body of an atom is an implicit group, so that things like\n    // \\left(x\\right)^2 work correctly.\n    var base = this.parseGroup(\"atom\", breakOnTokenText);\n    // Internal nodes (e.g. \\relax) cannot support super/subscripts.\n    // Instead, we will pick up super/subscripts with blank base next round.\n    if ((base == null ? void 0 : base.type) === \"internal\") {\n      return base;\n    }\n    // In text mode, we don't have superscripts or subscripts\n    if (this.mode === \"text\") {\n      return base;\n    }\n    var superscript;\n    var subscript;\n    while (true) {\n      // Guaranteed in math mode, so eat any spaces first.\n      this.consumeSpaces();\n      // Lex the first token\n      var lex = this.fetch();\n      if (lex.text === \"\\\\limits\" || lex.text === \"\\\\nolimits\") {\n        // We got a limit control\n        if (base && base.type === \"op\") {\n          base.limits = lex.text === \"\\\\limits\";\n          base.alwaysHandleSupSub = true;\n        } else if (base && base.type === \"operatorname\") {\n          if (base.alwaysHandleSupSub) {\n            base.limits = lex.text === \"\\\\limits\";\n          }\n        } else {\n          throw new ParseError(\"Limit controls must follow a math operator\", lex);\n        }\n        this.consume();\n      } else if (lex.text === \"^\") {\n        // We got a superscript start\n        if (superscript) {\n          throw new ParseError(\"Double superscript\", lex);\n        }\n        superscript = this.handleSupSubscript(\"superscript\");\n      } else if (lex.text === \"_\") {\n        // We got a subscript start\n        if (subscript) {\n          throw new ParseError(\"Double subscript\", lex);\n        }\n        subscript = this.handleSupSubscript(\"subscript\");\n      } else if (lex.text === \"'\") {\n        // We got a prime\n        if (superscript) {\n          throw new ParseError(\"Double superscript\", lex);\n        }\n        var prime = {\n          type: \"textord\",\n          mode: this.mode,\n          text: \"\\\\prime\"\n        };\n        // Many primes can be grouped together, so we handle this here\n        var primes = [prime];\n        this.consume();\n        // Keep lexing tokens until we get something that's not a prime\n        while (this.fetch().text === \"'\") {\n          // For each one, add another prime to the list\n          primes.push(prime);\n          this.consume();\n        }\n        // If there's a superscript following the primes, combine that\n        // superscript in with the primes.\n        if (this.fetch().text === \"^\") {\n          primes.push(this.handleSupSubscript(\"superscript\"));\n        }\n        // Put everything into an ordgroup as the superscript\n        superscript = {\n          type: \"ordgroup\",\n          mode: this.mode,\n          body: primes\n        };\n      } else if (uSubsAndSups[lex.text]) {\n        // A Unicode subscript or superscript character.\n        // We treat these similarly to the unicode-math package.\n        // So we render a string of Unicode (sub|super)scripts the\n        // same as a (sub|super)script of regular characters.\n        var isSub = unicodeSubRegEx.test(lex.text);\n        var subsupTokens = [];\n        subsupTokens.push(new Token(uSubsAndSups[lex.text]));\n        this.consume();\n        // Continue fetching tokens to fill out the string.\n        while (true) {\n          var token = this.fetch().text;\n          if (!uSubsAndSups[token]) {\n            break;\n          }\n          if (unicodeSubRegEx.test(token) !== isSub) {\n            break;\n          }\n          subsupTokens.unshift(new Token(uSubsAndSups[token]));\n          this.consume();\n        }\n        // Now create a (sub|super)script.\n        var body = this.subparse(subsupTokens);\n        if (isSub) {\n          subscript = {\n            type: \"ordgroup\",\n            mode: \"math\",\n            body\n          };\n        } else {\n          superscript = {\n            type: \"ordgroup\",\n            mode: \"math\",\n            body\n          };\n        }\n      } else {\n        // If it wasn't ^, _, or ', stop parsing super/subscripts\n        break;\n      }\n    }\n    // Base must be set if superscript or subscript are set per logic above,\n    // but need to check here for type check to pass.\n    if (superscript && subscript) {\n      return {\n        type: \"supsub\",\n        mode: this.mode,\n        base,\n        sup: superscript,\n        sub: subscript\n      };\n    } else if (superscript) {\n      return {\n        type: \"supsub\",\n        mode: this.mode,\n        base,\n        sup: superscript\n      };\n    } else if (subscript) {\n      return {\n        type: \"supsub\",\n        mode: this.mode,\n        base,\n        sub: subscript\n      };\n    } else {\n      // Otherwise return the original body\n      return base;\n    }\n  }\n  /**\n   * Parses an entire function, including its base and all of its arguments.\n   */\n  parseFunction(breakOnTokenText, name) {\n    var token = this.fetch();\n    var func = token.text;\n    var funcData = functions[func];\n    if (!funcData) {\n      return null;\n    }\n    this.consume(); // consume command token\n    if (name && name !== \"atom\" && !funcData.allowedInArgument) {\n      throw new ParseError(\"Got function '\" + func + \"' with no arguments\" + (name ? \" as \" + name : \"\"), token);\n      // Treat undefined allowedInText as false.\n    } else if (this.mode === \"text\" && !funcData.allowedInText) {\n      throw new ParseError(\"Can't use function '\" + func + \"' in text mode\", token);\n      // Treat undefined allowedInMath as true.\n    } else if (this.mode === \"math\" && funcData.allowedInMath === false) {\n      throw new ParseError(\"Can't use function '\" + func + \"' in math mode\", token);\n    }\n    var {\n      args,\n      optArgs\n    } = this.parseArguments(func, funcData);\n    return this.callFunction(func, args, optArgs, token, breakOnTokenText);\n  }\n  /**\n   * Call a function handler with a suitable context and arguments.\n   */\n  callFunction(name, args, optArgs, token, breakOnTokenText) {\n    var context = {\n      funcName: name,\n      parser: this,\n      token,\n      breakOnTokenText\n    };\n    var func = functions[name];\n    if (func && func.handler) {\n      return func.handler(context, args, optArgs);\n    } else {\n      throw new ParseError(\"No function handler for \" + name);\n    }\n  }\n  /**\n   * Parses the arguments of a function or environment\n   */\n  parseArguments(func,\n  // Should look like \"\\name\" or \"\\begin{name}\".\n  funcData) {\n    var _funcData$numOptional;\n    var numOptionalArgs = (_funcData$numOptional = funcData.numOptionalArgs) != null ? _funcData$numOptional : 0;\n    var totalArgs = funcData.numArgs + numOptionalArgs;\n    if (totalArgs === 0) {\n      return {\n        args: [],\n        optArgs: []\n      };\n    }\n    var args = [];\n    var optArgs = [];\n    for (var i = 0; i < totalArgs; i++) {\n      var _funcData$argTypes;\n      var argType = (_funcData$argTypes = funcData.argTypes) == null ? void 0 : _funcData$argTypes[i];\n      var isOptional = i < numOptionalArgs;\n      if (\"primitive\" in funcData && funcData.primitive && argType == null ||\n      // \\sqrt expands into primitive if optional argument doesn't exist\n      funcData.type === \"sqrt\" && i === 1 && optArgs[0] == null) {\n        argType = \"primitive\";\n      }\n      var arg = this.parseGroupOfType(\"argument to '\" + func + \"'\", argType, isOptional);\n      if (isOptional) {\n        optArgs.push(arg);\n      } else if (arg != null) {\n        args.push(arg);\n      } else {\n        // should be unreachable\n        throw new ParseError(\"Null argument, please report this as a bug\");\n      }\n    }\n    return {\n      args,\n      optArgs\n    };\n  }\n  /**\n   * Parses a group when the mode is changing.\n   */\n  parseGroupOfType(name, type, optional) {\n    switch (type) {\n      case \"color\":\n        return this.parseColorGroup(optional);\n      case \"size\":\n        return this.parseSizeGroup(optional);\n      case \"url\":\n        return this.parseUrlGroup(optional);\n      case \"math\":\n      case \"text\":\n        return this.parseArgumentGroup(optional, type);\n      case \"hbox\":\n        {\n          // hbox argument type wraps the argument in the equivalent of\n          // \\hbox, which is like \\text but switching to \\textstyle size\n          // and resetting math font.\n          var group = this.parseArgumentGroup(optional, \"text\");\n          return group != null ? {\n            type: \"styling\",\n            mode: group.mode,\n            body: [group],\n            style: \"text\",\n            // simulate \\textstyle\n            resetFont: true\n          } : null;\n        }\n      case \"raw\":\n        {\n          var token = this.parseStringGroup(optional);\n          return token != null ? {\n            type: \"raw\",\n            mode: \"text\",\n            string: token.text\n          } : null;\n        }\n      case \"primitive\":\n        {\n          if (optional) {\n            throw new ParseError(\"A primitive argument cannot be optional\");\n          }\n          var _group2 = this.parseGroup(name);\n          if (_group2 == null) {\n            throw new ParseError(\"Expected group as \" + name, this.fetch());\n          }\n          return _group2;\n        }\n      case \"original\":\n      case undefined:\n        return this.parseArgumentGroup(optional);\n      default:\n        throw new ParseError(\"Unknown group type as \" + name, this.fetch());\n    }\n  }\n  /**\n   * Discard any space tokens, fetching the next non-space token.\n   */\n  consumeSpaces() {\n    while (this.fetch().text === \" \") {\n      this.consume();\n    }\n  }\n  /**\n   * Parses a group, essentially returning the string formed by the\n   * brace-enclosed tokens plus some position information.\n   */\n  parseStringGroup(optional) {\n    var argToken = this.gullet.scanArgument(optional);\n    if (argToken == null) {\n      return null;\n    }\n    var str = \"\";\n    var nextToken;\n    while ((nextToken = this.fetch()).text !== \"EOF\") {\n      str += nextToken.text;\n      this.consume();\n    }\n    this.consume(); // consume the end of the argument\n    argToken.text = str;\n    return argToken;\n  }\n  /**\n   * Parses a regex-delimited group: the largest sequence of tokens\n   * whose concatenated strings match `regex`. Returns the string\n   * formed by the tokens plus some position information.\n   */\n  parseRegexGroup(regex, modeName) {\n    var firstToken = this.fetch();\n    var lastToken = firstToken;\n    var str = \"\";\n    var nextToken;\n    while ((nextToken = this.fetch()).text !== \"EOF\" && regex.test(str + nextToken.text)) {\n      lastToken = nextToken;\n      str += lastToken.text;\n      this.consume();\n    }\n    if (str === \"\") {\n      throw new ParseError(\"Invalid \" + modeName + \": '\" + firstToken.text + \"'\", firstToken);\n    }\n    return firstToken.range(lastToken, str);\n  }\n  /**\n   * Parses a color description.\n   */\n  parseColorGroup(optional) {\n    var res = this.parseStringGroup(optional);\n    if (res == null) {\n      return null;\n    }\n    var match = /^(#[a-f0-9]{3,4}|#[a-f0-9]{6}|#[a-f0-9]{8}|[a-f0-9]{6}|[a-z]+)$/i.exec(res.text);\n    if (!match) {\n      throw new ParseError(\"Invalid color: '\" + res.text + \"'\", res);\n    }\n    var color = match[0];\n    if (/^[0-9a-f]{6}$/i.test(color)) {\n      // We allow a 6-digit HTML color spec without a leading \"#\".\n      // This follows the xcolor package's HTML color model.\n      // Predefined color names are all missed by this RegEx pattern.\n      color = \"#\" + color;\n    }\n    return {\n      type: \"color-token\",\n      mode: this.mode,\n      color\n    };\n  }\n  /**\n   * Parses a size specification, consisting of magnitude and unit.\n   */\n  parseSizeGroup(optional) {\n    var res;\n    var isBlank = false;\n    // don't expand before parseStringGroup\n    this.gullet.consumeSpaces();\n    if (!optional && this.gullet.future().text !== \"{\") {\n      res = this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/, \"size\");\n    } else {\n      res = this.parseStringGroup(optional);\n    }\n    if (!res) {\n      return null;\n    }\n    if (!optional && res.text.length === 0) {\n      // Because we've tested for what is !optional, this block won't\n      // affect \\kern, \\hspace, etc. It will capture the mandatory arguments\n      // to \\genfrac and \\above.\n      res.text = \"0pt\"; // Enable \\above{}\n      isBlank = true; // This is here specifically for \\genfrac\n    }\n    var match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(res.text);\n    if (!match) {\n      throw new ParseError(\"Invalid size: '\" + res.text + \"'\", res);\n    }\n    var data = {\n      number: +(match[1] + match[2]),\n      // sign + magnitude, cast to number\n      unit: match[3]\n    };\n    if (!validUnit(data)) {\n      throw new ParseError(\"Invalid unit: '\" + data.unit + \"'\", res);\n    }\n    return {\n      type: \"size\",\n      mode: this.mode,\n      value: data,\n      isBlank\n    };\n  }\n  /**\n   * Parses an URL, checking escaped letters and allowed protocols,\n   * and setting the catcode of % as an active character (as in \\hyperref).\n   */\n  parseUrlGroup(optional) {\n    this.gullet.lexer.setCatcode(\"%\", 13); // active character\n    this.gullet.lexer.setCatcode(\"~\", 12); // other character\n    var res = this.parseStringGroup(optional);\n    this.gullet.lexer.setCatcode(\"%\", 14); // comment character\n    this.gullet.lexer.setCatcode(\"~\", 13); // active character\n    if (res == null) {\n      return null;\n    }\n    // hyperref package allows backslashes alone in href, but doesn't\n    // generate valid links in such cases; we interpret this as\n    // \"undefined\" behaviour, and keep them as-is. Some browser will\n    // replace backslashes with forward slashes.\n    var url = res.text.replace(/\\\\([#$%&~_^{}])/g, '$1');\n    return {\n      type: \"url\",\n      mode: this.mode,\n      url\n    };\n  }\n  /**\n   * Parses an argument with the mode specified.\n   */\n  parseArgumentGroup(optional, mode) {\n    var argToken = this.gullet.scanArgument(optional);\n    if (argToken == null) {\n      return null;\n    }\n    var outerMode = this.mode;\n    if (mode) {\n      // Switch to specified mode\n      this.switchMode(mode);\n    }\n    this.gullet.beginGroup();\n    var expression = this.parseExpression(false, \"EOF\");\n    // TODO: find an alternative way to denote the end\n    this.expect(\"EOF\"); // expect the end of the argument\n    this.gullet.endGroup();\n    var result = {\n      type: \"ordgroup\",\n      mode: this.mode,\n      loc: argToken.loc,\n      body: expression\n    };\n    if (mode) {\n      // Switch mode back\n      this.switchMode(outerMode);\n    }\n    return result;\n  }\n  /**\n   * Parses an ordinary group, which is either a single nucleus (like \"x\")\n   * or an expression in braces (like \"{x+y}\") or an implicit group, a group\n   * that starts at the current position, and ends right before a higher explicit\n   * group ends, or at EOF.\n   */\n  parseGroup(name,\n  // For error reporting.\n  breakOnTokenText) {\n    var firstToken = this.fetch();\n    var text = firstToken.text;\n    var result;\n    // Try to parse an open brace or \\begingroup\n    if (text === \"{\" || text === \"\\\\begingroup\") {\n      this.consume();\n      var groupEnd = text === \"{\" ? \"}\" : \"\\\\endgroup\";\n      this.gullet.beginGroup();\n      // If we get a brace, parse an expression\n      var expression = this.parseExpression(false, groupEnd);\n      var lastToken = this.fetch();\n      this.expect(groupEnd); // Check that we got a matching closing brace\n      this.gullet.endGroup();\n      result = {\n        type: \"ordgroup\",\n        mode: this.mode,\n        loc: SourceLocation.range(firstToken, lastToken),\n        body: expression,\n        // A group formed by \\begingroup...\\endgroup is a semi-simple group\n        // which doesn't affect spacing in math mode, i.e., is transparent.\n        // https://tex.stackexchange.com/questions/1930/when-should-one-\n        // use-begingroup-instead-of-bgroup\n        semisimple: text === \"\\\\begingroup\" || undefined\n      };\n    } else {\n      // If there exists a function with this name, parse the function.\n      // Otherwise, just return a nucleus\n      result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol();\n      if (result == null && text[0] === \"\\\\\" && !implicitCommands.hasOwnProperty(text)) {\n        if (this.settings.throwOnError) {\n          throw new ParseError(\"Undefined control sequence: \" + text, firstToken);\n        }\n        result = this.formatUnsupportedCmd(text);\n        this.consume();\n      }\n    }\n    return result;\n  }\n  /**\n   * Form ligature-like combinations of characters for text mode.\n   * This includes inputs like \"--\", \"---\", \"``\" and \"''\".\n   * The result will simply replace multiple textord nodes with a single\n   * character in each value by a single textord node having multiple\n   * characters in its value.  The representation is still ASCII source.\n   * The group will be modified in place.\n   */\n  formLigatures(group) {\n    var n = group.length - 1;\n    for (var i = 0; i < n; ++i) {\n      var a = group[i];\n      if (a.type !== \"textord\") {\n        continue;\n      }\n      var v = a.text;\n      var next = group[i + 1];\n      if (!next || next.type !== \"textord\") {\n        continue;\n      }\n      if (v === \"-\" && next.text === \"-\") {\n        var afterNext = group[i + 2];\n        if (i + 1 < n && afterNext && afterNext.type === \"textord\" && afterNext.text === \"-\") {\n          group.splice(i, 3, {\n            type: \"textord\",\n            mode: \"text\",\n            loc: SourceLocation.range(a, afterNext),\n            text: \"---\"\n          });\n          n -= 2;\n        } else {\n          group.splice(i, 2, {\n            type: \"textord\",\n            mode: \"text\",\n            loc: SourceLocation.range(a, next),\n            text: \"--\"\n          });\n          n -= 1;\n        }\n      }\n      if ((v === \"'\" || v === \"`\") && next.text === v) {\n        group.splice(i, 2, {\n          type: \"textord\",\n          mode: \"text\",\n          loc: SourceLocation.range(a, next),\n          text: v + v\n        });\n        n -= 1;\n      }\n    }\n  }\n  /**\n   * Parse a single symbol out of the string. Here, we handle single character\n   * symbols and special functions like \\verb.\n   */\n  parseSymbol() {\n    var nucleus = this.fetch();\n    var text = nucleus.text;\n    if (/^\\\\verb[^a-zA-Z]/.test(text)) {\n      this.consume();\n      var arg = text.slice(5);\n      var star = arg.charAt(0) === \"*\";\n      if (star) {\n        arg = arg.slice(1);\n      }\n      // Lexer's tokenRegex is constructed to always have matching\n      // first/last characters.\n      if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {\n        throw new ParseError(\"\\\\verb assertion failed --\\n                    please report what input caused this bug\");\n      }\n      arg = arg.slice(1, -1); // remove first and last char\n      return {\n        type: \"verb\",\n        mode: \"text\",\n        body: arg,\n        star\n      };\n    }\n    // At this point, we should have a symbol, possibly with accents.\n    // First expand any accented base symbol according to unicodeSymbols.\n    if (unicodeSymbols.hasOwnProperty(text[0]) && !symbols[this.mode][text[0]]) {\n      // This behavior is not strict (XeTeX-compatible) in math mode.\n      if (this.settings.strict && this.mode === \"math\") {\n        this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Accented Unicode text character \\\"\" + text[0] + \"\\\" used in \" + \"math mode\", nucleus);\n      }\n      text = unicodeSymbols[text[0]] + text.slice(1);\n    }\n    // Strip off any combining characters\n    var match = combiningDiacriticalMarksEndRegex.exec(text);\n    if (match) {\n      text = text.substring(0, match.index);\n      if (text === 'i') {\n        text = '\\u0131'; // dotless i, in math and text mode\n      } else if (text === 'j') {\n        text = '\\u0237'; // dotless j, in math and text mode\n      }\n    }\n    // Recognize base symbol\n    var symbol;\n    if (symbols[this.mode][text]) {\n      if (this.settings.strict && this.mode === 'math' && extraLatin.includes(text)) {\n        this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Latin-1/Unicode text character \\\"\" + text[0] + \"\\\" used in \" + \"math mode\", nucleus);\n      }\n      var group = symbols[this.mode][text].group;\n      var loc = SourceLocation.range(nucleus);\n      var s;\n      if (isAtom(group)) {\n        s = {\n          type: \"atom\",\n          mode: this.mode,\n          family: group,\n          loc,\n          text\n        };\n      } else {\n        s = {\n          type: group,\n          mode: this.mode,\n          loc,\n          text\n        };\n      }\n      symbol = s;\n    } else if (text.charCodeAt(0) >= 0x80) {\n      // no symbol for e.g. ^\n      if (this.settings.strict) {\n        if (!supportedCodepoint(text.charCodeAt(0))) {\n          this.settings.reportNonstrict(\"unknownSymbol\", \"Unrecognized Unicode character \\\"\" + text[0] + \"\\\"\" + (\" (\" + text.charCodeAt(0) + \")\"), nucleus);\n        } else if (this.mode === \"math\") {\n          this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Unicode text character \\\"\" + text[0] + \"\\\" used in math mode\", nucleus);\n        }\n      }\n      // All nonmathematical Unicode characters are rendered as if they\n      // are in text mode (wrapped in \\text) because that's what it\n      // takes to render them in LaTeX.  Setting `mode: this.mode` is\n      // another natural choice (the user requested math mode), but\n      // this makes it more difficult for getCharacterMetrics() to\n      // distinguish Unicode characters without metrics and those for\n      // which we want to simulate the letter M.\n      symbol = {\n        type: \"textord\",\n        mode: \"text\",\n        loc: SourceLocation.range(nucleus),\n        text\n      };\n    } else {\n      return null; // EOF, ^, _, {, }, etc.\n    }\n    this.consume();\n    // Transform combining characters into accents\n    if (match) {\n      for (var i = 0; i < match[0].length; i++) {\n        var accent = match[0][i];\n        if (!unicodeAccents[accent]) {\n          throw new ParseError(\"Unknown accent ' \" + accent + \"'\", nucleus);\n        }\n        var command = unicodeAccents[accent][this.mode] || unicodeAccents[accent].text;\n        if (!command) {\n          throw new ParseError(\"Accent \" + accent + \" unsupported in \" + this.mode + \" mode\", nucleus);\n        }\n        symbol = {\n          type: \"accent\",\n          mode: this.mode,\n          loc: SourceLocation.range(nucleus),\n          label: command,\n          isStretchy: false,\n          isShifty: true,\n          base: symbol\n        };\n      }\n    }\n    return symbol;\n  }\n}\nParser.endOfExpression = new Set([\"}\", \"\\\\endgroup\", \"\\\\end\", \"\\\\right\", \"&\"]);\n\n/**\n * Parses an expression using a Parser, then returns the parsed result.\n */\nvar parseTree = function parseTree(toParse, settings) {\n  if (!(typeof toParse === 'string' || toParse instanceof String)) {\n    throw new TypeError('KaTeX can only parse string typed expression');\n  }\n  var parser = new Parser(toParse, settings);\n  // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n  delete parser.gullet.macros.current[\"\\\\df@tag\"];\n  var tree = parser.parse();\n  // Prevent a color definition from persisting between calls to katex.render().\n  delete parser.gullet.macros.current[\"\\\\current@color\"];\n  delete parser.gullet.macros.current[\"\\\\color\"];\n  // If the input used \\tag, it will set the \\df@tag macro to the tag.\n  // In this case, we separately parse the tag and wrap the tree.\n  if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n    if (!settings.displayMode) {\n      throw new ParseError(\"\\\\tag works only in display equations\");\n    }\n    tree = [{\n      type: \"tag\",\n      mode: \"text\",\n      body: tree,\n      tag: parser.subparse([new Token(\"\\\\df@tag\")])\n    }];\n  }\n  return tree;\n};\n\n/* eslint no-console:0 */\n/**\n * Parse and build an expression, and place that expression in the DOM node\n * given.\n */\nvar render = function render(expression, baseNode, options) {\n  baseNode.textContent = \"\";\n  var node = renderToDomTree(expression, options).toNode();\n  baseNode.appendChild(node);\n};\n// KaTeX's styles don't work properly in quirks mode. Print out an error, and\n// disable rendering.\nif (typeof document !== \"undefined\") {\n  if (document.compatMode !== \"CSS1Compat\") {\n    typeof console !== \"undefined\" && console.warn(\"Warning: KaTeX doesn't work in quirks mode. Make sure your \" + \"website has a suitable doctype.\");\n    render = function render() {\n      throw new ParseError(\"KaTeX doesn't work in quirks mode.\");\n    };\n  }\n}\n/**\n * Parse and build an expression, and return the markup for that.\n */\nvar renderToString = function renderToString(expression, options) {\n  var markup = renderToDomTree(expression, options).toMarkup();\n  return markup;\n};\n/**\n * Parse an expression and return the parse tree.\n */\nvar generateParseTree = function generateParseTree(expression, options) {\n  var settings = new Settings(options);\n  return parseTree(expression, settings);\n};\n/**\n * If the given error is a KaTeX ParseError and options.throwOnError is false,\n * renders the invalid LaTeX as a span with hover title giving the KaTeX\n * error message.  Otherwise, simply throws the error.\n */\nvar renderError = function renderError(error, expression, options) {\n  if (options.throwOnError || !(error instanceof ParseError)) {\n    throw error;\n  }\n  var node = makeSpan([\"katex-error\"], [new SymbolNode(expression)]);\n  node.setAttribute(\"title\", error.toString());\n  node.setAttribute(\"style\", \"color:\" + options.errorColor);\n  return node;\n};\n/**\n * Generates and returns the katex build tree. This is used for advanced\n * use cases (like rendering to custom output).\n */\nvar renderToDomTree = function renderToDomTree(expression, options) {\n  var settings = new Settings(options);\n  try {\n    var tree = parseTree(expression, settings);\n    return buildTree(tree, expression, settings);\n  } catch (error) {\n    return renderError(error, expression, settings);\n  }\n};\n/**\n * Generates and returns the katex build tree, with just HTML (no MathML).\n * This is used for advanced use cases (like rendering to custom output).\n */\nvar renderToHTMLTree = function renderToHTMLTree(expression, options) {\n  var settings = new Settings(options);\n  try {\n    var tree = parseTree(expression, settings);\n    return buildHTMLTree(tree, expression, settings);\n  } catch (error) {\n    return renderError(error, expression, settings);\n  }\n};\nvar version = \"0.17.0\";\nvar __domTree = {\n  Span,\n  Anchor,\n  SymbolNode,\n  SvgNode,\n  PathNode,\n  LineNode\n};\n// CJS exports and ESM default export\nvar katex = {\n  /**\n   * Current KaTeX version\n   */\n  version,\n  /**\n   * Renders the given LaTeX into an HTML+MathML combination, and adds\n   * it as a child to the specified DOM node.\n   */\n  render,\n  /**\n   * Renders the given LaTeX into an HTML+MathML combination string,\n   * for sending to the client.\n   */\n  renderToString,\n  /**\n   * KaTeX error, usually during parsing.\n   */\n  ParseError,\n  /**\n   * The schema of Settings\n   */\n  SETTINGS_SCHEMA,\n  /**\n   * Parses the given LaTeX into KaTeX's internal parse tree structure,\n   * without rendering to HTML or MathML.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __parse: generateParseTree,\n  /**\n   * Renders the given LaTeX into an HTML+MathML internal DOM tree\n   * representation, without flattening that representation to a string.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __renderToDomTree: renderToDomTree,\n  /**\n   * Renders the given LaTeX into an HTML internal DOM tree representation,\n   * without MathML and without flattening that representation to a string.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __renderToHTMLTree: renderToHTMLTree,\n  /**\n   * extends internal font metrics object with a new object\n   * each key in the new object represents a font name\n  */\n  __setFontMetrics: setFontMetrics,\n  /**\n   * adds a new symbol to builtin symbols table\n   */\n  __defineSymbol: defineSymbol,\n  /**\n   * adds a new function to builtin function list,\n   * which directly produce parse tree elements\n   * and have their own html/mathml builders\n   */\n  __defineFunction: defineFunction,\n  /**\n   * adds a new macro to builtin macro list\n   */\n  __defineMacro: defineMacro,\n  /**\n   * Expose the dom tree node types, which can be useful for type checking nodes.\n   *\n   * NOTE: These methods are not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __domTree\n};\n\nexport { ParseError, SETTINGS_SCHEMA, defineFunction as __defineFunction, defineMacro as __defineMacro, defineSymbol as __defineSymbol, __domTree, generateParseTree as __parse, renderToDomTree as __renderToDomTree, renderToHTMLTree as __renderToHTMLTree, setFontMetrics as __setFontMetrics, katex as default, render, renderToString, version };\n","/*\nCopyright 2024, 2025 New Vector Ltd.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2019 The Matrix.org Foundation C.I.C.\nCopyright 2017, 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type Key, type LegacyRef, type ReactNode } from \"react\";\nimport sanitizeHtml, { type IOptions } from \"sanitize-html\";\nimport classNames from \"classnames\";\nimport katex from \"katex\";\nimport { decode } from \"html-entities\";\nimport { type IContent } from \"matrix-js-sdk/src/matrix\";\nimport escapeHtml from \"escape-html\";\nimport { getEmojiFromUnicode } from \"@matrix-org/emojibase-bindings\";\nimport { PERMITTED_URL_SCHEMES, LINKIFIED_DATA_ATTRIBUTE } from \"@element-hq/web-shared-components\";\n\nimport SettingsStore from \"./settings/SettingsStore\";\nimport { stripHTMLReply, stripPlainReply } from \"./utils/Reply\";\nimport { sanitizeHtmlParams, transformTags, linkifyHtml } from \"./Linkify\";\nimport { graphemeSegmenter } from \"./utils/strings\";\n\nexport { linkifyAndSanitizeHtml } from \"./Linkify\";\n\n// Anything outside the basic multilingual plane will be a surrogate pair\nconst SURROGATE_PAIR_PATTERN = /([\\ud800-\\udbff])([\\udc00-\\udfff])/;\n// And there a bunch more symbol characters that emojibase has within the\n// BMP, so this includes the ranges from 'letterlike symbols' to\n// 'miscellaneous symbols and arrows' which should catch all of them\n// (with plenty of false positives, but that's OK)\nconst SYMBOL_PATTERN = /([\\u2100-\\u2bff])/;\n\n// Regex pattern for non-emoji characters that can appear in an \"all-emoji\" message\n// (Zero-Width Space, other whitespace)\nconst EMOJI_SEPARATOR_REGEX = /[\\u200B\\s]/g;\n\n// Regex for emoji. This includes any RGI_Emoji sequence followed by an optional\n// emoji presentation VS (U+FE0F), but not those sequences that are followed by\n// a text presentation VS (U+FE0E). We also count lone regional indicators\n// (U+1F1E6-U+1F1FF). Technically this regex produces false negatives for emoji\n// followed by U+FE0E when the emoji doesn't have a text variant, but in\n// practice this doesn't matter.\nexport const EMOJI_REGEX = (() => {\n    try {\n        // Per our support policy, v mode is available to us, but we still don't\n        // want the app to completely crash on older platforms. We use the\n        // constructor here to avoid a syntax error on such platforms.\n        return new RegExp(\"\\\\p{RGI_Emoji}(?!\\\\uFE0E)(?:(?<!\\\\uFE0F)\\\\uFE0F)?|[\\\\u{1f1e6}-\\\\u{1f1ff}]\", \"v\");\n    } catch {\n        // v mode not supported; fall back to matching nothing\n        return /(?!)/;\n    }\n})();\n\nconst BIGEMOJI_REGEX = (() => {\n    try {\n        return new RegExp(`^(${EMOJI_REGEX.source})+$`, \"iv\");\n    } catch {\n        // Fall back, just like for EMOJI_REGEX\n        return /(?!)/;\n    }\n})();\n\n/*\n * Return true if the given string contains emoji\n * Uses a much, much simpler regex than emojibase's so will give false\n * positives, but useful for fast-path testing strings to see if they\n * need emojification.\n */\nfunction mightContainEmoji(str?: string): boolean {\n    return !!str && (SURROGATE_PAIR_PATTERN.test(str) || SYMBOL_PATTERN.test(str));\n}\n\n/**\n * Returns the shortcode for an emoji character.\n *\n * @param {String} char The emoji character\n * @returns {String} The shortcode (such as :thumbup:)\n */\nexport function unicodeToShortcode(char: string): string {\n    const shortcodes = getEmojiFromUnicode(char)?.shortcodes;\n    return shortcodes?.length ? `:${shortcodes[0]}:` : \"\";\n}\n\n/*\n * Given an untrusted HTML string, return a React node with an sanitized version\n * of that HTML.\n * @param insaneHtml - the input to sanitize\n * @param className - an optional class name to apply to the element\n * @param sanitizeParams - the params to use for sanitization\n */\nexport function sanitizedHtmlNode(\n    insaneHtml: string,\n    className?: string,\n    sanitizeParams = sanitizeHtmlParams,\n): ReactNode {\n    const saneHtml = sanitizeHtml(insaneHtml, sanitizeParams);\n\n    return <div dangerouslySetInnerHTML={{ __html: saneHtml }} dir=\"auto\" className={className} />;\n}\n\nexport function getHtmlText(insaneHtml: string): string {\n    return sanitizeHtml(insaneHtml, {\n        allowedTags: [],\n        allowedAttributes: {},\n        selfClosing: [],\n        allowedSchemes: [],\n        disallowedTagsMode: \"discard\",\n    });\n}\n\n/**\n * Tests if a URL from an untrusted source may be safely put into the DOM\n * The biggest threat here is javascript: URIs.\n * Note that the HTML sanitiser library has its own internal logic for\n * doing this, to which we pass the same list of schemes. This is used in\n * other places we need to sanitise URLs.\n * @returns true if permitted, otherwise false\n */\nexport function isUrlPermitted(inputUrl: string): boolean {\n    try {\n        // URL parser protocol includes the trailing colon\n        return PERMITTED_URL_SCHEMES.includes(new URL(inputUrl).protocol.slice(0, -1));\n    } catch {\n        return false;\n    }\n}\n\n// this is the same as the above except with less rewriting\nconst composerSanitizeHtmlParams: IOptions = {\n    ...sanitizeHtmlParams,\n    transformTags: {\n        \"code\": transformTags[\"code\"],\n        \"*\": transformTags[\"*\"],\n    },\n};\n\n// reduced set of allowed tags to avoid turning topics into Myspace\nconst topicSanitizeHtmlParams: IOptions = {\n    ...sanitizeHtmlParams,\n    allowedTags: [\n        \"font\", // custom to matrix for IRC-style font coloring\n        \"del\", // for markdown\n        \"s\",\n        \"a\",\n        \"sup\",\n        \"sub\",\n        \"b\",\n        \"i\",\n        \"u\",\n        \"strong\",\n        \"em\",\n        \"strike\",\n        \"br\",\n        \"div\",\n        \"span\",\n    ],\n};\n\nabstract class BaseHighlighter<T extends React.ReactNode> {\n    public constructor(\n        public highlightClass: string,\n        public highlightLink?: string,\n    ) {}\n\n    /**\n     * Apply the highlights to a section of text\n     *\n     * @param {string} safeSnippet The snippet of text to apply the highlights\n     *     to. This input must be sanitised as it will be treated as HTML.\n     * @param {string[]} safeHighlights A list of substrings to highlight,\n     *     sorted by descending length.\n     *\n     * returns a list of results (strings for HtmlHighligher, react nodes for\n     * TextHighlighter).\n     */\n    public applyHighlights(safeSnippet: string, safeHighlights: string[]): T[] {\n        let lastOffset = 0;\n        let offset: number;\n        let nodes: T[] = [];\n\n        const safeHighlight = safeHighlights[0];\n        while ((offset = safeSnippet.toLowerCase().indexOf(safeHighlight.toLowerCase(), lastOffset)) >= 0) {\n            // handle preamble\n            if (offset > lastOffset) {\n                const subSnippet = safeSnippet.substring(lastOffset, offset);\n                nodes = nodes.concat(this.applySubHighlights(subSnippet, safeHighlights));\n            }\n\n            // do highlight. use the original string rather than safeHighlight\n            // to preserve the original casing.\n            const endOffset = offset + safeHighlight.length;\n            nodes.push(this.processSnippet(safeSnippet.substring(offset, endOffset), true));\n\n            lastOffset = endOffset;\n        }\n\n        // handle postamble\n        if (lastOffset !== safeSnippet.length) {\n            const subSnippet = safeSnippet.substring(lastOffset, undefined);\n            nodes = nodes.concat(this.applySubHighlights(subSnippet, safeHighlights));\n        }\n        return nodes;\n    }\n\n    private applySubHighlights(safeSnippet: string, safeHighlights: string[]): T[] {\n        if (safeHighlights[1]) {\n            // recurse into this range to check for the next set of highlight matches\n            return this.applyHighlights(safeSnippet, safeHighlights.slice(1));\n        } else {\n            // no more highlights to be found, just return the unhighlighted string\n            return [this.processSnippet(safeSnippet, false)];\n        }\n    }\n\n    protected abstract processSnippet(snippet: string, highlight: boolean): T;\n}\n\nclass HtmlHighlighter extends BaseHighlighter<string> {\n    /* highlight the given snippet if required\n     *\n     * snippet: content of the span; must have been sanitised\n     * highlight: true to highlight as a search match\n     *\n     * returns an HTML string\n     */\n    protected processSnippet(snippet: string, highlight: boolean): string {\n        if (!highlight) {\n            // nothing required here\n            return snippet;\n        }\n\n        let span = `<span class=\"${this.highlightClass}\">${snippet}</span>`;\n\n        if (this.highlightLink) {\n            span = `<a href=\"${encodeURI(this.highlightLink)}\">${span}</a>`;\n        }\n        return span;\n    }\n}\n\nconst emojiToHtmlSpan = (emoji: string): string =>\n    `<span class='mx_Emoji' title='${unicodeToShortcode(emoji)}'>${emoji}</span>`;\nconst emojiToJsxSpan = (emoji: string, key: Key): JSX.Element => (\n    <span key={key} className=\"mx_Emoji\" title={unicodeToShortcode(emoji)}>\n        {emoji}\n    </span>\n);\n\n/**\n * Wraps emojis in <span> to style them separately from the rest of message. Consecutive emojis (and modifiers) are wrapped\n * in the same <span>.\n * @param {string} message the text to format\n * @param {boolean} isHtmlMessage whether the message contains HTML\n * @returns if isHtmlMessage is true, returns an array of strings, otherwise return an array of React Elements for emojis\n * and plain text for everything else\n */\nexport function formatEmojis(message: string | undefined, isHtmlMessage?: false): JSX.Element[];\nexport function formatEmojis(message: string | undefined, isHtmlMessage: true): string[];\nexport function formatEmojis(message: string | undefined, isHtmlMessage?: boolean): (JSX.Element | string)[] {\n    const emojiToSpan = isHtmlMessage ? emojiToHtmlSpan : emojiToJsxSpan;\n    const result: (JSX.Element | string)[] = [];\n    if (!message) return result;\n\n    let text = \"\";\n    let key = 0;\n\n    for (const data of graphemeSegmenter.segment(message)) {\n        if (EMOJI_REGEX.test(data.segment)) {\n            if (text) {\n                result.push(text);\n                text = \"\";\n            }\n            result.push(emojiToSpan(data.segment, key));\n            key++;\n        } else {\n            text += data.segment;\n        }\n    }\n    if (text) {\n        result.push(text);\n    }\n    return result;\n}\n\ninterface EventAnalysis {\n    bodyHasEmoji: boolean;\n    isHtmlMessage: boolean;\n    strippedBody: string;\n    safeBody?: string; // safe, sanitised HTML, preferred over `strippedBody` which is fully plaintext\n    isFormattedBody: boolean;\n}\n\nexport interface EventRenderOpts {\n    highlightLink?: string;\n    disableBigEmoji?: boolean;\n    stripReplyFallback?: boolean;\n    forComposerQuote?: boolean;\n    /**\n     * Should inline media be rendered?\n     */\n    mediaIsVisible?: boolean;\n    linkify?: boolean;\n}\n\nfunction analyseEvent(content: IContent, highlights?: string[], opts: EventRenderOpts = {}): EventAnalysis {\n    let sanitizeParams = sanitizeHtmlParams;\n    if (opts.forComposerQuote) {\n        sanitizeParams = composerSanitizeHtmlParams;\n    }\n\n    if (opts.mediaIsVisible === false && sanitizeParams.transformTags?.[\"img\"]) {\n        // Prevent mutating the source of sanitizeParams.\n        sanitizeParams = {\n            ...sanitizeParams,\n            transformTags: {\n                ...sanitizeParams.transformTags,\n                img: (tagName) => {\n                    // Remove element\n                    return { tagName, attribs: {} };\n                },\n            },\n        };\n    }\n\n    if (opts.linkify) {\n        // Prevent mutating the source of sanitizeParams.\n        sanitizeParams = { ...sanitizeParams };\n        if (typeof sanitizeParams.allowedAttributes === \"object\") {\n            const attribs = { ...sanitizeParams.allowedAttributes };\n            // We allow data-linkified because TextualBody uses it to passthrough links.\n            attribs[\"a\"] = [...sanitizeParams.allowedAttributes[\"a\"], `data-${LINKIFIED_DATA_ATTRIBUTE}`];\n            sanitizeParams.allowedAttributes = attribs;\n        } // else: No attibutes are are allowed for \"a\"\n    }\n\n    try {\n        const isFormattedBody =\n            content.format === \"org.matrix.custom.html\" && typeof content.formatted_body === \"string\";\n        let bodyHasEmoji = false;\n        let isHtmlMessage = false;\n\n        let safeBody: string | undefined; // safe, sanitised HTML, preferred over `strippedBody` which is fully plaintext\n\n        // sanitizeHtml can hang if an unclosed HTML tag is thrown at it\n        // A search for `<foo` will make the browser crash an alternative would be to escape HTML special characters\n        // but that would bring no additional benefit as the highlighter does not work with those special chars\n        const safeHighlights = highlights\n            ?.filter((highlight: string): boolean => !highlight.includes(\"<\"))\n            .map((highlight: string): string => sanitizeHtml(highlight, sanitizeParams));\n\n        let formattedBody = typeof content.formatted_body === \"string\" ? content.formatted_body : null;\n        const plainBody = typeof content.body === \"string\" ? content.body : \"\";\n\n        if (opts.stripReplyFallback && formattedBody) formattedBody = stripHTMLReply(formattedBody);\n        const strippedBody = opts.stripReplyFallback ? stripPlainReply(plainBody) : plainBody;\n        bodyHasEmoji = mightContainEmoji(isFormattedBody ? formattedBody! : plainBody);\n\n        const highlighter = safeHighlights?.length\n            ? new HtmlHighlighter(\"mx_EventTile_searchHighlight\", opts.highlightLink)\n            : null;\n\n        if (highlighter) {\n            // XXX: We sanitize the HTML whilst also highlighting its text nodes, to avoid accidentally trying\n            // to highlight HTML tags themselves. However, this does mean that we don't highlight textnodes which\n            // are interrupted by HTML tags (not that we did before) - e.g. foo<span/>bar won't get highlighted\n            // by an attempt to search for 'foobar'.  Then again, the search query probably wouldn't work either\n            // XXX: hacky bodge to temporarily apply a textFilter to the sanitizeParams structure.\n            sanitizeParams.textFilter = function (safeText) {\n                return highlighter.applyHighlights(safeText, safeHighlights!).join(\"\");\n            };\n        }\n\n        if (isFormattedBody) {\n            let unsafeBody = formattedBody!;\n\n            if (opts.linkify) {\n                unsafeBody = linkifyHtml(unsafeBody);\n            }\n\n            safeBody = sanitizeHtml(unsafeBody, sanitizeParams);\n\n            const phtml = new DOMParser().parseFromString(safeBody, \"text/html\");\n            const isPlainText = phtml.body.innerHTML === phtml.body.textContent;\n            isHtmlMessage = !isPlainText;\n\n            if (isHtmlMessage && SettingsStore.getValue(\"feature_latex_maths\")) {\n                [...phtml.querySelectorAll<HTMLElement>(\"div[data-mx-maths], span[data-mx-maths]\")].forEach((e) => {\n                    e.outerHTML = katex.renderToString(decode(e.getAttribute(\"data-mx-maths\")), {\n                        throwOnError: false,\n                        displayMode: e.tagName == \"DIV\",\n                        output: \"htmlAndMathml\",\n                    });\n                });\n                safeBody = phtml.body.innerHTML;\n            }\n        } else if (opts.linkify) {\n            // If we are linkifying plain text, pass the result through sanitizeHtml so that the highlighter configured in sanitizeParams.textFilter gets applied.\n            safeBody = sanitizeHtml(linkifyHtml(escapeHtml(plainBody)), sanitizeParams);\n        } else if (highlighter) {\n            safeBody = highlighter.applyHighlights(escapeHtml(plainBody), safeHighlights!).join(\"\");\n        }\n\n        return { bodyHasEmoji, isHtmlMessage, strippedBody, safeBody, isFormattedBody };\n    } finally {\n        delete sanitizeParams.textFilter;\n    }\n}\n\ninterface BodyToNodeReturn {\n    strippedBody: string;\n    formattedBody?: string;\n    emojiBodyElements: JSX.Element[] | undefined;\n    className: string;\n}\n\nexport function bodyToNode(content: IContent, highlights?: string[], opts: EventRenderOpts = {}): BodyToNodeReturn {\n    const eventInfo = analyseEvent(content, highlights, opts);\n\n    let emojiBody = false;\n    if (!opts.disableBigEmoji && eventInfo.bodyHasEmoji) {\n        const contentBody = eventInfo.safeBody ?? eventInfo.strippedBody;\n        let contentBodyTrimmed = contentBody !== undefined ? contentBody.trim() : \"\";\n\n        // Remove zero width joiner, zero width spaces and other spaces in body\n        // text. This ensures that emojis with spaces in between or that are made\n        // up of multiple unicode characters are still counted as purely emoji\n        // messages.\n        contentBodyTrimmed = contentBodyTrimmed.replace(EMOJI_SEPARATOR_REGEX, \"\");\n\n        const match = BIGEMOJI_REGEX.exec(contentBodyTrimmed);\n        emojiBody =\n            match?.[0]?.length === contentBodyTrimmed.length &&\n            // Prevent user pills expanding for users with only emoji in\n            // their username. Permalinks (links in pills) can be any URL\n            // now, so we just check for an HTTP-looking thing.\n            (eventInfo.strippedBody === eventInfo.safeBody || // replies have the html fallbacks, account for that here\n                content.formatted_body === undefined ||\n                (!content.formatted_body.includes(\"http:\") && !content.formatted_body.includes(\"https:\")));\n    }\n\n    const className = classNames({\n        \"mx_EventTile_body\": true,\n        \"mx_EventTile_bigEmoji\": emojiBody,\n        \"markdown-body\": eventInfo.isHtmlMessage && !emojiBody,\n        // Override the global `notranslate` class set by the top-level `matrixchat` div.\n        \"translate\": true,\n    });\n\n    let formattedBody = eventInfo.safeBody;\n    let emojiBodyElements: JSX.Element[] | undefined;\n\n    if (eventInfo.bodyHasEmoji) {\n        if (eventInfo.safeBody) {\n            // This has to be done after the emojiBody check as to not break big emoji on replies\n            formattedBody = formatEmojis(eventInfo.safeBody, true).join(\"\");\n        } else {\n            emojiBodyElements = formatEmojis(eventInfo.strippedBody, false) as JSX.Element[];\n        }\n    }\n\n    return { strippedBody: eventInfo.strippedBody, formattedBody, emojiBodyElements, className };\n}\n\n/**\n * Turn a matrix event body into html\n *\n * content: 'content' of the MatrixEvent\n *\n * highlights: optional list of words to highlight, ordered by longest word first\n *\n * opts.highlightLink: optional href to add to highlighted words\n * opts.disableBigEmoji: optional argument to disable the big emoji class.\n * opts.stripReplyFallback: optional argument specifying the event is a reply and so fallback needs removing\n * opts.forComposerQuote: optional param to lessen the url rewriting done by sanitization, for quoting into composer\n * opts.ref: React ref to attach to any React components returned (not compatible with opts.returnString)\n */\nexport function bodyToHtml(content: IContent, highlights?: string[], opts: EventRenderOpts = {}): string {\n    const eventInfo = analyseEvent(content, highlights, opts);\n\n    let formattedBody = eventInfo.safeBody;\n    if (eventInfo.bodyHasEmoji && formattedBody) {\n        // This has to be done after the emojiBody check above as to not break big emoji on replies\n        formattedBody = formatEmojis(eventInfo.safeBody, true).join(\"\");\n    }\n\n    return formattedBody ?? eventInfo.strippedBody;\n}\n\n/**\n * Turn a room topic into html\n * @param topic plain text topic\n * @param htmlTopic optional html topic\n * @param ref React ref to attach to any React components returned\n * @param allowExtendedHtml whether to allow extended HTML tags such as headings and lists\n * @returns The HTML-ified node.\n */\nexport function topicToHtml(\n    topic?: string,\n    htmlTopic?: string,\n    ref?: LegacyRef<HTMLSpanElement>,\n    allowExtendedHtml = false,\n): ReactNode {\n    let isFormattedTopic = !!htmlTopic;\n    let topicHasEmoji = false;\n    let safeTopic = \"\";\n\n    try {\n        topicHasEmoji = mightContainEmoji(isFormattedTopic ? htmlTopic! : topic);\n\n        if (isFormattedTopic) {\n            safeTopic = sanitizeHtml(htmlTopic!, allowExtendedHtml ? sanitizeHtmlParams : topicSanitizeHtmlParams);\n            if (topicHasEmoji) {\n                safeTopic = formatEmojis(safeTopic, true).join(\"\");\n            }\n        }\n    } catch {\n        isFormattedTopic = false; // Fall back to plain-text topic\n    }\n\n    let emojiBodyElements: JSX.Element[] | undefined;\n    if (!isFormattedTopic && topicHasEmoji) {\n        emojiBodyElements = formatEmojis(topic, false);\n    }\n\n    if (isFormattedTopic) {\n        if (!safeTopic) return null;\n        return <span ref={ref} dangerouslySetInnerHTML={{ __html: safeTopic }} dir=\"auto\" />;\n    }\n\n    if (!emojiBodyElements && !topic) return null;\n    return (\n        <span ref={ref} dir=\"auto\">\n            {emojiBodyElements || topic}\n        </span>\n    );\n}\n\n/**\n * Returns if a node is a block element or not.\n * Only takes html nodes into account that are allowed in matrix messages.\n *\n * @param {Node} node\n * @returns {bool}\n */\nexport function checkBlockNode(node: Node): boolean {\n    switch (node.nodeName) {\n        case \"H1\":\n        case \"H2\":\n        case \"H3\":\n        case \"H4\":\n        case \"H5\":\n        case \"H6\":\n        case \"PRE\":\n        case \"BLOCKQUOTE\":\n        case \"P\":\n        case \"UL\":\n        case \"OL\":\n        case \"LI\":\n        case \"HR\":\n        case \"TABLE\":\n        case \"THEAD\":\n        case \"TBODY\":\n        case \"TR\":\n        case \"TH\":\n        case \"TD\":\n            return true;\n        case \"DIV\":\n            // don't treat math nodes as block nodes for deserializing\n            return !(node as HTMLElement).hasAttribute(\"data-mx-maths\");\n        default:\n            return false;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { SERVICE_TYPES, createClient, type MatrixClient, MatrixError } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { MatrixClientPeg } from \"./MatrixClientPeg\";\nimport Modal from \"./Modal\";\nimport { _t } from \"./languageHandler\";\nimport { Service, startTermsFlow, TermsNotSignedError } from \"./Terms\";\nimport {\n    doesAccountDataHaveIdentityServer,\n    doesIdentityServerHaveTerms,\n    setToDefaultIdentityServer,\n} from \"./utils/IdentityServerUtils\";\nimport QuestionDialog from \"./components/views/dialogs/QuestionDialog\";\nimport { abbreviateUrl } from \"./utils/UrlUtils\";\n\nexport class AbortedIdentityActionError extends Error {}\n\nexport default class IdentityAuthClient {\n    private accessToken: string | null = null;\n    private tempClient?: MatrixClient;\n    private authEnabled = true;\n\n    /**\n     * Creates a new identity auth client\n     * @param {string} identityUrl The URL to contact the identity server with.\n     * When provided, this class will operate solely within memory, refusing to\n     * persist any information such as tokens. Default null (not provided).\n     */\n    public constructor(identityUrl?: string) {\n        if (identityUrl) {\n            // XXX: We shouldn't have to create a whole new MatrixClient just to\n            // do identity server auth. The functions don't take an identity URL\n            // though, and making all of them take one could lead to developer\n            // confusion about what the idBaseUrl does on a client. Therefore, we\n            // just make a new client and live with it.\n            this.tempClient = createClient({\n                baseUrl: \"\", // invalid by design\n                idBaseUrl: identityUrl,\n            });\n        }\n    }\n\n    // This client must not be used for general operations as it may not have a baseUrl or be running (tempClient).\n    private get identityClient(): MatrixClient {\n        return this.tempClient ?? this.matrixClient;\n    }\n\n    private get matrixClient(): MatrixClient {\n        return MatrixClientPeg.safeGet();\n    }\n\n    private writeToken(): void {\n        if (this.tempClient) return; // temporary client: ignore\n        if (this.accessToken) {\n            window.localStorage.setItem(\"mx_is_access_token\", this.accessToken);\n        } else {\n            window.localStorage.removeItem(\"mx_is_access_token\");\n        }\n    }\n\n    private readToken(): string | null {\n        if (this.tempClient) return null; // temporary client: ignore\n        return window.localStorage.getItem(\"mx_is_access_token\");\n    }\n\n    // Returns a promise that resolves to the access_token string from the IS\n    public async getAccessToken({ check = true } = {}): Promise<string | null> {\n        if (!this.authEnabled) {\n            // The current IS doesn't support authentication\n            return null;\n        }\n\n        let token: string | null = this.accessToken;\n        if (!token) {\n            token = this.readToken();\n        }\n\n        if (!token) {\n            token = await this.registerForToken(check);\n            if (token) {\n                this.accessToken = token;\n                this.writeToken();\n            }\n            return token;\n        }\n\n        if (check) {\n            try {\n                await this.checkToken(token);\n            } catch (e) {\n                if (e instanceof TermsNotSignedError || e instanceof AbortedIdentityActionError) {\n                    // Retrying won't help this\n                    throw e;\n                }\n                // Retry in case token expired\n                token = await this.registerForToken();\n                if (token) {\n                    this.accessToken = token;\n                    this.writeToken();\n                }\n            }\n        }\n\n        return token;\n    }\n\n    private async checkToken(token: string): Promise<void> {\n        const identityServerUrl = this.identityClient.getIdentityServerUrl()!;\n\n        try {\n            await this.identityClient.getIdentityAccount(token);\n        } catch (e) {\n            if (e instanceof MatrixError && e.errcode === \"M_TERMS_NOT_SIGNED\") {\n                logger.log(\"Identity server requires new terms to be agreed to\");\n                await startTermsFlow(this.matrixClient, [new Service(SERVICE_TYPES.IS, identityServerUrl, token)]);\n                return;\n            }\n            throw e;\n        }\n\n        if (\n            !this.tempClient &&\n            !doesAccountDataHaveIdentityServer(this.matrixClient) &&\n            !(await doesIdentityServerHaveTerms(this.matrixClient, identityServerUrl))\n        ) {\n            const { finished } = Modal.createDialog(QuestionDialog, {\n                title: _t(\"terms|identity_server_no_terms_title\"),\n                description: (\n                    <div>\n                        <p>\n                            {_t(\n                                \"terms|identity_server_no_terms_description_1\",\n                                {},\n                                {\n                                    server: () => <strong>{abbreviateUrl(identityServerUrl)}</strong>,\n                                },\n                            )}\n                        </p>\n                        <p>{_t(\"terms|identity_server_no_terms_description_2\")}</p>\n                    </div>\n                ),\n                button: _t(\"action|trust\"),\n            });\n            const [confirmed] = await finished;\n            if (confirmed) {\n                setToDefaultIdentityServer(this.matrixClient);\n            } else {\n                throw new AbortedIdentityActionError(\"User aborted identity server action without terms\");\n            }\n        }\n\n        // We should ensure the token in `localStorage` is cleared\n        // appropriately. We already clear storage on sign out, but we'll need\n        // additional clearing when changing ISes in settings as part of future\n        // privacy work.\n        // See also https://github.com/vector-im/element-web/issues/10455.\n    }\n\n    public async registerForToken(check = true): Promise<string> {\n        const hsOpenIdToken = await MatrixClientPeg.safeGet().getOpenIdToken();\n        // XXX: The spec is `token`, but we used `access_token` for a Sydent release.\n        const { access_token: accessToken, token } =\n            await this.identityClient.registerWithIdentityServer(hsOpenIdToken);\n        const identityAccessToken = token || accessToken;\n        if (check) await this.checkToken(identityAccessToken);\n        return identityAccessToken;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { CallType, type MatrixCall } from \"matrix-js-sdk/src/webrtc/call\";\nimport {\n    EndCallIcon,\n    VideoCallSolidIcon,\n    VoiceCallSolidIcon,\n    VolumeOffSolidIcon,\n    VolumeOnSolidIcon,\n} from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { LegacyCallHandlerEvent } from \"../LegacyCallHandler\";\nimport { _t } from \"../languageHandler\";\nimport RoomAvatar from \"../components/views/avatars/RoomAvatar\";\nimport AccessibleButton, { type ButtonEvent } from \"../components/views/elements/AccessibleButton\";\nimport { getCallStateIcon } from \"../components/views/messages/LegacyCallEvent.tsx\";\nimport { SDKContext } from \"../contexts/SDKContext.ts\";\n\nexport const getIncomingLegacyCallToastKey = (callId: string): string => `call_${callId}`;\n\ninterface IProps {\n    call: MatrixCall;\n}\n\ninterface IState {\n    silenced: boolean;\n}\n\nexport default class IncomingLegacyCallToast extends React.Component<IProps, IState> {\n    public static contextType = SDKContext;\n    declare public context: React.ContextType<typeof SDKContext>;\n\n    private readonly roomId: string;\n\n    public constructor(props: IProps, context: React.ContextType<typeof SDKContext>) {\n        super(props, context);\n\n        const roomId = context.legacyCallHandler.roomIdForCall(this.props.call);\n        if (!roomId) {\n            throw new Error(\"Unable to find room for incoming call\");\n        }\n        this.roomId = roomId;\n\n        this.state = {\n            silenced: context.legacyCallHandler.isCallSilenced(this.props.call.callId),\n        };\n    }\n\n    public componentDidMount = (): void => {\n        this.context.legacyCallHandler.addListener(\n            LegacyCallHandlerEvent.SilencedCallsChanged,\n            this.onSilencedCallsChanged,\n        );\n    };\n\n    public componentWillUnmount(): void {\n        this.context.legacyCallHandler.removeListener(\n            LegacyCallHandlerEvent.SilencedCallsChanged,\n            this.onSilencedCallsChanged,\n        );\n    }\n\n    private onSilencedCallsChanged = (): void => {\n        this.setState({ silenced: this.context.legacyCallHandler.isCallSilenced(this.props.call.callId) });\n    };\n\n    private onAnswerClick = (e: ButtonEvent): void => {\n        e.stopPropagation();\n        this.context.legacyCallHandler.answerCall(this.roomId);\n    };\n\n    private onRejectClick = (e: ButtonEvent): void => {\n        e.stopPropagation();\n        this.context.legacyCallHandler.hangupOrReject(this.roomId, true);\n    };\n\n    private onSilenceClick = (e: ButtonEvent): void => {\n        e.stopPropagation();\n        const callId = this.props.call.callId;\n        if (this.state.silenced) {\n            this.context.legacyCallHandler.unSilenceCall(callId);\n        } else {\n            this.context.legacyCallHandler.silenceCall(callId);\n        }\n    };\n\n    public render(): React.ReactNode {\n        const room = this.context.client?.getRoom(this.roomId);\n        const isVoice = this.props.call.type === CallType.Voice;\n        const callForcedSilent = this.context.legacyCallHandler.isForcedSilent();\n\n        let silenceButtonTooltip = this.state.silenced ? _t(\"voip|unsilence\") : _t(\"voip|silence\");\n        if (callForcedSilent) {\n            silenceButtonTooltip = _t(\"voip|silenced\");\n        }\n\n        return (\n            <React.Fragment>\n                <RoomAvatar room={room ?? undefined} size=\"32px\" />\n                <div className=\"mx_IncomingLegacyCallToast_content\">\n                    <span className=\"mx_LegacyCallEvent_caller\">{room?.name ?? _t(\"voip|unknown_caller\")}</span>\n                    <div className=\"mx_LegacyCallEvent_type\">\n                        {getCallStateIcon(isVoice, undefined)}\n                        {isVoice ? _t(\"voip|voice_call\") : _t(\"voip|video_call\")}\n                    </div>\n                    <div className=\"mx_IncomingLegacyCallToast_buttons\">\n                        <AccessibleButton\n                            className=\"mx_IncomingLegacyCallToast_button\"\n                            onClick={this.onRejectClick}\n                            kind=\"danger\"\n                        >\n                            <EndCallIcon />\n                            {_t(\"action|decline\")}\n                        </AccessibleButton>\n                        <AccessibleButton\n                            className=\"mx_IncomingLegacyCallToast_button\"\n                            onClick={this.onAnswerClick}\n                            kind=\"primary\"\n                        >\n                            {isVoice ? <VoiceCallSolidIcon /> : <VideoCallSolidIcon />}\n                            {_t(\"action|accept\")}\n                        </AccessibleButton>\n                    </div>\n                </div>\n                <AccessibleButton\n                    className=\"mx_IncomingLegacyCallToast_iconButton\"\n                    disabled={callForcedSilent}\n                    onClick={this.onSilenceClick}\n                    title={silenceButtonTooltip}\n                >\n                    {this.state.silenced ? <VolumeOffSolidIcon /> : <VolumeOnSolidIcon />}\n                </AccessibleButton>\n            </React.Fragment>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2022 The Matrix.org Foundation C.I.C.\nCopyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>\nCopyright 2017, 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { MatrixError, RuleId, TweakName, SyncState, TypedEventEmitter } from \"matrix-js-sdk/src/matrix\";\nimport {\n    type CallError,\n    CallErrorCode,\n    CallEvent,\n    CallParty,\n    CallState,\n    CallType,\n    FALLBACK_ICE_SERVER,\n    type MatrixCall,\n} from \"matrix-js-sdk/src/webrtc/call\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { CallEventHandlerEvent } from \"matrix-js-sdk/src/webrtc/callEventHandler\";\n\nimport { MatrixClientPeg } from \"./MatrixClientPeg\";\nimport Modal from \"./Modal\";\nimport { _t } from \"./languageHandler\";\nimport dis from \"./dispatcher/dispatcher\";\nimport WidgetUtils from \"./utils/WidgetUtils\";\nimport SettingsStore from \"./settings/SettingsStore\";\nimport { WidgetType } from \"./widgets/WidgetType\";\nimport { SettingLevel } from \"./settings/SettingLevel\";\nimport QuestionDialog from \"./components/views/dialogs/QuestionDialog\";\nimport ErrorDialog from \"./components/views/dialogs/ErrorDialog\";\nimport { WidgetMessagingStore } from \"./stores/widgets/WidgetMessagingStore\";\nimport { ElementWidgetActions } from \"./stores/widgets/ElementWidgetActions\";\nimport { UIFeature } from \"./settings/UIFeature\";\nimport { Action } from \"./dispatcher/actions\";\nimport { addManagedHybridWidget, isManagedHybridWidgetEnabled } from \"./widgets/ManagedHybrid\";\nimport SdkConfig from \"./SdkConfig\";\nimport { ensureDMExists } from \"./createRoom\";\nimport IncomingLegacyCallToast, { getIncomingLegacyCallToastKey } from \"./toasts/IncomingLegacyCallToast\";\nimport ToastStore from \"./stores/ToastStore\";\nimport { type ViewRoomPayload } from \"./dispatcher/payloads/ViewRoomPayload\";\nimport { InviteKind } from \"./components/views/dialogs/InviteDialogTypes\";\nimport { type OpenInviteDialogPayload } from \"./dispatcher/payloads/OpenInviteDialogPayload\";\nimport { findDMForUser } from \"./utils/dm/findDMForUser\";\nimport { getJoinedNonFunctionalMembers } from \"./utils/room/getJoinedNonFunctionalMembers\";\nimport { localNotificationsAreSilenced } from \"./utils/notifications\";\nimport { isNotNull } from \"./Typeguards\";\nimport { BackgroundAudio } from \"./audio/BackgroundAudio\";\nimport { Jitsi } from \"./widgets/Jitsi.ts\";\nimport { type SDKContextClass } from \"./contexts/SDKContextClass.ts\";\n\nexport const PROTOCOL_PSTN = \"m.protocol.pstn\";\nexport const PROTOCOL_PSTN_PREFIXED = \"im.vector.protocol.pstn\";\n\nconst CHECK_PROTOCOLS_ATTEMPTS = 3;\n\nexport enum AudioID {\n    Ring = \"ringAudio\",\n    Ringback = \"ringbackAudio\",\n    CallEnd = \"callendAudio\",\n    Busy = \"busyAudio\",\n}\n\ninterface ThirdpartyLookupResponse {\n    userid: string;\n    protocol: string;\n}\n\nexport enum LegacyCallHandlerEvent {\n    CallsChanged = \"calls_changed\",\n    CallChangeRoom = \"call_change_room\",\n    SilencedCallsChanged = \"silenced_calls_changed\",\n    ShownSidebarsChanged = \"shown_sidebars_changed\",\n    CallState = \"call_state\",\n    ProtocolSupport = \"protocol_support\",\n}\n\ntype EventEmitterMap = {\n    [LegacyCallHandlerEvent.CallsChanged]: (calls: Map<string, MatrixCall>) => void;\n    [LegacyCallHandlerEvent.CallChangeRoom]: (call: MatrixCall) => void;\n    [LegacyCallHandlerEvent.SilencedCallsChanged]: (calls: Set<string>) => void;\n    [LegacyCallHandlerEvent.ShownSidebarsChanged]: (sidebarsShown: Map<string, boolean>) => void;\n    [LegacyCallHandlerEvent.CallState]: (mappedRoomId: string | null, status: CallState) => void;\n    [LegacyCallHandlerEvent.ProtocolSupport]: () => void;\n};\n\n/**\n * LegacyCallHandler manages all currently active calls. It should be used for\n * placing, answering, rejecting and hanging up calls. It also handles ringing,\n * PSTN support and other things.\n */\nexport default class LegacyCallHandler extends TypedEventEmitter<LegacyCallHandlerEvent, EventEmitterMap> {\n    private calls = new Map<string, MatrixCall>(); // roomId -> call\n    // Calls started as an attended transfer, ie. with the intention of transferring another\n    // call with a different party to this one.\n    private transferees = new Map<string, MatrixCall>(); // callId (target) -> call (transferee)\n    private supportsPstnProtocol: boolean | null = null;\n    private pstnSupportPrefixed: boolean | null = null; // True if the server only support the prefixed pstn protocol\n\n    // Map of the asserted identity users after we've looked them up using the API.\n    // We need to be be able to determine the mapped room synchronously, so we\n    // do the async lookup when we get new information and then store these mappings here\n    private assertedIdentityNativeUsers = new Map<string, string>();\n\n    private silencedCalls = new Set<string>(); // callIds\n\n    private shownSidebars = new Map<string, boolean>(); // callId (call) -> sidebar show\n\n    private backgroundAudio = new BackgroundAudio();\n    private playingSources: Record<string, AudioBufferSourceNode> = {}; // Record them for stopping\n\n    public constructor(private readonly sdkContext: SDKContextClass) {\n        super();\n    }\n\n    /*\n     * Gets the user-facing room associated with a call\n     */\n    public roomIdForCall(call?: MatrixCall): string | null {\n        if (!call) return null;\n\n        // check asserted identity: if we're not obeying asserted identity,\n        // this map will never be populated, but we check anyway for sanity\n        if (this.shouldObeyAssertedfIdentity()) {\n            const nativeUser = this.assertedIdentityNativeUsers.get(call.callId);\n            if (nativeUser) {\n                const room = findDMForUser(MatrixClientPeg.safeGet(), nativeUser);\n                if (room) return room.roomId;\n            }\n        }\n\n        return call.roomId ?? null;\n    }\n\n    public start(): void {\n        if (SettingsStore.getValue(UIFeature.Voip)) {\n            MatrixClientPeg.safeGet().on(CallEventHandlerEvent.Incoming, this.onCallIncoming);\n        }\n\n        this.checkProtocols(CHECK_PROTOCOLS_ATTEMPTS);\n    }\n\n    public stop(): void {\n        const cli = MatrixClientPeg.get();\n        if (cli) {\n            cli.removeListener(CallEventHandlerEvent.Incoming, this.onCallIncoming);\n        }\n    }\n\n    public isForcedSilent(): boolean {\n        const cli = MatrixClientPeg.safeGet();\n        return localNotificationsAreSilenced(cli);\n    }\n\n    public silenceCall(callId?: string): void {\n        if (!callId) return;\n        this.silencedCalls.add(callId);\n        this.emit(LegacyCallHandlerEvent.SilencedCallsChanged, this.silencedCalls);\n\n        // Don't pause audio if we have calls which are still ringing\n        if (this.areAnyCallsUnsilenced()) return;\n        this.pause(AudioID.Ring);\n    }\n\n    public unSilenceCall(callId?: string): void {\n        if (!callId || this.isForcedSilent()) return;\n        this.silencedCalls.delete(callId);\n        this.emit(LegacyCallHandlerEvent.SilencedCallsChanged, this.silencedCalls);\n        this.play(AudioID.Ring);\n    }\n\n    public isCallSilenced(callId?: string): boolean {\n        return this.isForcedSilent() || (!!callId && this.silencedCalls.has(callId));\n    }\n\n    /**\n     * Returns true if there is at least one unsilenced call\n     * @returns {boolean}\n     */\n    private areAnyCallsUnsilenced(): boolean {\n        for (const call of this.calls.values()) {\n            if (call.state === CallState.Ringing && !this.isCallSilenced(call.callId)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    public setCallSidebarShown(callId: string, sidebarShown: boolean): void {\n        this.shownSidebars.set(callId, sidebarShown);\n        this.emit(LegacyCallHandlerEvent.ShownSidebarsChanged, this.shownSidebars);\n    }\n\n    public isCallSidebarShown(callId?: string): boolean {\n        return !!callId && (this.shownSidebars.get(callId) ?? true);\n    }\n\n    private async checkProtocols(maxTries: number): Promise<void> {\n        try {\n            const protocols = await MatrixClientPeg.safeGet().getThirdpartyProtocols();\n\n            if (protocols[PROTOCOL_PSTN] !== undefined) {\n                this.supportsPstnProtocol = Boolean(protocols[PROTOCOL_PSTN]);\n                if (this.supportsPstnProtocol) this.pstnSupportPrefixed = false;\n            } else if (protocols[PROTOCOL_PSTN_PREFIXED] !== undefined) {\n                this.supportsPstnProtocol = Boolean(protocols[PROTOCOL_PSTN_PREFIXED]);\n                if (this.supportsPstnProtocol) this.pstnSupportPrefixed = true;\n            } else {\n                this.supportsPstnProtocol = null;\n            }\n\n            this.emit(LegacyCallHandlerEvent.ProtocolSupport);\n        } catch (e) {\n            if (maxTries === 1) {\n                logger.log(\"Failed to check for protocol support and no retries remain: assuming no support\", e);\n            } else {\n                logger.log(\"Failed to check for protocol support: will retry\", e);\n                window.setTimeout(() => {\n                    this.checkProtocols(maxTries - 1);\n                }, 10000);\n            }\n        }\n    }\n\n    private shouldObeyAssertedfIdentity(): boolean {\n        return !!SdkConfig.getObject(\"voip\")?.get(\"obey_asserted_identity\");\n    }\n\n    public getSupportsPstnProtocol(): boolean {\n        return this.supportsPstnProtocol ?? false;\n    }\n\n    public async pstnLookup(phoneNumber: string): Promise<ThirdpartyLookupResponse[]> {\n        try {\n            return await MatrixClientPeg.safeGet().getThirdpartyUser(\n                this.pstnSupportPrefixed ? PROTOCOL_PSTN_PREFIXED : PROTOCOL_PSTN,\n                {\n                    \"m.id.phone\": phoneNumber,\n                },\n            );\n        } catch (e) {\n            logger.warn(\"Failed to lookup user from phone number\", e);\n            return Promise.resolve([]);\n        }\n    }\n\n    private onCallIncoming = (call: MatrixCall): void => {\n        // if the runtime env doesn't do VoIP, stop here.\n        if (!MatrixClientPeg.get()?.supportsVoip()) {\n            return;\n        }\n\n        const mappedRoomId = this.roomIdForCall(call);\n        if (!mappedRoomId) return;\n        if (this.getCallForRoom(mappedRoomId)) {\n            logger.log(\n                \"Got incoming call for room \" + mappedRoomId + \" but there's already a call for this room: ignoring\",\n            );\n            return;\n        }\n\n        this.addCallForRoom(mappedRoomId, call);\n        this.setCallListeners(call);\n        // Explicitly handle first state change\n        this.onCallStateChanged(call.state, null, call);\n\n        // get ready to send encrypted events in the room, so if the user does answer\n        // the call, we'll be ready to send. NB. This is the protocol-level room ID not\n        // the mapped one: that's where we'll send the events.\n        const cli = MatrixClientPeg.safeGet();\n        const room = cli.getRoom(call.roomId);\n        if (room) cli.getCrypto()?.prepareToEncrypt(room);\n    };\n\n    public getCallById(callId: string): MatrixCall | null {\n        for (const call of this.calls.values()) {\n            if (call.callId === callId) return call;\n        }\n        return null;\n    }\n\n    public getCallForRoom(roomId: string): MatrixCall | null {\n        return this.calls.get(roomId) || null;\n    }\n\n    public getAllActiveCalls(): MatrixCall[] {\n        const activeCalls: MatrixCall[] = [];\n\n        for (const call of this.calls.values()) {\n            if (call.state !== CallState.Ended && call.state !== CallState.Ringing) {\n                activeCalls.push(call);\n            }\n        }\n        return activeCalls;\n    }\n\n    public getAllActiveCallsNotInRoom(notInThisRoomId: string): MatrixCall[] {\n        const callsNotInThatRoom: MatrixCall[] = [];\n\n        for (const [roomId, call] of this.calls.entries()) {\n            if (roomId !== notInThisRoomId && call.state !== CallState.Ended) {\n                callsNotInThatRoom.push(call);\n            }\n        }\n        return callsNotInThatRoom;\n    }\n\n    public getAllActiveCallsForPip(roomId: string): MatrixCall[] {\n        const room = MatrixClientPeg.safeGet().getRoom(roomId);\n        if (room && this.sdkContext.widgetLayoutStore.hasMaximisedWidget(room)) {\n            // This checks if there is space for the call view in the aux panel\n            // If there is no space any call should be displayed in PiP\n            return this.getAllActiveCalls();\n        }\n        return this.getAllActiveCallsNotInRoom(roomId);\n    }\n\n    public getTransfereeForCallId(callId: string): MatrixCall | undefined {\n        return this.transferees.get(callId);\n    }\n\n    public async play(audioId: AudioID): Promise<void> {\n        const logPrefix = `LegacyCallHandler.play(${audioId}):`;\n        logger.debug(`${logPrefix} beginning of function`);\n\n        const audioInfo: Record<AudioID, [prefix: string, loop: boolean]> = {\n            [AudioID.Ring]: [`./media/ring`, true],\n            [AudioID.Ringback]: [`./media/ringback`, true],\n            [AudioID.CallEnd]: [`./media/callend`, false],\n            [AudioID.Busy]: [`./media/busy`, false],\n        };\n\n        const [urlPrefix, loop] = audioInfo[audioId];\n        const source = await this.backgroundAudio.pickFormatAndPlay(urlPrefix, [\"mp3\", \"ogg\"], loop);\n        if (this.playingSources[audioId]) {\n            logger.warn(`${logPrefix} Already playing audio ${audioId}!`);\n        }\n        this.playingSources[audioId] = source;\n        logger.debug(`${logPrefix} playing audio successfully`);\n    }\n\n    public pause(audioId: AudioID): void {\n        const logPrefix = `LegacyCallHandler.pause(${audioId}):`;\n        logger.debug(`${logPrefix} beginning of function`);\n\n        const source = this.playingSources[audioId];\n        if (!source) {\n            logger.debug(`${logPrefix} audio not playing`);\n            return;\n        }\n\n        source.stop();\n        delete this.playingSources[audioId];\n\n        logger.debug(`${logPrefix} paused audio`);\n    }\n\n    /**\n     * Returns whether the given audio is currently playing\n     * Only supported for looping audio tracks\n     * @param audioId the ID of the audio to query for playing state\n     */\n    public isPlaying(audioId: AudioID.Ring | AudioID.Ringback): boolean {\n        return !!this.playingSources[audioId];\n    }\n\n    private matchesCallForThisRoom(call: MatrixCall): boolean {\n        // We don't allow placing more than one call per room, but that doesn't mean there\n        // can't be more than one, eg. in a glare situation. This checks that the given call\n        // is the call we consider 'the' call for its room.\n        const mappedRoomId = this.roomIdForCall(call);\n\n        const callForThisRoom = mappedRoomId ? this.getCallForRoom(mappedRoomId) : null;\n        return !!callForThisRoom && call.callId === callForThisRoom.callId;\n    }\n\n    private setCallListeners(call: MatrixCall): void {\n        let mappedRoomId = this.roomIdForCall(call);\n\n        call.on(CallEvent.Error, (err: CallError) => {\n            if (!this.matchesCallForThisRoom(call)) return;\n\n            logger.error(\"Call error:\", err);\n\n            if (err.code === CallErrorCode.NoUserMedia) {\n                this.showMediaCaptureError(call);\n                return;\n            }\n\n            if (\n                MatrixClientPeg.safeGet().getTurnServers().length === 0 &&\n                SettingsStore.getValue(\"fallbackICEServerAllowed\") === null\n            ) {\n                this.showICEFallbackPrompt();\n                return;\n            }\n\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"voip|call_failed\"),\n                description: err.message,\n            });\n        });\n        call.on(CallEvent.Hangup, () => {\n            if (!mappedRoomId || !this.matchesCallForThisRoom(call)) return;\n\n            if (isNotNull(mappedRoomId)) {\n                this.removeCallForRoom(mappedRoomId);\n            }\n        });\n        call.on(CallEvent.State, (newState: CallState, oldState: CallState) => {\n            this.onCallStateChanged(newState, oldState, call);\n        });\n        call.on(CallEvent.Replaced, (newCall: MatrixCall) => {\n            if (!mappedRoomId || !this.matchesCallForThisRoom(call)) return;\n\n            logger.log(`Call ID ${call.callId} is being replaced by call ID ${newCall.callId}`);\n\n            if (call.state === CallState.Ringing) {\n                this.pause(AudioID.Ring);\n            } else if (call.state === CallState.InviteSent) {\n                this.pause(AudioID.Ringback);\n            }\n\n            if (isNotNull(mappedRoomId)) {\n                this.removeCallForRoom(mappedRoomId);\n                this.addCallForRoom(mappedRoomId, newCall);\n            }\n            this.setCallListeners(newCall);\n            this.setCallState(newCall, newCall.state);\n        });\n        call.on(CallEvent.AssertedIdentityChanged, async (): Promise<void> => {\n            if (!mappedRoomId || !this.matchesCallForThisRoom(call)) return;\n\n            logger.log(`Call ID ${call.callId} got new asserted identity:`, call.getRemoteAssertedIdentity());\n\n            if (!this.shouldObeyAssertedfIdentity()) {\n                logger.log(\"asserted identity not enabled in config: ignoring\");\n                return;\n            }\n\n            const newAssertedIdentity = call.getRemoteAssertedIdentity()?.id;\n\n            if (newAssertedIdentity) {\n                this.assertedIdentityNativeUsers.set(call.callId, newAssertedIdentity);\n\n                // If we don't already have a room with this user, make one. This will be slightly odd\n                // if they called us because we'll be inviting them, but there's not much we can do about\n                // this if we want the actual, native room to exist (which we do). This is why it's\n                // important to only obey asserted identity in trusted environments, since anyone you're\n                // on a call with can cause you to send a room invite to someone.\n                await ensureDMExists(MatrixClientPeg.safeGet(), newAssertedIdentity);\n\n                const newMappedRoomId = this.roomIdForCall(call);\n                logger.log(`Old room ID: ${mappedRoomId}, new room ID: ${newMappedRoomId}`);\n                if (newMappedRoomId !== mappedRoomId && isNotNull(mappedRoomId) && isNotNull(newMappedRoomId)) {\n                    this.removeCallForRoom(mappedRoomId);\n                    mappedRoomId = newMappedRoomId;\n                    logger.log(\"Moving call to room \" + mappedRoomId);\n                    this.addCallForRoom(mappedRoomId, call, true);\n                }\n            }\n        });\n    }\n\n    private onCallStateChanged = (newState: CallState, oldState: CallState | null, call: MatrixCall): void => {\n        const mappedRoomId = this.roomIdForCall(call);\n        if (!mappedRoomId || !this.matchesCallForThisRoom(call)) return;\n\n        this.setCallState(call, newState);\n        // XXX: this is used by the IPC into Electron to keep device awake\n        dis.dispatch({\n            action: \"call_state\",\n            room_id: mappedRoomId,\n            state: newState,\n        });\n\n        switch (oldState) {\n            case CallState.Ringing:\n                this.pause(AudioID.Ring);\n                break;\n            case CallState.InviteSent:\n                this.pause(AudioID.Ringback);\n                break;\n        }\n\n        if (newState !== CallState.Ringing) {\n            this.silencedCalls.delete(call.callId);\n        }\n\n        switch (newState) {\n            case CallState.Ringing: {\n                const incomingCallPushRule = MatrixClientPeg.safeGet().pushProcessor.getPushRuleById(\n                    RuleId.IncomingCall,\n                );\n                const pushRuleEnabled = incomingCallPushRule?.enabled;\n                // actions can be either Tweaks | PushRuleActionName, ie an object or a string type enum\n                // and we want to only run this check on the Tweaks\n                const tweakSetToRing = incomingCallPushRule?.actions.some(\n                    (action) =>\n                        typeof action !== \"string\" && action.set_tweak === TweakName.Sound && action.value === \"ring\",\n                );\n\n                if (pushRuleEnabled && tweakSetToRing && !this.isForcedSilent()) {\n                    this.play(AudioID.Ring);\n                } else {\n                    this.silenceCall(call.callId);\n                }\n                break;\n            }\n            case CallState.InviteSent: {\n                this.play(AudioID.Ringback);\n                break;\n            }\n            case CallState.Ended: {\n                const hangupReason = call.hangupReason;\n                if (isNotNull(mappedRoomId)) {\n                    this.removeCallForRoom(mappedRoomId);\n                }\n\n                if (oldState === CallState.InviteSent && call.hangupParty === CallParty.Remote) {\n                    this.play(AudioID.Busy);\n\n                    // Don't show a modal when we got rejected/the call was hung up\n                    if (!hangupReason || [CallErrorCode.UserHangup, \"user hangup\"].includes(hangupReason)) break;\n\n                    let title: string;\n                    let description: string;\n                    // TODO: We should either do away with these or figure out a copy for each code (expect user_hangup...)\n                    if (call.hangupReason === CallErrorCode.UserBusy) {\n                        title = _t(\"voip|user_busy\");\n                        description = _t(\"voip|user_busy_description\");\n                    } else {\n                        title = _t(\"voip|call_failed\");\n                        description = _t(\"voip|call_failed_description\");\n                    }\n\n                    Modal.createDialog(ErrorDialog, {\n                        title,\n                        description,\n                    });\n                } else if (hangupReason === CallErrorCode.AnsweredElsewhere && oldState === CallState.Connecting) {\n                    Modal.createDialog(ErrorDialog, {\n                        title: _t(\"voip|answered_elsewhere\"),\n                        description: _t(\"voip|answered_elsewhere_description\"),\n                    });\n                } else if (oldState !== CallState.Fledgling && oldState !== CallState.Ringing) {\n                    // don't play the end-call sound for calls that never got off the ground\n                    this.play(AudioID.CallEnd);\n                }\n\n                if (isNotNull(mappedRoomId)) {\n                    this.logCallStats(call, mappedRoomId);\n                }\n                break;\n            }\n        }\n    };\n\n    private async logCallStats(call: MatrixCall, mappedRoomId: string): Promise<void> {\n        const stats = await call.getCurrentCallStats();\n        logger.debug(\n            `Call completed. Call ID: ${call.callId}, virtual room ID: ${call.roomId}, ` +\n                `user-facing room ID: ${mappedRoomId}, direction: ${call.direction}, ` +\n                `our Party ID: ${call.ourPartyId}, hangup party: ${call.hangupParty}, ` +\n                `hangup reason: ${call.hangupReason}`,\n        );\n        if (!stats) {\n            logger.debug(\n                \"Call statistics are undefined. The call has probably failed before a peerConn was established\",\n            );\n            return;\n        }\n        logger.debug(\"Local candidates:\");\n        for (const cand of stats.filter((item) => item.type === \"local-candidate\")) {\n            const address = cand.address || cand.ip; // firefox uses 'address', chrome uses 'ip'\n            logger.debug(\n                `${cand.id} - type: ${cand.candidateType}, address: ${address}, port: ${cand.port}, ` +\n                    `protocol: ${cand.protocol}, relay protocol: ${cand.relayProtocol}, network type: ${cand.networkType}`,\n            );\n        }\n        logger.debug(\"Remote candidates:\");\n        for (const cand of stats.filter((item) => item.type === \"remote-candidate\")) {\n            const address = cand.address || cand.ip; // firefox uses 'address', chrome uses 'ip'\n            logger.debug(\n                `${cand.id} - type: ${cand.candidateType}, address: ${address}, port: ${cand.port}, ` +\n                    `protocol: ${cand.protocol}`,\n            );\n        }\n        logger.debug(\"Candidate pairs:\");\n        for (const pair of stats.filter((item) => item.type === \"candidate-pair\")) {\n            logger.debug(\n                `${pair.localCandidateId} / ${pair.remoteCandidateId} - state: ${pair.state}, ` +\n                    `nominated: ${pair.nominated}, ` +\n                    `requests sent ${pair.requestsSent}, requests received  ${pair.requestsReceived},  ` +\n                    `responses received: ${pair.responsesReceived}, responses sent: ${pair.responsesSent}, ` +\n                    `bytes received: ${pair.bytesReceived}, bytes sent: ${pair.bytesSent}, `,\n            );\n        }\n\n        logger.debug(\"Outbound RTP:\");\n        for (const s of stats.filter((item) => item.type === \"outbound-rtp\")) {\n            logger.debug(s);\n        }\n\n        logger.debug(\"Inbound RTP:\");\n        for (const s of stats.filter((item) => item.type === \"inbound-rtp\")) {\n            logger.debug(s);\n        }\n    }\n\n    private setCallState(call: MatrixCall, status: CallState): void {\n        const mappedRoomId = this.roomIdForCall(call);\n\n        logger.log(`Call state in ${mappedRoomId} changed to ${status}`);\n\n        const toastKey = getIncomingLegacyCallToastKey(call.callId);\n        if (status === CallState.Ringing) {\n            ToastStore.sharedInstance().addOrReplaceToast({\n                key: toastKey,\n                priority: 100,\n                component: IncomingLegacyCallToast,\n                bodyClassName: \"mx_IncomingLegacyCallToast\",\n                props: { call },\n            });\n        } else {\n            ToastStore.sharedInstance().dismissToast(toastKey);\n        }\n\n        this.emit(LegacyCallHandlerEvent.CallState, mappedRoomId, status);\n    }\n\n    private removeCallForRoom(roomId: string): void {\n        logger.log(\"Removing call for room \", roomId);\n        this.calls.delete(roomId);\n        this.emit(LegacyCallHandlerEvent.CallsChanged, this.calls);\n    }\n\n    private showICEFallbackPrompt(): void {\n        const cli = MatrixClientPeg.safeGet();\n        const { finished } = Modal.createDialog(\n            QuestionDialog,\n            {\n                title: _t(\"voip|misconfigured_server\"),\n                description: (\n                    <div>\n                        <p>\n                            {_t(\n                                \"voip|misconfigured_server_description\",\n                                { homeserverDomain: cli.getDomain() },\n                                { code: (sub: string) => <code>{sub}</code> },\n                            )}\n                        </p>\n                        <p>\n                            {_t(\"voip|misconfigured_server_fallback\", undefined, {\n                                server: () => <code>{new URL(FALLBACK_ICE_SERVER).pathname}</code>,\n                            })}\n                        </p>\n                    </div>\n                ),\n                button: _t(\"voip|misconfigured_server_fallback_accept\", {\n                    server: new URL(FALLBACK_ICE_SERVER).pathname,\n                }),\n                cancelButton: _t(\"action|ok\"),\n            },\n            undefined,\n            true,\n        );\n\n        finished.then(([allow]) => {\n            SettingsStore.setValue(\"fallbackICEServerAllowed\", null, SettingLevel.DEVICE, allow ?? null);\n        });\n    }\n\n    private showMediaCaptureError(call: MatrixCall): void {\n        let title;\n        let description;\n\n        if (call.type === CallType.Voice) {\n            title = _t(\"voip|unable_to_access_microphone\");\n            description = <div>{_t(\"voip|call_failed_microphone\")}</div>;\n        } else if (call.type === CallType.Video) {\n            title = _t(\"voip|unable_to_access_media\");\n            description = (\n                <div>\n                    {_t(\"voip|call_failed_media\")}\n                    <ul>\n                        <li>{_t(\"voip|call_failed_media_connected\")}</li>\n                        <li>{_t(\"voip|call_failed_media_permissions\")}</li>\n                        <li>{_t(\"voip|call_failed_media_applications\")}</li>\n                    </ul>\n                </div>\n            );\n        }\n\n        Modal.createDialog(\n            ErrorDialog,\n            {\n                title,\n                description,\n            },\n            undefined,\n            true,\n        );\n    }\n\n    private async placeMatrixCall(roomId: string, type: CallType, transferee?: MatrixCall): Promise<void> {\n        const cli = MatrixClientPeg.safeGet();\n\n        const timeUntilTurnCresExpire = cli.getTurnServersExpiry() - Date.now();\n        logger.log(\"Current turn creds expire in \" + timeUntilTurnCresExpire + \" ms\");\n        const call = cli.createCall(roomId)!;\n\n        try {\n            this.addCallForRoom(roomId, call);\n        } catch {\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"voip|already_in_call\"),\n                description: _t(\"voip|already_in_call_person\"),\n            });\n            return;\n        }\n        if (transferee) {\n            this.transferees.set(call.callId, transferee);\n        }\n\n        this.setCallListeners(call);\n\n        this.setActiveCallRoomId(roomId);\n\n        if (type === CallType.Voice) {\n            call.placeVoiceCall();\n        } else if (type === \"video\") {\n            call.placeVideoCall();\n        } else {\n            logger.error(\"Unknown conf call type: \" + type);\n        }\n    }\n\n    public async placeCall(roomId: string, type: CallType, transferee?: MatrixCall): Promise<void> {\n        const cli = MatrixClientPeg.safeGet();\n        const room = cli.getRoom(roomId);\n        if (!room) {\n            logger.error(`Room ${roomId} does not exist.`);\n            return;\n        }\n\n        // We might be using managed hybrid widgets\n        if (isManagedHybridWidgetEnabled(room)) {\n            await addManagedHybridWidget(room);\n            return;\n        }\n\n        // if the runtime env doesn't do VoIP, whine.\n        if (!cli.supportsVoip()) {\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"voip|unsupported\"),\n                description: _t(\"voip|unsupported_browser\"),\n            });\n            return;\n        }\n\n        if (cli.getSyncState() === SyncState.Error) {\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"voip|connection_lost\"),\n                description: _t(\"voip|connection_lost_description\"),\n            });\n            return;\n        }\n\n        // don't allow > 2 calls to be placed.\n        if (this.getAllActiveCalls().length > 1) {\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"voip|too_many_calls\"),\n                description: _t(\"voip|too_many_calls_description\"),\n            });\n            return;\n        }\n\n        // We leave the check for whether there's already a call in this room until later,\n        // otherwise it can race.\n\n        const members = getJoinedNonFunctionalMembers(room);\n        if (members.length <= 1) {\n            Modal.createDialog(ErrorDialog, {\n                description: _t(\"voip|cannot_call_yourself_description\"),\n            });\n        } else if (members.length === 2 && !Jitsi.getInstance().useFor1To1Calls) {\n            logger.info(`Place ${type} call in ${roomId}`);\n\n            await this.placeMatrixCall(roomId, type, transferee);\n        } else {\n            // > 2 || useFor1To1Calls\n            await this.placeJitsiCall(roomId, type);\n        }\n    }\n\n    public hangupAllCalls(): void {\n        for (const call of this.calls.values()) {\n            this.stopRingingIfPossible(call.callId);\n            call.hangup(CallErrorCode.UserHangup, false);\n        }\n    }\n\n    public hangupOrReject(roomId: string, reject?: boolean): void {\n        const call = this.calls.get(roomId);\n\n        // no call to hangup\n        if (!call) return;\n\n        this.stopRingingIfPossible(call.callId);\n\n        if (reject) {\n            call.reject();\n        } else {\n            call.hangup(CallErrorCode.UserHangup, false);\n        }\n        // don't remove the call yet: let the hangup event handler do it (otherwise it will throw\n        // the hangup event away)\n    }\n\n    public answerCall(roomId: string): void {\n        // no call to answer\n        if (!this.calls.has(roomId)) return;\n\n        const call = this.calls.get(roomId)!;\n        this.stopRingingIfPossible(call.callId);\n\n        if (this.getAllActiveCalls().length > 1) {\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"voip|too_many_calls\"),\n                description: _t(\"voip|too_many_calls_description\"),\n            });\n            return;\n        }\n\n        call.answer();\n        this.setActiveCallRoomId(roomId);\n        dis.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            room_id: roomId,\n            metricsTrigger: \"WebAcceptCall\",\n        });\n    }\n\n    private stopRingingIfPossible(callId: string): void {\n        this.silencedCalls.delete(callId);\n        if (this.areAnyCallsUnsilenced()) return;\n        this.pause(AudioID.Ring);\n    }\n\n    public async dialNumber(number: string, transferee?: MatrixCall): Promise<void> {\n        const results = await this.pstnLookup(number);\n        if (!results || results.length === 0 || !results[0].userid) {\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"voip|msisdn_lookup_failed\"),\n                description: _t(\"voip|msisdn_lookup_failed_description\"),\n            });\n            return;\n        }\n        const userId = results[0].userid;\n\n        const roomId = await ensureDMExists(MatrixClientPeg.safeGet(), userId);\n        if (!roomId) {\n            throw new Error(\"Failed to ensure DM exists for dialing number\");\n        }\n\n        dis.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            room_id: roomId,\n            metricsTrigger: \"WebDialPad\",\n        });\n\n        await this.placeMatrixCall(roomId, CallType.Voice, transferee);\n    }\n\n    public async startTransferToPhoneNumber(\n        call: MatrixCall,\n        destination: string,\n        consultFirst: boolean,\n    ): Promise<void> {\n        if (consultFirst) {\n            // if we're consulting, we just start by placing a call to the transfer\n            // target (passing the transferee so the actual transfer can happen later)\n            this.dialNumber(destination, call);\n            return;\n        }\n\n        const results = await this.pstnLookup(destination);\n        if (!results || results.length === 0 || !results[0].userid) {\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"voip|msisdn_transfer_failed\"),\n                description: _t(\"voip|msisdn_lookup_failed_description\"),\n            });\n            return;\n        }\n\n        await this.startTransferToMatrixID(call, results[0].userid, consultFirst);\n    }\n\n    public async startTransferToMatrixID(call: MatrixCall, destination: string, consultFirst: boolean): Promise<void> {\n        if (consultFirst) {\n            const dmRoomId = await ensureDMExists(MatrixClientPeg.safeGet(), destination);\n            if (!dmRoomId) {\n                logger.log(\"Failed to transfer call, could not ensure dm exists\");\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"voip|transfer_failed\"),\n                    description: _t(\"voip|transfer_failed_description\"),\n                });\n                return;\n            }\n\n            this.placeCall(dmRoomId, call.type, call);\n            dis.dispatch<ViewRoomPayload>({\n                action: Action.ViewRoom,\n                room_id: dmRoomId,\n                should_peek: false,\n                joining: false,\n                metricsTrigger: undefined, // other\n            });\n        } else {\n            try {\n                await call.transfer(destination);\n            } catch (e) {\n                logger.log(\"Failed to transfer call\", e);\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"voip|transfer_failed\"),\n                    description: _t(\"voip|transfer_failed_description\"),\n                });\n            }\n        }\n    }\n\n    public setActiveCallRoomId(activeCallRoomId: string): void {\n        logger.info(\"Setting call in room \" + activeCallRoomId + \" active\");\n\n        for (const [roomId, call] of this.calls.entries()) {\n            if (call.state === CallState.Ended) continue;\n\n            if (roomId === activeCallRoomId) {\n                call.setRemoteOnHold(false);\n            } else {\n                logger.info(\"Holding call in room \" + roomId + \" because another call is being set active\");\n                call.setRemoteOnHold(true);\n            }\n        }\n    }\n\n    /**\n     * @returns true if we are currently in any call where we haven't put the remote party on hold\n     */\n    public hasAnyUnheldCall(): boolean {\n        for (const call of this.calls.values()) {\n            if (call.state === CallState.Ended) continue;\n            if (!call.isRemoteOnHold()) return true;\n        }\n\n        return false;\n    }\n\n    private async placeJitsiCall(roomId: string, type: CallType): Promise<void> {\n        const client = MatrixClientPeg.safeGet();\n        logger.info(`Place conference call in ${roomId}`);\n\n        dis.dispatch({ action: \"appsDrawer\", show: true });\n\n        // Prevent double clicking the call button\n        const widget = this.sdkContext.widgetStore.getApps(roomId).find((app) => WidgetType.JITSI.matches(app.type));\n        if (widget) {\n            // If there already is a Jitsi widget, pin it\n            const room = client.getRoom(roomId);\n            if (isNotNull(room)) {\n                this.sdkContext.widgetLayoutStore.moveToContainer(room, widget, \"top\");\n            }\n            return;\n        }\n\n        try {\n            await WidgetUtils.addJitsiWidget(client, roomId, type, \"Jitsi\", false);\n            logger.log(\"Jitsi widget added\");\n        } catch (e) {\n            if (e instanceof MatrixError && e.errcode === \"M_FORBIDDEN\") {\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"voip|no_permission_conference\"),\n                    description: _t(\"voip|no_permission_conference_description\"),\n                });\n            }\n            logger.error(e);\n        }\n    }\n\n    public hangupCallApp(roomId: string): void {\n        logger.info(\"Leaving conference call in \" + roomId);\n\n        const roomInfo = this.sdkContext.widgetStore.getRoom(roomId);\n        if (!roomInfo) return; // \"should never happen\" clauses go here\n\n        const jitsiWidgets = roomInfo.widgets.filter((w) => WidgetType.JITSI.matches(w.type));\n        jitsiWidgets.forEach((w) => {\n            const messaging = WidgetMessagingStore.instance.getMessagingForUid(WidgetUtils.getWidgetUid(w));\n            if (!messaging?.widgetApi) return; // more \"should never happen\" words\n\n            messaging.widgetApi.transport.send(ElementWidgetActions.HangupCall, {});\n        });\n    }\n\n    /*\n     * Shows the transfer dialog for a call, signalling to the other end that\n     * a transfer is about to happen\n     */\n    public showTransferDialog(call: MatrixCall): void {\n        call.setRemoteOnHold(true);\n        dis.dispatch<OpenInviteDialogPayload>({\n            action: Action.OpenInviteDialog,\n            kind: InviteKind.CallTransfer,\n            call,\n            analyticsName: \"Transfer Call\",\n            className: \"mx_InviteDialog_transferWrapper\",\n            onFinishedCallback: (results) => {\n                if (results.length === 0 || results[0] === false) {\n                    call.setRemoteOnHold(false);\n                }\n            },\n        });\n    }\n\n    private addCallForRoom(roomId: string, call: MatrixCall, changedRooms = false): void {\n        if (this.calls.has(roomId)) {\n            logger.log(`Couldn't add call to room ${roomId}: already have a call for this room`);\n            throw new Error(\"Already have a call for room \" + roomId);\n        }\n\n        logger.log(\"setting call for room \" + roomId);\n        this.calls.set(roomId, call);\n\n        // Should we always emit CallsChanged too?\n        if (changedRooms) {\n            this.emit(LegacyCallHandlerEvent.CallChangeRoom, call);\n        } else {\n            this.emit(LegacyCallHandlerEvent.CallsChanged, this.calls);\n        }\n    }\n}\n","/*\nCopyright 2026 Element Creations Ltd.\nCopyright 2024, 2025 New Vector Ltd.\nCopyright 2024 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport sanitizeHtml, { type IOptions } from \"sanitize-html\";\nimport {\n    PERMITTED_URL_SCHEMES,\n    linkifyString as _linkifyString,\n    linkifyHtml as _linkifyHtml,\n    LinkifyMatrixOpaqueIdType,\n    generateLinkedTextOptions,\n    type LinkEventListener,\n} from \"@element-hq/web-shared-components\";\nimport { getHttpUriForMxc, User } from \"matrix-js-sdk/src/matrix\";\n\nimport { ELEMENT_URL_PATTERN } from \"./linkify-matrix\";\nimport { mediaFromMxc } from \"./customisations/Media\";\nimport {\n    parsePermalink,\n    tryTransformEntityToPermalink,\n    tryTransformPermalinkToLocalHref,\n} from \"./utils/permalinks/Permalinks\";\nimport dis from \"./dispatcher/dispatcher\";\nimport { Action } from \"./dispatcher/actions\";\nimport { type ViewUserPayload } from \"./dispatcher/payloads/ViewUserPayload\";\nimport { type ViewRoomPayload } from \"./dispatcher/payloads/ViewRoomPayload\";\nimport { MatrixClientPeg } from \"./MatrixClientPeg\";\n\nconst COLOR_REGEX = /^#[0-9a-fA-F]{6}$/;\nconst MEDIA_API_MXC_REGEX = /\\/_matrix\\/media\\/r0\\/(?:download|thumbnail)\\/(.+?)\\/(.+?)(?:[?/]|$)/;\n\nexport const transformTags: NonNullable<IOptions[\"transformTags\"]> = {\n    // custom to matrix\n    // add blank targets to all hyperlinks except vector URLs\n    \"a\": function (tagName: string, attribs: sanitizeHtml.Attributes) {\n        if (attribs.href) {\n            attribs.target = \"_blank\"; // by default\n\n            const transformed = tryTransformPermalinkToLocalHref(attribs.href); // only used to check if it is a link that can be handled locally\n            if (\n                transformed !== attribs.href || // it could be converted so handle locally symbols e.g. @user:server.tdl, matrix: and matrix.to\n                ELEMENT_URL_PATTERN.test(attribs.href) // for https links to Element domains\n            ) {\n                delete attribs.target;\n            }\n        } else {\n            // Delete the href attrib if it is falsy\n            delete attribs.href;\n        }\n\n        attribs.rel = \"noreferrer noopener\"; // https://mathiasbynens.github.io/rel-noopener/\n        return { tagName, attribs };\n    },\n    \"img\": function (tagName: string, attribs: sanitizeHtml.Attributes) {\n        let src = attribs.src;\n        // Strip out imgs that aren't `mxc` here instead of using allowedSchemesByTag\n        // because transformTags is used _before_ we filter by allowedSchemesByTag and\n        // we don't want to allow images with `https?` `src`s.\n        if (!src) {\n            return { tagName, attribs: {} };\n        }\n\n        if (!src.startsWith(\"mxc://\")) {\n            const match = MEDIA_API_MXC_REGEX.exec(src);\n            if (match) {\n                src = `mxc://${match[1]}/${match[2]}`;\n            }\n        }\n\n        if (!src.startsWith(\"mxc://\")) {\n            return { tagName, attribs: {} };\n        }\n\n        const requestedWidth = Number(attribs.width);\n        const requestedHeight = Number(attribs.height);\n        const width = Math.min(requestedWidth || 800, 800);\n        const height = Math.min(requestedHeight || 600, 600);\n        // specify width/height as max values instead of absolute ones to allow object-fit to do its thing\n        // we only allow our own styles for this tag so overwrite the attribute\n        attribs.style = `max-width: ${width}px; max-height: ${height}px;`;\n        if (requestedWidth) {\n            attribs.style += \"width: 100%;\";\n        }\n        if (requestedHeight) {\n            attribs.style += \"height: 100%;\";\n        }\n        attribs.src = mediaFromMxc(src).getThumbnailOfSourceHttp(width, height)!;\n        return { tagName, attribs };\n    },\n    \"code\": function (tagName: string, attribs: sanitizeHtml.Attributes) {\n        if (typeof attribs.class !== \"undefined\") {\n            // Filter out all classes other than ones starting with language- for syntax highlighting.\n            const classes = attribs.class.split(/\\s/).filter(function (cl) {\n                return cl.startsWith(\"language-\") && !cl.startsWith(\"language-_\");\n            });\n            attribs.class = classes.join(\" \");\n        }\n        return { tagName, attribs };\n    },\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    \"*\": function (tagName: string, attribs: sanitizeHtml.Attributes) {\n        // Delete any style previously assigned, style is an allowedTag for font, span & img,\n        // because attributes are stripped after transforming.\n        // For img this is trusted as it is generated wholly within the img transformation method.\n        if (tagName !== \"img\") {\n            delete attribs.style;\n        }\n\n        // Sanitise and transform data-mx-color and data-mx-bg-color to their CSS\n        // equivalents\n        const customCSSMapper: Record<string, string> = {\n            \"data-mx-color\": \"color\",\n            \"data-mx-bg-color\": \"background-color\",\n            // $customAttributeKey: $cssAttributeKey\n        };\n\n        let style = \"\";\n        Object.keys(customCSSMapper).forEach((customAttributeKey) => {\n            const cssAttributeKey = customCSSMapper[customAttributeKey];\n            const customAttributeValue = attribs[customAttributeKey];\n            if (\n                customAttributeValue &&\n                typeof customAttributeValue === \"string\" &&\n                COLOR_REGEX.test(customAttributeValue)\n            ) {\n                style += cssAttributeKey + \":\" + customAttributeValue + \";\";\n                delete attribs[customAttributeKey];\n            }\n        });\n\n        if (style) {\n            attribs.style = style + (attribs.style || \"\");\n        }\n\n        return { tagName, attribs };\n    },\n};\n\nexport const sanitizeHtmlParams: IOptions = {\n    allowedTags: [\n        // These tags are suggested by the spec https://spec.matrix.org/v1.10/client-server-api/#mroommessage-msgtypes\n        \"font\", // custom to matrix for IRC-style font coloring\n        \"del\", // for markdown\n        \"s\",\n        \"h1\",\n        \"h2\",\n        \"h3\",\n        \"h4\",\n        \"h5\",\n        \"h6\",\n        \"blockquote\",\n        \"p\",\n        \"a\",\n        \"ul\",\n        \"ol\",\n        \"sup\",\n        \"sub\",\n        \"nl\",\n        \"li\",\n        \"b\",\n        \"i\",\n        \"u\",\n        \"strong\",\n        \"em\",\n        \"strike\",\n        \"code\",\n        \"hr\",\n        \"br\",\n        \"div\",\n        \"table\",\n        \"thead\",\n        \"caption\",\n        \"tbody\",\n        \"tr\",\n        \"th\",\n        \"td\",\n        \"pre\",\n        \"span\",\n        \"img\",\n        \"details\",\n        \"summary\",\n    ],\n    allowedAttributes: {\n        // attribute sanitization happens after transformations, so we have to accept `style` for font, span & img\n        // but strip during the transformation.\n        // custom ones first:\n        font: [\"color\", \"data-mx-bg-color\", \"data-mx-color\", \"style\"], // custom to matrix\n        span: [\"data-mx-maths\", \"data-mx-bg-color\", \"data-mx-color\", \"data-mx-spoiler\", \"style\"], // custom to matrix\n        div: [\"data-mx-maths\"],\n        a: [\"href\", \"name\", \"target\", \"rel\"], // remote target: custom to matrix\n        // img tags also accept width/height, we just map those to max-width & max-height during transformation\n        img: [\"src\", \"alt\", \"title\", \"style\"],\n        ol: [\"start\"],\n        code: [\"class\"], // We don't actually allow all classes, we filter them in transformTags\n    },\n    // Lots of these won't come up by default because we don't allow them\n    selfClosing: [\"img\", \"br\", \"hr\", \"area\", \"base\", \"basefont\", \"input\", \"link\", \"meta\"],\n    // URL schemes we permit\n    allowedSchemes: PERMITTED_URL_SCHEMES,\n    allowProtocolRelative: false,\n    transformTags,\n    // 50 levels deep \"should be enough for anyone\"\n    nestingLimit: 50,\n};\n\n/**\n * Handler function when a UserID link is clicked.\n * @param event The click event\n * @param userId The linked UserID\n */\nfunction onUserClick(event: MouseEvent, userId: string): void {\n    event.preventDefault();\n    dis.dispatch<ViewUserPayload>({\n        action: Action.ViewUser,\n        member: new User(userId),\n    });\n}\n\n/**\n * Handler function when a Room Alias link is clicked.\n * @param event The click event\n * @param roomAlias The linked room alias\n */\nfunction onAliasClick(event: MouseEvent, roomAlias: string): void {\n    event.preventDefault();\n    dis.dispatch<ViewRoomPayload>({\n        action: Action.ViewRoom,\n        room_alias: roomAlias,\n        metricsTrigger: \"Timeline\",\n        metricsViaKeyboard: false,\n    });\n}\n\n/**\n * Generates a set of event handlers for a regular URL link.\n *\n * @param href The link location.\n * @returns Event listenenrs compatible with linkifyjs.\n */\nfunction urlEventListeners(href: string): LinkEventListener {\n    // intercept local permalinks to users and show them like userids (in userinfo of current room)\n    try {\n        const permalink = parsePermalink(href);\n        if (permalink?.userId) {\n            return {\n                click: function (e: MouseEvent) {\n                    onUserClick(e, permalink.userId!);\n                },\n            };\n        } else {\n            // for events, rooms etc. (anything other than users)\n            const localHref = tryTransformPermalinkToLocalHref(href);\n            if (localHref !== href) {\n                // it could be converted to a localHref -> therefore handle locally\n                return {\n                    click: function (e: MouseEvent) {\n                        e.preventDefault();\n                        globalThis.location.hash = localHref;\n                    },\n                };\n            }\n        }\n    } catch {\n        // OK fine, it's not actually a permalink\n    }\n    return {};\n}\n\n/**\n * Generates a set of event handlers for a UserID link.\n *\n * @param href A link that contains a userId.\n * @returns Event listenenrs compatible with linkifyjs.\n */\nexport function userIdEventListeners(href: string): LinkEventListener {\n    return {\n        click: function (e: MouseEvent) {\n            e.preventDefault();\n            const userId = parsePermalink(href)?.userId ?? href;\n            if (userId) onUserClick(e, userId);\n        },\n    };\n}\n\n/**\n * Generates a set of event handlers for a UserID link.\n *\n * @param href A link that contains a room alias.\n * @returns Event listenenrs compatible with linkifyjs.\n */\nexport function roomAliasEventListeners(href: string): LinkEventListener {\n    return {\n        click: function (e: MouseEvent) {\n            e.preventDefault();\n            const alias = parsePermalink(href)?.roomIdOrAlias ?? href;\n            if (alias) onAliasClick(e, alias);\n        },\n    };\n}\n\n/**\n * Generates a `target` attribute for the anchor element\n * for the given `href` value.\n *\n * @param href A URL from a link.\n * @returns The resulting `target` value.\n */\nfunction urlTargetTransformFunction(href: string): string {\n    try {\n        const transformed = tryTransformPermalinkToLocalHref(href);\n        if (\n            transformed !== href || // if it could be converted to handle locally for matrix symbols e.g. @user:server.tdl and matrix.to\n            ELEMENT_URL_PATTERN.test(decodeURIComponent(href)) // for https links to Element domains\n        ) {\n            return \"\";\n        } else {\n            return \"_blank\";\n        }\n    } catch {\n        // malformed URI\n    }\n    return \"\";\n}\n\n/**\n * Generates the result `href` value based on an incoming `href` value and a link type.\n *\n * @param href A URL from a link.\n * @param type The type of link beinh handled.\n * @returns The resulting `href` value.\n */\nexport function formatHref(href: string, type: LinkifyMatrixOpaqueIdType): string {\n    switch (type) {\n        case LinkifyMatrixOpaqueIdType.URL:\n            if (href.startsWith(\"mxc://\") && MatrixClientPeg.get()) {\n                return getHttpUriForMxc(\n                    MatrixClientPeg.get()!.baseUrl,\n                    href,\n                    undefined,\n                    undefined,\n                    undefined,\n                    false,\n                    true,\n                );\n            }\n        // fallthrough\n        case LinkifyMatrixOpaqueIdType.RoomAlias:\n        case LinkifyMatrixOpaqueIdType.UserId:\n        default: {\n            return tryTransformEntityToPermalink(MatrixClientPeg.safeGet(), href) ?? \"\";\n        }\n    }\n}\n\n/**\n * The standard configuration for a LinkedTextContext.Provider\n * within Element Web.\n */\nexport const LinkedTextConfiguration = {\n    userIdListener: userIdEventListeners,\n    roomAliasListener: roomAliasEventListeners,\n    urlListener: urlEventListeners,\n    hrefTransformer: formatHref,\n    urlTargetTransformer: urlTargetTransformFunction,\n};\n\ntype LinkifyOpts = Parameters<typeof _linkifyString>[1];\n\n/**\n * Linkifies the given string. This is a wrapper around 'linkifyjs/string'.\n *\n * @param str string to linkify\n * @param [options] Options for linkifyString.\n * @returns Linkified string\n */\nexport function linkifyString(\n    value: string,\n    options: LinkifyOpts = generateLinkedTextOptions(LinkedTextConfiguration),\n): string {\n    return _linkifyString(value, options);\n}\n\n/**\n * Linkifies the given HTML-formatted string. This is a wrapper around 'linkifyjs/html'.\n *\n * @param str HTML string to linkify\n * @param [options] Options for linkifyHtml.\n * @returns Linkified string\n */\nexport function linkifyHtml(\n    value: string,\n    options: LinkifyOpts = generateLinkedTextOptions(LinkedTextConfiguration),\n): string {\n    return _linkifyHtml(value, options);\n}\n\n/**\n * Linkify the given string and sanitize the HTML afterwards.\n *\n * @param dirtyString The string to linkify, and then sanitize.\n * @param [options] Options for linkifyString. Default: linkifyMatrixOptions\n * @returns HTML string\n */\nexport function linkifyAndSanitizeHtml(\n    dirtyHtml: string,\n    options: LinkifyOpts = generateLinkedTextOptions(LinkedTextConfiguration),\n): string {\n    return sanitizeHtml(linkifyString(dirtyHtml, options), sanitizeHtmlParams);\n}\n","\"use strict\";\n\nfunction isContainer(node) {\n    switch (node._type) {\n        case \"document\":\n        case \"block_quote\":\n        case \"list\":\n        case \"item\":\n        case \"paragraph\":\n        case \"heading\":\n        case \"emph\":\n        case \"strong\":\n        case \"link\":\n        case \"image\":\n        case \"custom_inline\":\n        case \"custom_block\":\n            return true;\n        default:\n            return false;\n    }\n}\n\nvar resumeAt = function(node, entering) {\n    this.current = node;\n    this.entering = entering === true;\n};\n\nvar next = function() {\n    var cur = this.current;\n    var entering = this.entering;\n\n    if (cur === null) {\n        return null;\n    }\n\n    var container = isContainer(cur);\n\n    if (entering && container) {\n        if (cur._firstChild) {\n            this.current = cur._firstChild;\n            this.entering = true;\n        } else {\n            // stay on node but exit\n            this.entering = false;\n        }\n    } else if (cur === this.root) {\n        this.current = null;\n    } else if (cur._next === null) {\n        this.current = cur._parent;\n        this.entering = false;\n    } else {\n        this.current = cur._next;\n        this.entering = true;\n    }\n\n    return { entering: entering, node: cur };\n};\n\nvar NodeWalker = function(root) {\n    return {\n        current: root,\n        root: root,\n        entering: true,\n        next: next,\n        resumeAt: resumeAt\n    };\n};\n\nvar Node = function(nodeType, sourcepos) {\n    this._type = nodeType;\n    this._parent = null;\n    this._firstChild = null;\n    this._lastChild = null;\n    this._prev = null;\n    this._next = null;\n    this._sourcepos = sourcepos;\n    this._open = true;\n    this._string_content = null;\n    this._literal = null;\n    this._listData = {};\n    this._info = null;\n    this._destination = null;\n    this._title = null;\n    this._isFenced = false;\n    this._fenceChar = null;\n    this._fenceLength = 0;\n    this._fenceOffset = null;\n    this._level = null;\n    this._onEnter = null;\n    this._onExit = null;\n};\n\nvar proto = Node.prototype;\n\nObject.defineProperty(proto, \"isContainer\", {\n    get: function() {\n        return isContainer(this);\n    }\n});\n\nObject.defineProperty(proto, \"type\", {\n    get: function() {\n        return this._type;\n    }\n});\n\nObject.defineProperty(proto, \"firstChild\", {\n    get: function() {\n        return this._firstChild;\n    }\n});\n\nObject.defineProperty(proto, \"lastChild\", {\n    get: function() {\n        return this._lastChild;\n    }\n});\n\nObject.defineProperty(proto, \"next\", {\n    get: function() {\n        return this._next;\n    }\n});\n\nObject.defineProperty(proto, \"prev\", {\n    get: function() {\n        return this._prev;\n    }\n});\n\nObject.defineProperty(proto, \"parent\", {\n    get: function() {\n        return this._parent;\n    }\n});\n\nObject.defineProperty(proto, \"sourcepos\", {\n    get: function() {\n        return this._sourcepos;\n    }\n});\n\nObject.defineProperty(proto, \"literal\", {\n    get: function() {\n        return this._literal;\n    },\n    set: function(s) {\n        this._literal = s;\n    }\n});\n\nObject.defineProperty(proto, \"destination\", {\n    get: function() {\n        return this._destination;\n    },\n    set: function(s) {\n        this._destination = s;\n    }\n});\n\nObject.defineProperty(proto, \"title\", {\n    get: function() {\n        return this._title;\n    },\n    set: function(s) {\n        this._title = s;\n    }\n});\n\nObject.defineProperty(proto, \"info\", {\n    get: function() {\n        return this._info;\n    },\n    set: function(s) {\n        this._info = s;\n    }\n});\n\nObject.defineProperty(proto, \"level\", {\n    get: function() {\n        return this._level;\n    },\n    set: function(s) {\n        this._level = s;\n    }\n});\n\nObject.defineProperty(proto, \"listType\", {\n    get: function() {\n        return this._listData.type;\n    },\n    set: function(t) {\n        this._listData.type = t;\n    }\n});\n\nObject.defineProperty(proto, \"listTight\", {\n    get: function() {\n        return this._listData.tight;\n    },\n    set: function(t) {\n        this._listData.tight = t;\n    }\n});\n\nObject.defineProperty(proto, \"listStart\", {\n    get: function() {\n        return this._listData.start;\n    },\n    set: function(n) {\n        this._listData.start = n;\n    }\n});\n\nObject.defineProperty(proto, \"listDelimiter\", {\n    get: function() {\n        return this._listData.delimiter;\n    },\n    set: function(delim) {\n        this._listData.delimiter = delim;\n    }\n});\n\nObject.defineProperty(proto, \"onEnter\", {\n    get: function() {\n        return this._onEnter;\n    },\n    set: function(s) {\n        this._onEnter = s;\n    }\n});\n\nObject.defineProperty(proto, \"onExit\", {\n    get: function() {\n        return this._onExit;\n    },\n    set: function(s) {\n        this._onExit = s;\n    }\n});\n\nNode.prototype.appendChild = function(child) {\n    child.unlink();\n    child._parent = this;\n    if (this._lastChild) {\n        this._lastChild._next = child;\n        child._prev = this._lastChild;\n        this._lastChild = child;\n    } else {\n        this._firstChild = child;\n        this._lastChild = child;\n    }\n};\n\nNode.prototype.prependChild = function(child) {\n    child.unlink();\n    child._parent = this;\n    if (this._firstChild) {\n        this._firstChild._prev = child;\n        child._next = this._firstChild;\n        this._firstChild = child;\n    } else {\n        this._firstChild = child;\n        this._lastChild = child;\n    }\n};\n\nNode.prototype.unlink = function() {\n    if (this._prev) {\n        this._prev._next = this._next;\n    } else if (this._parent) {\n        this._parent._firstChild = this._next;\n    }\n    if (this._next) {\n        this._next._prev = this._prev;\n    } else if (this._parent) {\n        this._parent._lastChild = this._prev;\n    }\n    this._parent = null;\n    this._next = null;\n    this._prev = null;\n};\n\nNode.prototype.insertAfter = function(sibling) {\n    sibling.unlink();\n    sibling._next = this._next;\n    if (sibling._next) {\n        sibling._next._prev = sibling;\n    }\n    sibling._prev = this;\n    this._next = sibling;\n    sibling._parent = this._parent;\n    if (!sibling._next) {\n        sibling._parent._lastChild = sibling;\n    }\n};\n\nNode.prototype.insertBefore = function(sibling) {\n    sibling.unlink();\n    sibling._prev = this._prev;\n    if (sibling._prev) {\n        sibling._prev._next = sibling;\n    }\n    sibling._next = this;\n    this._prev = sibling;\n    sibling._parent = this._parent;\n    if (!sibling._prev) {\n        sibling._parent._firstChild = sibling;\n    }\n};\n\nNode.prototype.walker = function() {\n    var walker = new NodeWalker(this);\n    return walker;\n};\n\nexport default Node;\n\n/* Example of use of walker:\n\n var walker = w.walker();\n var event;\n\n while (event = walker.next()) {\n console.log(event.entering, event.node.type);\n }\n\n */\n","\"use strict\";\n\n// derived from https://github.com/mathiasbynens/String.fromCodePoint\n/*! http://mths.be/fromcodepoint v0.2.1 by @mathias */\n\nvar _fromCodePoint;\n\nexport default function fromCodePoint(_) {\n    return _fromCodePoint(_);\n}\n\nif (String.fromCodePoint) {\n    _fromCodePoint = function(_) {\n        try {\n            return String.fromCodePoint(_);\n        } catch (e) {\n            if (e instanceof RangeError) {\n                return String.fromCharCode(0xfffd);\n            }\n            throw e;\n        }\n    };\n} else {\n    var stringFromCharCode = String.fromCharCode;\n    var floor = Math.floor;\n    _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                return String.fromCharCode(0xfffd);\n            }\n            if (codePoint <= 0xffff) {\n                // BMP code point\n                codeUnits.push(codePoint);\n            } else {\n                // 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}\n","\"use strict\";\n\nimport encode from \"mdurl/encode.js\";\nimport { decodeHTMLStrict } from \"entities\";\n\nvar C_BACKSLASH = 92;\n\nvar ENTITY = \"&(?:#x[a-f0-9]{1,6}|#[0-9]{1,7}|[a-z][a-z0-9]{1,31});\";\n\nvar TAGNAME = \"[A-Za-z][A-Za-z0-9-]*\";\nvar ATTRIBUTENAME = \"[a-zA-Z_:][a-zA-Z0-9:._-]*\";\nvar UNQUOTEDVALUE = \"[^\\\"'=<>`\\\\x00-\\\\x20]+\";\nvar SINGLEQUOTEDVALUE = \"'[^']*'\";\nvar DOUBLEQUOTEDVALUE = '\"[^\"]*\"';\nvar ATTRIBUTEVALUE =\n    \"(?:\" +\n    UNQUOTEDVALUE +\n    \"|\" +\n    SINGLEQUOTEDVALUE +\n    \"|\" +\n    DOUBLEQUOTEDVALUE +\n    \")\";\nvar ATTRIBUTEVALUESPEC = \"(?:\" + \"\\\\s*=\" + \"\\\\s*\" + ATTRIBUTEVALUE + \")\";\nvar ATTRIBUTE = \"(?:\" + \"\\\\s+\" + ATTRIBUTENAME + ATTRIBUTEVALUESPEC + \"?)\";\nvar OPENTAG = \"<\" + TAGNAME + ATTRIBUTE + \"*\" + \"\\\\s*/?>\";\nvar CLOSETAG = \"</\" + TAGNAME + \"\\\\s*[>]\";\nvar HTMLCOMMENT = \"<!-->|<!--->|<!--[\\\\s\\\\S]*?-->\"\nvar PROCESSINGINSTRUCTION = \"[<][?][\\\\s\\\\S]*?[?][>]\";\nvar DECLARATION = \"<![A-Za-z]+\" + \"[^>]*>\";\nvar CDATA = \"<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\";\nvar HTMLTAG =\n    \"(?:\" +\n    OPENTAG +\n    \"|\" +\n    CLOSETAG +\n    \"|\" +\n    HTMLCOMMENT +\n    \"|\" +\n    PROCESSINGINSTRUCTION +\n    \"|\" +\n    DECLARATION +\n    \"|\" +\n    CDATA +\n    \")\";\nvar reHtmlTag = new RegExp(\"^\" + HTMLTAG);\n\nvar reBackslashOrAmp = /[\\\\&]/;\n\nvar ESCAPABLE = \"[!\\\"#$%&'()*+,./:;<=>?@[\\\\\\\\\\\\]^_`{|}~-]\";\n\nvar reEntityOrEscapedChar = new RegExp(\"\\\\\\\\\" + ESCAPABLE + \"|\" + ENTITY, \"gi\");\n\nvar XMLSPECIAL = '[&<>\"]';\n\nvar reXmlSpecial = new RegExp(XMLSPECIAL, \"g\");\n\nvar unescapeChar = function(s) {\n    if (s.charCodeAt(0) === C_BACKSLASH) {\n        return s.charAt(1);\n    } else {\n        return decodeHTMLStrict(s);\n    }\n};\n\n// Replace entities and backslash escapes with literal characters.\nvar unescapeString = function(s) {\n    if (reBackslashOrAmp.test(s)) {\n        return s.replace(reEntityOrEscapedChar, unescapeChar);\n    } else {\n        return s;\n    }\n};\n\nvar normalizeURI = function(uri) {\n    try {\n        return encode(uri);\n    } catch (err) {\n        return uri;\n    }\n};\n\nvar replaceUnsafeChar = function(s) {\n    switch (s) {\n        case \"&\":\n            return \"&amp;\";\n        case \"<\":\n            return \"&lt;\";\n        case \">\":\n            return \"&gt;\";\n        case '\"':\n            return \"&quot;\";\n        default:\n            return s;\n    }\n};\n\nvar escapeXml = function(s) {\n    if (reXmlSpecial.test(s)) {\n        return s.replace(reXmlSpecial, replaceUnsafeChar);\n    } else {\n        return s;\n    }\n};\n\nexport {\n    unescapeString,\n    normalizeURI,\n    escapeXml,\n    reHtmlTag,\n    OPENTAG,\n    CLOSETAG,\n    ENTITY,\n    ESCAPABLE\n};\n","\"use strict\";\n\nimport Node from \"./node.js\";\nimport * as common from \"./common.js\";\nimport fromCodePoint from \"./from-code-point.js\";\nimport { decodeHTMLStrict } from \"entities\";\n\nvar normalizeURI = common.normalizeURI;\nvar unescapeString = common.unescapeString;\n\n// Constants for character codes:\n\nvar C_NEWLINE = 10;\nvar C_ASTERISK = 42;\nvar C_UNDERSCORE = 95;\nvar C_BACKTICK = 96;\nvar C_OPEN_BRACKET = 91;\nvar C_CLOSE_BRACKET = 93;\nvar C_LESSTHAN = 60;\nvar C_BANG = 33;\nvar C_BACKSLASH = 92;\nvar C_AMPERSAND = 38;\nvar C_OPEN_PAREN = 40;\nvar C_CLOSE_PAREN = 41;\nvar C_COLON = 58;\nvar C_SINGLEQUOTE = 39;\nvar C_DOUBLEQUOTE = 34;\n\n// Some regexps used in inline parser:\n\nvar ESCAPABLE = common.ESCAPABLE;\nvar ESCAPED_CHAR = \"\\\\\\\\\" + ESCAPABLE;\n\nvar ENTITY = common.ENTITY;\nvar reHtmlTag = common.reHtmlTag;\n\nvar rePunctuation = new RegExp(\n    /^[!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~\\p{P}\\p{S}]/u);\n\nvar reLinkTitle = new RegExp(\n    '^(?:\"(' +\n        ESCAPED_CHAR +\n        '|\\\\\\\\[^\\\\\\\\]' +\n        '|[^\\\\\\\\\"\\\\x00])*\"' +\n        \"|\" +\n        \"'(\" +\n        ESCAPED_CHAR +\n        '|\\\\\\\\[^\\\\\\\\]' +\n        \"|[^\\\\\\\\'\\\\x00])*'\" +\n        \"|\" +\n        \"\\\\((\" +\n        ESCAPED_CHAR +\n        '|\\\\\\\\[^\\\\\\\\]' +\n        \"|[^\\\\\\\\()\\\\x00])*\\\\))\"\n);\n\nvar reLinkDestinationBraces = /^(?:<(?:[^<>\\n\\\\\\x00]|\\\\.)*>)/;\n\nvar reEscapable = new RegExp(\"^\" + ESCAPABLE);\n\nvar reEntityHere = new RegExp(\"^\" + ENTITY, \"i\");\n\nvar reTicks = /`+/;\n\nvar reTicksHere = /^`+/;\n\nvar reEllipses = /\\.\\.\\./g;\n\nvar reDash = /--+/g;\n\nvar reEmailAutolink = /^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;\n\nvar reAutolink = /^<[A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\\x00-\\x20]*>/i;\n\nvar reSpnl = /^ *(?:\\n *)?/;\n\nvar reWhitespaceChar = /^[ \\t\\n\\x0b\\x0c\\x0d]/;\n\nvar reUnicodeWhitespaceChar = /^\\s/;\n\nvar reFinalSpace = / *$/;\n\nvar reInitialSpace = /^ */;\n\nvar reSpaceAtEndOfLine = /^ *(?:\\n|$)/;\n\nvar reLinkLabel = /^\\[(?:[^\\\\\\[\\]]|\\\\.){0,1000}\\]/s;\n\n// Matches a string of non-special characters.\nvar reMain = /^[^\\n`\\[\\]\\\\!<&*_'\"]+/m;\n\nvar text = function(s) {\n    var node = new Node(\"text\");\n    node._literal = s;\n    return node;\n};\n\n// normalize a reference in reference link (remove []s, trim,\n// collapse internal space, unicode case fold.\n// See commonmark/commonmark.js#168.\nvar normalizeReference = function(string) {\n    return string\n        .slice(1, string.length - 1)\n        .trim()\n        .replace(/[ \\t\\r\\n]+/g, \" \")\n        .toLowerCase()\n        .toUpperCase();\n};\n\n// INLINE PARSER\n\n// These are methods of an InlineParser object, defined below.\n// An InlineParser keeps track of a subject (a string to be\n// parsed) and a position in that subject.\n\n// If re matches at current position in the subject, advance\n// position in subject and return the match; otherwise return null.\nvar match = function(re) {\n    var m = re.exec(this.subject.slice(this.pos));\n    if (m === null) {\n        return null;\n    } else {\n        this.pos += m.index + m[0].length;\n        return m[0];\n    }\n};\n\n// Returns the code for the character at the current subject position, or -1\n// there are no more characters.\nvar peek = function() {\n    if (this.pos < this.subject.length) {\n        return this.subject.charCodeAt(this.pos);\n    } else {\n        return -1;\n    }\n};\n\n// Parse zero or more space characters, including at most one newline\nvar spnl = function() {\n    this.match(reSpnl);\n    return true;\n};\n\n// All of the parsers below try to match something at the current position\n// in the subject.  If they succeed in matching anything, they\n// return the inline matched, advancing the subject.\n\n// Attempt to parse backticks, adding either a backtick code span or a\n// literal sequence of backticks.\nvar parseBackticks = function(block) {\n    var ticks = this.match(reTicksHere);\n    if (ticks === null) {\n        return false;\n    }\n    var afterOpenTicks = this.pos;\n    var matched;\n    var node;\n    var contents;\n    while ((matched = this.match(reTicks)) !== null) {\n        if (matched === ticks) {\n            node = new Node(\"code\");\n            contents = this.subject\n                .slice(afterOpenTicks, this.pos - ticks.length)\n                .replace(/\\n/gm, \" \");\n            if (\n                contents.length > 0 &&\n                contents.match(/[^ ]/) !== null &&\n                contents[0] == \" \" &&\n                contents[contents.length - 1] == \" \"\n            ) {\n                node._literal = contents.slice(1, contents.length - 1);\n            } else {\n                node._literal = contents;\n            }\n            block.appendChild(node);\n            return true;\n        }\n    }\n    // If we got here, we didn't match a closing backtick sequence.\n    this.pos = afterOpenTicks;\n    block.appendChild(text(ticks));\n    return true;\n};\n\n// Parse a backslash-escaped special character, adding either the escaped\n// character, a hard line break (if the backslash is followed by a newline),\n// or a literal backslash to the block's children.  Assumes current character\n// is a backslash.\nvar parseBackslash = function(block) {\n    var subj = this.subject;\n    var node;\n    this.pos += 1;\n    if (this.peek() === C_NEWLINE) {\n        this.pos += 1;\n        node = new Node(\"linebreak\");\n        block.appendChild(node);\n    } else if (reEscapable.test(subj.charAt(this.pos))) {\n        block.appendChild(text(subj.charAt(this.pos)));\n        this.pos += 1;\n    } else {\n        block.appendChild(text(\"\\\\\"));\n    }\n    return true;\n};\n\n// Attempt to parse an autolink (URL or email in pointy brackets).\nvar parseAutolink = function(block) {\n    var m;\n    var dest;\n    var node;\n    if ((m = this.match(reEmailAutolink))) {\n        dest = m.slice(1, m.length - 1);\n        node = new Node(\"link\");\n        node._destination = normalizeURI(\"mailto:\" + dest);\n        node._title = \"\";\n        node.appendChild(text(dest));\n        block.appendChild(node);\n        return true;\n    } else if ((m = this.match(reAutolink))) {\n        dest = m.slice(1, m.length - 1);\n        node = new Node(\"link\");\n        node._destination = normalizeURI(dest);\n        node._title = \"\";\n        node.appendChild(text(dest));\n        block.appendChild(node);\n        return true;\n    } else {\n        return false;\n    }\n};\n\n// Attempt to parse a raw HTML tag.\nvar parseHtmlTag = function(block) {\n    var m = this.match(reHtmlTag);\n    if (m === null) {\n        return false;\n    } else {\n        var node = new Node(\"html_inline\");\n        node._literal = m;\n        block.appendChild(node);\n        return true;\n    }\n};\n\n// Scan a sequence of characters with code cc, and return information about\n// the number of delimiters and whether they are positioned such that\n// they can open and/or close emphasis or strong emphasis.  A utility\n// function for strong/emph parsing.\nvar scanDelims = function(cc) {\n    var numdelims = 0;\n    var char_before, char_after, cc_after;\n    var startpos = this.pos;\n    var left_flanking, right_flanking, can_open, can_close;\n    var after_is_whitespace,\n        after_is_punctuation,\n        before_is_whitespace,\n        before_is_punctuation;\n\n    if (cc === C_SINGLEQUOTE || cc === C_DOUBLEQUOTE) {\n        numdelims++;\n        this.pos++;\n    } else {\n        while (this.peek() === cc) {\n            numdelims++;\n            this.pos++;\n        }\n    }\n\n    if (numdelims === 0) {\n        return null;\n    }\n\n    char_before = startpos === 0 ? \"\\n\" : this.subject.charAt(startpos - 1);\n\n    cc_after = this.peek();\n    if (cc_after === -1) {\n        char_after = \"\\n\";\n    } else {\n        char_after = fromCodePoint(cc_after);\n    }\n\n    after_is_whitespace = reUnicodeWhitespaceChar.test(char_after);\n    after_is_punctuation = rePunctuation.test(char_after);\n    before_is_whitespace = reUnicodeWhitespaceChar.test(char_before);\n    before_is_punctuation = rePunctuation.test(char_before);\n\n    left_flanking =\n        !after_is_whitespace &&\n        (!after_is_punctuation ||\n            before_is_whitespace ||\n            before_is_punctuation);\n    right_flanking =\n        !before_is_whitespace &&\n        (!before_is_punctuation || after_is_whitespace || after_is_punctuation);\n    if (cc === C_UNDERSCORE) {\n        can_open = left_flanking && (!right_flanking || before_is_punctuation);\n        can_close = right_flanking && (!left_flanking || after_is_punctuation);\n    } else if (cc === C_SINGLEQUOTE || cc === C_DOUBLEQUOTE) {\n        can_open = left_flanking && !right_flanking;\n        can_close = right_flanking;\n    } else {\n        can_open = left_flanking;\n        can_close = right_flanking;\n    }\n    this.pos = startpos;\n    return { numdelims: numdelims, can_open: can_open, can_close: can_close };\n};\n\n// Handle a delimiter marker for emphasis or a quote.\nvar handleDelim = function(cc, block) {\n    var res = this.scanDelims(cc);\n    if (!res) {\n        return false;\n    }\n    var numdelims = res.numdelims;\n    var startpos = this.pos;\n    var contents;\n\n    this.pos += numdelims;\n    if (cc === C_SINGLEQUOTE) {\n        contents = \"\\u2019\";\n    } else if (cc === C_DOUBLEQUOTE) {\n        contents = \"\\u201C\";\n    } else {\n        contents = this.subject.slice(startpos, this.pos);\n    }\n    var node = text(contents);\n    block.appendChild(node);\n\n    // Add entry to stack for this opener\n    if (\n        (res.can_open || res.can_close) &&\n        (this.options.smart || (cc !== C_SINGLEQUOTE && cc !== C_DOUBLEQUOTE))\n    ) {\n        this.delimiters = {\n            cc: cc,\n            numdelims: numdelims,\n            origdelims: numdelims,\n            node: node,\n            previous: this.delimiters,\n            next: null,\n            can_open: res.can_open,\n            can_close: res.can_close\n        };\n        if (this.delimiters.previous !== null) {\n            this.delimiters.previous.next = this.delimiters;\n        }\n    }\n\n    return true;\n};\n\nvar removeDelimiter = function(delim) {\n    if (delim.previous !== null) {\n        delim.previous.next = delim.next;\n    }\n    if (delim.next === null) {\n        // top of stack\n        this.delimiters = delim.previous;\n    } else {\n        delim.next.previous = delim.previous;\n    }\n};\n\nvar removeDelimitersBetween = function(bottom, top) {\n    if (bottom.next !== top) {\n        bottom.next = top;\n        top.previous = bottom;\n    }\n};\n\nvar processEmphasis = function(stack_bottom) {\n    var opener, closer, old_closer;\n    var opener_inl, closer_inl;\n    var tempstack;\n    var use_delims;\n    var tmp, next;\n    var opener_found;\n    var openers_bottom = [];\n    var openers_bottom_index;\n    var odd_match = false;\n\n    for (var i = 0; i < 14; i++) {\n        openers_bottom[i] = stack_bottom;\n    }\n    // find first closer above stack_bottom:\n    closer = this.delimiters;\n    while (closer !== null && closer.previous !== stack_bottom) {\n        closer = closer.previous;\n    }\n    // move forward, looking for closers, and handling each\n    while (closer !== null) {\n        var closercc = closer.cc;\n        if (!closer.can_close) {\n            closer = closer.next;\n        } else {\n            // found emphasis closer. now look back for first matching opener:\n            opener = closer.previous;\n            opener_found = false;\n            switch (closercc) {\n               case C_SINGLEQUOTE:\n                 openers_bottom_index = 0;\n                 break;\n               case C_DOUBLEQUOTE:\n                 openers_bottom_index = 1;\n                 break;\n               case C_UNDERSCORE:\n                 openers_bottom_index = 2 + (closer.can_open ? 3 : 0)\n                                          + (closer.origdelims % 3);\n                 break;\n               case C_ASTERISK:\n                 openers_bottom_index = 8 + (closer.can_open ? 3 : 0)\n                                          + (closer.origdelims % 3);\n                 break;\n            }\n            while (\n                opener !== null &&\n                opener !== stack_bottom &&\n                opener !== openers_bottom[openers_bottom_index]\n            ) {\n                odd_match =\n                    (closer.can_open || opener.can_close) &&\n                    closer.origdelims % 3 !== 0 &&\n                    (opener.origdelims + closer.origdelims) % 3 === 0;\n                if (opener.cc === closer.cc && opener.can_open && !odd_match) {\n                    opener_found = true;\n                    break;\n                }\n                opener = opener.previous;\n            }\n            old_closer = closer;\n\n            if (closercc === C_ASTERISK || closercc === C_UNDERSCORE) {\n                if (!opener_found) {\n                    closer = closer.next;\n                } else {\n                    // calculate actual number of delimiters used from closer\n                    use_delims =\n                        closer.numdelims >= 2 && opener.numdelims >= 2 ? 2 : 1;\n\n                    opener_inl = opener.node;\n                    closer_inl = closer.node;\n\n                    // remove used delimiters from stack elts and inlines\n                    opener.numdelims -= use_delims;\n                    closer.numdelims -= use_delims;\n                    opener_inl._literal = opener_inl._literal.slice(\n                        0,\n                        opener_inl._literal.length - use_delims\n                    );\n                    closer_inl._literal = closer_inl._literal.slice(\n                        0,\n                        closer_inl._literal.length - use_delims\n                    );\n\n                    // build contents for new emph element\n                    var emph = new Node(use_delims === 1 ? \"emph\" : \"strong\");\n\n                    tmp = opener_inl._next;\n                    while (tmp && tmp !== closer_inl) {\n                        next = tmp._next;\n                        tmp.unlink();\n                        emph.appendChild(tmp);\n                        tmp = next;\n                    }\n\n                    opener_inl.insertAfter(emph);\n\n                    // remove elts between opener and closer in delimiters stack\n                    removeDelimitersBetween(opener, closer);\n\n                    // if opener has 0 delims, remove it and the inline\n                    if (opener.numdelims === 0) {\n                        opener_inl.unlink();\n                        this.removeDelimiter(opener);\n                    }\n\n                    if (closer.numdelims === 0) {\n                        closer_inl.unlink();\n                        tempstack = closer.next;\n                        this.removeDelimiter(closer);\n                        closer = tempstack;\n                    }\n                }\n            } else if (closercc === C_SINGLEQUOTE) {\n                closer.node._literal = \"\\u2019\";\n                if (opener_found) {\n                    opener.node._literal = \"\\u2018\";\n                }\n                closer = closer.next;\n            } else if (closercc === C_DOUBLEQUOTE) {\n                closer.node._literal = \"\\u201D\";\n                if (opener_found) {\n                    opener.node.literal = \"\\u201C\";\n                }\n                closer = closer.next;\n            }\n            if (!opener_found) {\n                // Set lower bound for future searches for openers:\n                openers_bottom[openers_bottom_index] =\n                    old_closer.previous;\n                if (!old_closer.can_open) {\n                    // We can remove a closer that can't be an opener,\n                    // once we've seen there's no matching opener:\n                    this.removeDelimiter(old_closer);\n                }\n            }\n        }\n    }\n\n    // remove all delimiters\n    while (this.delimiters !== null && this.delimiters !== stack_bottom) {\n        this.removeDelimiter(this.delimiters);\n    }\n};\n\n// Attempt to parse link title (sans quotes), returning the string\n// or null if no match.\nvar parseLinkTitle = function() {\n    var title = this.match(reLinkTitle);\n    if (title === null) {\n        return null;\n    } else {\n        // chop off quotes from title and unescape:\n        return unescapeString(title.slice(1, -1));\n    }\n};\n\n// Attempt to parse link destination, returning the string or\n// null if no match.\nvar parseLinkDestination = function() {\n    var res = this.match(reLinkDestinationBraces);\n    if (res === null) {\n        if (this.peek() === C_LESSTHAN) {\n            return null;\n        }\n        // TODO handrolled parser; res should be null or the string\n        var savepos = this.pos;\n        var openparens = 0;\n        var c;\n        while ((c = this.peek()) !== -1) {\n            if (\n                c === C_BACKSLASH &&\n                reEscapable.test(this.subject.charAt(this.pos + 1))\n            ) {\n                this.pos += 1;\n                if (this.peek() !== -1) {\n                    this.pos += 1;\n                }\n            } else if (c === C_OPEN_PAREN) {\n                this.pos += 1;\n                openparens += 1;\n            } else if (c === C_CLOSE_PAREN) {\n                if (openparens < 1) {\n                    break;\n                } else {\n                    this.pos += 1;\n                    openparens -= 1;\n                }\n            } else if (reWhitespaceChar.exec(fromCodePoint(c)) !== null) {\n                break;\n            } else {\n                this.pos += 1;\n            }\n        }\n        if (this.pos === savepos && c !== C_CLOSE_PAREN) {\n            return null;\n        }\n        if (openparens !== 0) {\n            return null;\n        }\n        res = this.subject.slice(savepos, this.pos);\n        return normalizeURI(unescapeString(res));\n    } else {\n        // chop off surrounding <..>:\n        return normalizeURI(unescapeString(res.slice(1, -1)));\n    }\n};\n\n// Attempt to parse a link label, returning number of characters parsed.\nvar parseLinkLabel = function() {\n    var m = this.match(reLinkLabel);\n    if (m === null || m.length > 1001) {\n        return 0;\n    } else {\n        return m.length;\n    }\n};\n\n// Add open bracket to delimiter stack and add a text node to block's children.\nvar parseOpenBracket = function(block) {\n    var startpos = this.pos;\n    this.pos += 1;\n\n    var node = text(\"[\");\n    block.appendChild(node);\n\n    // Add entry to stack for this opener\n    this.addBracket(node, startpos, false);\n    return true;\n};\n\n// IF next character is [, and ! delimiter to delimiter stack and\n// add a text node to block's children.  Otherwise just add a text node.\nvar parseBang = function(block) {\n    var startpos = this.pos;\n    this.pos += 1;\n    if (this.peek() === C_OPEN_BRACKET) {\n        this.pos += 1;\n\n        var node = text(\"![\");\n        block.appendChild(node);\n\n        // Add entry to stack for this opener\n        this.addBracket(node, startpos + 1, true);\n    } else {\n        block.appendChild(text(\"!\"));\n    }\n    return true;\n};\n\n// Try to match close bracket against an opening in the delimiter\n// stack.  Add either a link or image, or a plain [ character,\n// to block's children.  If there is a matching delimiter,\n// remove it from the delimiter stack.\nvar parseCloseBracket = function(block) {\n    var startpos;\n    var is_image;\n    var dest;\n    var title;\n    var matched = false;\n    var reflabel;\n    var opener;\n\n    this.pos += 1;\n    startpos = this.pos;\n\n    // get last [ or ![\n    opener = this.brackets;\n\n    if (opener === null) {\n        // no matched opener, just return a literal\n        block.appendChild(text(\"]\"));\n        return true;\n    }\n\n    if (!opener.active) {\n        // no matched opener, just return a literal\n        block.appendChild(text(\"]\"));\n        // take opener off brackets stack\n        this.removeBracket();\n        return true;\n    }\n\n    // If we got here, open is a potential opener\n    is_image = opener.image;\n\n    // Check to see if we have a link/image\n\n    var savepos = this.pos;\n\n    // Inline link?\n    if (this.peek() === C_OPEN_PAREN) {\n        this.pos++;\n        if (\n            this.spnl() &&\n            (dest = this.parseLinkDestination()) !== null &&\n            this.spnl() &&\n            // make sure there's a space before the title:\n            ((reWhitespaceChar.test(this.subject.charAt(this.pos - 1)) &&\n                (title = this.parseLinkTitle())) ||\n                true) &&\n            this.spnl() &&\n            this.peek() === C_CLOSE_PAREN\n        ) {\n            this.pos += 1;\n            matched = true;\n        } else {\n            this.pos = savepos;\n        }\n    }\n\n    if (!matched) {\n        // Next, see if there's a link label\n        var beforelabel = this.pos;\n        var n = this.parseLinkLabel();\n        if (n > 2) {\n            reflabel = this.subject.slice(beforelabel, beforelabel + n);\n        } else if (!opener.bracketAfter) {\n            // Empty or missing second label means to use the first label as the reference.\n            // The reference must not contain a bracket. If we know there's a bracket, we don't even bother checking it.\n            reflabel = this.subject.slice(opener.index, startpos);\n        }\n        if (n === 0) {\n            // If shortcut reference link, rewind before spaces we skipped.\n            this.pos = savepos;\n        }\n\n        if (reflabel) {\n            // lookup rawlabel in refmap\n            var link = this.refmap[normalizeReference(reflabel)];\n            if (link) {\n                dest = link.destination;\n                title = link.title;\n                matched = true;\n            }\n        }\n    }\n\n    if (matched) {\n        var node = new Node(is_image ? \"image\" : \"link\");\n        node._destination = dest;\n        node._title = title || \"\";\n\n        var tmp, next;\n        tmp = opener.node._next;\n        while (tmp) {\n            next = tmp._next;\n            tmp.unlink();\n            node.appendChild(tmp);\n            tmp = next;\n        }\n        block.appendChild(node);\n        this.processEmphasis(opener.previousDelimiter);\n        this.removeBracket();\n        opener.node.unlink();\n\n        // We remove this bracket and processEmphasis will remove later delimiters.\n        // Now, for a link, we also deactivate earlier link openers.\n        // (no links in links)\n        if (!is_image) {\n            opener = this.brackets;\n            while (opener !== null) {\n                if (!opener.image) {\n                    opener.active = false; // deactivate this opener\n                }\n                opener = opener.previous;\n            }\n        }\n\n        return true;\n    } else {\n        // no match\n\n        this.removeBracket(); // remove this opener from stack\n        this.pos = startpos;\n        block.appendChild(text(\"]\"));\n        return true;\n    }\n};\n\nvar addBracket = function(node, index, image) {\n    if (this.brackets !== null) {\n        this.brackets.bracketAfter = true;\n    }\n    this.brackets = {\n        node: node,\n        previous: this.brackets,\n        previousDelimiter: this.delimiters,\n        index: index,\n        image: image,\n        active: true\n    };\n};\n\nvar removeBracket = function() {\n    this.brackets = this.brackets.previous;\n};\n\n// Attempt to parse an entity.\nvar parseEntity = function(block) {\n    var m;\n    if ((m = this.match(reEntityHere))) {\n        block.appendChild(text(decodeHTMLStrict(m)));\n        return true;\n    } else {\n        return false;\n    }\n};\n\n// Parse a run of ordinary characters, or a single character with\n// a special meaning in markdown, as a plain string.\nvar parseString = function(block) {\n    var m;\n    if ((m = this.match(reMain))) {\n        if (this.options.smart) {\n            block.appendChild(\n                text(\n                    m\n                        .replace(reEllipses, \"\\u2026\")\n                        .replace(reDash, function(chars) {\n                            var enCount = 0;\n                            var emCount = 0;\n                            if (chars.length % 3 === 0) {\n                                // If divisible by 3, use all em dashes\n                                emCount = chars.length / 3;\n                            } else if (chars.length % 2 === 0) {\n                                // If divisible by 2, use all en dashes\n                                enCount = chars.length / 2;\n                            } else if (chars.length % 3 === 2) {\n                                // If 2 extra dashes, use en dash for last 2; em dashes for rest\n                                enCount = 1;\n                                emCount = (chars.length - 2) / 3;\n                            } else {\n                                // Use en dashes for last 4 hyphens; em dashes for rest\n                                enCount = 2;\n                                emCount = (chars.length - 4) / 3;\n                            }\n                            return (\n                                \"\\u2014\".repeat(emCount) +\n                                \"\\u2013\".repeat(enCount)\n                            );\n                        })\n                )\n            );\n        } else {\n            block.appendChild(text(m));\n        }\n        return true;\n    } else {\n        return false;\n    }\n};\n\n// Parse a newline.  If it was preceded by two spaces, return a hard\n// line break; otherwise a soft line break.\nvar parseNewline = function(block) {\n    this.pos += 1; // assume we're at a \\n\n    // check previous node for trailing spaces\n    var lastc = block._lastChild;\n    if (\n        lastc &&\n        lastc.type === \"text\" &&\n        lastc._literal[lastc._literal.length - 1] === \" \"\n    ) {\n        var hardbreak = lastc._literal[lastc._literal.length - 2] === \" \";\n        lastc._literal = lastc._literal.replace(reFinalSpace, \"\");\n        block.appendChild(new Node(hardbreak ? \"linebreak\" : \"softbreak\"));\n    } else {\n        block.appendChild(new Node(\"softbreak\"));\n    }\n    this.match(reInitialSpace); // gobble leading spaces in next line\n    return true;\n};\n\n// Attempt to parse a link reference, modifying refmap.\nvar parseReference = function(s, refmap) {\n    this.subject = s;\n    this.pos = 0;\n    var rawlabel;\n    var dest;\n    var title;\n    var matchChars;\n    var startpos = this.pos;\n\n    // label:\n    matchChars = this.parseLinkLabel();\n    if (matchChars === 0) {\n        return 0;\n    } else {\n        rawlabel = this.subject.slice(0, matchChars);\n    }\n\n    // colon:\n    if (this.peek() === C_COLON) {\n        this.pos++;\n    } else {\n        this.pos = startpos;\n        return 0;\n    }\n\n    //  link url\n    this.spnl();\n\n    dest = this.parseLinkDestination();\n    if (dest === null) {\n        this.pos = startpos;\n        return 0;\n    }\n\n    var beforetitle = this.pos;\n    this.spnl();\n    if (this.pos !== beforetitle) {\n        title = this.parseLinkTitle();\n    }\n    if (title === null) {\n        // rewind before spaces\n        this.pos = beforetitle;\n    }\n\n    // make sure we're at line end:\n    var atLineEnd = true;\n    if (this.match(reSpaceAtEndOfLine) === null) {\n        if (title === null) {\n            atLineEnd = false;\n        } else {\n            // the potential title we found is not at the line end,\n            // but it could still be a legal link reference if we\n            // discard the title\n            title = null;\n            // rewind before spaces\n            this.pos = beforetitle;\n            // and instead check if the link URL is at the line end\n            atLineEnd = this.match(reSpaceAtEndOfLine) !== null;\n        }\n    }\n\n    if (!atLineEnd) {\n        this.pos = startpos;\n        return 0;\n    }\n\n    var normlabel = normalizeReference(rawlabel);\n    if (normlabel === \"\") {\n        // label must contain non-whitespace characters\n        this.pos = startpos;\n        return 0;\n    }\n\n    if (!refmap[normlabel]) {\n        refmap[normlabel] = { destination: dest, title: title === null ? \"\" : title };\n    }\n    return this.pos - startpos;\n};\n\n// Parse the next inline element in subject, advancing subject position.\n// On success, add the result to block's children and return true.\n// On failure, return false.\nvar parseInline = function(block) {\n    var res = false;\n    var c = this.peek();\n    if (c === -1) {\n        return false;\n    }\n    switch (c) {\n        case C_NEWLINE:\n            res = this.parseNewline(block);\n            break;\n        case C_BACKSLASH:\n            res = this.parseBackslash(block);\n            break;\n        case C_BACKTICK:\n            res = this.parseBackticks(block);\n            break;\n        case C_ASTERISK:\n        case C_UNDERSCORE:\n            res = this.handleDelim(c, block);\n            break;\n        case C_SINGLEQUOTE:\n        case C_DOUBLEQUOTE:\n            res = this.options.smart && this.handleDelim(c, block);\n            break;\n        case C_OPEN_BRACKET:\n            res = this.parseOpenBracket(block);\n            break;\n        case C_BANG:\n            res = this.parseBang(block);\n            break;\n        case C_CLOSE_BRACKET:\n            res = this.parseCloseBracket(block);\n            break;\n        case C_LESSTHAN:\n            res = this.parseAutolink(block) || this.parseHtmlTag(block);\n            break;\n        case C_AMPERSAND:\n            res = this.parseEntity(block);\n            break;\n        default:\n            res = this.parseString(block);\n            break;\n    }\n    if (!res) {\n        this.pos += 1;\n        block.appendChild(text(fromCodePoint(c)));\n    }\n\n    return true;\n};\n\n// Parse string content in block into inline children,\n// using refmap to resolve references.\nvar parseInlines = function(block) {\n    this.subject = block._string_content.trim();\n    this.pos = 0;\n    this.delimiters = null;\n    this.brackets = null;\n    while (this.parseInline(block)) {}\n    block._string_content = null; // allow raw string to be garbage collected\n    this.processEmphasis(null);\n};\n\n// The InlineParser object.\nfunction InlineParser(options) {\n    return {\n        subject: \"\",\n        delimiters: null, // used by handleDelim method\n        brackets: null,\n        pos: 0,\n        refmap: {},\n        match: match,\n        peek: peek,\n        spnl: spnl,\n        parseBackticks: parseBackticks,\n        parseBackslash: parseBackslash,\n        parseAutolink: parseAutolink,\n        parseHtmlTag: parseHtmlTag,\n        scanDelims: scanDelims,\n        handleDelim: handleDelim,\n        parseLinkTitle: parseLinkTitle,\n        parseLinkDestination: parseLinkDestination,\n        parseLinkLabel: parseLinkLabel,\n        parseOpenBracket: parseOpenBracket,\n        parseBang: parseBang,\n        parseCloseBracket: parseCloseBracket,\n        addBracket: addBracket,\n        removeBracket: removeBracket,\n        parseEntity: parseEntity,\n        parseString: parseString,\n        parseNewline: parseNewline,\n        parseReference: parseReference,\n        parseInline: parseInline,\n        processEmphasis: processEmphasis,\n        removeDelimiter: removeDelimiter,\n        options: options || {},\n        parse: parseInlines\n    };\n}\n\nexport default InlineParser;\n","\"use strict\";\n\nimport Node from \"./node.js\";\nimport { unescapeString, OPENTAG, CLOSETAG } from \"./common.js\";\nimport InlineParser from \"./inlines.js\";\n\nvar CODE_INDENT = 4;\n\nvar C_TAB = 9;\nvar C_NEWLINE = 10;\nvar C_GREATERTHAN = 62;\nvar C_LESSTHAN = 60;\nvar C_SPACE = 32;\nvar C_OPEN_BRACKET = 91;\n\nvar reHtmlBlockOpen = [\n    /./, // dummy for 0\n    /^<(?:script|pre|textarea|style)(?:\\s|>|$)/i,\n    /^<!--/,\n    /^<[?]/,\n    /^<![A-Za-z]/,\n    /^<!\\[CDATA\\[/,\n    /^<[/]?(?:address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[123456]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|section|search|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul)(?:\\s|[/]?[>]|$)/i,\n    new RegExp(\"^(?:\" + OPENTAG + \"|\" + CLOSETAG + \")\\\\s*$\", \"i\")\n];\n\nvar reHtmlBlockClose = [\n    /./, // dummy for 0\n    /<\\/(?:script|pre|textarea|style)>/i,\n    /-->/,\n    /\\?>/,\n    />/,\n    /\\]\\]>/\n];\n\nvar reThematicBreak = /^(?:\\*[ \\t]*){3,}$|^(?:_[ \\t]*){3,}$|^(?:-[ \\t]*){3,}$/;\n\nvar reMaybeSpecial = /^[#`~*+_=<>0-9-]/;\n\nvar reNonSpace = /[^ \\t\\f\\v\\r\\n]/;\n\nvar reBulletListMarker = /^[*+-]/;\n\nvar reOrderedListMarker = /^(\\d{1,9})([.)])/;\n\nvar reATXHeadingMarker = /^#{1,6}(?:[ \\t]+|$)/;\n\nvar reCodeFence = /^`{3,}(?!.*`)|^~{3,}/;\n\nvar reClosingCodeFence = /^(?:`{3,}|~{3,})(?=[ \\t]*$)/;\n\nvar reSetextHeadingLine = /^(?:=+|-+)[ \\t]*$/;\n\nvar reLineEnding = /\\r\\n|\\n|\\r/;\n\n// Returns true if string contains only space characters.\nvar isBlank = function(s) {\n    return !reNonSpace.test(s);\n};\n\nvar isSpaceOrTab = function(c) {\n    return c === C_SPACE || c === C_TAB;\n};\n\nvar peek = function(ln, pos) {\n    if (pos < ln.length) {\n        return ln.charCodeAt(pos);\n    } else {\n        return -1;\n    }\n};\n\n// DOC PARSER\n\n// These are methods of a Parser object, defined below.\n\n// Returns true if block ends with a blank line.\nvar endsWithBlankLine = function(block) {\n    return block.next &&\n        block.sourcepos[1][0] !== block.next.sourcepos[0][0] - 1;\n};\n\n// Add a line to the block at the tip.  We assume the tip\n// can accept lines -- that check should be done before calling this.\nvar addLine = function() {\n    if (this.partiallyConsumedTab) {\n        this.offset += 1; // skip over tab\n        // add space characters:\n        var charsToTab = 4 - (this.column % 4);\n        this.tip._string_content += \" \".repeat(charsToTab);\n    }\n    this.tip._string_content += this.currentLine.slice(this.offset) + \"\\n\";\n};\n\n// Add block of type tag as a child of the tip.  If the tip can't\n// accept children, close and finalize it and try its parent,\n// and so on til we find a block that can accept children.\nvar addChild = function(tag, offset) {\n    while (!this.blocks[this.tip.type].canContain(tag)) {\n        this.finalize(this.tip, this.lineNumber - 1);\n    }\n\n    var column_number = offset + 1; // offset 0 = column 1\n    var newBlock = new Node(tag, [\n        [this.lineNumber, column_number],\n        [0, 0]\n    ]);\n    newBlock._string_content = \"\";\n    this.tip.appendChild(newBlock);\n    this.tip = newBlock;\n    return newBlock;\n};\n\n// Parse a list marker and return data on the marker (type,\n// start, delimiter, bullet character, padding) or null.\nvar parseListMarker = function(parser, container) {\n    var rest = parser.currentLine.slice(parser.nextNonspace);\n    var match;\n    var nextc;\n    var spacesStartCol;\n    var spacesStartOffset;\n    var data = {\n        type: null,\n        tight: true, // lists are tight by default\n        bulletChar: null,\n        start: null,\n        delimiter: null,\n        padding: null,\n        markerOffset: parser.indent\n    };\n    if (parser.indent >= 4) {\n        return null;\n    }\n    if ((match = rest.match(reBulletListMarker))) {\n        data.type = \"bullet\";\n        data.bulletChar = match[0][0];\n    } else if (\n        (match = rest.match(reOrderedListMarker)) &&\n        (container.type !== \"paragraph\" || match[1] == 1)\n    ) {\n        data.type = \"ordered\";\n        data.start = parseInt(match[1]);\n        data.delimiter = match[2];\n    } else {\n        return null;\n    }\n    // make sure we have spaces after\n    nextc = peek(parser.currentLine, parser.nextNonspace + match[0].length);\n    if (!(nextc === -1 || nextc === C_TAB || nextc === C_SPACE)) {\n        return null;\n    }\n\n    // if it interrupts paragraph, make sure first line isn't blank\n    if (\n        container.type === \"paragraph\" &&\n        !parser.currentLine\n            .slice(parser.nextNonspace + match[0].length)\n            .match(reNonSpace)\n    ) {\n        return null;\n    }\n\n    // we've got a match! advance offset and calculate padding\n    parser.advanceNextNonspace(); // to start of marker\n    parser.advanceOffset(match[0].length, true); // to end of marker\n    spacesStartCol = parser.column;\n    spacesStartOffset = parser.offset;\n    do {\n        parser.advanceOffset(1, true);\n        nextc = peek(parser.currentLine, parser.offset);\n    } while (parser.column - spacesStartCol < 5 && isSpaceOrTab(nextc));\n    var blank_item = peek(parser.currentLine, parser.offset) === -1;\n    var spaces_after_marker = parser.column - spacesStartCol;\n    if (spaces_after_marker >= 5 || spaces_after_marker < 1 || blank_item) {\n        data.padding = match[0].length + 1;\n        parser.column = spacesStartCol;\n        parser.offset = spacesStartOffset;\n        if (isSpaceOrTab(peek(parser.currentLine, parser.offset))) {\n            parser.advanceOffset(1, true);\n        }\n    } else {\n        data.padding = match[0].length + spaces_after_marker;\n    }\n    return data;\n};\n\n// Returns true if the two list items are of the same type,\n// with the same delimiter and bullet character.  This is used\n// in agglomerating list items into lists.\nvar listsMatch = function(list_data, item_data) {\n    return (\n        list_data.type === item_data.type &&\n        list_data.delimiter === item_data.delimiter &&\n        list_data.bulletChar === item_data.bulletChar\n    );\n};\n\n// Finalize and close any unmatched blocks.\nvar closeUnmatchedBlocks = function() {\n    if (!this.allClosed) {\n        // finalize any blocks not matched\n        while (this.oldtip !== this.lastMatchedContainer) {\n            var parent = this.oldtip._parent;\n            this.finalize(this.oldtip, this.lineNumber - 1);\n            this.oldtip = parent;\n        }\n        this.allClosed = true;\n    }\n};\n\n// Remove link reference definitions from given tree.\nvar removeLinkReferenceDefinitions = function(parser, tree) {\n    var event, node;\n    var walker = tree.walker();\n    var emptyNodes = [];\n\n    while ((event = walker.next())) {\n        node = event.node;\n        if (event.entering && node.type === \"paragraph\") {\n            var pos;\n            var hasReferenceDefs = false;\n\n            // Try parsing the beginning as link reference definitions;\n            // Note that link reference definitions must be the beginning of a\n            // paragraph node since link reference definitions cannot interrupt\n            // paragraphs.\n            while (\n                peek(node._string_content, 0) === C_OPEN_BRACKET &&\n                    (pos = parser.inlineParser.parseReference(\n                        node._string_content,\n                        parser.refmap\n                    ))\n            ) {\n                const removedText = node._string_content.slice(0, pos);\n\n                node._string_content = node._string_content.slice(pos);\n                hasReferenceDefs = true;\n\n                const lines = removedText.split(\"\\n\");\n\n                // -1 for final newline.\n                node.sourcepos[0][0] += lines.length - 1;\n            }\n            if (hasReferenceDefs && isBlank(node._string_content)) {\n                emptyNodes.push(node);\n            }\n        }\n    }\n\n    for (node of emptyNodes) {\n        node.unlink();\n    }\n};\n\n// 'finalize' is run when the block is closed.\n// 'continue' is run to check whether the block is continuing\n// at a certain line and offset (e.g. whether a block quote\n// contains a `>`.  It returns 0 for matched, 1 for not matched,\n// and 2 for \"we've dealt with this line completely, go to next.\"\nvar blocks = {\n    document: {\n        continue: function() {\n            return 0;\n        },\n        finalize: function(parser, block) {\n            removeLinkReferenceDefinitions(parser, block);\n            return;\n        },\n        canContain: function(t) {\n            return t !== \"item\";\n        },\n        acceptsLines: false\n    },\n    list: {\n        continue: function() {\n            return 0;\n        },\n        finalize: function(parser, block) {\n            var item = block._firstChild;\n            while (item) {\n                // check for non-final list item ending with blank line:\n                if (item._next && endsWithBlankLine(item)) {\n                    block._listData.tight = false;\n                    break;\n                }\n                // recurse into children of list item, to see if there are\n                // spaces between any of them:\n                var subitem = item._firstChild;\n                while (subitem) {\n                    if (\n                        subitem._next &&\n                        endsWithBlankLine(subitem)\n                    ) {\n                        block._listData.tight = false;\n                        break;\n                    }\n                    subitem = subitem._next;\n                }\n                item = item._next;\n            }\n            block.sourcepos[1] = block._lastChild.sourcepos[1];\n        },\n        canContain: function(t) {\n            return t === \"item\";\n        },\n        acceptsLines: false\n    },\n    block_quote: {\n        continue: function(parser) {\n            var ln = parser.currentLine;\n            if (\n                !parser.indented &&\n                peek(ln, parser.nextNonspace) === C_GREATERTHAN\n            ) {\n                parser.advanceNextNonspace();\n                parser.advanceOffset(1, false);\n                if (isSpaceOrTab(peek(ln, parser.offset))) {\n                    parser.advanceOffset(1, true);\n                }\n            } else {\n                return 1;\n            }\n            return 0;\n        },\n        finalize: function() {\n            return;\n        },\n        canContain: function(t) {\n            return t !== \"item\";\n        },\n        acceptsLines: false\n    },\n    item: {\n        continue: function(parser, container) {\n            if (parser.blank) {\n                if (container._firstChild == null) {\n                    // Blank line after empty list item\n                    return 1;\n                } else {\n                    parser.advanceNextNonspace();\n                }\n            } else if (\n                parser.indent >=\n                container._listData.markerOffset + container._listData.padding\n            ) {\n                parser.advanceOffset(\n                    container._listData.markerOffset +\n                        container._listData.padding,\n                    true\n                );\n            } else {\n                return 1;\n            }\n            return 0;\n        },\n        finalize: function(parser, block) {\n            if (block._lastChild) {\n                block.sourcepos[1] = block._lastChild.sourcepos[1];\n            } else {\n                // Empty list item\n                block.sourcepos[1][0] = block.sourcepos[0][0];\n                block.sourcepos[1][1] =\n                    block._listData.markerOffset + block._listData.padding;\n            }\n\n            return;\n        },\n        canContain: function(t) {\n            return t !== \"item\";\n        },\n        acceptsLines: false\n    },\n    heading: {\n        continue: function() {\n            // a heading can never container > 1 line, so fail to match:\n            return 1;\n        },\n        finalize: function() {\n            return;\n        },\n        canContain: function() {\n            return false;\n        },\n        acceptsLines: false\n    },\n    thematic_break: {\n        continue: function() {\n            // a thematic break can never container > 1 line, so fail to match:\n            return 1;\n        },\n        finalize: function() {\n            return;\n        },\n        canContain: function() {\n            return false;\n        },\n        acceptsLines: false\n    },\n    code_block: {\n        continue: function(parser, container) {\n            var ln = parser.currentLine;\n            var indent = parser.indent;\n            if (container._isFenced) {\n                // fenced\n                var match =\n                    indent <= 3 &&\n                    ln.charAt(parser.nextNonspace) === container._fenceChar &&\n                    ln.slice(parser.nextNonspace).match(reClosingCodeFence);\n                if (match && match[0].length >= container._fenceLength) {\n                    // closing fence - we're at end of line, so we can return\n                    parser.lastLineLength =\n                        parser.offset + indent + match[0].length;\n                    parser.finalize(container, parser.lineNumber);\n                    return 2;\n                } else {\n                    // skip optional spaces of fence offset\n                    var i = container._fenceOffset;\n                    while (i > 0 && isSpaceOrTab(peek(ln, parser.offset))) {\n                        parser.advanceOffset(1, true);\n                        i--;\n                    }\n                }\n            } else {\n                // indented\n                if (indent >= CODE_INDENT) {\n                    parser.advanceOffset(CODE_INDENT, true);\n                } else if (parser.blank) {\n                    parser.advanceNextNonspace();\n                } else {\n                    return 1;\n                }\n            }\n            return 0;\n        },\n        finalize: function(parser, block) {\n            if (block._isFenced) {\n                // fenced\n                // first line becomes info string\n                var content = block._string_content;\n                var newlinePos = content.indexOf(\"\\n\");\n                var firstLine = content.slice(0, newlinePos);\n                var rest = content.slice(newlinePos + 1);\n                block.info = unescapeString(firstLine.trim());\n                block._literal = rest;\n            } else {\n                // indented\n                var lines = block._string_content.split(\"\\n\");\n                // Note that indented code block cannot be empty, so\n                // lines.length cannot be zero.\n                while (/^[ \\t]*$/.test(lines[lines.length - 1])) {\n                    lines.pop();\n                }\n                block._literal = lines.join(\"\\n\") + \"\\n\";\n                block.sourcepos[1][0] =\n                    block.sourcepos[0][0] + lines.length - 1;\n                block.sourcepos[1][1] =\n                    block.sourcepos[0][1] + lines[lines.length - 1].length - 1;\n            }\n            block._string_content = null; // allow GC\n        },\n        canContain: function() {\n            return false;\n        },\n        acceptsLines: true\n    },\n    html_block: {\n        continue: function(parser, container) {\n            return parser.blank &&\n                (container._htmlBlockType === 6 ||\n                    container._htmlBlockType === 7)\n                ? 1\n                : 0;\n        },\n        finalize: function(parser, block) {\n            block._literal = block._string_content.replace(/\\n$/, '');\n            block._string_content = null; // allow GC\n        },\n        canContain: function() {\n            return false;\n        },\n        acceptsLines: true\n    },\n    paragraph: {\n        continue: function(parser) {\n            return parser.blank ? 1 : 0;\n        },\n        finalize: function() {\n            return;\n        },\n        canContain: function() {\n            return false;\n        },\n        acceptsLines: true\n    }\n};\n\n// block start functions.  Return values:\n// 0 = no match\n// 1 = matched container, keep going\n// 2 = matched leaf, no more block starts\nvar blockStarts = [\n    // block quote\n    function(parser) {\n        if (\n            !parser.indented &&\n            peek(parser.currentLine, parser.nextNonspace) === C_GREATERTHAN\n        ) {\n            parser.advanceNextNonspace();\n            parser.advanceOffset(1, false);\n            // optional following space\n            if (isSpaceOrTab(peek(parser.currentLine, parser.offset))) {\n                parser.advanceOffset(1, true);\n            }\n            parser.closeUnmatchedBlocks();\n            parser.addChild(\"block_quote\", parser.nextNonspace);\n            return 1;\n        } else {\n            return 0;\n        }\n    },\n\n    // ATX heading\n    function(parser) {\n        var match;\n        if (\n            !parser.indented &&\n            (match = parser.currentLine\n                .slice(parser.nextNonspace)\n                .match(reATXHeadingMarker))\n        ) {\n            parser.advanceNextNonspace();\n            parser.advanceOffset(match[0].length, false);\n            parser.closeUnmatchedBlocks();\n            var container = parser.addChild(\"heading\", parser.nextNonspace);\n            container.level = match[0].trim().length; // number of #s\n            // remove trailing ###s:\n            container._string_content = parser.currentLine\n                .slice(parser.offset)\n                .replace(/^[ \\t]*#+[ \\t]*$/, \"\")\n                .replace(/[ \\t]+#+[ \\t]*$/, \"\");\n            parser.advanceOffset(parser.currentLine.length - parser.offset);\n            return 2;\n        } else {\n            return 0;\n        }\n    },\n\n    // Fenced code block\n    function(parser) {\n        var match;\n        if (\n            !parser.indented &&\n            (match = parser.currentLine\n                .slice(parser.nextNonspace)\n                .match(reCodeFence))\n        ) {\n            var fenceLength = match[0].length;\n            parser.closeUnmatchedBlocks();\n            var container = parser.addChild(\"code_block\", parser.nextNonspace);\n            container._isFenced = true;\n            container._fenceLength = fenceLength;\n            container._fenceChar = match[0][0];\n            container._fenceOffset = parser.indent;\n            parser.advanceNextNonspace();\n            parser.advanceOffset(fenceLength, false);\n            return 2;\n        } else {\n            return 0;\n        }\n    },\n\n    // HTML block\n    function(parser, container) {\n        if (\n            !parser.indented &&\n            peek(parser.currentLine, parser.nextNonspace) === C_LESSTHAN\n        ) {\n            var s = parser.currentLine.slice(parser.nextNonspace);\n            var blockType;\n\n            for (blockType = 1; blockType <= 7; blockType++) {\n                if (\n                    reHtmlBlockOpen[blockType].test(s) &&\n                    (blockType < 7 || (container.type !== \"paragraph\" &&\n                     !(!parser.allClosed && !parser.blank &&\n                       parser.tip.type === \"paragraph\") // maybe lazy\n                    ))\n                ) {\n                    parser.closeUnmatchedBlocks();\n                    // We don't adjust parser.offset;\n                    // spaces are part of the HTML block:\n                    var b = parser.addChild(\"html_block\", parser.offset);\n                    b._htmlBlockType = blockType;\n                    return 2;\n                }\n            }\n        }\n\n        return 0;\n    },\n\n    // Setext heading\n    function(parser, container) {\n        var match;\n        if (\n            !parser.indented &&\n            container.type === \"paragraph\" &&\n            (match = parser.currentLine\n                .slice(parser.nextNonspace)\n                .match(reSetextHeadingLine))\n        ) {\n            parser.closeUnmatchedBlocks();\n            // resolve reference link definitiosn\n            var pos;\n            while (\n                peek(container._string_content, 0) === C_OPEN_BRACKET &&\n                (pos = parser.inlineParser.parseReference(\n                    container._string_content,\n                    parser.refmap\n                ))\n            ) {\n                container._string_content = container._string_content.slice(\n                    pos\n                );\n            }\n            if (container._string_content.length > 0) {\n                var heading = new Node(\"heading\", container.sourcepos);\n                heading.level = match[0][0] === \"=\" ? 1 : 2;\n                heading._string_content = container._string_content;\n                container.insertAfter(heading);\n                container.unlink();\n                parser.tip = heading;\n                parser.advanceOffset(\n                    parser.currentLine.length - parser.offset,\n                    false\n                );\n                return 2;\n            } else {\n                return 0;\n            }\n        } else {\n            return 0;\n        }\n    },\n\n    // thematic break\n    function(parser) {\n        if (\n            !parser.indented &&\n            reThematicBreak.test(parser.currentLine.slice(parser.nextNonspace))\n        ) {\n            parser.closeUnmatchedBlocks();\n            parser.addChild(\"thematic_break\", parser.nextNonspace);\n            parser.advanceOffset(\n                parser.currentLine.length - parser.offset,\n                false\n            );\n            return 2;\n        } else {\n            return 0;\n        }\n    },\n\n    // list item\n    function(parser, container) {\n        var data;\n\n        if (\n            (!parser.indented || container.type === \"list\") &&\n            (data = parseListMarker(parser, container))\n        ) {\n            parser.closeUnmatchedBlocks();\n\n            // add the list if needed\n            if (\n                parser.tip.type !== \"list\" ||\n                !listsMatch(container._listData, data)\n            ) {\n                container = parser.addChild(\"list\", parser.nextNonspace);\n                container._listData = data;\n            }\n\n            // add the list item\n            container = parser.addChild(\"item\", parser.nextNonspace);\n            container._listData = data;\n            return 1;\n        } else {\n            return 0;\n        }\n    },\n\n    // indented code block\n    function(parser) {\n        if (\n            parser.indented &&\n            parser.tip.type !== \"paragraph\" &&\n            !parser.blank\n        ) {\n            // indented code\n            parser.advanceOffset(CODE_INDENT, true);\n            parser.closeUnmatchedBlocks();\n            parser.addChild(\"code_block\", parser.offset);\n            return 2;\n        } else {\n            return 0;\n        }\n    }\n];\n\nvar advanceOffset = function(count, columns) {\n    var currentLine = this.currentLine;\n    var charsToTab, charsToAdvance;\n    var c;\n    while (count > 0 && (c = currentLine[this.offset])) {\n        if (c === \"\\t\") {\n            charsToTab = 4 - (this.column % 4);\n            if (columns) {\n                this.partiallyConsumedTab = charsToTab > count;\n                charsToAdvance = charsToTab > count ? count : charsToTab;\n                this.column += charsToAdvance;\n                this.offset += this.partiallyConsumedTab ? 0 : 1;\n                count -= charsToAdvance;\n            } else {\n                this.partiallyConsumedTab = false;\n                this.column += charsToTab;\n                this.offset += 1;\n                count -= 1;\n            }\n        } else {\n            this.partiallyConsumedTab = false;\n            this.offset += 1;\n            this.column += 1; // assume ascii; block starts are ascii\n            count -= 1;\n        }\n    }\n};\n\nvar advanceNextNonspace = function() {\n    this.offset = this.nextNonspace;\n    this.column = this.nextNonspaceColumn;\n    this.partiallyConsumedTab = false;\n};\n\nvar findNextNonspace = function() {\n    var currentLine = this.currentLine;\n    var i = this.offset;\n    var cols = this.column;\n    var c;\n\n    while ((c = currentLine.charAt(i)) !== \"\") {\n        if (c === \" \") {\n            i++;\n            cols++;\n        } else if (c === \"\\t\") {\n            i++;\n            cols += 4 - (cols % 4);\n        } else {\n            break;\n        }\n    }\n    this.blank = c === \"\\n\" || c === \"\\r\" || c === \"\";\n    this.nextNonspace = i;\n    this.nextNonspaceColumn = cols;\n    this.indent = this.nextNonspaceColumn - this.column;\n    this.indented = this.indent >= CODE_INDENT;\n};\n\n// Analyze a line of text and update the document appropriately.\n// We parse markdown text by calling this on each line of input,\n// then finalizing the document.\nvar incorporateLine = function(ln) {\n    var all_matched = true;\n    var t;\n\n    var container = this.doc;\n    this.oldtip = this.tip;\n    this.offset = 0;\n    this.column = 0;\n    this.blank = false;\n    this.partiallyConsumedTab = false;\n    this.lineNumber += 1;\n\n    // replace NUL characters for security\n    if (ln.indexOf(\"\\u0000\") !== -1) {\n        ln = ln.replace(/\\0/g, \"\\uFFFD\");\n    }\n\n    this.currentLine = ln;\n\n    // For each containing block, try to parse the associated line start.\n    // Bail out on failure: container will point to the last matching block.\n    // Set all_matched to false if not all containers match.\n    var lastChild;\n    while ((lastChild = container._lastChild) && lastChild._open) {\n        container = lastChild;\n\n        this.findNextNonspace();\n\n        switch (this.blocks[container.type].continue(this, container)) {\n            case 0: // we've matched, keep going\n                break;\n            case 1: // we've failed to match a block\n                all_matched = false;\n                break;\n            case 2: // we've hit end of line for fenced code close and can return\n                return;\n            default:\n                throw \"continue returned illegal value, must be 0, 1, or 2\";\n        }\n        if (!all_matched) {\n            container = container._parent; // back up to last matching block\n            break;\n        }\n    }\n\n    this.allClosed = container === this.oldtip;\n    this.lastMatchedContainer = container;\n\n    var matchedLeaf =\n        container.type !== \"paragraph\" && blocks[container.type].acceptsLines;\n    var starts = this.blockStarts;\n    var startsLen = starts.length;\n    // Unless last matched container is a code block, try new container starts,\n    // adding children to the last matched container:\n    while (!matchedLeaf) {\n        this.findNextNonspace();\n\n        // this is a little performance optimization:\n        if (\n            !this.indented &&\n            !reMaybeSpecial.test(ln.slice(this.nextNonspace))\n        ) {\n            this.advanceNextNonspace();\n            break;\n        }\n\n        var i = 0;\n        while (i < startsLen) {\n            var res = starts[i](this, container);\n            if (res === 1) {\n                container = this.tip;\n                break;\n            } else if (res === 2) {\n                container = this.tip;\n                matchedLeaf = true;\n                break;\n            } else {\n                i++;\n            }\n        }\n\n        if (i === startsLen) {\n            // nothing matched\n            this.advanceNextNonspace();\n            break;\n        }\n    }\n\n    // What remains at the offset is a text line.  Add the text to the\n    // appropriate container.\n\n    // First check for a lazy paragraph continuation:\n    if (!this.allClosed && !this.blank && this.tip.type === \"paragraph\") {\n        // lazy paragraph continuation\n        this.addLine();\n    } else {\n        // not a lazy continuation\n\n        // finalize any blocks not matched\n        this.closeUnmatchedBlocks();\n\n        t = container.type;\n\n        if (this.blocks[t].acceptsLines) {\n            this.addLine();\n            // if HtmlBlock, check for end condition\n            if (\n                t === \"html_block\" &&\n                container._htmlBlockType >= 1 &&\n                container._htmlBlockType <= 5 &&\n                reHtmlBlockClose[container._htmlBlockType].test(\n                    this.currentLine.slice(this.offset)\n                )\n            ) {\n                this.lastLineLength = ln.length;\n                this.finalize(container, this.lineNumber);\n            }\n        } else if (this.offset < ln.length && !this.blank) {\n            // create paragraph container for line\n            container = this.addChild(\"paragraph\", this.offset);\n            this.advanceNextNonspace();\n            this.addLine();\n        }\n    }\n    this.lastLineLength = ln.length;\n};\n\n// Finalize a block.  Close it and do any necessary postprocessing,\n// e.g. creating string_content from strings, setting the 'tight'\n// or 'loose' status of a list, and parsing the beginnings\n// of paragraphs for reference definitions.  Reset the tip to the\n// parent of the closed block.\nvar finalize = function(block, lineNumber) {\n    var above = block._parent;\n    block._open = false;\n    block.sourcepos[1] = [lineNumber, this.lastLineLength];\n\n    this.blocks[block.type].finalize(this, block);\n\n    this.tip = above;\n};\n\n// Walk through a block & children recursively, parsing string content\n// into inline content where appropriate.\nvar processInlines = function(block) {\n    var node, event, t;\n    var walker = block.walker();\n    this.inlineParser.refmap = this.refmap;\n    this.inlineParser.options = this.options;\n    while ((event = walker.next())) {\n        node = event.node;\n        t = node.type;\n        if (!event.entering && (t === \"paragraph\" || t === \"heading\")) {\n            this.inlineParser.parse(node);\n        }\n    }\n};\n\nvar Document = function() {\n    var doc = new Node(\"document\", [\n        [1, 1],\n        [0, 0]\n    ]);\n    return doc;\n};\n\n// The main parsing function.  Returns a parsed document AST.\nvar parse = function(input) {\n    this.doc = new Document();\n    this.tip = this.doc;\n    this.refmap = {};\n    this.lineNumber = 0;\n    this.lastLineLength = 0;\n    this.offset = 0;\n    this.column = 0;\n    this.lastMatchedContainer = this.doc;\n    this.currentLine = \"\";\n    if (this.options.time) {\n        console.time(\"preparing input\");\n    }\n    var lines = input.split(reLineEnding);\n    var len = lines.length;\n    if (input.charCodeAt(input.length - 1) === C_NEWLINE) {\n        // ignore last blank line created by final newline\n        len -= 1;\n    }\n    if (this.options.time) {\n        console.timeEnd(\"preparing input\");\n    }\n    if (this.options.time) {\n        console.time(\"block parsing\");\n    }\n    for (var i = 0; i < len; i++) {\n        this.incorporateLine(lines[i]);\n    }\n    while (this.tip) {\n        this.finalize(this.tip, len);\n    }\n    if (this.options.time) {\n        console.timeEnd(\"block parsing\");\n    }\n    if (this.options.time) {\n        console.time(\"inline parsing\");\n    }\n    this.processInlines(this.doc);\n    if (this.options.time) {\n        console.timeEnd(\"inline parsing\");\n    }\n    return this.doc;\n};\n\n// The Parser object.\nfunction Parser(options) {\n    return {\n        doc: new Document(),\n        blocks: blocks,\n        blockStarts: blockStarts,\n        tip: this.doc,\n        oldtip: this.doc,\n        currentLine: \"\",\n        lineNumber: 0,\n        offset: 0,\n        column: 0,\n        nextNonspace: 0,\n        nextNonspaceColumn: 0,\n        indent: 0,\n        indented: false,\n        blank: false,\n        partiallyConsumedTab: false,\n        allClosed: true,\n        lastMatchedContainer: this.doc,\n        refmap: {},\n        lastLineLength: 0,\n        inlineParser: new InlineParser(options),\n        findNextNonspace: findNextNonspace,\n        advanceOffset: advanceOffset,\n        advanceNextNonspace: advanceNextNonspace,\n        addLine: addLine,\n        addChild: addChild,\n        incorporateLine: incorporateLine,\n        finalize: finalize,\n        processInlines: processInlines,\n        closeUnmatchedBlocks: closeUnmatchedBlocks,\n        parse: parse,\n        options: options || {}\n    };\n}\n\nexport default Parser;\n","\"use strict\";\n\nfunction Renderer() {}\n\n/**\n *  Walks the AST and calls member methods for each Node type.\n *\n *  @param ast {Node} The root of the abstract syntax tree.\n */\nfunction render(ast) {\n    var walker = ast.walker(),\n        event,\n        type;\n\n    this.buffer = \"\";\n    this.lastOut = \"\\n\";\n\n    while ((event = walker.next())) {\n        type = event.node.type;\n        if (this[type]) {\n            this[type](event.node, event.entering);\n        }\n    }\n    return this.buffer;\n}\n\n/**\n *  Concatenate a literal string to the buffer.\n *\n *  @param str {String} The string to concatenate.\n */\nfunction lit(str) {\n    this.buffer += str;\n    this.lastOut = str;\n}\n\n/**\n *  Output a newline to the buffer.\n */\nfunction cr() {\n    if (this.lastOut !== \"\\n\") {\n        this.lit(\"\\n\");\n    }\n}\n\n/**\n *  Concatenate a string to the buffer possibly escaping the content.\n *\n *  Concrete renderer implementations should override this method.\n *\n *  @param str {String} The string to concatenate.\n */\nfunction out(str) {\n    this.lit(str);\n}\n\n/**\n *  Escape a string for the target renderer.\n *\n *  Abstract function that should be implemented by concrete\n *  renderer implementations.\n *\n *  @param str {String} The string to escape.\n */\nfunction esc(str) {\n    return str;\n}\n\nRenderer.prototype.render = render;\nRenderer.prototype.out = out;\nRenderer.prototype.lit = lit;\nRenderer.prototype.cr = cr;\nRenderer.prototype.esc = esc;\n\nexport default Renderer;\n","\"use strict\";\n\nimport { escapeXml } from \"../common.js\";\nimport Renderer from \"./renderer.js\";\n\nvar reUnsafeProtocol = /^javascript:|vbscript:|file:|data:/i;\nvar reSafeDataProtocol = /^data:image\\/(?:png|gif|jpeg|webp)/i;\n\nvar potentiallyUnsafe = function(url) {\n    return reUnsafeProtocol.test(url) && !reSafeDataProtocol.test(url);\n};\n\n// Helper function to produce an HTML tag.\nfunction tag(name, attrs, selfclosing) {\n    if (this.disableTags > 0) {\n        return;\n    }\n    this.buffer += \"<\" + name;\n    if (attrs && attrs.length > 0) {\n        var i = 0;\n        var attrib;\n        while ((attrib = attrs[i]) !== undefined) {\n            this.buffer += \" \" + attrib[0] + '=\"' + attrib[1] + '\"';\n            i++;\n        }\n    }\n    if (selfclosing) {\n        this.buffer += \" /\";\n    }\n    this.buffer += \">\";\n    this.lastOut = \">\";\n}\n\nfunction HtmlRenderer(options) {\n    options = options || {};\n    // by default, soft breaks are rendered as newlines in HTML\n    options.softbreak = options.softbreak || \"\\n\";\n    // set to \"<br />\" to make them hard breaks\n    // set to \" \" if you want to ignore line wrapping in source\n    this.esc = options.esc || escapeXml;\n    // escape html with a custom function\n    // else use escapeXml\n\n    this.disableTags = 0;\n    this.lastOut = \"\\n\";\n    this.options = options;\n}\n\n/* Node methods */\n\nfunction text(node) {\n    this.out(node.literal);\n}\n\nfunction softbreak() {\n    this.lit(this.options.softbreak);\n}\n\nfunction linebreak() {\n    this.tag(\"br\", [], true);\n    this.cr();\n}\n\nfunction link(node, entering) {\n    var attrs = this.attrs(node);\n    if (entering) {\n        if (!(this.options.safe && potentiallyUnsafe(node.destination))) {\n            attrs.push([\"href\", this.esc(node.destination)]);\n        }\n        if (node.title) {\n            attrs.push([\"title\", this.esc(node.title)]);\n        }\n        this.tag(\"a\", attrs);\n    } else {\n        this.tag(\"/a\");\n    }\n}\n\nfunction image(node, entering) {\n    if (entering) {\n        if (this.disableTags === 0) {\n            if (this.options.safe && potentiallyUnsafe(node.destination)) {\n                this.lit('<img src=\"\" alt=\"');\n            } else {\n                this.lit('<img src=\"' + this.esc(node.destination) + '\" alt=\"');\n            }\n        }\n        this.disableTags += 1;\n    } else {\n        this.disableTags -= 1;\n        if (this.disableTags === 0) {\n            if (node.title) {\n                this.lit('\" title=\"' + this.esc(node.title));\n            }\n            this.lit('\" />');\n        }\n    }\n}\n\nfunction emph(node, entering) {\n    this.tag(entering ? \"em\" : \"/em\");\n}\n\nfunction strong(node, entering) {\n    this.tag(entering ? \"strong\" : \"/strong\");\n}\n\nfunction paragraph(node, entering) {\n    var grandparent = node.parent.parent,\n        attrs = this.attrs(node);\n    if (grandparent !== null && grandparent.type === \"list\") {\n        if (grandparent.listTight) {\n            return;\n        }\n    }\n    if (entering) {\n        this.cr();\n        this.tag(\"p\", attrs);\n    } else {\n        this.tag(\"/p\");\n        this.cr();\n    }\n}\n\nfunction heading(node, entering) {\n    var tagname = \"h\" + node.level,\n        attrs = this.attrs(node);\n    if (entering) {\n        this.cr();\n        this.tag(tagname, attrs);\n    } else {\n        this.tag(\"/\" + tagname);\n        this.cr();\n    }\n}\n\nfunction code(node) {\n    this.tag(\"code\");\n    this.out(node.literal);\n    this.tag(\"/code\");\n}\n\nfunction code_block(node) {\n    var info_words = node.info ? node.info.split(/\\s+/) : [],\n        attrs = this.attrs(node);\n    if (info_words.length > 0 && info_words[0].length > 0) {\n        var cls = this.esc(info_words[0]);\n        if (!/^language-/.exec(cls)) {\n          cls = \"language-\" + cls;\n        }\n        attrs.push([\"class\", cls]);\n    }\n    this.cr();\n    this.tag(\"pre\");\n    this.tag(\"code\", attrs);\n    this.out(node.literal);\n    this.tag(\"/code\");\n    this.tag(\"/pre\");\n    this.cr();\n}\n\nfunction thematic_break(node) {\n    var attrs = this.attrs(node);\n    this.cr();\n    this.tag(\"hr\", attrs, true);\n    this.cr();\n}\n\nfunction block_quote(node, entering) {\n    var attrs = this.attrs(node);\n    if (entering) {\n        this.cr();\n        this.tag(\"blockquote\", attrs);\n        this.cr();\n    } else {\n        this.cr();\n        this.tag(\"/blockquote\");\n        this.cr();\n    }\n}\n\nfunction list(node, entering) {\n    var tagname = node.listType === \"bullet\" ? \"ul\" : \"ol\",\n        attrs = this.attrs(node);\n\n    if (entering) {\n        var start = node.listStart;\n        if (start !== null && start !== 1) {\n            attrs.push([\"start\", start.toString()]);\n        }\n        this.cr();\n        this.tag(tagname, attrs);\n        this.cr();\n    } else {\n        this.cr();\n        this.tag(\"/\" + tagname);\n        this.cr();\n    }\n}\n\nfunction item(node, entering) {\n    var attrs = this.attrs(node);\n    if (entering) {\n        this.tag(\"li\", attrs);\n    } else {\n        this.tag(\"/li\");\n        this.cr();\n    }\n}\n\nfunction html_inline(node) {\n    if (this.options.safe) {\n        this.lit(\"<!-- raw HTML omitted -->\");\n    } else {\n        this.lit(node.literal);\n    }\n}\n\nfunction html_block(node) {\n    this.cr();\n    if (this.options.safe) {\n        this.lit(\"<!-- raw HTML omitted -->\");\n    } else {\n        this.lit(node.literal);\n    }\n    this.cr();\n}\n\nfunction custom_inline(node, entering) {\n    if (entering && node.onEnter) {\n        this.lit(node.onEnter);\n    } else if (!entering && node.onExit) {\n        this.lit(node.onExit);\n    }\n}\n\nfunction custom_block(node, entering) {\n    this.cr();\n    if (entering && node.onEnter) {\n        this.lit(node.onEnter);\n    } else if (!entering && node.onExit) {\n        this.lit(node.onExit);\n    }\n    this.cr();\n}\n\n/* Helper methods */\n\nfunction out(s) {\n    this.lit(this.esc(s));\n}\n\nfunction attrs(node) {\n    var att = [];\n    if (this.options.sourcepos) {\n        var pos = node.sourcepos;\n        if (pos) {\n            att.push([\n                \"data-sourcepos\",\n                String(pos[0][0]) +\n                    \":\" +\n                    String(pos[0][1]) +\n                    \"-\" +\n                    String(pos[1][0]) +\n                    \":\" +\n                    String(pos[1][1])\n            ]);\n        }\n    }\n    return att;\n}\n\n// quick browser-compatible inheritance\nHtmlRenderer.prototype = Object.create(Renderer.prototype);\n\nHtmlRenderer.prototype.text = text;\nHtmlRenderer.prototype.html_inline = html_inline;\nHtmlRenderer.prototype.html_block = html_block;\nHtmlRenderer.prototype.softbreak = softbreak;\nHtmlRenderer.prototype.linebreak = linebreak;\nHtmlRenderer.prototype.link = link;\nHtmlRenderer.prototype.image = image;\nHtmlRenderer.prototype.emph = emph;\nHtmlRenderer.prototype.strong = strong;\nHtmlRenderer.prototype.paragraph = paragraph;\nHtmlRenderer.prototype.heading = heading;\nHtmlRenderer.prototype.code = code;\nHtmlRenderer.prototype.code_block = code_block;\nHtmlRenderer.prototype.thematic_break = thematic_break;\nHtmlRenderer.prototype.block_quote = block_quote;\nHtmlRenderer.prototype.list = list;\nHtmlRenderer.prototype.item = item;\nHtmlRenderer.prototype.custom_inline = custom_inline;\nHtmlRenderer.prototype.custom_block = custom_block;\n\nHtmlRenderer.prototype.esc = escapeXml;\n\nHtmlRenderer.prototype.out = out;\nHtmlRenderer.prototype.tag = tag;\nHtmlRenderer.prototype.attrs = attrs;\n\nexport default HtmlRenderer;\n","\"use strict\";\n\nimport Renderer from \"./renderer.js\";\nimport { escapeXml } from \"../common.js\";\n\nvar reXMLTag = /\\<[^>]*\\>/;\n\nfunction toTagName(s) {\n    return s.replace(/([a-z])([A-Z])/g, \"$1_$2\").toLowerCase();\n}\n\nfunction XmlRenderer(options) {\n    options = options || {};\n\n    this.disableTags = 0;\n    this.lastOut = \"\\n\";\n\n    this.indentLevel = 0;\n    this.indent = \"  \";\n    \n    this.esc = options.esc || escapeXml;\n    // escape html with a custom function\n    // else use escapeXml\n\n    this.options = options;\n}\n\nfunction render(ast) {\n    this.buffer = \"\";\n\n    var attrs;\n    var tagname;\n    var walker = ast.walker();\n    var event, node, entering;\n    var container;\n    var selfClosing;\n    var nodetype;\n\n    var options = this.options;\n\n    if (options.time) {\n        console.time(\"rendering\");\n    }\n\n    this.buffer += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n    this.buffer += '<!DOCTYPE document SYSTEM \"CommonMark.dtd\">\\n';\n\n    while ((event = walker.next())) {\n        entering = event.entering;\n        node = event.node;\n        nodetype = node.type;\n\n        container = node.isContainer;\n\n        selfClosing =\n            nodetype === \"thematic_break\" ||\n            nodetype === \"linebreak\" ||\n            nodetype === \"softbreak\";\n\n        tagname = toTagName(nodetype);\n\n        if (entering) {\n            attrs = [];\n\n            switch (nodetype) {\n                case \"document\":\n                    attrs.push([\"xmlns\", \"http://commonmark.org/xml/1.0\"]);\n                    break;\n                case \"list\":\n                    if (node.listType !== null) {\n                        attrs.push([\"type\", node.listType.toLowerCase()]);\n                    }\n                    if (node.listStart !== null) {\n                        attrs.push([\"start\", String(node.listStart)]);\n                    }\n                    if (node.listTight !== null) {\n                        attrs.push([\n                            \"tight\",\n                            node.listTight ? \"true\" : \"false\"\n                        ]);\n                    }\n                    var delim = node.listDelimiter;\n                    if (delim !== null) {\n                        var delimword = \"\";\n                        if (delim === \".\") {\n                            delimword = \"period\";\n                        } else {\n                            delimword = \"paren\";\n                        }\n                        attrs.push([\"delimiter\", delimword]);\n                    }\n                    break;\n                case \"code_block\":\n                    if (node.info) {\n                        attrs.push([\"info\", node.info]);\n                    }\n                    break;\n                case \"heading\":\n                    attrs.push([\"level\", String(node.level)]);\n                    break;\n                case \"link\":\n                case \"image\":\n                    attrs.push([\"destination\", node.destination]);\n                    attrs.push([\"title\", node.title]);\n                    break;\n                case \"custom_inline\":\n                case \"custom_block\":\n                    attrs.push([\"on_enter\", node.onEnter]);\n                    attrs.push([\"on_exit\", node.onExit]);\n                    break;\n                default:\n                    break;\n            }\n            if (options.sourcepos) {\n                var pos = node.sourcepos;\n                if (pos) {\n                    attrs.push([\n                        \"sourcepos\",\n                        String(pos[0][0]) +\n                            \":\" +\n                            String(pos[0][1]) +\n                            \"-\" +\n                            String(pos[1][0]) +\n                            \":\" +\n                            String(pos[1][1])\n                    ]);\n                }\n            }\n\n            this.cr();\n            this.out(this.tag(tagname, attrs, selfClosing));\n            if (container) {\n                this.indentLevel += 1;\n            } else if (!container && !selfClosing) {\n                var lit = node.literal;\n                if (lit) {\n                    this.out(this.esc(lit));\n                }\n                this.out(this.tag(\"/\" + tagname));\n            }\n        } else {\n            this.indentLevel -= 1;\n            this.cr();\n            this.out(this.tag(\"/\" + tagname));\n        }\n    }\n    if (options.time) {\n        console.timeEnd(\"rendering\");\n    }\n    this.buffer += \"\\n\";\n    return this.buffer;\n}\n\nfunction out(s) {\n    if (this.disableTags > 0) {\n        this.buffer += s.replace(reXMLTag, \"\");\n    } else {\n        this.buffer += s;\n    }\n    this.lastOut = s;\n}\n\nfunction cr() {\n    if (this.lastOut !== \"\\n\") {\n        this.buffer += \"\\n\";\n        this.lastOut = \"\\n\";\n        for (var i = this.indentLevel; i > 0; i--) {\n            this.buffer += this.indent;\n        }\n    }\n}\n\n// Helper function to produce an XML tag.\nfunction tag(name, attrs, selfclosing) {\n    var result = \"<\" + name;\n    if (attrs && attrs.length > 0) {\n        var i = 0;\n        var attrib;\n        while ((attrib = attrs[i]) !== undefined) {\n            result += \" \" + attrib[0] + '=\"' + this.esc(attrib[1]) + '\"';\n            i++;\n        }\n    }\n    if (selfclosing) {\n        result += \" /\";\n    }\n    result += \">\";\n    return result;\n}\n\n// quick browser-compatible inheritance\nXmlRenderer.prototype = Object.create(Renderer.prototype);\n\nXmlRenderer.prototype.render = render;\nXmlRenderer.prototype.out = out;\nXmlRenderer.prototype.cr = cr;\nXmlRenderer.prototype.tag = tag;\nXmlRenderer.prototype.esc = escapeXml;\n\nexport default XmlRenderer;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\nCopyright 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport \"./@types/commonmark\"; // import better types than @types/commonmark\nimport * as commonmark from \"commonmark\";\nimport { escape } from \"lodash\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { findLinksInString } from \"@element-hq/web-shared-components\";\n\nconst ALLOWED_HTML_TAGS = [\"sub\", \"sup\", \"del\", \"s\", \"u\", \"br\", \"br/\"];\n\n// These types of node are definitely text\nconst TEXT_NODES = [\"text\", \"softbreak\", \"linebreak\", \"paragraph\", \"document\"];\n\nfunction isAllowedHtmlTag(node: commonmark.Node): boolean {\n    if (!node.literal) {\n        return false;\n    }\n\n    if (node.literal.match('^<((div|span) data-mx-maths=\"[^\"]*\"|/(div|span))>$') != null) {\n        return true;\n    }\n\n    // Regex won't work for tags with attrs, but the tags we allow\n    // shouldn't really have any anyway.\n    const matches = /^<\\/?(.*)>$/.exec(node.literal);\n    if (matches && matches.length == 2) {\n        const tag = matches[1];\n        return ALLOWED_HTML_TAGS.indexOf(tag) > -1;\n    }\n\n    return false;\n}\n\n/*\n * Returns true if the parse output containing the node\n * comprises multiple block level elements (ie. lines),\n * or false if it is only a single line.\n */\nfunction isMultiLine(node: commonmark.Node): boolean {\n    let par = node;\n    while (par.parent) {\n        par = par.parent;\n    }\n    return par.firstChild != par.lastChild;\n}\n\nfunction getTextUntilEndOrLinebreak(node: commonmark.Node): string {\n    let currentNode: commonmark.Node | null = node;\n    let text = \"\";\n    while (currentNode && currentNode.type !== \"softbreak\" && currentNode.type !== \"linebreak\") {\n        const { literal, type } = currentNode;\n        if (type === \"text\" && literal) {\n            let n = 0;\n            let char = literal[n];\n            while (char !== \" \" && char !== null && n <= literal.length) {\n                if (char === \" \") {\n                    break;\n                }\n                if (char) {\n                    text += char;\n                }\n                n += 1;\n                char = literal[n];\n            }\n            if (char === \" \") {\n                break;\n            }\n        }\n        currentNode = currentNode.next;\n    }\n    return text;\n}\n\nconst formattingChangesByNodeType = {\n    emph: \"_\",\n    strong: \"__\",\n};\n\n/**\n * Returns the literal of a node an all child nodes.\n */\nconst innerNodeLiteral = (node: commonmark.Node): string => {\n    let literal = \"\";\n\n    const walker = node.walker();\n    let step: commonmark.NodeWalkingStep | null;\n\n    while ((step = walker.next())) {\n        const currentNode = step.node;\n        const currentNodeLiteral = currentNode.literal;\n        if (step.entering && currentNode.type === \"text\" && currentNodeLiteral) {\n            literal += currentNodeLiteral;\n        }\n    }\n\n    return literal;\n};\n\nconst emptyItemWithNoSiblings = (node: commonmark.Node): boolean => {\n    return !node.prev && !node.next && !node.firstChild;\n};\n\n/**\n * Class that wraps commonmark, adding the ability to see whether\n * a given message actually uses any markdown syntax or whether\n * it's plain text.\n */\nexport default class Markdown {\n    private input: string;\n    private parsed: commonmark.Node;\n\n    public constructor(input: string) {\n        this.input = input;\n\n        const parser = new commonmark.Parser();\n        this.parsed = parser.parse(this.input);\n        this.parsed = this.repairLinks(this.parsed);\n    }\n\n    /**\n     * This method is modifying the parsed AST in such a way that links are always\n     * properly linkified instead of sometimes being wrongly emphasised in case\n     * if you were to write a link like the example below:\n     * https://my_weird-link_domain.domain.com\n     * ^ this link would be parsed to something like this:\n     * <a href=\"https://my\">https://my</a><b>weird-link</b><a href=\"https://domain.domain.com\">domain.domain.com</a>\n     * This method makes it so the link gets properly modified to a version where it is\n     * not emphasised until it actually ends.\n     * See: https://github.com/vector-im/element-web/issues/4674\n     * @param parsed\n     */\n    private repairLinks(parsed: commonmark.Node): commonmark.Node {\n        const walker = parsed.walker();\n        let event: commonmark.NodeWalkingStep | null = null;\n        let text = \"\";\n        let isInPara = false;\n        let previousNode: commonmark.Node | null = null;\n        let shouldUnlinkFormattingNode = false;\n        while ((event = walker.next())) {\n            const { node } = event;\n            if (node.type === \"paragraph\") {\n                if (event.entering) {\n                    isInPara = true;\n                } else {\n                    isInPara = false;\n                }\n            }\n            if (isInPara) {\n                // Clear saved string when line ends\n                if (\n                    node.type === \"softbreak\" ||\n                    node.type === \"linebreak\" ||\n                    // Also start calculating the text from the beginning on any spaces\n                    (node.type === \"text\" && node.literal === \" \")\n                ) {\n                    text = \"\";\n                    continue;\n                }\n\n                // Break up text nodes on spaces, so that we don't shoot past them without resetting\n                if (node.type === \"text\" && node.literal) {\n                    const [thisPart, ...nextParts] = node.literal.split(/( )/);\n                    node.literal = thisPart;\n                    text += thisPart;\n\n                    // Add the remaining parts as siblings\n                    nextParts.reverse().forEach((part) => {\n                        if (part) {\n                            const nextNode = new commonmark.Node(\"text\");\n                            nextNode.literal = part;\n                            node.insertAfter(nextNode);\n                            // Make the iterator aware of the newly inserted node\n                            walker.resumeAt(nextNode, true);\n                        }\n                    });\n                }\n\n                // We should not do this if previous node was not a textnode, as we can't combine it then.\n                if ((node.type === \"emph\" || node.type === \"strong\") && previousNode?.type === \"text\") {\n                    if (event.entering) {\n                        const foundLinks = findLinksInString(text);\n                        for (const { value } of foundLinks) {\n                            if (node?.firstChild?.literal) {\n                                /**\n                                 * NOTE: This technically should unlink the emph node and create LINK nodes instead, adding all the next elements as siblings\n                                 * but this solution seems to work well and is hopefully slightly easier to understand too\n                                 */\n                                const format = formattingChangesByNodeType[node.type];\n                                const nonEmphasizedText = `${format}${innerNodeLiteral(node)}${format}`;\n                                const f = getTextUntilEndOrLinebreak(node);\n                                const newText = value + nonEmphasizedText + f;\n                                const newLinks = findLinksInString(newText);\n                                // Should always find only one link here, if it finds more it means that the algorithm is broken\n                                if (newLinks.length === 1) {\n                                    const emphasisTextNode = new commonmark.Node(\"text\");\n                                    emphasisTextNode.literal = nonEmphasizedText;\n                                    previousNode.insertAfter(emphasisTextNode);\n                                    node.firstChild.literal = \"\";\n                                    event = node.walker().next();\n                                    if (event) {\n                                        // Remove `em` opening and closing nodes\n                                        node.unlink();\n                                        previousNode.insertAfter(event.node);\n                                        shouldUnlinkFormattingNode = true;\n                                    }\n                                } else {\n                                    logger.error(\n                                        \"Markdown links escaping found too many links for following text: \",\n                                        text,\n                                    );\n                                    logger.error(\n                                        \"Markdown links escaping found too many links for modified text: \",\n                                        newText,\n                                    );\n                                }\n                            }\n                        }\n                    } else {\n                        if (shouldUnlinkFormattingNode) {\n                            node.unlink();\n                            shouldUnlinkFormattingNode = false;\n                        }\n                    }\n                }\n            }\n            previousNode = node;\n        }\n        return parsed;\n    }\n\n    public isPlainText(): boolean {\n        const walker = this.parsed.walker();\n        let ev: commonmark.NodeWalkingStep | null;\n\n        while ((ev = walker.next())) {\n            const node = ev.node;\n\n            if (TEXT_NODES.indexOf(node.type) > -1) {\n                // definitely text\n                continue;\n            } else if (node.type == \"list\" || node.type == \"item\") {\n                // Special handling for inputs like `+`, `*`, `-` and `2021.` which\n                // would otherwise be treated as a list of a single empty item.\n                // See https://github.com/vector-im/element-web/issues/7631\n                if (node.type == \"list\" && node.firstChild && emptyItemWithNoSiblings(node.firstChild)) {\n                    // A list with a single empty item is treated as plain text.\n                    continue;\n                }\n\n                if (node.type == \"item\" && emptyItemWithNoSiblings(node)) {\n                    // An empty list item with no sibling items is treated as plain text.\n                    continue;\n                }\n\n                // Everything else is actual lists and therefore not plaintext.\n                return false;\n            } else if (node.type == \"html_inline\" || node.type == \"html_block\") {\n                // if it's an allowed html tag, we need to render it and therefore\n                // we will need to use HTML. If it's not allowed, it's not HTML since\n                // we'll just be treating it as text.\n                if (isAllowedHtmlTag(node)) {\n                    return false;\n                }\n            } else {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    public toHTML({ externalLinks = false } = {}): string {\n        const renderer = new commonmark.HtmlRenderer({\n            safe: false,\n\n            // Set soft breaks to hard HTML breaks: commonmark\n            // puts softbreaks in for multiple lines in a blockquote,\n            // so if these are just newline characters then the\n            // block quote ends up all on one line\n            // (https://github.com/vector-im/element-web/issues/3154)\n            softbreak: \"<br />\",\n        });\n\n        // Trying to strip out the wrapping <p/> causes a lot more complication\n        // than it's worth, i think.  For instance, this code will go and strip\n        // out any <p/> tag (no matter where it is in the tree) which doesn't\n        // contain \\n's.\n        // On the flip side, <p/>s are quite opionated and restricted on where\n        // you can nest them.\n        //\n        // Let's try sending with <p/>s anyway for now, though.\n        const realParagraph = renderer.paragraph;\n        renderer.paragraph = function (node: commonmark.Node, entering: boolean) {\n            // If there is only one top level node, just return the\n            // bare text: it's a single line of text and so should be\n            // 'inline', rather than unnecessarily wrapped in its own\n            // p tag. If, however, we have multiple nodes, each gets\n            // its own p tag to keep them as separate paragraphs.\n            // However, if it's a blockquote, adds a p tag anyway\n            // in order to avoid deviation to commonmark and unexpected\n            // results when parsing the formatted HTML.\n            if (node.parent?.type === \"block_quote\" || isMultiLine(node)) {\n                realParagraph.call(this, node, entering);\n            }\n        };\n\n        renderer.link = function (node, entering) {\n            const attrs = this.attrs(node);\n            if (entering && node.destination) {\n                attrs.push([\"href\", this.esc(node.destination)]);\n                if (node.title) {\n                    attrs.push([\"title\", this.esc(node.title)]);\n                }\n                // Modified link behaviour to treat them all as external and\n                // thus opening in a new tab.\n                if (externalLinks) {\n                    attrs.push([\"target\", \"_blank\"]);\n                    attrs.push([\"rel\", \"noreferrer noopener\"]);\n                }\n                this.tag(\"a\", attrs);\n            } else {\n                this.tag(\"/a\");\n            }\n        };\n\n        renderer.html_inline = function (node: commonmark.Node) {\n            if (node.literal) {\n                if (isAllowedHtmlTag(node)) {\n                    this.lit(node.literal);\n                } else {\n                    this.lit(escape(node.literal));\n                }\n            }\n        };\n\n        renderer.html_block = function (node: commonmark.Node) {\n            /*\n            // as with `paragraph`, we only insert line breaks\n            // if there are multiple lines in the markdown.\n            const isMultiLine = is_multi_line(node);\n            if (isMultiLine) this.cr();\n            */\n            renderer.html_inline(node);\n            /*\n            if (isMultiLine) this.cr();\n            */\n        };\n\n        return renderer.render(this.parsed);\n    }\n\n    /*\n     * Render the markdown message to plain text. That is, essentially\n     * just remove any backslashes escaping what would otherwise be\n     * markdown syntax\n     * (to fix https://github.com/vector-im/element-web/issues/2870).\n     *\n     * N.B. this does **NOT** render arbitrary MD to plain text - only MD\n     * which has no formatting.  Otherwise it emits HTML(!).\n     */\n    public toPlaintext(): string {\n        const renderer = new commonmark.HtmlRenderer({ safe: false });\n\n        renderer.paragraph = function (node: commonmark.Node, entering: boolean) {\n            // as with toHTML, only append lines to paragraphs if there are\n            // multiple paragraphs\n            if (isMultiLine(node)) {\n                if (!entering && node.next) {\n                    this.lit(\"\\n\\n\");\n                }\n            }\n        };\n\n        renderer.html_block = function (node: commonmark.Node) {\n            if (node.literal) this.lit(node.literal);\n            if (isMultiLine(node) && node.next) this.lit(\"\\n\\n\");\n        };\n\n        // We inhibit the default escape function as we escape the entire output string to correctly handle backslashes\n        renderer.esc = (input: string) => input;\n\n        return escape(renderer.render(this.parsed));\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>\nCopyright 2017 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport EventEmitter from \"events\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport SettingsStore from \"./settings/SettingsStore\";\nimport { SettingLevel } from \"./settings/SettingLevel\";\nimport { MatrixClientPeg } from \"./MatrixClientPeg\";\nimport { _t } from \"./languageHandler\";\n\n// XXX: MediaDeviceKind is a union type, so we make our own enum\nexport enum MediaDeviceKindEnum {\n    AudioOutput = \"audiooutput\",\n    AudioInput = \"audioinput\",\n    VideoInput = \"videoinput\",\n}\n\nexport type IMediaDevices = Record<MediaDeviceKindEnum, Array<MediaDeviceInfo>>;\n\nexport enum MediaDeviceHandlerEvent {\n    AudioOutputChanged = \"audio_output_changed\",\n}\n\nexport default class MediaDeviceHandler extends EventEmitter {\n    private static internalInstance?: MediaDeviceHandler;\n\n    public static get instance(): MediaDeviceHandler {\n        if (!MediaDeviceHandler.internalInstance) {\n            MediaDeviceHandler.internalInstance = new MediaDeviceHandler();\n        }\n        return MediaDeviceHandler.internalInstance;\n    }\n\n    public static async hasAnyLabeledDevices(): Promise<boolean> {\n        const devices = await navigator.mediaDevices.enumerateDevices();\n        return devices.some((d) => Boolean(d.label));\n    }\n\n    /**\n     * Gets the available audio input/output and video input devices\n     * from the browser: a thin wrapper around mediaDevices.enumerateDevices()\n     * that also returns results by type of devices. Note that this requires\n     * user media permissions and an active stream, otherwise you'll get blank\n     * device labels.\n     *\n     * Once the Permissions API\n     * (https://developer.mozilla.org/en-US/docs/Web/API/Permissions_API)\n     * is ready for primetime, it might help make this simpler.\n     *\n     * @returns Promise<IMediaDevices> The available media devices\n     */\n    public static async getDevices(): Promise<IMediaDevices | undefined> {\n        try {\n            const devices = await navigator.mediaDevices.enumerateDevices();\n            const output: Record<MediaDeviceKindEnum, MediaDeviceInfo[]> = {\n                [MediaDeviceKindEnum.AudioOutput]: [],\n                [MediaDeviceKindEnum.AudioInput]: [],\n                [MediaDeviceKindEnum.VideoInput]: [],\n            };\n\n            devices.forEach((device) => output[device.kind].push(device));\n            return output;\n        } catch (error) {\n            logger.warn(\"Unable to refresh WebRTC Devices: \", error);\n        }\n    }\n\n    public static getDefaultDevice = (devices: Array<Partial<MediaDeviceInfo>>): string => {\n        // Note we're looking for a device with deviceId 'default' but adding a device\n        // with deviceId == the empty string: this is because Chrome gives us a device\n        // with deviceId 'default', so we're looking for this, not the one we are adding.\n        if (!devices.some((i) => i.deviceId === \"default\")) {\n            devices.unshift({ deviceId: \"\", label: _t(\"voip|default_device\") });\n            return \"\";\n        } else {\n            return \"default\";\n        }\n    };\n\n    /**\n     * Retrieves devices from the SettingsStore and tells the js-sdk to use them\n     */\n    public static async loadDevices(): Promise<void> {\n        const audioDeviceId = SettingsStore.getValue(\"webrtc_audioinput\");\n        const videoDeviceId = SettingsStore.getValue(\"webrtc_videoinput\");\n\n        await MatrixClientPeg.safeGet().getMediaHandler().setAudioInput(audioDeviceId);\n        await MatrixClientPeg.safeGet().getMediaHandler().setVideoInput(videoDeviceId);\n\n        await MediaDeviceHandler.updateAudioSettings();\n    }\n\n    private static async updateAudioSettings(): Promise<void> {\n        await MatrixClientPeg.safeGet().getMediaHandler().setAudioSettings({\n            autoGainControl: MediaDeviceHandler.getAudioAutoGainControl(),\n            echoCancellation: MediaDeviceHandler.getAudioEchoCancellation(),\n            noiseSuppression: MediaDeviceHandler.getAudioNoiseSuppression(),\n        });\n    }\n\n    public setAudioOutput(deviceId: string): void {\n        SettingsStore.setValue(\"webrtc_audiooutput\", null, SettingLevel.DEVICE, deviceId);\n        this.emit(MediaDeviceHandlerEvent.AudioOutputChanged, deviceId);\n    }\n\n    /**\n     * This will not change the device that a potential call uses. The call will\n     * need to be ended and started again for this change to take effect\n     * @param {string} deviceId\n     */\n    public async setAudioInput(deviceId: string): Promise<void> {\n        SettingsStore.setValue(\"webrtc_audioinput\", null, SettingLevel.DEVICE, deviceId);\n        return MatrixClientPeg.safeGet().getMediaHandler().setAudioInput(deviceId);\n    }\n\n    /**\n     * This will not change the device that a potential call uses. The call will\n     * need to be ended and started again for this change to take effect\n     * @param {string} deviceId\n     */\n    public async setVideoInput(deviceId: string): Promise<void> {\n        SettingsStore.setValue(\"webrtc_videoinput\", null, SettingLevel.DEVICE, deviceId);\n        return MatrixClientPeg.safeGet().getMediaHandler().setVideoInput(deviceId);\n    }\n\n    public async setDevice(deviceId: string, kind: MediaDeviceKindEnum): Promise<void> {\n        switch (kind) {\n            case MediaDeviceKindEnum.AudioOutput:\n                this.setAudioOutput(deviceId);\n                break;\n            case MediaDeviceKindEnum.AudioInput:\n                await this.setAudioInput(deviceId);\n                break;\n            case MediaDeviceKindEnum.VideoInput:\n                await this.setVideoInput(deviceId);\n                break;\n        }\n    }\n\n    public static async setAudioAutoGainControl(value: boolean): Promise<void> {\n        await SettingsStore.setValue(\"webrtc_audio_autoGainControl\", null, SettingLevel.DEVICE, value);\n        await MediaDeviceHandler.updateAudioSettings();\n    }\n\n    public static async setAudioEchoCancellation(value: boolean): Promise<void> {\n        await SettingsStore.setValue(\"webrtc_audio_echoCancellation\", null, SettingLevel.DEVICE, value);\n        await MediaDeviceHandler.updateAudioSettings();\n    }\n\n    public static async setAudioNoiseSuppression(value: boolean): Promise<void> {\n        await SettingsStore.setValue(\"webrtc_audio_noiseSuppression\", null, SettingLevel.DEVICE, value);\n        await MediaDeviceHandler.updateAudioSettings();\n    }\n\n    public static getAudioOutput(): string {\n        return SettingsStore.getValueAt(SettingLevel.DEVICE, \"webrtc_audiooutput\");\n    }\n\n    public static getAudioInput(): string {\n        return SettingsStore.getValueAt(SettingLevel.DEVICE, \"webrtc_audioinput\");\n    }\n\n    public static getVideoInput(): string {\n        return SettingsStore.getValueAt(SettingLevel.DEVICE, \"webrtc_videoinput\");\n    }\n\n    public static getAudioAutoGainControl(): boolean {\n        return SettingsStore.getValue(\"webrtc_audio_autoGainControl\");\n    }\n\n    public static getAudioEchoCancellation(): boolean {\n        return SettingsStore.getValue(\"webrtc_audio_echoCancellation\");\n    }\n\n    public static getAudioNoiseSuppression(): boolean {\n        return SettingsStore.getValue(\"webrtc_audio_noiseSuppression\");\n    }\n\n    /**\n     * Returns the current set deviceId for a device kind\n     * @param {MediaDeviceKindEnum} kind of the device that will be returned\n     * @returns {string} the deviceId\n     */\n    public static getDevice(kind: MediaDeviceKindEnum): string {\n        switch (kind) {\n            case MediaDeviceKindEnum.AudioOutput:\n                return this.getAudioOutput();\n            case MediaDeviceKindEnum.AudioInput:\n                return this.getAudioInput();\n            case MediaDeviceKindEnum.VideoInput:\n                return this.getVideoInput();\n        }\n    }\n\n    public static get startWithAudioMuted(): boolean {\n        return SettingsStore.getValue(\"audioInputMuted\");\n    }\n    public static set startWithAudioMuted(value: boolean) {\n        SettingsStore.setValue(\"audioInputMuted\", null, SettingLevel.DEVICE, value);\n    }\n\n    public static get startWithVideoMuted(): boolean {\n        return SettingsStore.getValue(\"videoInputMuted\");\n    }\n    public static set startWithVideoMuted(value: boolean) {\n        SettingsStore.setValue(\"videoInputMuted\", null, SettingLevel.DEVICE, value);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, EventStatus, type Room, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport dis from \"./dispatcher/dispatcher\";\n\nexport default class Resend {\n    public static resendUnsentEvents(room: Room): Promise<void[]> {\n        return Promise.all(\n            room\n                .getPendingEvents()\n                .filter(function (ev: MatrixEvent) {\n                    return ev.status === EventStatus.NOT_SENT;\n                })\n                .map(function (event: MatrixEvent) {\n                    return Resend.resend(room.client, event);\n                }),\n        );\n    }\n\n    public static cancelUnsentEvents(room: Room): void {\n        room.getPendingEvents()\n            .filter(function (ev: MatrixEvent) {\n                return ev.status === EventStatus.NOT_SENT;\n            })\n            .forEach(function (event: MatrixEvent) {\n                Resend.removeFromQueue(room.client, event);\n            });\n    }\n\n    public static resend(client: MatrixClient, event: MatrixEvent): Promise<void> {\n        const room = client.getRoom(event.getRoomId())!;\n        return client.resendEvent(event, room).then(\n            function (res) {\n                dis.dispatch({\n                    action: \"message_sent\",\n                    event: event,\n                });\n            },\n            function (err: Error) {\n                // XXX: temporary logging to try to diagnose\n                // https://github.com/vector-im/element-web/issues/3148\n                logger.log(\"Resend got send failure: \" + err.name + \"(\" + err + \")\");\n            },\n        );\n    }\n\n    public static removeFromQueue(client: MatrixClient, event: MatrixEvent): void {\n        client.cancelPendingEvent(event);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017 Vector Creations Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { _t } from \"./languageHandler\";\n\nexport function levelRoleMap(usersDefault: number): Record<number | \"undefined\", string> {\n    return {\n        undefined: _t(\"power_level|default\"),\n        0: _t(\"power_level|restricted\"),\n        [usersDefault]: _t(\"power_level|default\"),\n        50: _t(\"power_level|moderator\"),\n        100: _t(\"power_level|admin\"),\n    };\n}\n\nexport function textualPowerLevel(level: number, usersDefault: number): string {\n    const LEVEL_ROLE_MAP = levelRoleMap(usersDefault);\n    if (LEVEL_ROLE_MAP[level]) {\n        return LEVEL_ROLE_MAP[level];\n    } else {\n        return _t(\"power_level|custom\", { level });\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\ntype CacheResult = { roomId: string; viaServers: string[] };\n\n/**\n * This is meant to be a cache of room alias to room ID so that moving between\n * rooms happens smoothly (for example using browser back / forward buttons).\n *\n * For the moment, it's in memory only and so only applies for the current\n * session for simplicity, but could be extended further in the future.\n *\n * A similar thing could also be achieved via `pushState` with a state object,\n * but keeping it separate like this seems easier in case we do want to extend.\n */\nconst cache = new Map<string, CacheResult>();\n\nexport function storeRoomAliasInCache(alias: string, roomId: string, viaServers: string[]): void {\n    cache.set(alias, { roomId, viaServers });\n}\n\nexport function getCachedRoomIdForAlias(alias: string): CacheResult | undefined {\n    return cache.get(alias);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2016-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ComponentProps } from \"react\";\nimport { EventType, type MatrixEvent, type Room, type User } from \"matrix-js-sdk/src/matrix\";\n\nimport type MultiInviter from \"./utils/MultiInviter\";\nimport { type CompletionStates } from \"./utils/MultiInviter\";\nimport Modal from \"./Modal\";\nimport { _t } from \"./languageHandler\";\nimport InviteDialog from \"./components/views/dialogs/InviteDialog\";\nimport BaseAvatar from \"./components/views/avatars/BaseAvatar\";\nimport { mediaFromMxc } from \"./customisations/Media\";\nimport ErrorDialog from \"./components/views/dialogs/ErrorDialog\";\nimport { InviteKind } from \"./components/views/dialogs/InviteDialogTypes\";\nimport { type Member } from \"./utils/direct-messages\";\n\nexport function showStartChatInviteDialog(initialText = \"\"): void {\n    // This dialog handles the room creation internally - we don't need to worry about it.\n    Modal.createDialog(\n        InviteDialog,\n        { kind: InviteKind.Dm, initialText },\n        /*className=*/ \"mx_InviteDialog_flexWrapper\",\n        /*isPriority=*/ false,\n        /*isStatic=*/ true,\n    );\n}\n\nexport function showRoomInviteDialog(roomId: string, initialText = \"\"): void {\n    // This dialog handles the room creation internally - we don't need to worry about it.\n    Modal.createDialog(\n        InviteDialog,\n        {\n            kind: InviteKind.Invite,\n            initialText,\n            roomId,\n        } as Omit<ComponentProps<typeof InviteDialog>, \"onFinished\">,\n        /*className=*/ \"mx_InviteDialog_flexWrapper\",\n        /*isPriority=*/ false,\n        /*isStatic=*/ true,\n    );\n}\n\n/**\n * Checks if the given MatrixEvent is a valid 3rd party user invite.\n * @param {MatrixEvent} event The event to check\n * @returns {boolean} True if valid, false otherwise\n */\nexport function isValid3pidInvite(event: MatrixEvent): boolean {\n    if (!event || event.getType() !== EventType.RoomThirdPartyInvite) return false;\n\n    // any events without these keys are not valid 3pid invites, so we ignore them\n    const requiredKeys = [\"key_validity_url\", \"public_key\", \"display_name\"];\n    if (requiredKeys.some((key) => !event.getContent()[key])) {\n        return false;\n    }\n\n    // Valid enough by our standards\n    return true;\n}\n\nexport function showAnyInviteErrors(\n    states: CompletionStates,\n    room: Room,\n    inviter: MultiInviter,\n    userMap?: Map<string, Member>,\n): boolean {\n    // Show user any errors\n    const failedUsers = Object.keys(states).filter((a) => states[a] === \"error\");\n    if (failedUsers.length === 1 && inviter.fatal) {\n        // Just get the first message because there was a fatal problem on the first\n        // user. This usually means that no other users were attempted, making it\n        // pointless for us to list who failed exactly.\n        Modal.createDialog(ErrorDialog, {\n            title: _t(\"invite|room_failed_title\", { roomName: room.name }),\n            description: inviter.getErrorText(failedUsers[0]),\n        });\n        return false;\n    } else {\n        const errorList: string[] = [];\n        for (const addr of failedUsers) {\n            if (states[addr] === \"error\") {\n                const reason = inviter.getErrorText(addr);\n                errorList.push(addr + \": \" + reason);\n            }\n        }\n\n        const cli = room.client;\n        if (errorList.length > 0) {\n            // React 16 doesn't let us use `errorList.join(<br />)` anymore, so this is our solution\n            const description = (\n                <div className=\"mx_InviteDialog_multiInviterError\">\n                    <h4>\n                        {_t(\n                            \"invite|room_failed_partial\",\n                            {},\n                            {\n                                RoomName: () => <strong>{room.name}</strong>,\n                            },\n                        )}\n                    </h4>\n                    <div>\n                        {failedUsers.map((addr) => {\n                            const user = userMap?.get(addr) || cli.getUser(addr);\n                            const name = (user as Member).name || (user as User).rawDisplayName;\n                            const avatarUrl = (user as Member).getMxcAvatarUrl?.() || (user as User).avatarUrl;\n                            return (\n                                <div key={addr} className=\"mx_InviteDialog_tile mx_InviteDialog_tile--inviterError\">\n                                    <div className=\"mx_InviteDialog_tile_avatarStack\">\n                                        <BaseAvatar\n                                            url={\n                                                (avatarUrl && mediaFromMxc(avatarUrl).getSquareThumbnailHttp(24)) ??\n                                                undefined\n                                            }\n                                            name={name!}\n                                            idName={user?.userId}\n                                            size=\"36px\"\n                                        />\n                                    </div>\n                                    <div className=\"mx_InviteDialog_tile_nameStack\">\n                                        <span className=\"mx_InviteDialog_tile_nameStack_name\">{name}</span>\n                                        <span className=\"mx_InviteDialog_tile_nameStack_userId\">{user?.userId}</span>\n                                    </div>\n                                    <div className=\"mx_InviteDialog_tile--inviterError_errorText\">\n                                        {inviter.getErrorText(addr)}\n                                    </div>\n                                </div>\n                            );\n                        })}\n                    </div>\n                </div>\n            );\n\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"invite|room_failed_partial_title\"),\n                description,\n            });\n            return false;\n        }\n    }\n\n    return true;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2016-2019 , 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { PushProcessor } from \"matrix-js-sdk/src/pushprocessor\";\nimport {\n    NotificationCountType,\n    ConditionKind,\n    PushRuleActionName,\n    PushRuleKind,\n    TweakName,\n    EventStatus,\n} from \"matrix-js-sdk/src/matrix\";\n\nimport type { IPushRule, Room, MatrixClient, MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { NotificationLevel } from \"./stores/notifications/NotificationLevel\";\nimport { doesRoomHaveUnreadMessages, doesRoomOrThreadHaveUnreadMessages } from \"./Unread\";\nimport { EffectiveMembership, getEffectiveMembership, isKnockDenied } from \"./utils/membership\";\nimport SettingsStore from \"./settings/SettingsStore\";\nimport { getMarkedUnreadState } from \"./utils/notifications\";\n\n/**\n * Gets all pending events in a room that have a status of `EventStatus.NOT_SENT`\n * and belong to the current thread, if specified.\n * @param room The room to check.\n * @param threadId The thread to check. If not specified, no thread filtering is performed.\n * @returns An array of unsent matrix events.\n */\nexport function getUnsentMessages(room: Room, threadId?: string): MatrixEvent[] {\n    if (!room) {\n        return [];\n    }\n    return room.getPendingEvents().filter(function (ev) {\n        if (ev.status !== EventStatus.NOT_SENT) {\n            return false;\n        }\n        if (threadId && threadId !== ev.threadRootId) {\n            return false;\n        }\n        return true;\n    });\n}\n\nexport enum RoomNotifState {\n    AllMessagesLoud = \"all_messages_loud\",\n    AllMessages = \"all_messages\",\n    MentionsOnly = \"mentions_only\",\n    Mute = \"mute\",\n}\n\nexport function getRoomNotifsState(client: MatrixClient, roomId: string): RoomNotifState | null {\n    if (client.isGuest()) return RoomNotifState.AllMessages;\n\n    // look through the override rules for a rule affecting this room:\n    // if one exists, it will take precedence.\n    const muteRule = findOverrideMuteRule(client, roomId);\n    if (muteRule) {\n        return RoomNotifState.Mute;\n    }\n\n    // for everything else, look at the room rule.\n    let roomRule: IPushRule | undefined;\n    try {\n        roomRule = client.getRoomPushRule(\"global\", roomId);\n    } catch {\n        // Possible that the client doesn't have pushRules yet. If so, it\n        // hasn't started either, so indicate that this room is not notifying.\n        return null;\n    }\n\n    // XXX: We have to assume the default is to notify for all messages\n    // (in particular this will be 'wrong' for one to one rooms because\n    // they will notify loudly for all messages)\n    if (!roomRule?.enabled) return RoomNotifState.AllMessages;\n\n    // a mute at the room level will still allow mentions\n    // to notify\n    if (isMuteRule(roomRule)) return RoomNotifState.MentionsOnly;\n\n    const actionsObject = PushProcessor.actionListToActionsObject(roomRule.actions);\n    if (actionsObject.tweaks.sound) return RoomNotifState.AllMessagesLoud;\n\n    return null;\n}\n\nexport function setRoomNotifsState(client: MatrixClient, roomId: string, newState: RoomNotifState): Promise<void> {\n    if (newState === RoomNotifState.Mute) {\n        return setRoomNotifsStateMuted(client, roomId);\n    } else {\n        return setRoomNotifsStateUnmuted(client, roomId, newState);\n    }\n}\n\nexport function getUnreadNotificationCount(\n    room: Room,\n    type: NotificationCountType,\n    includeThreads: boolean,\n    threadId?: string,\n): number {\n    const getCountShownForRoom = (r: Room, type: NotificationCountType): number => {\n        return includeThreads ? r.getUnreadNotificationCount(type) : r.getRoomUnreadNotificationCount(type);\n    };\n\n    let notificationCount = !!threadId\n        ? room.getThreadUnreadNotificationCount(threadId, type)\n        : getCountShownForRoom(room, type);\n\n    // Check notification counts in the old room just in case there's some lost\n    // there. We only go one level down to avoid performance issues, and theory\n    // is that 1st generation rooms will have already been read by the 3rd generation.\n    const msc3946ProcessDynamicPredecessor = SettingsStore.getValue(\"feature_dynamic_room_predecessors\");\n    const predecessor = room.findPredecessor(msc3946ProcessDynamicPredecessor);\n    // Exclude threadId, as the same thread can't continue over a room upgrade\n    if (!threadId && predecessor?.roomId) {\n        const oldRoomId = predecessor.roomId;\n        const oldRoom = room.client.getRoom(oldRoomId);\n        if (oldRoom) {\n            // We only ever care if there's highlights in the old room. No point in\n            // notifying the user for unread messages because they would have extreme\n            // difficulty changing their notification preferences away from \"All Messages\"\n            // and \"Noisy\".\n            notificationCount += getCountShownForRoom(oldRoom, NotificationCountType.Highlight);\n        }\n    }\n\n    return notificationCount;\n}\n\nfunction setRoomNotifsStateMuted(cli: MatrixClient, roomId: string): Promise<any> {\n    const promises: Promise<unknown>[] = [];\n\n    // delete the room rule\n    const roomRule = cli.getRoomPushRule(\"global\", roomId);\n    if (roomRule) {\n        promises.push(cli.deletePushRule(\"global\", PushRuleKind.RoomSpecific, roomRule.rule_id));\n    }\n\n    // add/replace an override rule to squelch everything in this room\n    // NB. We use the room ID as the name of this rule too, although this\n    // is an override rule, not a room rule: it still pertains to this room\n    // though, so using the room ID as the rule ID is logical and prevents\n    // duplicate copies of the rule.\n    promises.push(\n        cli.addPushRule(\"global\", PushRuleKind.Override, roomId, {\n            conditions: [\n                {\n                    kind: ConditionKind.EventMatch,\n                    key: \"room_id\",\n                    pattern: roomId,\n                },\n            ],\n            actions: [PushRuleActionName.DontNotify],\n        }),\n    );\n\n    return Promise.all(promises);\n}\n\nfunction setRoomNotifsStateUnmuted(cli: MatrixClient, roomId: string, newState: RoomNotifState): Promise<any> {\n    const promises: Promise<unknown>[] = [];\n\n    const overrideMuteRule = findOverrideMuteRule(cli, roomId);\n    if (overrideMuteRule) {\n        promises.push(cli.deletePushRule(\"global\", PushRuleKind.Override, overrideMuteRule.rule_id));\n    }\n\n    if (newState === RoomNotifState.AllMessages) {\n        const roomRule = cli.getRoomPushRule(\"global\", roomId);\n        if (roomRule) {\n            promises.push(cli.deletePushRule(\"global\", PushRuleKind.RoomSpecific, roomRule.rule_id));\n        }\n    } else if (newState === RoomNotifState.MentionsOnly) {\n        promises.push(\n            cli.addPushRule(\"global\", PushRuleKind.RoomSpecific, roomId, {\n                actions: [PushRuleActionName.DontNotify],\n            }),\n        );\n    } else if (newState === RoomNotifState.AllMessagesLoud) {\n        promises.push(\n            cli.addPushRule(\"global\", PushRuleKind.RoomSpecific, roomId, {\n                actions: [\n                    PushRuleActionName.Notify,\n                    {\n                        set_tweak: TweakName.Sound,\n                        value: \"default\",\n                    },\n                ],\n            }),\n        );\n    }\n\n    return Promise.all(promises);\n}\n\nfunction findOverrideMuteRule(cli: MatrixClient | undefined, roomId: string): IPushRule | null {\n    if (!cli?.pushRules?.global?.override) {\n        return null;\n    }\n    for (const rule of cli.pushRules.global.override) {\n        if (rule.enabled && isRuleRoomMuteRuleForRoomId(roomId, rule)) {\n            return rule;\n        }\n    }\n    return null;\n}\n\n/**\n * Checks if a given rule is a room mute rule as implemented by EW\n * - matches every event in one room (one condition that is an event match on roomId)\n * - silences notifications (one action that is `DontNotify`)\n * @param rule - push rule\n * @returns {boolean} - true when rule mutes a room\n */\nexport function isRuleMaybeRoomMuteRule(rule: IPushRule): boolean {\n    return (\n        // matches every event in one room\n        rule.conditions?.length === 1 &&\n        rule.conditions[0].kind === ConditionKind.EventMatch &&\n        rule.conditions[0].key === \"room_id\" &&\n        // silences notifications\n        isMuteRule(rule)\n    );\n}\n\n/**\n * Checks if a given rule is a room mute rule as implemented by EW\n * @param roomId - id of room to match\n * @param rule - push rule\n * @returns {boolean} true when rule mutes the given room\n */\nfunction isRuleRoomMuteRuleForRoomId(roomId: string, rule: IPushRule): boolean {\n    if (!isRuleMaybeRoomMuteRule(rule)) {\n        return false;\n    }\n    // isRuleMaybeRoomMuteRule checks this condition exists\n    const cond = rule.conditions![0]!;\n    return cond.pattern === roomId;\n}\n\nfunction isMuteRule(rule: IPushRule): boolean {\n    // DontNotify is equivalent to the empty actions array\n    return (\n        rule.actions.length === 0 || (rule.actions.length === 1 && rule.actions[0] === PushRuleActionName.DontNotify)\n    );\n}\n\n/**\n * Returns an object giving information about the unread state of a room or thread\n * @param room The room to query, or the room the thread is in\n * @param threadId The thread to check the unread state of, or undefined to query the main thread\n * @param includeThreads If threadId is undefined, true to include threads other than the main thread, or\n *   false to exclude them. Ignored if threadId is specified.\n * @returns\n */\nexport function determineUnreadState(\n    room?: Room,\n    threadId?: string,\n    includeThreads?: boolean,\n): { level: NotificationLevel; symbol: string | null; count: number; invited: boolean } {\n    if (!room) {\n        return { symbol: null, count: 0, level: NotificationLevel.None, invited: false };\n    }\n\n    if (getUnsentMessages(room, threadId).length > 0) {\n        return { symbol: \"!\", count: 1, level: NotificationLevel.Unsent, invited: false };\n    }\n\n    if (getEffectiveMembership(room.getMyMembership()) === EffectiveMembership.Invite) {\n        return { symbol: \"!\", count: 1, level: NotificationLevel.Highlight, invited: true };\n    }\n\n    if (SettingsStore.getValue(\"feature_ask_to_join\") && isKnockDenied(room)) {\n        return { symbol: \"!\", count: 1, level: NotificationLevel.Highlight, invited: false };\n    }\n\n    if (getRoomNotifsState(room.client, room.roomId) === RoomNotifState.Mute) {\n        return { symbol: null, count: 0, level: NotificationLevel.None, invited: false };\n    }\n\n    const redNotifs = getUnreadNotificationCount(\n        room,\n        NotificationCountType.Highlight,\n        includeThreads ?? false,\n        threadId,\n    );\n    const greyNotifs = getUnreadNotificationCount(room, NotificationCountType.Total, includeThreads ?? false, threadId);\n\n    const trueCount = greyNotifs || redNotifs;\n    if (redNotifs > 0) {\n        return { symbol: null, count: trueCount, level: NotificationLevel.Highlight, invited: false };\n    }\n\n    const markedUnreadState = getMarkedUnreadState(room);\n    if (greyNotifs > 0 || markedUnreadState) {\n        return { symbol: null, count: trueCount, level: NotificationLevel.Notification, invited: false };\n    }\n\n    // We don't have any notified messages, but we might have unread messages. Let's find out.\n    let hasUnread = false;\n    if (threadId) {\n        const thread = room.getThread(threadId);\n        if (thread) {\n            hasUnread = doesRoomOrThreadHaveUnreadMessages(thread);\n        }\n        // If the thread does not exist, assume it contains no unreads\n    } else {\n        hasUnread = doesRoomHaveUnreadMessages(room, includeThreads ?? false);\n    }\n\n    return {\n        symbol: null,\n        count: trueCount,\n        level: hasUnread ? NotificationLevel.Activity : NotificationLevel.None,\n        invited: false,\n    };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room, EventType, type RoomMember, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport AliasCustomisations from \"./customisations/Alias\";\nimport { filterValidMDirect } from \"./utils/dm/filterValidMDirect.ts\";\n\n/**\n * Given a room object, return the alias we should use for it,\n * if any. This could be the canonical alias if one exists, otherwise\n * an alias selected arbitrarily but deterministically from the list\n * of aliases. Otherwise return null;\n *\n * @param {Object} room The room object\n * @returns {string} A display alias for the given room\n */\nexport function getDisplayAliasForRoom(room: Room): string | null {\n    return getDisplayAliasForAliasSet(room.getCanonicalAlias(), room.getAltAliases());\n}\n\n// The various display alias getters should all feed through this one path so\n// there's a single place to change the logic.\nexport function getDisplayAliasForAliasSet(canonicalAlias: string | null, altAliases: string[]): string | null {\n    if (AliasCustomisations.getDisplayAliasForAliasSet) {\n        return AliasCustomisations.getDisplayAliasForAliasSet(canonicalAlias, altAliases);\n    }\n    return (canonicalAlias || altAliases?.[0]) ?? \"\";\n}\n\nexport function guessAndSetDMRoom(room: Room, isDirect: boolean): Promise<void> {\n    let newTarget;\n    if (isDirect) {\n        const guessedUserId = guessDMRoomTargetId(room, room.client.getSafeUserId());\n        newTarget = guessedUserId;\n    } else {\n        newTarget = null;\n    }\n\n    return setDMRoom(room.client, room.roomId, newTarget);\n}\n\n/**\n * Marks or unmarks the given room as being as a DM room.\n * @param client the Matrix Client instance of the logged-in user\n * @param {string} roomId The ID of the room to modify\n * @param {string | null} userId The user ID of the desired DM room target user or\n *                        null to un-mark this room as a DM room\n * @returns {object} A promise\n */\nexport async function setDMRoom(client: MatrixClient, roomId: string, userId: string | null): Promise<void> {\n    if (client.isGuest()) return;\n\n    const mDirectEvent = client.getAccountData(EventType.Direct);\n    const { filteredContent } = filterValidMDirect(mDirectEvent?.getContent() ?? {});\n\n    // remove it from the lists of all users (it can only be a DM room for one person)\n    for (const thisUserId in filteredContent) {\n        if (!filteredContent[thisUserId]) continue;\n        filteredContent[thisUserId] = filteredContent[thisUserId].filter((room) => room !== roomId);\n    }\n\n    // now add it if the caller asked for it to be a DM room\n    if (userId) {\n        if (!filteredContent[userId]) {\n            filteredContent[userId] = [];\n        }\n        filteredContent[userId].push(roomId);\n    }\n\n    await client.setAccountData(EventType.Direct, filteredContent);\n}\n\n/**\n * Given a room, estimate which of its members is likely to\n * be the target if the room were a DM room and return that user.\n *\n * @param {Object} room Target room\n * @param {string} myUserId User ID of the current user\n * @returns {string} User ID of the user that the room is probably a DM with\n */\nfunction guessDMRoomTargetId(room: Room, myUserId: string): string {\n    let oldestTs: number | undefined;\n    let oldestUser: RoomMember | undefined;\n\n    // Pick the joined user who's been here longest (and isn't us),\n    for (const user of room.getJoinedMembers()) {\n        if (user.userId == myUserId) continue;\n\n        if (oldestTs === undefined || (user.events.member && user.events.member.getTs() < oldestTs)) {\n            oldestUser = user;\n            oldestTs = user.events.member?.getTs();\n        }\n    }\n    if (oldestUser) return oldestUser.userId;\n\n    // if there are no joined members other than us, use the oldest member\n    for (const user of room.currentState.getMembers()) {\n        if (user.userId == myUserId) continue;\n\n        if (oldestTs === undefined || (user.events.member && user.events.member.getTs() < oldestTs)) {\n            oldestUser = user;\n            oldestTs = user.events.member?.getTs();\n        }\n    }\n\n    if (oldestUser === undefined) return myUserId;\n    return oldestUser.userId;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2018-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { Button, PasswordInput } from \"@vector-im/compound-web\";\nimport LockSolidIcon from \"@vector-im/compound-design-tokens/assets/web/icons/lock-solid\";\nimport { debounce } from \"lodash\";\nimport classNames from \"classnames\";\nimport React, { type ChangeEvent, type FormEvent, type ReactNode } from \"react\";\nimport { type SecretStorage } from \"matrix-js-sdk/src/matrix\";\nimport { Flex } from \"@element-hq/web-shared-components\";\nimport { ErrorSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../../languageHandler\";\nimport { EncryptionCard } from \"../../settings/encryption/EncryptionCard\";\nimport { EncryptionCardButtons } from \"../../settings/encryption/EncryptionCardButtons\";\nimport BaseDialog from \"../BaseDialog\";\n\n// Don't shout at the user that their key is invalid every time they type a key: wait a short time\nconst VALIDATION_THROTTLE_MS = 200;\n\nexport type KeyParams = { passphrase?: string; recoveryKey?: string };\n\ninterface IProps {\n    /**\n     * Information about the Secret Storage key that we want to get.\n     */\n    keyInfo: SecretStorage.SecretStorageKeyDescription;\n    /**\n     * Callback to check whether the given key is correct.\n     */\n    checkPrivateKey: (k: KeyParams) => Promise<boolean>;\n    /**\n     * Callback for when the user is done with this dialog.  `result` will\n     * contain information about the key that was entered, or will be `false` if\n     * the user cancelled.\n     */\n    onFinished(result?: false | KeyParams): void;\n}\n\ninterface IState {\n    //! The recovery key/phrase that the user entered\n    recoveryKey: string;\n    //! Is the recovery key/phrase correct?  `null` means no key/phrase has been entered\n    recoveryKeyCorrect: boolean | null;\n}\n\n/*\n * Access Secure Secret Storage by requesting the user's passphrase.\n */\nexport default class AccessSecretStorageDialog extends React.PureComponent<IProps, IState> {\n    private inputRef = React.createRef<HTMLInputElement>();\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            recoveryKey: \"\",\n            recoveryKeyCorrect: null,\n        };\n    }\n\n    private onCancel = (): void => {\n        this.props.onFinished(false);\n    };\n\n    private validateRecoveryKeyOnChange = debounce(async (): Promise<void> => {\n        await this.validateRecoveryKey(this.state.recoveryKey);\n    }, VALIDATION_THROTTLE_MS);\n\n    /**\n     * Checks whether the security key/phrase is correct.\n     *\n     * Sets `state.recoveryKeyCorrect` accordingly, and if the key/phrase is\n     * correct, returns a `KeyParams` structure.\n     */\n    private async validateRecoveryKey(recoveryKey: string): Promise<KeyParams | undefined> {\n        recoveryKey = recoveryKey.trim();\n\n        if (recoveryKey === \"\") {\n            this.setState({\n                recoveryKeyCorrect: null,\n            });\n            return;\n        }\n\n        const hasPassphrase = this.props.keyInfo?.passphrase?.salt && this.props.keyInfo?.passphrase?.iterations;\n\n        // If the user has a passphrase, we want to try validating it both as a\n        // key and as a passphrase.  We first try to validate it as a key, since\n        // that check is faster.\n\n        try {\n            const input = { recoveryKey };\n            const recoveryKeyCorrect = await this.props.checkPrivateKey(input);\n            if (recoveryKeyCorrect) {\n                this.setState({ recoveryKeyCorrect });\n                return input;\n            }\n        } catch {}\n\n        if (hasPassphrase) {\n            try {\n                const input = { passphrase: recoveryKey };\n                const recoveryKeyCorrect = await this.props.checkPrivateKey(input);\n                if (recoveryKeyCorrect) {\n                    this.setState({ recoveryKeyCorrect });\n                    return input;\n                }\n            } catch {}\n        }\n\n        this.setState({\n            recoveryKeyCorrect: false,\n        });\n    }\n\n    private onRecoveryKeyChange = (ev: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({\n            recoveryKey: ev.target.value,\n        });\n\n        // We don't use Field's validation here because we want it in a separate place rather\n        // than in a tooltip. Ideally we would refactor Field's validation logic so we could\n        // re-use some of it.\n        this.validateRecoveryKeyOnChange();\n    };\n\n    private onRecoveryKeyNext = async (ev: FormEvent<HTMLFormElement> | React.MouseEvent): Promise<void> => {\n        ev.preventDefault();\n\n        const keyParams = await this.validateRecoveryKey(this.state.recoveryKey);\n\n        if (keyParams !== undefined) {\n            this.props.onFinished(keyParams);\n        } else {\n            this.inputRef.current?.focus();\n        }\n    };\n\n    private getRecoveryKeyFeedback(): React.ReactNode | null {\n        let content: ReactNode;\n        let classes: string | undefined;\n\n        if (this.state.recoveryKeyCorrect) {\n            // The recovery key is good. Empty feedback.\n            content = \"\\xA0\"; // &nbsp;\n        } else if (this.state.recoveryKeyCorrect === null) {\n            // The input element is empty. Tell the user they can also use a passphrase.\n            content = _t(\"encryption|access_secret_storage_dialog|alternatives\");\n        } else {\n            // The entered key is not (yet) correct. Tell them so.\n            content = (\n                <>\n                    <ErrorSolidIcon />\n                    {_t(\"encryption|access_secret_storage_dialog|key_validation_text|wrong_security_key\")}\n                </>\n            );\n            classes = \"mx_AccessSecretStorageDialog_recoveryKeyFeedback--invalid\";\n        }\n\n        return (\n            <Flex align=\"center\" className={classNames(\"mx_AccessSecretStorageDialog_recoveryKeyFeedback\", classes)}>\n                {content}\n            </Flex>\n        );\n    }\n\n    public render(): React.ReactNode {\n        const title = _t(\"encryption|access_secret_storage_dialog|security_key_title\");\n\n        const recoveryKeyFeedback = this.getRecoveryKeyFeedback();\n        const content = (\n            <div>\n                <form\n                    className=\"mx_AccessSecretStorageDialog_primaryContainer\"\n                    onSubmit={this.onRecoveryKeyNext}\n                    spellCheck={false}\n                    autoComplete=\"off\"\n                >\n                    <div className=\"mx_AccessSecretStorageDialog_recoveryKeyEntry\">\n                        <PasswordInput\n                            ref={this.inputRef}\n                            id=\"mx_securityKey\"\n                            title={_t(\"encryption|access_secret_storage_dialog|security_key_label\")}\n                            placeholder={_t(\"encryption|access_secret_storage_dialog|security_key_label\")}\n                            value={this.state.recoveryKey}\n                            onChange={this.onRecoveryKeyChange}\n                            autoFocus={true}\n                            autoComplete=\"off\"\n                        />\n                    </div>\n                    {recoveryKeyFeedback}\n                    <EncryptionCardButtons>\n                        <Button disabled={!this.state.recoveryKeyCorrect} onClick={this.onRecoveryKeyNext}>\n                            {_t(\"action|continue\")}\n                        </Button>\n                        <Button kind=\"tertiary\" onClick={this.onCancel}>\n                            {_t(\"action|cancel\")}\n                        </Button>\n                    </EncryptionCardButtons>\n                </form>\n            </div>\n        );\n\n        // We wrap the content in `BaseDialog` mostly so that we get a `FocusLock` container; otherwise, if the\n        // SettingsDialog is open, then the `FocusLock` in *that* stops us getting the focus.\n        return (\n            <BaseDialog fixedWidth={false} hasCancel={false}>\n                <EncryptionCard\n                    Icon={LockSolidIcon}\n                    className=\"mx_AccessSecretStorageDialog\"\n                    title={title}\n                    description={_t(\"encryption|access_secret_storage_dialog|privacy_warning\")}\n                >\n                    {content}\n                </EncryptionCard>\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { lazy } from \"react\";\nimport { type SecretStorage } from \"matrix-js-sdk/src/matrix\";\nimport { deriveRecoveryKeyFromPassphrase, decodeRecoveryKey, type CryptoCallbacks } from \"matrix-js-sdk/src/crypto-api\";\nimport { logger as rootLogger } from \"matrix-js-sdk/src/logger\";\n\nimport Modal from \"./Modal\";\nimport { MatrixClientPeg } from \"./MatrixClientPeg\";\nimport { _t } from \"./languageHandler\";\nimport AccessSecretStorageDialog, {\n    type KeyParams,\n} from \"./components/views/dialogs/security/AccessSecretStorageDialog\";\nimport { ModuleRunner } from \"./modules/ModuleRunner\";\nimport InteractiveAuthDialog from \"./components/views/dialogs/InteractiveAuthDialog\";\n\n// This stores the secret storage private keys in memory for the JS SDK. This is\n// only meant to act as a cache to avoid prompting the user multiple times\n// during the same single operation. Use `accessSecretStorage` below to scope a\n// single secret storage operation, as it will clear the cached keys once the\n// operation ends.\nlet secretStorageKeys: Record<string, Uint8Array<ArrayBuffer>> = {};\nlet secretStorageKeyInfo: Record<string, SecretStorage.SecretStorageKeyDescription> = {};\nlet secretStorageBeingAccessed = false;\n\nconst logger = rootLogger.getChild(\"SecurityManager:\");\n\n/**\n * This can be used by other components to check if secret storage access is in\n * progress, so that we can e.g. avoid intermittently showing toasts during\n * secret storage setup.\n *\n * @returns {bool}\n */\nexport function isSecretStorageBeingAccessed(): boolean {\n    return secretStorageBeingAccessed;\n}\n\nexport class AccessCancelledError extends Error {\n    public constructor() {\n        super(\"Secret storage access canceled\");\n    }\n}\n\nfunction makeInputToKey(\n    keyInfo: SecretStorage.SecretStorageKeyDescription,\n): (keyParams: KeyParams) => Promise<Uint8Array<ArrayBuffer>> {\n    return async ({ passphrase, recoveryKey }): Promise<Uint8Array<ArrayBuffer>> => {\n        if (passphrase) {\n            return deriveRecoveryKeyFromPassphrase(passphrase, keyInfo.passphrase.salt, keyInfo.passphrase.iterations);\n        } else if (recoveryKey) {\n            return decodeRecoveryKey(recoveryKey);\n        }\n        throw new Error(\"Invalid input, passphrase or recoveryKey need to be provided\");\n    };\n}\n\nasync function getSecretStorageKey(\n    {\n        keys: keyInfos,\n    }: {\n        keys: Record<string, SecretStorage.SecretStorageKeyDescription>;\n    },\n    secretName: string,\n): Promise<[string, Uint8Array<ArrayBuffer>]> {\n    const cli = MatrixClientPeg.safeGet();\n    const defaultKeyId = await cli.secretStorage.getDefaultKeyId();\n\n    let keyId: string;\n    // If the defaultKey is useful, use that\n    if (defaultKeyId && keyInfos[defaultKeyId]) {\n        keyId = defaultKeyId;\n    } else {\n        // Fall back to a heuristic of using the\n        // only available key, if only one key is set\n        const usefulKeys = Object.keys(keyInfos);\n        if (usefulKeys.length > 1) {\n            throw new Error(\"Multiple storage key requests not implemented\");\n        }\n        keyId = usefulKeys[0];\n    }\n    const keyInfo = keyInfos[keyId];\n    logger.debug(\n        `getSecretStorageKey: request for 4S keys [${Object.keys(keyInfos)}] for secret \\`${secretName}\\`: looking for key ${keyId}`,\n    );\n\n    // Check the in-memory cache\n    if (secretStorageBeingAccessed && secretStorageKeys[keyId]) {\n        logger.debug(`getSecretStorageKey: returning key ${keyId} from cache`);\n        return [keyId, secretStorageKeys[keyId]];\n    }\n\n    const keyFromCustomisations = ModuleRunner.instance.extensions.cryptoSetup.getSecretStorageKey();\n    if (keyFromCustomisations) {\n        logger.debug(\"getSecretStorageKey: Using secret storage key from CryptoSetupExtension\");\n        cacheSecretStorageKey(keyId, keyInfo, keyFromCustomisations);\n        return [keyId, keyFromCustomisations];\n    }\n\n    // We only prompt the user for the default key\n    if (keyId !== defaultKeyId) {\n        logger.debug(`getSecretStorageKey: request for non-default key ${keyId}: not prompting user`);\n        throw new Error(\"Request for non-default 4S key\");\n    }\n\n    logger.debug(`getSecretStorageKey: prompting user for key ${keyId}`);\n    const inputToKey = makeInputToKey(keyInfo);\n    const { finished } = Modal.createDialog(\n        AccessSecretStorageDialog,\n        /* props= */\n        {\n            keyInfo,\n            checkPrivateKey: async (input: KeyParams): Promise<boolean> => {\n                const key = await inputToKey(input);\n                return MatrixClientPeg.safeGet().secretStorage.checkKey(key, keyInfo);\n            },\n        },\n    );\n    const [keyParams] = await finished;\n    if (!keyParams) {\n        throw new AccessCancelledError();\n    }\n    logger.debug(`getSecretStorageKey: got key ${keyId} from user`);\n    const key = await inputToKey(keyParams);\n\n    // Save to cache to avoid future prompts in the current session\n    cacheSecretStorageKey(keyId, keyInfo, key);\n\n    return [keyId, key];\n}\n\nfunction cacheSecretStorageKey(\n    keyId: string,\n    keyInfo: SecretStorage.SecretStorageKeyDescription,\n    key: Uint8Array<ArrayBuffer>,\n): void {\n    if (secretStorageBeingAccessed) {\n        logger.debug(`Caching 4S key ${keyId}`);\n        secretStorageKeys[keyId] = key;\n        secretStorageKeyInfo[keyId] = keyInfo;\n    }\n}\n\nexport const crossSigningCallbacks: CryptoCallbacks = {\n    getSecretStorageKey,\n    cacheSecretStorageKey,\n};\n\n/**\n * Carry out an operation that may require multiple accesses to secret storage, caching the key.\n *\n * Use this helper to wrap an operation that may require multiple accesses to secret storage; the user will be prompted\n * to enter the 4S key or passphrase on the first access, and the key will be cached for the rest of the operation.\n *\n * @param func - The operation to be wrapped.\n */\nexport async function withSecretStorageKeyCache<T>(func: () => Promise<T>): Promise<T> {\n    logger.debug(\"enabling 4S key cache\");\n    secretStorageBeingAccessed = true;\n    try {\n        return await func();\n    } finally {\n        // Clear secret storage key cache now that work is complete\n        logger.debug(\"disabling 4S key cache\");\n        secretStorageBeingAccessed = false;\n        secretStorageKeys = {};\n        secretStorageKeyInfo = {};\n    }\n}\n\nexport interface AccessSecretStorageOpts {\n    /**\n     * Reset secret storage even if it's already set up.\n     * @deprecated send the user to the Encryption settings tab to reset secret storage\n     */\n    forceReset?: boolean;\n}\n\n/**\n * This helper should be used whenever you need to access secret storage. It\n * ensures that secret storage (and also cross-signing since they each depend on\n * each other in a cycle of sorts) have been bootstrapped before running the\n * provided function.\n *\n * Bootstrapping secret storage may take one of these paths:\n * 1. (Only if `opts.forceReset` is set) create secret storage from a passphrase\n *    and store cross-signing keys in secret storage.\n * 2. Access existing secret storage by requesting passphrase and accessing\n *    cross-signing keys as needed.\n * 3. All keys are loaded and there's nothing to do.\n *\n * Additionally, the secret storage keys are cached during the scope of this function\n * to ensure the user is prompted only once for their secret storage\n * passphrase. The cache is then cleared once the provided function completes.\n *\n * Throws an error if secret storage is not set up (and `opts.forceReset` is not set)\n *\n * @param {Function} [func] An operation to perform once secret storage has been\n * bootstrapped. Optional.\n * @param [opts] The options to use when accessing secret storage.\n */\nexport async function accessSecretStorage(\n    func = async (): Promise<void> => {},\n    opts: AccessSecretStorageOpts = {},\n): Promise<void> {\n    await withSecretStorageKeyCache(() => doAccessSecretStorage(func, opts));\n}\n\n/** Helper for {@link #accessSecretStorage} */\nasync function doAccessSecretStorage(func: () => Promise<void>, opts: AccessSecretStorageOpts): Promise<void> {\n    try {\n        const cli = MatrixClientPeg.safeGet();\n        const crypto = cli.getCrypto();\n        if (!crypto) {\n            throw new Error(\"End-to-end encryption is disabled - unable to access secret storage.\");\n        }\n\n        if (opts.forceReset) {\n            logger.debug(\"accessSecretStorage: resetting 4S\");\n            // This dialog calls bootstrap itself after guiding the user through\n            // passphrase creation.\n            const { finished } = Modal.createDialog(\n                lazy(() => import(\"./async-components/views/dialogs/security/CreateSecretStorageDialog\")),\n                opts,\n                undefined,\n                /* priority = */ false,\n                /* static = */ true,\n            );\n            const [confirmed] = await finished;\n            if (!confirmed) {\n                throw new Error(\"Secret storage creation canceled\");\n            }\n        } else if (!(await cli.secretStorage.hasKey())) {\n            logger.debug(\"accessSecretStorage: no 4S key configured\");\n            throw new Error(\"Secret storage has not been created yet.\");\n        } else {\n            logger.debug(\"accessSecretStorage: bootstrapCrossSigning\");\n            await crypto.bootstrapCrossSigning({\n                authUploadDeviceSigningKeys: async (makeRequest): Promise<void> => {\n                    logger.debug(\"accessSecretStorage: performing UIA to upload cross-signing keys\");\n                    const { finished } = Modal.createDialog(InteractiveAuthDialog, {\n                        title: _t(\"encryption|bootstrap_title\"),\n                        matrixClient: cli,\n                        makeRequest,\n                    });\n                    const [confirmed] = await finished;\n                    if (!confirmed) {\n                        throw new Error(\"Cross-signing key upload auth canceled\");\n                    }\n                    logger.debug(\"accessSecretStorage: Cross-signing key upload successful\");\n                },\n            });\n            logger.debug(\"accessSecretStorage: bootstrapSecretStorage\");\n            await crypto.bootstrapSecretStorage({});\n        }\n\n        logger.debug(\"accessSecretStorage: 4S now ready\");\n        // `return await` needed here to ensure `finally` block runs after the\n        // inner operation completes.\n        await func();\n        logger.debug(\"accessSecretStorage: operation complete\");\n    } catch (e) {\n        ModuleRunner.instance.extensions.cryptoSetup.catchAccessSecretStorageError(e as Error);\n        logger.error(\"accessSecretStorage: error during operation\", e);\n        // Re-throw so that higher level logic can abort as needed\n        throw e;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017 Aviral Dasgupta\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { clamp } from \"lodash\";\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { type SerializedPart } from \"./editor/parts\";\nimport type EditorModel from \"./editor/model\";\n\ninterface IHistoryItem {\n    parts: SerializedPart[];\n    replyEventId?: string;\n}\n\nexport default class SendHistoryManager {\n    public history: Array<IHistoryItem> = [];\n    public prefix: string;\n    public lastIndex = 0; // used for indexing the storage\n    public currentIndex = 0; // used for indexing the loaded validated history Array\n\n    public constructor(roomId: string, prefix: string) {\n        this.prefix = prefix + roomId;\n\n        // TODO: Performance issues?\n        let index = 0;\n        let itemJSON;\n\n        while ((itemJSON = sessionStorage.getItem(`${this.prefix}[${index}]`))) {\n            try {\n                this.history.push(JSON.parse(itemJSON));\n            } catch (e) {\n                logger.warn(\"Throwing away unserialisable history\", e);\n                break;\n            }\n            ++index;\n        }\n        this.lastIndex = this.history.length - 1;\n        // reset currentIndex to account for any unserialisable history\n        this.currentIndex = this.lastIndex + 1;\n    }\n\n    public static createItem(model: EditorModel, replyEvent?: MatrixEvent): IHistoryItem {\n        return {\n            parts: model.serializeParts(),\n            replyEventId: replyEvent ? replyEvent.getId() : undefined,\n        };\n    }\n\n    public save(editorModel: EditorModel, replyEvent?: MatrixEvent): void {\n        const item = SendHistoryManager.createItem(editorModel, replyEvent);\n        this.history.push(item);\n        this.currentIndex = this.history.length;\n        this.lastIndex += 1;\n        sessionStorage.setItem(`${this.prefix}[${this.lastIndex}]`, JSON.stringify(item));\n    }\n\n    public getItem(offset: number): IHistoryItem {\n        this.currentIndex = clamp(this.currentIndex + offset, 0, this.history.length - 1);\n        return this.history[this.currentIndex];\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport { _t } from \"../../languageHandler\";\n\nexport function getSenderName(event: MatrixEvent): string {\n    return event.sender?.name ?? event.getSender() ?? _t(\"common|someone\");\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015-2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport {\n    type MatrixEvent,\n    type MatrixClient,\n    GuestAccess,\n    HistoryVisibility,\n    JoinRule,\n    EventType,\n    MsgType,\n    M_POLL_START,\n    M_POLL_END,\n    ContentHelpers,\n} from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { removeDirectionOverrideChars } from \"matrix-js-sdk/src/utils\";\nimport { type PollStartEvent } from \"matrix-js-sdk/src/extensible_events_v1/PollStartEvent\";\nimport { type IRTCNotificationContent } from \"matrix-js-sdk/src/matrixrtc\";\n\nimport { _t } from \"./languageHandler\";\nimport * as Roles from \"./Roles\";\nimport { isValid3pidInvite } from \"./RoomInvite\";\nimport SettingsStore from \"./settings/SettingsStore\";\nimport { ALL_RULE_TYPES, ROOM_RULE_TYPES, SERVER_RULE_TYPES, USER_RULE_TYPES } from \"./mjolnir/BanList\";\nimport { WIDGET_LAYOUT_EVENT_TYPE } from \"./stores/widgets/WidgetLayoutStore\";\nimport { RightPanelPhases } from \"./stores/right-panel/RightPanelStorePhases\";\nimport defaultDispatcher from \"./dispatcher/dispatcher\";\nimport { RoomSettingsTab } from \"./components/views/dialogs/RoomSettingsDialog-tab\";\nimport AccessibleButton from \"./components/views/elements/AccessibleButton\";\nimport RightPanelStore from \"./stores/right-panel/RightPanelStore\";\nimport { highlightEvent, isLocationEvent } from \"./utils/EventUtils\";\nimport { getSenderName } from \"./utils/event/getSenderName\";\nimport PosthogTrackers from \"./PosthogTrackers.ts\";\nimport { ElementCallEventType } from \"./call-types.ts\";\nimport Spoiler from \"./components/views/elements/Spoiler.tsx\";\n\nfunction getRoomMemberDisplayname(client: MatrixClient, event: MatrixEvent, userId = event.getSender()): string {\n    const roomId = event.getRoomId();\n    const member = client.getRoom(roomId)?.getMember(userId!);\n    return member?.name || member?.rawDisplayName || userId || _t(\"common|someone\");\n}\n\nfunction textForCallEvent(event: MatrixEvent, client: MatrixClient): () => string {\n    const roomName = client.getRoom(event.getRoomId()!)?.name;\n    const isSupported = client.supportsVoip();\n\n    return isSupported\n        ? () => _t(\"timeline|m.call|video_call_started\", { roomName })\n        : () => _t(\"timeline|m.call|video_call_started_unsupported\", { roomName });\n}\n\n// These functions are frequently used just to check whether an event has\n// any text to display at all. For this reason they return deferred values\n// to avoid the expense of looking up translations when they're not needed.\n\nfunction getCallInviteText(isVoice: boolean, isSupported: boolean, senderName: string): () => string {\n    // This logic could be reduced down to dynamic string keys, however other languages\n    // can have a hard time translating those strings. In an effort to make translations easier\n    // and more accurate, we use explicit strings for each combination.\n    if (isVoice) {\n        return isSupported\n            ? () => _t(\"timeline|m.call.invite|voice_call\", { senderName })\n            : () => _t(\"timeline|m.call.invite|voice_call_unsupported\", { senderName });\n    }\n\n    return isSupported\n        ? () => _t(\"timeline|m.call.invite|video_call\", { senderName })\n        : () => _t(\"timeline|m.call.invite|video_call_unsupported\", { senderName });\n}\n\n/**\n * Resolves the textual content for incoming legacy WebRTC call events.\n */\nfunction textForCallInviteEvent(event: MatrixEvent, client: MatrixClient): (() => string) | null {\n    const senderName = getSenderName(event);\n    const content = event.getContent();\n\n    // Fallback for legacy WebRTC signaling\n    // FIXME: Find a better way to determine this from the event?\n    const isVoice = !content.offer?.sdp?.includes(\"m=video\");\n    const isSupported = client.supportsVoip();\n\n    return getCallInviteText(isVoice, isSupported, senderName);\n}\n\n/**\n * Resolves the textual content for incoming MatrixRTC notifications (MSC4075).\n */\nfunction textForRTCNotificationEvent(event: MatrixEvent, client: MatrixClient): (() => string) | null {\n    const senderName = getSenderName(event);\n    const content = event.getContent<IRTCNotificationContent>();\n\n    const isVoice = content[\"m.call.intent\"] === \"audio\";\n    const isSupported = client.supportsVoip();\n\n    return getCallInviteText(isVoice, isSupported, senderName);\n}\n\nenum Modification {\n    None,\n    Unset,\n    Set,\n    Changed,\n}\n\nfunction getModification(prev?: string, value?: string): Modification {\n    if (prev && value && prev !== value) {\n        return Modification.Changed;\n    }\n    if (prev && !value) {\n        return Modification.Unset;\n    }\n    if (!prev && value) {\n        return Modification.Set;\n    }\n\n    return Modification.None;\n}\n\nfunction textForMemberEvent(\n    ev: MatrixEvent,\n    client: MatrixClient,\n    allowJSX: boolean,\n    showHiddenEvents?: boolean,\n): (() => Renderable) | null {\n    // XXX: SYJS-16 \"sender is sometimes null for join messages\"\n    const senderName = ev.sender?.name || getRoomMemberDisplayname(client, ev);\n    const targetName = ev.target?.name || getRoomMemberDisplayname(client, ev, ev.getStateKey());\n    const prevContent = ev.getPrevContent();\n    const content = ev.getContent();\n    const reason = content.reason;\n\n    switch (content.membership) {\n        case KnownMembership.Invite: {\n            const threePidContent = content.third_party_invite;\n            if (threePidContent) {\n                if (threePidContent.display_name) {\n                    return () =>\n                        _t(\"timeline|m.room.member|accepted_3pid_invite\", {\n                            targetName,\n                            displayName: threePidContent.display_name,\n                        });\n                } else {\n                    return () => _t(\"timeline|m.room.member|accepted_invite\", { targetName });\n                }\n            } else {\n                return () => _t(\"timeline|m.room.member|invite\", { senderName, targetName });\n            }\n        }\n        case KnownMembership.Ban:\n            if (allowJSX) {\n                return reason\n                    ? () =>\n                          _t(\n                              \"timeline|m.room.member|ban_reason_spoiler\",\n                              { senderName, reason },\n                              { user: () => <Spoiler>{targetName}</Spoiler> },\n                          )\n                    : () =>\n                          _t(\n                              \"timeline|m.room.member|ban_spoiler\",\n                              { senderName },\n                              { user: () => <Spoiler>{targetName}</Spoiler> },\n                          );\n            }\n\n            return reason\n                ? () => _t(\"timeline|m.room.member|ban_reason\", { senderName, reason })\n                : () => _t(\"timeline|m.room.member|ban\", { senderName });\n\n        case KnownMembership.Join:\n            if (prevContent && prevContent.membership === KnownMembership.Join) {\n                const modDisplayname = getModification(prevContent.displayname, content.displayname);\n                const modAvatarUrl = getModification(prevContent.avatar_url, content.avatar_url);\n\n                if (modDisplayname !== Modification.None && modAvatarUrl !== Modification.None) {\n                    // Compromise to provide the user with more context without needing 16 translations\n                    return () =>\n                        _t(\"timeline|m.room.member|change_name_avatar\", {\n                            // We're taking the display namke directly from the event content here so we need\n                            // to strip direction override chars which the js-sdk would normally do when\n                            // calculating the display name\n                            oldDisplayName: removeDirectionOverrideChars(prevContent.displayname!),\n                        });\n                } else if (modDisplayname === Modification.Changed) {\n                    return () =>\n                        _t(\"timeline|m.room.member|change_name\", {\n                            // We're taking the display name directly from the event content here so we need\n                            // to strip direction override chars which the js-sdk would normally do when\n                            // calculating the display name\n                            oldDisplayName: removeDirectionOverrideChars(prevContent.displayname!),\n                            displayName: removeDirectionOverrideChars(content.displayname!),\n                        });\n                } else if (modDisplayname === Modification.Set) {\n                    return () =>\n                        _t(\"timeline|m.room.member|set_name\", {\n                            senderName: ev.getSender(),\n                            displayName: removeDirectionOverrideChars(content.displayname!),\n                        });\n                } else if (modDisplayname === Modification.Unset) {\n                    return () =>\n                        _t(\"timeline|m.room.member|remove_name\", {\n                            senderName,\n                            oldDisplayName: removeDirectionOverrideChars(prevContent.displayname!),\n                        });\n                } else if (modAvatarUrl === Modification.Unset) {\n                    return () => _t(\"timeline|m.room.member|remove_avatar\", { senderName });\n                } else if (modAvatarUrl === Modification.Changed) {\n                    return () => _t(\"timeline|m.room.member|change_avatar\", { senderName });\n                } else if (modAvatarUrl === Modification.Set) {\n                    return () => _t(\"timeline|m.room.member|set_avatar\", { senderName });\n                } else if (showHiddenEvents ?? SettingsStore.getValue(\"showHiddenEventsInTimeline\")) {\n                    // This is a null rejoin, it will only be visible if using 'show hidden events' (labs)\n                    return () => _t(\"timeline|m.room.member|no_change\", { senderName });\n                } else {\n                    return null;\n                }\n            } else {\n                if (!ev.target) logger.warn(\"Join message has no target! -- \" + ev.getContent().state_key);\n                return () => _t(\"timeline|m.room.member|join\", { targetName });\n            }\n        case KnownMembership.Leave:\n            if (ev.getSender() === ev.getStateKey()) {\n                if (prevContent.membership === KnownMembership.Invite) {\n                    return () =>\n                        reason\n                            ? _t(\"timeline|m.room.member|reject_invite_reason\", { targetName, reason })\n                            : _t(\"timeline|m.room.member|reject_invite\", { targetName });\n                } else {\n                    return () =>\n                        reason\n                            ? _t(\"timeline|m.room.member|left_reason\", { targetName, reason })\n                            : _t(\"timeline|m.room.member|left\", { targetName });\n                }\n            } else if (prevContent.membership === KnownMembership.Ban) {\n                return () => _t(\"timeline|m.room.member|unban\", { senderName, targetName });\n            } else if (prevContent.membership === KnownMembership.Invite) {\n                return () =>\n                    reason\n                        ? _t(\"timeline|m.room.member|withdrew_invite_reason\", {\n                              senderName,\n                              targetName,\n                              reason,\n                          })\n                        : _t(\"timeline|m.room.member|withdrew_invite\", { senderName, targetName });\n            } else if (prevContent.membership === KnownMembership.Join) {\n                return () =>\n                    reason\n                        ? _t(\"timeline|m.room.member|kick_reason\", {\n                              senderName,\n                              targetName,\n                              reason,\n                          })\n                        : _t(\"timeline|m.room.member|kick\", { senderName, targetName });\n            } else {\n                return null;\n            }\n    }\n\n    return null;\n}\n\nfunction textForTopicEvent(ev: MatrixEvent): (() => string) | null {\n    const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();\n    const topic = ContentHelpers.parseTopicContent(ev.getContent()).text;\n    return () =>\n        topic\n            ? _t(\"timeline|m.room.topic|changed\", {\n                  senderDisplayName,\n                  topic,\n              })\n            : _t(\"timeline|m.room.topic|removed\", {\n                  senderDisplayName,\n              });\n}\n\nfunction textForRoomAvatarEvent(ev: MatrixEvent): (() => string) | null {\n    const senderDisplayName = ev?.sender?.name || ev.getSender();\n    return () => _t(\"timeline|m.room.avatar|changed\", { senderDisplayName });\n}\n\nfunction textForRoomNameEvent(ev: MatrixEvent): (() => string) | null {\n    const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();\n\n    if (!ev.getContent().name || ev.getContent().name.trim().length === 0) {\n        return () => _t(\"timeline|m.room.name|remove\", { senderDisplayName });\n    }\n    if (ev.getPrevContent().name) {\n        return () =>\n            _t(\"timeline|m.room.name|change\", {\n                senderDisplayName,\n                oldRoomName: ev.getPrevContent().name,\n                newRoomName: ev.getContent().name,\n            });\n    }\n    return () =>\n        _t(\"timeline|m.room.name|set\", {\n            senderDisplayName,\n            roomName: ev.getContent().name,\n        });\n}\n\nfunction textForTombstoneEvent(ev: MatrixEvent): (() => string) | null {\n    const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();\n    return () => _t(\"timeline|m.room.tombstone\", { senderDisplayName });\n}\n\nconst onViewJoinRuleSettingsClick = (): void => {\n    defaultDispatcher.dispatch({\n        action: \"open_room_settings\",\n        initial_tab_id: RoomSettingsTab.Security,\n    });\n};\n\nfunction textForJoinRulesEvent(ev: MatrixEvent, client: MatrixClient, allowJSX: boolean): () => Renderable {\n    const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();\n    switch (ev.getContent().join_rule) {\n        case JoinRule.Public:\n            return () =>\n                _t(\"timeline|m.room.join_rules|public\", {\n                    senderDisplayName,\n                });\n        case JoinRule.Invite:\n            return () =>\n                _t(\"timeline|m.room.join_rules|invite\", {\n                    senderDisplayName,\n                });\n        case JoinRule.Knock:\n            return () => _t(\"timeline|m.room.join_rules|knock\", { senderDisplayName });\n        case JoinRule.Restricted:\n            if (allowJSX) {\n                return () => (\n                    <span>\n                        {_t(\n                            \"timeline|m.room.join_rules|restricted_settings\",\n                            {\n                                senderDisplayName,\n                            },\n                            {\n                                a: (sub) => (\n                                    <AccessibleButton kind=\"link_inline\" onClick={onViewJoinRuleSettingsClick}>\n                                        {sub}\n                                    </AccessibleButton>\n                                ),\n                            },\n                        )}\n                    </span>\n                );\n            }\n\n            return () => _t(\"timeline|m.room.join_rules|restricted\", { senderDisplayName });\n        default:\n            // The spec supports \"knock\" and \"private\", however nothing implements these.\n            return () =>\n                _t(\"timeline|m.room.join_rules|unknown\", {\n                    senderDisplayName,\n                    rule: ev.getContent().join_rule,\n                });\n    }\n}\n\nfunction textForGuestAccessEvent(ev: MatrixEvent): (() => string) | null {\n    const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();\n    switch (ev.getContent().guest_access) {\n        case GuestAccess.CanJoin:\n            return () => _t(\"timeline|m.room.guest_access|can_join\", { senderDisplayName });\n        case GuestAccess.Forbidden:\n            return () => _t(\"timeline|m.room.guest_access|forbidden\", { senderDisplayName });\n        default:\n            // There's no other options we can expect, however just for safety's sake we'll do this.\n            return () =>\n                _t(\"timeline|m.room.guest_access|unknown\", {\n                    senderDisplayName,\n                    rule: ev.getContent().guest_access,\n                });\n    }\n}\n\nfunction textForMessageEvent(ev: MatrixEvent, client: MatrixClient): (() => string) | null {\n    if (isLocationEvent(ev)) {\n        return textForLocationEvent(ev);\n    }\n\n    return () => {\n        const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();\n        let message = ev.getContent().body;\n        if (ev.isRedacted()) {\n            message = textForRedactedPollAndMessageEvent(ev, client);\n        }\n\n        if (ev.getContent().msgtype === MsgType.Emote) {\n            message = \"* \" + senderDisplayName + \" \" + message;\n        } else if (ev.getContent().msgtype === MsgType.Image) {\n            message = _t(\"timeline|m.image|sent\", { senderDisplayName });\n        } else if (ev.getType() == EventType.Sticker) {\n            message = _t(\"timeline|m.sticker\", { senderDisplayName });\n        } else {\n            // in this case, parse it as a plain text message\n            message = senderDisplayName + \": \" + message;\n        }\n        return message;\n    };\n}\n\nfunction textForCanonicalAliasEvent(ev: MatrixEvent): (() => string) | null {\n    const senderName = getSenderName(ev);\n    const oldAlias = ev.getPrevContent().alias;\n    const oldAltAliases = ev.getPrevContent().alt_aliases || [];\n    const newAlias = ev.getContent().alias;\n    const newAltAliases = ev.getContent().alt_aliases || [];\n    const removedAltAliases = oldAltAliases.filter((alias: string) => !newAltAliases.includes(alias));\n    const addedAltAliases = newAltAliases.filter((alias: string) => !oldAltAliases.includes(alias));\n\n    if (!removedAltAliases.length && !addedAltAliases.length) {\n        if (newAlias) {\n            return () =>\n                _t(\"timeline|m.room.canonical_alias|set\", {\n                    senderName,\n                    address: ev.getContent().alias,\n                });\n        } else if (oldAlias) {\n            return () =>\n                _t(\"timeline|m.room.canonical_alias|removed\", {\n                    senderName,\n                });\n        }\n    } else if (newAlias === oldAlias) {\n        if (addedAltAliases.length && !removedAltAliases.length) {\n            return () =>\n                _t(\"timeline|m.room.canonical_alias|alt_added\", {\n                    senderName,\n                    addresses: addedAltAliases.join(\", \"),\n                    count: addedAltAliases.length,\n                });\n        }\n        if (removedAltAliases.length && !addedAltAliases.length) {\n            return () =>\n                _t(\"timeline|m.room.canonical_alias|alt_removed\", {\n                    senderName,\n                    addresses: removedAltAliases.join(\", \"),\n                    count: removedAltAliases.length,\n                });\n        }\n        if (removedAltAliases.length && addedAltAliases.length) {\n            return () =>\n                _t(\"timeline|m.room.canonical_alias|changed_alternative\", {\n                    senderName,\n                });\n        }\n    } else {\n        // both alias and alt_aliases where modified\n        return () =>\n            _t(\"timeline|m.room.canonical_alias|changed_main_and_alternative\", {\n                senderName,\n            });\n    }\n    // in case there is no difference between the two events,\n    // say something as we can't simply hide the tile from here\n    return () =>\n        _t(\"timeline|m.room.canonical_alias|changed\", {\n            senderName,\n        });\n}\n\nfunction textForThreePidInviteEvent(event: MatrixEvent): (() => string) | null {\n    const senderName = getSenderName(event);\n\n    if (!isValid3pidInvite(event)) {\n        return () =>\n            _t(\"timeline|m.room.third_party_invite|revoked\", {\n                senderName,\n                targetDisplayName: event.getPrevContent().display_name || _t(\"common|someone\"),\n            });\n    }\n\n    return () =>\n        _t(\"timeline|m.room.third_party_invite|sent\", {\n            senderName,\n            targetDisplayName: event.getContent().display_name,\n        });\n}\n\nfunction textForHistoryVisibilityEvent(event: MatrixEvent): (() => string) | null {\n    const senderName = getSenderName(event);\n    switch (event.getContent().history_visibility) {\n        case HistoryVisibility.Invited:\n            return () => _t(\"timeline|m.room.history_visibility|invited\", { senderName });\n        case HistoryVisibility.Joined:\n            return () =>\n                _t(\"timeline|m.room.history_visibility|joined\", {\n                    senderName,\n                });\n        case HistoryVisibility.Shared:\n            return () => _t(\"timeline|m.room.history_visibility|shared\", { senderName });\n        case HistoryVisibility.WorldReadable:\n            return () => _t(\"timeline|m.room.history_visibility|world_readable\", { senderName });\n        default:\n            return () =>\n                _t(\"timeline|m.room.history_visibility|unknown\", {\n                    senderName,\n                    visibility: event.getContent().history_visibility,\n                });\n    }\n}\n\n// Currently will only display a change if a user's power level is changed\nfunction textForPowerEvent(event: MatrixEvent, client: MatrixClient): (() => string) | null {\n    const senderName = getSenderName(event);\n    if (!event.getPrevContent()?.users || !event.getContent()?.users) {\n        return null;\n    }\n    const previousUserDefault: number = event.getPrevContent().users_default || 0;\n    const currentUserDefault: number = event.getContent().users_default || 0;\n    // Construct set of userIds\n    const users: string[] = [];\n    Object.keys(event.getContent().users).forEach((userId) => {\n        if (users.indexOf(userId) === -1) users.push(userId);\n    });\n    Object.keys(event.getPrevContent().users).forEach((userId) => {\n        if (users.indexOf(userId) === -1) users.push(userId);\n    });\n\n    const diffs: {\n        userId: string;\n        name: string;\n        from: number;\n        to: number;\n    }[] = [];\n    users.forEach((userId) => {\n        // Previous power level\n        let from: number = event.getPrevContent().users[userId];\n        if (!Number.isInteger(from)) {\n            from = previousUserDefault;\n        }\n        // Current power level\n        let to = event.getContent().users[userId];\n        if (!Number.isInteger(to)) {\n            to = currentUserDefault;\n        }\n        if (from === previousUserDefault && to === currentUserDefault) {\n            return;\n        }\n        if (to !== from) {\n            const name = getRoomMemberDisplayname(client, event, userId);\n            diffs.push({ userId, name, from, to });\n        }\n    });\n    if (!diffs.length) {\n        return null;\n    }\n\n    // XXX: This is also surely broken for i18n\n    return () =>\n        _t(\"timeline|m.room.power_levels|changed\", {\n            senderName,\n            powerLevelDiffText: diffs\n                .map((diff) =>\n                    _t(\"timeline|m.room.power_levels|user_from_to\", {\n                        userId: diff.name,\n                        fromPowerLevel: Roles.textualPowerLevel(diff.from, previousUserDefault),\n                        toPowerLevel: Roles.textualPowerLevel(diff.to, currentUserDefault),\n                    }),\n                )\n                .join(\", \"),\n        });\n}\n\nconst onPinnedMessagesClick = (): void => {\n    PosthogTrackers.trackInteraction(\"PinnedMessageStateEventClick\");\n    RightPanelStore.instance.setCard({ phase: RightPanelPhases.PinnedMessages }, false);\n};\n\nfunction textForPinnedEvent(event: MatrixEvent, client: MatrixClient, allowJSX: boolean): (() => Renderable) | null {\n    const senderName = getSenderName(event);\n    const roomId = event.getRoomId()!;\n\n    const content = event.getContent<{ pinned: string[] }>();\n    const prevContent = event.getPrevContent();\n\n    const pinned = Array.isArray(content.pinned) ? content.pinned : [];\n    const previouslyPinned: string[] = Array.isArray(prevContent.pinned) ? prevContent.pinned : [];\n    const newlyPinned = pinned.filter((item) => previouslyPinned.indexOf(item) < 0);\n    const newlyUnpinned = previouslyPinned.filter((item) => pinned.indexOf(item) < 0);\n\n    if (newlyPinned.length === 1 && newlyUnpinned.length === 0) {\n        // A single message was pinned, include a link to that message.\n        if (allowJSX) {\n            const messageId = newlyPinned.pop()!;\n\n            return () => (\n                <span>\n                    {_t(\n                        \"timeline|m.room.pinned_events|pinned_link\",\n                        { senderName },\n                        {\n                            a: (sub) => (\n                                <AccessibleButton\n                                    kind=\"link_inline\"\n                                    onClick={() => {\n                                        PosthogTrackers.trackInteraction(\"PinnedMessageStateEventClick\");\n                                        highlightEvent(roomId, messageId);\n                                    }}\n                                >\n                                    {sub}\n                                </AccessibleButton>\n                            ),\n                            b: (sub) => (\n                                <AccessibleButton kind=\"link_inline\" onClick={onPinnedMessagesClick}>\n                                    {sub}\n                                </AccessibleButton>\n                            ),\n                        },\n                    )}\n                </span>\n            );\n        }\n\n        return () => _t(\"timeline|m.room.pinned_events|pinned\", { senderName });\n    }\n\n    if (newlyUnpinned.length === 1 && newlyPinned.length === 0) {\n        // A single message was unpinned, include a link to that message.\n        if (allowJSX) {\n            const messageId = newlyUnpinned.pop()!;\n\n            return () => (\n                <span>\n                    {_t(\n                        \"timeline|m.room.pinned_events|unpinned_link\",\n                        { senderName },\n                        {\n                            a: (sub) => (\n                                <AccessibleButton\n                                    kind=\"link_inline\"\n                                    onClick={() => {\n                                        PosthogTrackers.trackInteraction(\"PinnedMessageStateEventClick\");\n                                        highlightEvent(roomId, messageId);\n                                    }}\n                                >\n                                    {sub}\n                                </AccessibleButton>\n                            ),\n                            b: (sub) => (\n                                <AccessibleButton kind=\"link_inline\" onClick={onPinnedMessagesClick}>\n                                    {sub}\n                                </AccessibleButton>\n                            ),\n                        },\n                    )}\n                </span>\n            );\n        }\n\n        return () => _t(\"timeline|m.room.pinned_events|unpinned\", { senderName });\n    }\n\n    if (allowJSX) {\n        return () => (\n            <span>\n                {_t(\n                    \"timeline|m.room.pinned_events|changed_link\",\n                    { senderName },\n                    {\n                        a: (sub) => (\n                            <AccessibleButton kind=\"link_inline\" onClick={onPinnedMessagesClick}>\n                                {sub}\n                            </AccessibleButton>\n                        ),\n                    },\n                )}\n            </span>\n        );\n    }\n\n    return () => _t(\"timeline|m.room.pinned_events|changed\", { senderName });\n}\n\nfunction textForWidgetEvent(event: MatrixEvent): (() => string) | null {\n    const senderName = getSenderName(event);\n    const { name: prevName, type: prevType, url: prevUrl } = event.getPrevContent();\n    const { name, type, url } = event.getContent() || {};\n\n    let widgetName = name || prevName || type || prevType || \"\";\n    // Apply sentence case to widget name\n    if (widgetName && widgetName.length > 0) {\n        widgetName = widgetName[0].toUpperCase() + widgetName.slice(1);\n    }\n\n    // If the widget was removed, its content should be {}, but this is sufficiently\n    // equivalent to that condition.\n    if (url) {\n        if (prevUrl) {\n            return () =>\n                _t(\"timeline|m.widget|modified\", {\n                    widgetName,\n                    senderName,\n                });\n        } else {\n            return () =>\n                _t(\"timeline|m.widget|added\", {\n                    widgetName,\n                    senderName,\n                });\n        }\n    } else {\n        return () =>\n            _t(\"timeline|m.widget|removed\", {\n                widgetName,\n                senderName,\n            });\n    }\n}\n\nfunction textForWidgetLayoutEvent(event: MatrixEvent): (() => string) | null {\n    const senderName = getSenderName(event);\n    return () => _t(\"timeline|io.element.widgets.layout\", { senderName });\n}\n\nfunction textForMjolnirEvent(event: MatrixEvent): (() => string) | null {\n    const senderName = getSenderName(event);\n    const { entity: prevEntity } = event.getPrevContent();\n    const { entity, recommendation, reason } = event.getContent();\n\n    // Rule removed\n    if (!entity) {\n        if (USER_RULE_TYPES.includes(event.getType())) {\n            return () => _t(\"timeline|mjolnir|removed_rule_users\", { senderName, glob: prevEntity });\n        } else if (ROOM_RULE_TYPES.includes(event.getType())) {\n            return () => _t(\"timeline|mjolnir|removed_rule_rooms\", { senderName, glob: prevEntity });\n        } else if (SERVER_RULE_TYPES.includes(event.getType())) {\n            return () =>\n                _t(\"timeline|mjolnir|removed_rule_servers\", {\n                    senderName,\n                    glob: prevEntity,\n                });\n        }\n\n        // Unknown type. We'll say something, but we shouldn't end up here.\n        return () => _t(\"timeline|mjolnir|removed_rule\", { senderName, glob: prevEntity });\n    }\n\n    // Invalid rule\n    if (!recommendation || !reason) return () => _t(\"timeline|mjolnir|updated_invalid_rule\", { senderName });\n\n    // Rule updated\n    if (entity === prevEntity) {\n        if (USER_RULE_TYPES.includes(event.getType())) {\n            return () =>\n                _t(\"timeline|mjolnir|updated_rule_users\", {\n                    senderName,\n                    glob: entity,\n                    reason,\n                });\n        } else if (ROOM_RULE_TYPES.includes(event.getType())) {\n            return () =>\n                _t(\"timeline|mjolnir|updated_rule_rooms\", {\n                    senderName,\n                    glob: entity,\n                    reason,\n                });\n        } else if (SERVER_RULE_TYPES.includes(event.getType())) {\n            return () =>\n                _t(\"timeline|mjolnir|updated_rule_servers\", {\n                    senderName,\n                    glob: entity,\n                    reason,\n                });\n        }\n\n        // Unknown type. We'll say something but we shouldn't end up here.\n        return () =>\n            _t(\"timeline|mjolnir|updated_rule\", {\n                senderName,\n                glob: entity,\n                reason,\n            });\n    }\n\n    // New rule\n    if (!prevEntity) {\n        if (USER_RULE_TYPES.includes(event.getType())) {\n            return () =>\n                _t(\"timeline|mjolnir|created_rule_users\", {\n                    senderName,\n                    glob: entity,\n                    reason,\n                });\n        } else if (ROOM_RULE_TYPES.includes(event.getType())) {\n            return () =>\n                _t(\"timeline|mjolnir|created_rule_rooms\", {\n                    senderName,\n                    glob: entity,\n                    reason,\n                });\n        } else if (SERVER_RULE_TYPES.includes(event.getType())) {\n            return () =>\n                _t(\"timeline|mjolnir|created_rule_servers\", {\n                    senderName,\n                    glob: entity,\n                    reason,\n                });\n        }\n\n        // Unknown type. We'll say something but we shouldn't end up here.\n        return () =>\n            _t(\"timeline|mjolnir|created_rule\", {\n                senderName,\n                glob: entity,\n                reason,\n            });\n    }\n\n    // else the entity !== prevEntity - count as a removal & add\n    if (USER_RULE_TYPES.includes(event.getType())) {\n        return () =>\n            _t(\"timeline|mjolnir|changed_rule_users\", { senderName, oldGlob: prevEntity, newGlob: entity, reason });\n    } else if (ROOM_RULE_TYPES.includes(event.getType())) {\n        return () =>\n            _t(\"timeline|mjolnir|changed_rule_rooms\", { senderName, oldGlob: prevEntity, newGlob: entity, reason });\n    } else if (SERVER_RULE_TYPES.includes(event.getType())) {\n        return () =>\n            _t(\"timeline|mjolnir|changed_rule_servers\", { senderName, oldGlob: prevEntity, newGlob: entity, reason });\n    }\n\n    // Unknown type. We'll say something but we shouldn't end up here.\n    return () =>\n        _t(\"timeline|mjolnir|changed_rule_glob\", {\n            senderName,\n            oldGlob: prevEntity,\n            newGlob: entity,\n            reason,\n        });\n}\n\nexport function textForLocationEvent(event: MatrixEvent): () => string {\n    return () =>\n        _t(\"timeline|m.location|full\", {\n            senderName: getSenderName(event),\n        });\n}\n\nfunction textForRedactedPollAndMessageEvent(ev: MatrixEvent, client: MatrixClient): string {\n    let message = _t(\"timeline|self_redaction\");\n    const unsigned = ev.getUnsigned();\n    const redactedBecauseUserId = unsigned?.redacted_because?.sender;\n    if (redactedBecauseUserId && redactedBecauseUserId !== ev.getSender()) {\n        const room = client.getRoom(ev.getRoomId());\n        const sender = room?.getMember(redactedBecauseUserId);\n        message = _t(\"timeline|redaction\", {\n            name: sender?.name || redactedBecauseUserId,\n        });\n    }\n\n    return message;\n}\n\nfunction textForPollStartEvent(event: MatrixEvent, client: MatrixClient): (() => string) | null {\n    return () => {\n        let message = \"\";\n\n        if (event.isRedacted()) {\n            message = textForRedactedPollAndMessageEvent(event, client);\n            const senderDisplayName = event.sender?.name ?? event.getSender();\n            message = senderDisplayName + \": \" + message;\n        } else {\n            message = _t(\"timeline|m.poll.start\", {\n                senderName: getSenderName(event),\n                pollQuestion: (event.unstableExtensibleEvent as PollStartEvent)?.question?.text,\n            });\n        }\n\n        return message;\n    };\n}\n\nfunction textForPollEndEvent(event: MatrixEvent): (() => string) | null {\n    return () =>\n        _t(\"timeline|m.poll.end|sender_ended\", {\n            senderName: getSenderName(event),\n        });\n}\n\ntype Renderable = string | React.ReactNode | null;\n\ninterface IHandlers {\n    [type: string]: (\n        ev: MatrixEvent,\n        client: MatrixClient,\n        allowJSX: boolean,\n        showHiddenEvents?: boolean,\n    ) => (() => Renderable) | null;\n}\n\nconst handlers: IHandlers = {\n    [EventType.RoomMessage]: textForMessageEvent,\n    [EventType.Sticker]: textForMessageEvent,\n    [EventType.CallInvite]: textForCallInviteEvent,\n    [EventType.RTCNotification]: textForRTCNotificationEvent,\n    [M_POLL_START.name]: textForPollStartEvent,\n    [M_POLL_END.name]: textForPollEndEvent,\n    [M_POLL_START.altName]: textForPollStartEvent,\n    [M_POLL_END.altName]: textForPollEndEvent,\n};\n\nconst stateHandlers: IHandlers = {\n    [EventType.RoomCanonicalAlias]: textForCanonicalAliasEvent,\n    [EventType.RoomName]: textForRoomNameEvent,\n    [EventType.RoomTopic]: textForTopicEvent,\n    [EventType.RoomMember]: textForMemberEvent,\n    [EventType.RoomAvatar]: textForRoomAvatarEvent,\n    [EventType.RoomThirdPartyInvite]: textForThreePidInviteEvent,\n    [EventType.RoomHistoryVisibility]: textForHistoryVisibilityEvent,\n    [EventType.RoomPowerLevels]: textForPowerEvent,\n    [EventType.RoomPinnedEvents]: textForPinnedEvent,\n    [EventType.RoomTombstone]: textForTombstoneEvent,\n    [EventType.RoomJoinRules]: textForJoinRulesEvent,\n    [EventType.RoomGuestAccess]: textForGuestAccessEvent,\n\n    // TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)\n    \"im.vector.modular.widgets\": textForWidgetEvent,\n    [WIDGET_LAYOUT_EVENT_TYPE]: textForWidgetLayoutEvent,\n};\n\n// Add all the Mjolnir stuff to the renderer\nfor (const evType of ALL_RULE_TYPES) {\n    stateHandlers[evType] = textForMjolnirEvent;\n}\n\n// Add both stable and unstable m.call events\nfor (const evType of ElementCallEventType.names) {\n    stateHandlers[evType] = textForCallEvent;\n}\n\n/**\n * Determines whether the given event has text to display.\n *\n * @param client The Matrix Client instance for the logged-in user\n * @param ev The event\n * @param showHiddenEvents An optional cached setting value for showHiddenEventsInTimeline\n *     to avoid hitting the settings store\n */\nexport function hasText(ev: MatrixEvent, client: MatrixClient, showHiddenEvents?: boolean): boolean {\n    const handler = (ev.isState() ? stateHandlers : handlers)[ev.getType()];\n    try {\n        return Boolean(handler?.(ev, client, false, showHiddenEvents));\n    } catch (e) {\n        console.error(`Error encountered when trying to render event type=${ev.getType()} id=${ev.getId()}`, e);\n        // Returning true if we have a handler so we can show an error tile rather than no tile at all\n        return !!handler;\n    }\n}\n\n/**\n * Gets the textual content of the given event.\n *\n * @param ev The event\n * @param client The Matrix Client instance for the logged-in user\n * @param allowJSX Whether to output rich JSX content\n * @param showHiddenEvents An optional cached setting value for showHiddenEventsInTimeline\n *     to avoid hitting the settings store\n */\nexport function textForEvent(ev: MatrixEvent, client: MatrixClient): string;\nexport function textForEvent(\n    ev: MatrixEvent,\n    client: MatrixClient,\n    allowJSX: true,\n    showHiddenEvents?: boolean,\n): string | React.ReactNode;\nexport function textForEvent(\n    ev: MatrixEvent,\n    client: MatrixClient,\n    allowJSX = false,\n    showHiddenEvents?: boolean,\n): string | React.ReactNode {\n    const handler = (ev.isState() ? stateHandlers : handlers)[ev.getType()];\n    return handler?.(ev, client, allowJSX, showHiddenEvents)?.() || \"\";\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2024 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { SettingLevel } from \"./settings/SettingLevel\";\nimport SettingsStore from \"./settings/SettingsStore\";\n\nexport const USER_TIMEZONE_KEY = \"userTimezone\";\n\n/**\n * Returning `undefined` ensure that if unset the browser default will be used in `DateTimeFormat`.\n * @returns The user specified timezone or `undefined`\n */\nexport function getUserTimezone(): string | undefined {\n    const tz = SettingsStore.getValueAt(SettingLevel.DEVICE, USER_TIMEZONE_KEY);\n    return tz || undefined;\n}\n\n/**\n * Set in the settings the given timezone\n */\nexport function setUserTimezone(timezone: string): Promise<void> {\n    return SettingsStore.setValue(USER_TIMEZONE_KEY, null, SettingLevel.DEVICE, timezone);\n}\n\n/**\n * Return all the available timezones\n */\nexport function getAllTimezones(): string[] {\n    return Intl.supportedValuesOf(\"timeZone\");\n}\n\n/**\n * Return the current timezone in a short human readable way\n */\nexport function shortBrowserTimezone(): string {\n    return (\n        new Intl.DateTimeFormat(undefined, { timeZoneName: \"short\" })\n            .formatToParts(new Date())\n            .find((x) => x.type === \"timeZoneName\")?.value ?? \"GMT\"\n    );\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport function isNotNull<T>(arg: T): arg is Exclude<T, null> {\n    return arg !== null;\n}\n\nexport function isNotUndefined<T>(arg: T): arg is Exclude<T, undefined> {\n    return arg !== undefined;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015-2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { M_BEACON, type Room, Thread, type MatrixEvent, EventType, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport shouldHideEvent from \"./shouldHideEvent\";\nimport { haveRendererForEvent } from \"./events/EventTileFactory\";\nimport { RoomNotifState, getRoomNotifsState } from \"./RoomNotifs\";\n\n/**\n * Returns true if this event arriving in a room should affect the room's\n * count of unread messages\n *\n * @param client The Matrix Client instance of the logged-in user\n * @param {Object} ev The event\n * @returns {boolean} True if the given event should affect the unread message count\n */\nexport function eventTriggersUnreadCount(client: MatrixClient, ev: MatrixEvent): boolean {\n    if (ev.getSender() === client.getSafeUserId()) {\n        return false;\n    }\n\n    switch (ev.getType()) {\n        case EventType.RoomMember:\n        case EventType.RoomThirdPartyInvite:\n        case EventType.CallAnswer:\n        case EventType.CallHangup:\n        case EventType.RoomCanonicalAlias:\n        case EventType.RoomServerAcl:\n        case M_BEACON.name:\n        case M_BEACON.altName:\n            return false;\n    }\n\n    if (ev.isRedacted()) return false;\n    try {\n        return haveRendererForEvent(ev, client, false /* hidden messages should never trigger unread counts anyways */);\n    } catch (e) {\n        console.warn(\"Error determining if event should trigger unread count\", e);\n        return false; // If we can't determine if the event should trigger an unread count, assume it does not.\n    }\n}\n\nexport function doesRoomHaveUnreadMessages(room: Room, includeThreads: boolean): boolean {\n    const toCheck: Array<Room | Thread> = [room];\n    if (includeThreads) {\n        toCheck.push(...room.getThreads());\n    }\n\n    for (const withTimeline of toCheck) {\n        if (doesTimelineHaveUnreadMessages(room, withTimeline.timeline)) {\n            // We found an unread, so the room is unread\n            return true;\n        }\n    }\n\n    // If we got here then no timelines were found with unread messages.\n    return false;\n}\n\nfunction doesTimelineHaveUnreadMessages(room: Room, timeline: Array<MatrixEvent>): boolean {\n    // The room is a space, let's ignore it\n    if (room.isSpaceRoom()) return false;\n\n    const myUserId = room.client.getSafeUserId();\n    const latestImportantEventId = findLatestImportantEvent(room.client, timeline)?.getId();\n    if (latestImportantEventId) {\n        return !room.hasUserReadEvent(myUserId, latestImportantEventId);\n    } else {\n        // We couldn't find an important event to check - check the unimportant ones.\n        const earliestUnimportantEventId = timeline.at(0)?.getId();\n        if (!earliestUnimportantEventId) {\n            // There are no events in this timeline - it is uninitialised, so we\n            // consider it read\n            return false;\n        } else if (room.hasUserReadEvent(myUserId, earliestUnimportantEventId)) {\n            // Some of the unimportant events are read, and there are no\n            // important ones after them, so we've read everything.\n            return false;\n        } else {\n            // We have events. and none of them are read.  We must guess that\n            // the timeline is unread, because there could be older unread\n            // important events that we don't have loaded.\n            logger.warn(\"Falling back to unread room because of no read receipt or counting message found\", {\n                roomId: room.roomId,\n                earliestUnimportantEventId: earliestUnimportantEventId,\n            });\n            return true;\n        }\n    }\n}\n\n/**\n * Returns true if this room has unread threads.\n * @param room The room to check\n * @returns {boolean} True if the given room has unread threads\n */\nexport function doesRoomHaveUnreadThreads(room: Room): boolean {\n    if (getRoomNotifsState(room.client, room.roomId) === RoomNotifState.Mute) {\n        // No unread for muted rooms, nor their threads\n        // NB. This logic duplicated in RoomNotifs.determineUnreadState\n        return false;\n    }\n\n    for (const thread of room.getThreads()) {\n        if (doesTimelineHaveUnreadMessages(room, thread.timeline)) {\n            // We found an unread, so the room has an unread thread\n            return true;\n        }\n    }\n\n    // If we got here then no threads were found with unread messages.\n    return false;\n}\n\nexport function doesRoomOrThreadHaveUnreadMessages(roomOrThread: Room | Thread): boolean {\n    const room = roomOrThread instanceof Thread ? roomOrThread.room : roomOrThread;\n    const events = roomOrThread instanceof Thread ? roomOrThread.timeline : room.getLiveTimeline().getEvents();\n    return doesTimelineHaveUnreadMessages(room, events);\n}\n\n/**\n * Look backwards through the timeline and find the last event that is\n * \"important\" in the sense of isImportantEvent.\n *\n * @returns the latest important event, or null if none were found\n */\nfunction findLatestImportantEvent(client: MatrixClient, timeline: Array<MatrixEvent>): MatrixEvent | null {\n    for (let index = timeline.length - 1; index >= 0; index--) {\n        const event = timeline[index];\n        if (isImportantEvent(client, event)) {\n            return event;\n        }\n    }\n    return null;\n}\n\n/**\n * Given this event does not have a receipt, is it important enough to make\n * this room unread?\n */\nfunction isImportantEvent(client: MatrixClient, event: MatrixEvent): boolean {\n    return !shouldHideEvent(event) && eventTriggersUnreadCount(client, event);\n}\n","/*\nCopyright 2019-2024 New Vector Ltd.\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport dis from \"./dispatcher/dispatcher\";\nimport Timer from \"./utils/Timer\";\nimport { Action } from \"./dispatcher/actions.ts\";\n\n// important these are larger than the timeouts of timers\n// used with UserActivity.timeWhileActive*,\n// such as READ_MARKER_INVIEW_THRESHOLD_MS (timeWhileActiveRecently),\n// READ_MARKER_OUTOFVIEW_THRESHOLD_MS (timeWhileActiveRecently),\n// READ_RECEIPT_INTERVAL_MS (timeWhileActiveNow) in TimelinePanel\n\n// 'Under a few seconds'. Must be less than 'RECENTLY_ACTIVE_THRESHOLD_MS'\nconst CURRENTLY_ACTIVE_THRESHOLD_MS = 700;\n\n// 'Under a few minutes'.\nconst RECENTLY_ACTIVE_THRESHOLD_MS = 2 * 60 * 1000;\n\n/**\n * This class watches for user activity (moving the mouse or pressing a key)\n * and starts/stops attached timers while the user is active.\n *\n * There are two classes of 'active': 'active now' and 'active recently'\n * see doc on the userActive* functions for what these mean.\n */\nexport default class UserActivity {\n    private readonly activeNowTimeout: Timer;\n    private readonly activeRecentlyTimeout: Timer;\n    private attachedActiveNowTimers: Timer[] = [];\n    private attachedActiveRecentlyTimers: Timer[] = [];\n    private lastScreenX = 0;\n    private lastScreenY = 0;\n\n    public constructor(\n        private readonly window: Window,\n        private readonly document: Document,\n    ) {\n        this.activeNowTimeout = new Timer(CURRENTLY_ACTIVE_THRESHOLD_MS);\n        this.activeRecentlyTimeout = new Timer(RECENTLY_ACTIVE_THRESHOLD_MS);\n    }\n\n    public static sharedInstance(): UserActivity {\n        if (window.mxUserActivity === undefined) {\n            window.mxUserActivity = new UserActivity(window, document);\n        }\n        return window.mxUserActivity;\n    }\n\n    /**\n     * Runs the given timer while the user is 'active now', aborting when the user is no longer\n     * considered currently active.\n     * See userActiveNow() for what it means for a user to be 'active'.\n     * Can be called multiple times with the same already running timer, which is a NO-OP.\n     * Can be called before the user becomes active, in which case it is only started\n     * later on when the user does become active.\n     * @param {Timer} timer the timer to use\n     */\n    public timeWhileActiveNow(timer: Timer): void {\n        this.timeWhile(timer, this.attachedActiveNowTimers);\n        if (this.userActiveNow()) {\n            timer.start();\n        }\n    }\n\n    /**\n     * Runs the given timer while the user is 'active' now or recently,\n     * aborting when the user becomes inactive.\n     * See userActiveRecently() for what it means for a user to be 'active recently'.\n     * Can be called multiple times with the same already running timer, which is a NO-OP.\n     * Can be called before the user becomes active, in which case it is only started\n     * later on when the user does become active.\n     * @param {Timer} timer the timer to use\n     */\n    public timeWhileActiveRecently(timer: Timer): void {\n        this.timeWhile(timer, this.attachedActiveRecentlyTimers);\n        if (this.userActiveRecently()) {\n            timer.start();\n        }\n    }\n\n    private timeWhile(timer: Timer, attachedTimers: Timer[]): void {\n        // important this happens first\n        const index = attachedTimers.indexOf(timer);\n        if (index === -1) {\n            attachedTimers.push(timer);\n            // remove when done or aborted\n            timer\n                .finished()\n                .finally(() => {\n                    const index = attachedTimers.indexOf(timer);\n                    if (index !== -1) {\n                        // should never be -1\n                        attachedTimers.splice(index, 1);\n                    }\n                    // as we fork the promise here,\n                    // avoid unhandled rejection warnings\n                })\n                .catch((err) => {});\n        }\n    }\n\n    /**\n     * Start listening to user activity\n     */\n    public start(): void {\n        this.document.addEventListener(\"mousedown\", this.onUserActivity);\n        this.document.addEventListener(\"mousemove\", this.onUserActivity);\n        this.document.addEventListener(\"keydown\", this.onUserActivity);\n        this.document.addEventListener(\"visibilitychange\", this.onPageVisibilityChanged);\n        this.window.addEventListener(\"blur\", this.onWindowBlurred);\n        this.window.addEventListener(\"focus\", this.onUserActivity);\n        // can't use document.scroll here because that's only the document\n        // itself being scrolled. Need to use addEventListener's useCapture.\n        // also this needs to be the wheel event, not scroll, as scroll is\n        // fired when the view scrolls down for a new message.\n        this.window.addEventListener(\"wheel\", this.onUserActivity, {\n            passive: true,\n            capture: true,\n        });\n    }\n\n    /**\n     * Stop tracking user activity\n     */\n    public stop(): void {\n        this.document.removeEventListener(\"mousedown\", this.onUserActivity);\n        this.document.removeEventListener(\"mousemove\", this.onUserActivity);\n        this.document.removeEventListener(\"keydown\", this.onUserActivity);\n        this.window.removeEventListener(\"wheel\", this.onUserActivity, {\n            capture: true,\n        });\n        this.document.removeEventListener(\"visibilitychange\", this.onPageVisibilityChanged);\n        this.window.removeEventListener(\"blur\", this.onWindowBlurred);\n        this.window.removeEventListener(\"focus\", this.onUserActivity);\n    }\n\n    /**\n     * Return true if the user is currently 'active'\n     * A user is 'active' while they are interacting with the app and for a very short (<1s)\n     * time after that. This is intended to give a strong indication that the app has the\n     * user's attention at any given moment.\n     * @returns {boolean} true if user is currently 'active'\n     */\n    public userActiveNow(): boolean {\n        return this.activeNowTimeout.isRunning();\n    }\n\n    /**\n     * Return true if the user is currently active or has been recently\n     * A user is 'active recently' for a longer period of time (~2 mins) after\n     * they have been 'active' and while the app still has the focus. This is\n     * intended to indicate when the app may still have the user's attention\n     * (or they may have gone to make tea and left the window focused).\n     * @returns {boolean} true if user has been active recently\n     */\n    public userActiveRecently(): boolean {\n        return this.activeRecentlyTimeout.isRunning();\n    }\n\n    private onPageVisibilityChanged = (e: Event): void => {\n        if (this.document.visibilityState === \"hidden\") {\n            this.activeNowTimeout.abort();\n            this.activeRecentlyTimeout.abort();\n        } else {\n            this.onUserActivity(e);\n        }\n    };\n\n    private onWindowBlurred = (): void => {\n        this.activeNowTimeout.abort();\n        this.activeRecentlyTimeout.abort();\n    };\n\n    // XXX: exported for tests\n    public onUserActivity = (event: Event): void => {\n        // ignore anything if the window isn't focused\n        if (!this.document.hasFocus()) return;\n\n        if (event.type === \"mousemove\" && this.isMouseEvent(event)) {\n            if (event.screenX === this.lastScreenX && event.screenY === this.lastScreenY) {\n                // mouse hasn't actually moved\n                return;\n            }\n            this.lastScreenX = event.screenX;\n            this.lastScreenY = event.screenY;\n        }\n\n        dis.dispatch({ action: Action.UserActivity });\n        if (!this.activeNowTimeout.isRunning()) {\n            this.activeNowTimeout.start();\n            UserActivity.runTimersUntilTimeout(this.attachedActiveNowTimers, this.activeNowTimeout);\n        } else {\n            this.activeNowTimeout.restart();\n        }\n\n        if (!this.activeRecentlyTimeout.isRunning()) {\n            this.activeRecentlyTimeout.start();\n\n            UserActivity.runTimersUntilTimeout(this.attachedActiveRecentlyTimers, this.activeRecentlyTimeout);\n        } else {\n            this.activeRecentlyTimeout.restart();\n        }\n    };\n\n    private static async runTimersUntilTimeout(attachedTimers: Timer[], timeout: Timer): Promise<void> {\n        attachedTimers.forEach((t) => t.start());\n        try {\n            await timeout.finished();\n        } catch {\n            /* aborted */\n        }\n        attachedTimers.forEach((t) => t.abort());\n    }\n\n    private isMouseEvent(event: Event): event is MouseEvent {\n        return event.type.startsWith(\"mouse\");\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nconst emailRegex = /^\\S+@\\S+\\.\\S+$/;\nconst mxUserIdRegex = /^@\\S+:\\S+$/;\nconst mxRoomIdRegex = /^!\\S+:\\S+$/;\n\nexport enum AddressType {\n    Email = \"email\",\n    MatrixUserId = \"mx-user-id\",\n    MatrixRoomId = \"mx-room-id\",\n}\n\nexport function getAddressType(inputText: string): AddressType | null {\n    if (emailRegex.test(inputText)) {\n        return AddressType.Email;\n    } else if (mxUserIdRegex.test(inputText)) {\n        return AddressType.MatrixUserId;\n    } else if (mxRoomIdRegex.test(inputText)) {\n        return AddressType.MatrixRoomId;\n    } else {\n        return null;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type WorkerPayload } from \"./workers/worker\";\n\nexport class WorkerManager<Request extends object, Response> {\n    private readonly worker: Worker;\n    private seq = 0;\n    private pendingDeferredMap = new Map<number, PromiseWithResolvers<Response>>();\n\n    public constructor(worker: Worker) {\n        this.worker = worker;\n        this.worker.onmessage = this.onMessage;\n    }\n\n    private onMessage = (ev: MessageEvent<Response & WorkerPayload>): void => {\n        const deferred = this.pendingDeferredMap.get(ev.data.seq);\n        if (deferred) {\n            this.pendingDeferredMap.delete(ev.data.seq);\n            deferred.resolve(ev.data);\n        }\n    };\n\n    public call(request: Request): Promise<Response> {\n        const seq = this.seq++;\n        const deferred = Promise.withResolvers<Response>();\n        this.pendingDeferredMap.set(seq, deferred);\n        this.worker.postMessage({ seq, ...request });\n        return deferred.promise;\n    }\n}\n","/*\n * Copyright 2024 New Vector Ltd.\n * Copyright 2024 The Matrix.org Foundation C.I.C.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { Action } from \"../dispatcher/actions\";\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\n\nexport const enum Landmark {\n    // This is the space/home button in the left panel.\n    ACTIVE_SPACE_BUTTON,\n    // This is the room filter in the left panel.\n    ROOM_SEARCH,\n    // This is the currently opened room/first room in the room list in the left panel.\n    ROOM_LIST,\n    // This is the message composer within the room if available or it is the welcome screen shown when no room is selected\n    MESSAGE_COMPOSER_OR_HOME,\n}\n\nconst ORDERED_LANDMARKS = [\n    Landmark.ACTIVE_SPACE_BUTTON,\n    Landmark.ROOM_SEARCH,\n    Landmark.ROOM_LIST,\n    Landmark.MESSAGE_COMPOSER_OR_HOME,\n];\n\n/**\n * The landmarks are cycled through in the following order:\n * ACTIVE_SPACE_BUTTON <-> ROOM_SEARCH <-> ROOM_LIST <-> MESSAGE_COMPOSER/HOME <-> ACTIVE_SPACE_BUTTON\n */\nexport class LandmarkNavigation {\n    /**\n     * Get the next/previous landmark that must be focused from a given landmark\n     * @param currentLandmark The current landmark\n     * @param backwards If true, the landmark before currentLandmark in ORDERED_LANDMARKS is returned\n     * @returns The next landmark to focus\n     */\n    private static getLandmark(currentLandmark: Landmark, backwards = false): Landmark {\n        const currentIndex = ORDERED_LANDMARKS.findIndex((l) => l === currentLandmark);\n        const offset = backwards ? -1 : 1;\n        const newLandmark = ORDERED_LANDMARKS.at((currentIndex + offset) % ORDERED_LANDMARKS.length)!;\n        return newLandmark;\n    }\n\n    /**\n     * Focus the next landmark from a given landmark.\n     * This method will skip over any missing landmarks.\n     * @param currentLandmark The current landmark\n     * @param backwards If true, search the next landmark to the left in ORDERED_LANDMARKS\n     */\n    public static findAndFocusNextLandmark(currentLandmark: Landmark, backwards = false): void {\n        let landmark = currentLandmark;\n        let element: HTMLElement | null | undefined = null;\n        while (element === null) {\n            landmark = LandmarkNavigation.getLandmark(landmark, backwards);\n            element = landmarkToDomElementMap[landmark]();\n        }\n        element?.focus({ focusVisible: true });\n    }\n}\n\n/**\n * The functions return:\n * - The DOM element of the landmark if it exists\n * - undefined if the DOM element exists but focus is given through an action\n * - null if the landmark does not exist\n */\nconst landmarkToDomElementMap: Record<Landmark, () => HTMLElement | null | undefined> = {\n    [Landmark.ACTIVE_SPACE_BUTTON]: () => document.querySelector<HTMLElement>(\".mx_SpaceButton_active\"),\n\n    [Landmark.ROOM_SEARCH]: () => document.querySelector<HTMLElement>(\"#room-list-search-button\"),\n    [Landmark.ROOM_LIST]: () =>\n        document.querySelector<HTMLElement>(\".mx_RoomListItemView_selected\") ||\n        document.querySelector<HTMLElement>(\".mx_RoomListItemView\"),\n\n    [Landmark.MESSAGE_COMPOSER_OR_HOME]: () => {\n        const isComposerOpen = !!document.querySelector(\".mx_MessageComposer\");\n        if (isComposerOpen) {\n            const inThread = !!document.activeElement?.closest(\".mx_ThreadView\");\n            defaultDispatcher.dispatch(\n                {\n                    action: Action.FocusSendMessageComposer,\n                    context: inThread ? TimelineRenderingType.Thread : TimelineRenderingType.Room,\n                },\n                true,\n            );\n            // Special case where the element does exist but we focus it through an action.\n            return undefined;\n        } else {\n            return document.querySelector<HTMLElement>(\".mx_HomePage\");\n        }\n    },\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type Ref, type JSX } from \"react\";\n\nimport { RovingTabIndexProvider } from \"./RovingTabIndex\";\nimport { getKeyBindingsManager } from \"../KeyBindingsManager\";\nimport { KeyBindingAction } from \"./KeyboardShortcuts\";\n\ninterface IProps extends Omit<React.HTMLProps<HTMLDivElement>, \"onKeyDown\"> {\n    ref?: Ref<HTMLDivElement>;\n}\n\n// This component implements the Toolbar design pattern from the WAI-ARIA Authoring Practices guidelines.\n// https://www.w3.org/TR/wai-aria-practices-1.1/#toolbar\n// All buttons passed in children must use RovingTabIndex to set `onFocus`, `isActive`, `ref`\nconst Toolbar = ({ children, ref, ...props }: IProps): JSX.Element => {\n    const onKeyDown = (ev: React.KeyboardEvent): void => {\n        const target = ev.target as HTMLElement;\n        // Don't interfere with input default keydown behaviour\n        if (target.tagName === \"INPUT\") return;\n\n        let handled = true;\n\n        // HOME and END are handled by RovingTabIndexProvider\n        const action = getKeyBindingsManager().getAccessibilityAction(ev);\n        switch (action) {\n            case KeyBindingAction.ArrowUp:\n            case KeyBindingAction.ArrowDown:\n                if (target.hasAttribute(\"aria-haspopup\")) {\n                    target.click();\n                }\n                break;\n\n            default:\n                handled = false;\n        }\n\n        if (handled) {\n            ev.preventDefault();\n            ev.stopPropagation();\n        }\n    };\n\n    // We handle both up/down and left/right as is allowed in the above WAI ARIA best practices\n    return (\n        <RovingTabIndexProvider handleHomeEnd handleLeftRight handleUpDown onKeyDown={onKeyDown}>\n            {({ onKeyDownHandler }) => (\n                <div {...props} onKeyDown={onKeyDownHandler} role=\"toolbar\" ref={ref}>\n                    {children}\n                </div>\n            )}\n        </RovingTabIndexProvider>\n    );\n};\n\nexport default Toolbar;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type Ref, type JSX } from \"react\";\n\nimport AccessibleButton, { type ButtonProps } from \"../../components/views/elements/AccessibleButton\";\n\ntype Props = Omit<ButtonProps<\"div\">, \"element\" | \"ref\"> & {\n    label?: string;\n    // whether the context menu is currently open\n    isExpanded: boolean;\n    ref?: Ref<HTMLElement>;\n};\n\n// Semantic component for representing the AccessibleButton which launches a <ContextMenu />\nexport const ContextMenuButton = function ({\n    label,\n    isExpanded,\n    children,\n    onClick,\n    onContextMenu,\n    ref,\n    ...props\n}: Props): JSX.Element {\n    return (\n        <AccessibleButton\n            {...props}\n            onClick={onClick}\n            onContextMenu={onContextMenu ?? onClick ?? undefined}\n            aria-label={label}\n            aria-haspopup={true}\n            aria-expanded={isExpanded}\n            ref={ref}\n        >\n            {children}\n        </AccessibleButton>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type Ref } from \"react\";\n\nimport AccessibleButton, { type ButtonProps } from \"../../components/views/elements/AccessibleButton\";\n\ntype Props = Omit<ButtonProps<\"div\">, \"element\" | \"ref\"> & {\n    // whether the context menu is currently open\n    isExpanded: boolean;\n    ref?: Ref<HTMLElement>;\n};\n\n// Semantic component for representing the AccessibleButton which launches a <ContextMenu />\nexport const ContextMenuTooltipButton = function ({\n    isExpanded,\n    children,\n    onClick,\n    onContextMenu,\n    ref,\n    ...props\n}: Props): JSX.Element {\n    return (\n        <AccessibleButton\n            {...props}\n            onClick={onClick}\n            onContextMenu={onContextMenu ?? onClick ?? undefined}\n            aria-haspopup={true}\n            aria-expanded={isExpanded}\n            disableTooltip={isExpanded}\n            ref={ref}\n        >\n            {children}\n        </AccessibleButton>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport { RovingAccessibleButton } from \"../RovingTabIndex\";\n\ninterface IProps extends React.ComponentProps<typeof RovingAccessibleButton> {\n    label?: string;\n    active: boolean;\n}\n\n// Semantic component for representing a role=menuitemradio\nexport const MenuItemRadio: React.FC<IProps> = ({ children, label, active, disabled, ...props }) => {\n    return (\n        <RovingAccessibleButton\n            {...props}\n            role=\"menuitemradio\"\n            aria-checked={active}\n            aria-disabled={disabled}\n            disabled={disabled}\n            aria-label={label}\n        >\n            {children}\n        </RovingAccessibleButton>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2024 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { createAudioContext } from \"./compat\";\n\nconst formatMap = {\n    mp3: \"audio/mpeg\",\n    ogg: \"audio/ogg\",\n};\n\nexport class BackgroundAudio {\n    private audioContext = createAudioContext();\n    private sounds: Record<string, AudioBuffer> = {};\n\n    public async pickFormatAndPlay<F extends Array<keyof typeof formatMap>>(\n        urlPrefix: string,\n        formats: F,\n        loop = false,\n    ): Promise<AudioBufferSourceNode> {\n        const format = this.pickFormat(...formats);\n        if (!format) {\n            console.log(\"Browser doesn't support any of the formats\", formats);\n            // Will probably never happen. If happened, format=\"\" and will fail to load audio. Who cares...\n        }\n\n        return this.play(`${urlPrefix}.${format}`, loop);\n    }\n\n    public async play(url: string, loop = false): Promise<AudioBufferSourceNode> {\n        if (!this.sounds.hasOwnProperty(url)) {\n            // No cache, fetch it\n            const response = await fetch(url);\n            if (response.status != 200) {\n                logger.warn(\"Failed to fetch error audio\");\n            }\n            const buffer = await response.arrayBuffer();\n            const sound = await this.audioContext.decodeAudioData(buffer);\n            this.sounds[url] = sound;\n        }\n        const source = this.audioContext.createBufferSource();\n        source.buffer = this.sounds[url];\n        source.loop = loop;\n        source.connect(this.audioContext.destination);\n\n        await this.audioContext.resume();\n        source.onended = () => {\n            this.audioContext.suspend();\n        };\n\n        source.start();\n        return source;\n    }\n\n    private pickFormat<F extends Array<keyof typeof formatMap>>(...formats: F): F[number] | null {\n        // Detect supported formats\n        const audioElement = document.createElement(\"audio\");\n\n        for (const format of formats) {\n            if (audioElement.canPlayType(formatMap[format])) {\n                return format;\n            }\n        }\n        return null;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { SimpleObservable } from \"matrix-widget-api\";\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport { type IDestroyable } from \"../utils/IDestroyable\";\n\n/**\n * Tracks accurate human-perceptible time for an audio clip, as informed\n * by managed playback. This clock is tightly coupled with the operation\n * of the Playback class, making assumptions about how the provided\n * AudioContext will be used (suspended/resumed to preserve time, etc).\n *\n * But why do we need a clock? The AudioContext exposes time information,\n * and so does the audio buffer, but not in a way that is useful for humans\n * to perceive. The audio buffer time is often lagged behind the context\n * time due to internal processing delays of the audio API. Additionally,\n * the context's time is tracked from when it was first initialized/started,\n * not related to positioning within the clip. However, the context time\n * is the most accurate time we can use to determine position within the\n * clip if we're fast enough to track the pauses and stops.\n *\n * As a result, we track every play, pause, stop, and seek event from the\n * Playback class (kinda: it calls us, which is close enough to the same\n * thing). These events are then tracked on the AudioContext time scale,\n * with assumptions that code execution will result in negligible desync\n * of the clock, or at least no perceptible difference in time. It's\n * extremely important that the calling code, and the clock's own code,\n * is extremely fast between the event happening and the clock time being\n * tracked - anything more than a dozen milliseconds is likely to stack up\n * poorly, leading to clock desync.\n *\n * Clock desync can be dangerous for the stability of the playback controls:\n * if the clock thinks the user is somewhere else in the clip, it could\n * inform the playback of the wrong place in time, leading to dead air in\n * the output or, if severe enough, a clock that won't stop running while\n * the audio is paused/stopped. Other examples include the clip stopping at\n * 90% time due to playback ending, the clip playing from the wrong spot\n * relative to the time, and negative clock time.\n *\n * Note that the clip duration is fed to the clock: this is to ensure that\n * we have the most accurate time possible to present.\n */\nexport class PlaybackClock implements IDestroyable {\n    private clipStart = 0;\n    private stopped = true;\n    private lastCheck = 0;\n    private observable = new SimpleObservable<number[]>();\n    private timerId?: number;\n    private clipDuration = 0;\n    private placeholderDuration = 0;\n\n    public constructor(private context: AudioContext) {}\n\n    public get durationSeconds(): number {\n        return this.clipDuration || this.placeholderDuration;\n    }\n\n    public set durationSeconds(val: number) {\n        this.clipDuration = val;\n        this.observable.update([this.timeSeconds, this.clipDuration]);\n    }\n\n    public get timeSeconds(): number {\n        // The modulo is to ensure that we're only looking at the most recent clip\n        // time, as the context is long-running and multiple plays might not be\n        // informed to us (if the control is looping, for example). By taking the\n        // remainder of the division operation, we're assuming that playback is\n        // incomplete or stopped, thus giving an accurate position within the active\n        // clip segment.\n        return (this.context.currentTime - this.clipStart) % this.clipDuration || 0;\n    }\n\n    public get liveData(): SimpleObservable<number[]> {\n        return this.observable;\n    }\n\n    private checkTime = (force = false): void => {\n        const now = this.timeSeconds; // calculated dynamically\n        if (this.lastCheck !== now || force) {\n            this.observable.update([now, this.durationSeconds]);\n            this.lastCheck = now;\n        }\n    };\n\n    /**\n     * Populates default information about the audio clip from the event body.\n     * The placeholders will be overridden once known.\n     * @param {MatrixEvent} event The event to use for placeholders.\n     */\n    public populatePlaceholdersFrom(event: MatrixEvent): void {\n        const durationMs = Number(event.getContent()[\"info\"]?.[\"duration\"]);\n        if (Number.isFinite(durationMs)) this.placeholderDuration = durationMs / 1000;\n    }\n\n    /**\n     * Mark the time in the audio context where the clip starts/has been loaded.\n     * This is to ensure the clock isn't skewed into thinking it is ~0.5s into\n     * a clip when the duration is set.\n     */\n    public flagLoadTime(): void {\n        this.clipStart = this.context.currentTime;\n    }\n\n    public flagStart(): void {\n        if (this.stopped) {\n            this.clipStart = this.context.currentTime;\n            this.stopped = false;\n        }\n\n        if (!this.timerId) {\n            // 100ms interval to make sure the time is as accurate as possible without being overly insane\n            this.timerId = window.setInterval(this.checkTime, 100);\n        }\n    }\n\n    public flagStop(): void {\n        this.stopped = true;\n\n        // Reset the clock time now so that the update going out will trigger components\n        // to check their seek/position information (alongside the clock).\n        this.clipStart = this.context.currentTime;\n    }\n\n    public syncTo(contextTime: number, clipTime: number): void {\n        this.clipStart = contextTime - clipTime;\n        this.stopped = false; // count as a mid-stream pause (if we were stopped)\n        this.checkTime(true);\n    }\n\n    public destroy(): void {\n        this.observable.close();\n        if (this.timerId) clearInterval(this.timerId);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2024 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Request, type Response } from \"./workers/playback.worker\";\nimport { WorkerManager } from \"./WorkerManager\";\nimport playbackWorkerFactory from \"./workers/playbackWorkerFactory\";\n\nexport class PlaybackEncoder {\n    private static internalInstance = new PlaybackEncoder();\n\n    public static get instance(): PlaybackEncoder {\n        return PlaybackEncoder.internalInstance;\n    }\n\n    private readonly worker = new WorkerManager<Request, Response>(playbackWorkerFactory());\n\n    public getPlaybackWaveform(input: Float32Array): Promise<number[]> {\n        return this.worker.call({ data: Array.from(input) }).then((resp) => resp.waveform);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport default function factory(options?: WorkerOptions | undefined): Worker {\n    return new Worker(\n        /* webpackChunkName: \"playback.worker\" */ new URL(\"./playback.worker.ts\", import.meta.url),\n        options,\n    );\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport EventEmitter from \"events\";\nimport { SimpleObservable } from \"matrix-widget-api\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { clamp } from \"@element-hq/web-shared-components\";\n\nimport { UPDATE_EVENT } from \"../stores/AsyncStore\";\nimport { arrayFastResample } from \"../utils/arrays\";\nimport { type IDestroyable } from \"../utils/IDestroyable\";\nimport { PlaybackClock } from \"./PlaybackClock\";\nimport { createAudioContext, decodeOgg } from \"./compat\";\nimport { DEFAULT_WAVEFORM, PLAYBACK_WAVEFORM_SAMPLES } from \"./consts\";\nimport { PlaybackEncoder } from \"../PlaybackEncoder\";\n\nexport enum PlaybackState {\n    Preparing = \"preparing\", // preparing to decode\n    Decoding = \"decoding\",\n    Stopped = \"stopped\", // no progress on timeline\n    Paused = \"paused\", // some progress on timeline\n    Playing = \"playing\", // active progress through timeline\n}\n\nconst THUMBNAIL_WAVEFORM_SAMPLES = 100; // arbitrary: [30,120]\n\nexport interface PlaybackInterface {\n    readonly currentState: PlaybackState;\n    readonly liveData: SimpleObservable<number[]>;\n    readonly timeSeconds: number;\n    readonly durationSeconds: number;\n    skipTo(timeSeconds: number): Promise<void>;\n}\n\nexport class Playback extends EventEmitter implements IDestroyable, PlaybackInterface {\n    /**\n     * Stable waveform for representing a thumbnail of the media. Values are\n     * guaranteed to be between zero and one, inclusive.\n     */\n    public readonly thumbnailWaveform: number[];\n\n    private readonly context: AudioContext;\n    private source?: AudioBufferSourceNode | MediaElementAudioSourceNode;\n    private state = PlaybackState.Decoding;\n    private audioBuf?: AudioBuffer;\n    private element?: HTMLAudioElement;\n    private resampledWaveform: number[];\n    private waveformObservable = new SimpleObservable<number[]>();\n    private readonly clock: PlaybackClock;\n    private readonly fileSize: number;\n\n    /**\n     * Creates a new playback instance from a buffer.\n     * @param {ArrayBuffer} buf The buffer containing the sound sample.\n     * @param {number[]} seedWaveform Optional seed waveform to present until the proper waveform\n     * can be calculated. Contains values between zero and one, inclusive.\n     */\n    public constructor(\n        private buf: ArrayBuffer,\n        seedWaveform = DEFAULT_WAVEFORM,\n    ) {\n        super();\n        // Capture the file size early as reading the buffer will result in a 0-length buffer left behind\n        this.fileSize = this.buf.byteLength;\n        this.context = createAudioContext();\n        this.resampledWaveform = arrayFastResample(seedWaveform ?? DEFAULT_WAVEFORM, PLAYBACK_WAVEFORM_SAMPLES);\n        this.thumbnailWaveform = arrayFastResample(seedWaveform ?? DEFAULT_WAVEFORM, THUMBNAIL_WAVEFORM_SAMPLES);\n        this.waveformObservable.update(this.resampledWaveform);\n        this.clock = new PlaybackClock(this.context);\n    }\n\n    /**\n     * Size of the audio clip in bytes. May be zero if unknown. This is updated\n     * when the playback goes through phase changes.\n     */\n    public get sizeBytes(): number {\n        return this.fileSize;\n    }\n\n    /**\n     * Stable waveform for the playback. Values are guaranteed to be between\n     * zero and one, inclusive.\n     */\n    public get waveform(): number[] {\n        return this.resampledWaveform;\n    }\n\n    public get waveformData(): SimpleObservable<number[]> {\n        return this.waveformObservable;\n    }\n\n    public get clockInfo(): PlaybackClock {\n        return this.clock;\n    }\n\n    public get liveData(): SimpleObservable<number[]> {\n        return this.clock.liveData;\n    }\n\n    public get timeSeconds(): number {\n        return this.clock.timeSeconds;\n    }\n\n    public get durationSeconds(): number {\n        return this.clock.durationSeconds;\n    }\n\n    public get currentState(): PlaybackState {\n        return this.state;\n    }\n\n    public get isPlaying(): boolean {\n        return this.currentState === PlaybackState.Playing;\n    }\n\n    public emit(event: PlaybackState, ...args: any[]): boolean {\n        this.state = event;\n        super.emit(event, ...args);\n        super.emit(UPDATE_EVENT, event, ...args);\n        return true; // we don't ever care if the event had listeners, so just return \"yes\"\n    }\n\n    public destroy(): void {\n        // Dev note: It's critical that we call stop() during cleanup to ensure that downstream callers\n        // are aware of the final clock position before the user triggered an unload.\n        // noinspection JSIgnoredPromiseFromCall - not concerned about being called async here\n        this.stop();\n        this.removeAllListeners();\n        this.clock.destroy();\n        this.waveformObservable.close();\n        if (this.element) {\n            URL.revokeObjectURL(this.element.src);\n            this.element.remove();\n        }\n    }\n\n    public async prepare(): Promise<void> {\n        // don't attempt to decode the media again\n        // AudioContext.decodeAudioData detaches the array buffer `this.buf`\n        // meaning it cannot be re-read\n        if (this.state !== PlaybackState.Decoding) {\n            return;\n        }\n\n        this.state = PlaybackState.Preparing;\n\n        // The point where we use an audio element is fairly arbitrary, though we don't want\n        // it to be too low. As of writing, voice messages want to show a waveform but audio\n        // messages do not. Using an audio element means we can't show a waveform preview, so\n        // we try to target the difference between a voice message file and large audio file.\n        // Overall, the point of this is to avoid memory-related issues due to storing a massive\n        // audio buffer in memory, as that can balloon to far greater than the input buffer's\n        // byte length.\n        if (this.buf.byteLength > 5 * 1024 * 1024) {\n            // 5mb\n            logger.log(\"Audio file too large: processing through <audio /> element\");\n            this.element = document.createElement(\"AUDIO\") as HTMLAudioElement;\n            const deferred = Promise.withResolvers<unknown>();\n            this.element.onloadeddata = deferred.resolve;\n            this.element.onerror = deferred.reject;\n            this.element.src = URL.createObjectURL(new Blob([this.buf]));\n            await deferred.promise; // make sure the audio element is ready for us\n        } else {\n            try {\n                this.audioBuf = await this.context.decodeAudioData(this.buf);\n            } catch (e) {\n                logger.error(\"Error decoding recording:\", e);\n                logger.warn(\"Trying to re-encode to WAV instead...\");\n\n                try {\n                    // This error handler is largely for Safari, which doesn't support Opus/Ogg very well.\n                    const wav = await decodeOgg(this.buf);\n                    this.audioBuf = await this.context.decodeAudioData(wav);\n                } catch (e) {\n                    logger.error(\"Error decoding recording:\", e);\n                    throw e;\n                }\n            }\n\n            // Update the waveform to the real waveform once we have channel data to use. We don't\n            // exactly trust the user-provided waveform to be accurate...\n            this.resampledWaveform = await PlaybackEncoder.instance.getPlaybackWaveform(\n                this.audioBuf.getChannelData(0),\n            );\n        }\n\n        this.waveformObservable.update(this.resampledWaveform);\n\n        this.clock.flagLoadTime(); // must happen first because setting the duration fires a clock update\n        this.clock.durationSeconds = this.element?.duration ?? this.audioBuf!.duration;\n\n        // Signal that we're not decoding anymore. This is done last to ensure the clock is updated for\n        // when the downstream callers try to use it.\n        this.emit(PlaybackState.Stopped); // signal that we're not decoding anymore\n    }\n\n    private onPlaybackEnd = async (): Promise<void> => {\n        await this.context.suspend();\n        this.emit(PlaybackState.Stopped);\n        this.clock.flagStop();\n    };\n\n    public async play(): Promise<void> {\n        // We can't restart a buffer source, so we need to create a new one if we hit the end\n        if (this.state === PlaybackState.Stopped) {\n            this.disconnectSource();\n            this.makeNewSourceBuffer();\n            if (this.element) {\n                await this.element.play();\n            } else {\n                (this.source as AudioBufferSourceNode).start();\n            }\n        }\n\n        // We use the context suspend/resume functions because it allows us to pause a source\n        // node, but that still doesn't help us when the source node runs out (see above).\n        await this.context.resume();\n        this.clock.flagStart();\n        this.emit(PlaybackState.Playing);\n    }\n\n    private disconnectSource(): void {\n        if (this.element) return; // leave connected, we can (and must) re-use it\n        this.source?.disconnect();\n        this.source?.removeEventListener(\"ended\", this.onPlaybackEnd);\n    }\n\n    private makeNewSourceBuffer(): void {\n        if (this.element && this.source) return; // leave connected, we can (and must) re-use it\n\n        if (this.element) {\n            this.source = this.context.createMediaElementSource(this.element);\n        } else {\n            this.source = this.context.createBufferSource();\n            this.source.buffer = this.audioBuf ?? null;\n        }\n\n        this.source.addEventListener(\"ended\", this.onPlaybackEnd);\n        this.source.connect(this.context.destination);\n    }\n\n    public async pause(): Promise<void> {\n        await this.context.suspend();\n        this.emit(PlaybackState.Paused);\n    }\n\n    public stop(): Promise<void> {\n        return this.onPlaybackEnd();\n    }\n\n    public async toggle(): Promise<void> {\n        if (this.isPlaying) await this.pause();\n        else await this.play();\n    }\n\n    public async skipTo(timeSeconds: number): Promise<void> {\n        // Dev note: this function talks a lot about clock desyncs. There is a clock running\n        // independently to the audio context and buffer so that accurate human-perceptible\n        // time can be exposed. The PlaybackClock class has more information, but the short\n        // version is that we need to line up the useful time (clip position) with the context\n        // time, and avoid as many deviations as possible as otherwise the user could see the\n        // wrong time, and we stop playback at the wrong time, etc.\n\n        timeSeconds = clamp(timeSeconds, 0, this.clock.durationSeconds);\n\n        // Track playing state so we don't cause seeking to start playing the track.\n        const isPlaying = this.isPlaying;\n\n        if (isPlaying) {\n            // Pause first so we can get an accurate measurement of time\n            await this.context.suspend();\n        }\n\n        // We can't simply tell the context/buffer to jump to a time, so we have to\n        // start a whole new buffer and start it from the new time offset.\n        const now = this.context.currentTime;\n        this.disconnectSource();\n        this.makeNewSourceBuffer();\n\n        // We have to resync the clock because it can get confused about where we're\n        // at in the audio clip.\n        this.clock.syncTo(now, timeSeconds);\n\n        // Always start the source to queue it up. We have to do this now (and pause\n        // quickly if we're not supposed to be playing) as otherwise the clock can desync\n        // when it comes time to the user hitting play. After a couple jumps, the user\n        // will have desynced the clock enough to be about 10-15 seconds off, while this\n        // keeps it as close to perfect as humans can perceive.\n        if (this.element) {\n            this.element.currentTime = timeSeconds;\n        } else {\n            (this.source as AudioBufferSourceNode).start(now, timeSeconds);\n        }\n\n        // Dev note: it's critical that the code gap between `this.source.start()` and\n        // `this.pause()` is as small as possible: we do not want to delay *anything*\n        // as that could cause a clock desync, or a buggy feeling as a single note plays\n        // during seeking.\n\n        if (isPlaying) {\n            // If we were playing before, continue the context so the clock doesn't desync.\n            await this.context.resume();\n        } else {\n            // As mentioned above, we'll have to pause the clip if we weren't supposed to\n            // be playing it just yet. If we didn't have this, the audio clip plays but all\n            // the states will be wrong: clock won't advance, pause state doesn't match the\n            // blaring noise leaving the user's speakers, etc.\n            //\n            // Also as mentioned, if the code gap is small enough then this should be\n            // executed immediately after the start time, leaving no feasible time for the\n            // user's speakers to play any sound.\n            await this.pause();\n        }\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { Playback } from \"./Playback\";\nimport { type PlaybackManager } from \"./PlaybackManager\";\nimport { DEFAULT_WAVEFORM } from \"./consts\";\n\n/**\n * A managed playback is a Playback instance that is guided by a PlaybackManager.\n */\nexport class ManagedPlayback extends Playback {\n    public constructor(\n        private manager: PlaybackManager,\n        buf: ArrayBuffer,\n        seedWaveform = DEFAULT_WAVEFORM,\n    ) {\n        super(buf, seedWaveform);\n    }\n\n    public async play(): Promise<void> {\n        this.manager.pauseAllExcept(this);\n        return super.play();\n    }\n\n    public destroy(): void {\n        this.manager.destroyPlaybackInstance(this);\n        super.destroy();\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Playback, PlaybackState } from \"./Playback\";\nimport { ManagedPlayback } from \"./ManagedPlayback\";\nimport { DEFAULT_WAVEFORM } from \"./consts\";\n\n/**\n * Handles management of playback instances to ensure certain functionality, like\n * one playback operating at any one time.\n */\nexport class PlaybackManager {\n    private static internalInstance: PlaybackManager;\n\n    private instances: ManagedPlayback[] = [];\n\n    public static get instance(): PlaybackManager {\n        if (!PlaybackManager.internalInstance) {\n            PlaybackManager.internalInstance = new PlaybackManager();\n        }\n        return PlaybackManager.internalInstance;\n    }\n\n    /**\n     * Pauses all other playback instances. If no playback is provided, all playing\n     * instances are paused.\n     * @param playback Optional. The playback to leave untouched.\n     */\n    public pauseAllExcept(playback?: Playback): void {\n        this.instances\n            .filter((p) => p !== playback && p.currentState === PlaybackState.Playing)\n            .forEach((p) => p.pause());\n    }\n\n    public destroyPlaybackInstance(playback: ManagedPlayback): void {\n        this.instances = this.instances.filter((p) => p !== playback);\n    }\n\n    public createPlaybackInstance(buf: ArrayBuffer, waveform = DEFAULT_WAVEFORM): Playback {\n        const instance = new ManagedPlayback(this, buf, waveform);\n        this.instances.push(instance);\n        return instance;\n    }\n}\n","export default __webpack_public_path__ + \"opus-encoderWorker.min.8bd8ff5.js\";","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { arrayFastClone, arraySeed } from \"./arrays\";\n\n/**\n * An array which is of fixed length and accepts rolling values. Values will\n * be inserted on the left, falling off the right.\n */\nexport class FixedRollingArray<T> {\n    private samples: T[] = [];\n\n    /**\n     * Creates a new fixed rolling array.\n     * @param width The width of the array.\n     * @param padValue The value to seed the array with.\n     */\n    public constructor(\n        private width: number,\n        padValue: T,\n    ) {\n        this.samples = arraySeed(padValue, this.width);\n    }\n\n    /**\n     * The array, as a fixed length.\n     */\n    public get value(): T[] {\n        return this.samples;\n    }\n\n    /**\n     * Pushes a value to the array.\n     * @param value The value to push.\n     */\n    public pushValue(value: T): void {\n        let swap = arrayFastClone(this.samples);\n        swap.splice(0, 0, value);\n        if (swap.length > this.width) {\n            swap = swap.slice(0, this.width);\n        }\n        this.samples = swap;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport Recorder from \"opus-recorder/dist/recorder.min.js\";\nimport encoderPath from \"opus-recorder/dist/encoderWorker.min.js\";\nimport { SimpleObservable } from \"matrix-widget-api\";\nimport EventEmitter from \"events\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { clamp } from \"@element-hq/web-shared-components\";\n\nimport MediaDeviceHandler from \"../MediaDeviceHandler\";\nimport { type IDestroyable } from \"../utils/IDestroyable\";\nimport { Singleflight } from \"../utils/Singleflight\";\nimport { PayloadEvent, WORKLET_NAME } from \"./consts\";\nimport { UPDATE_EVENT } from \"../stores/AsyncStore\";\nimport { createAudioContext } from \"./compat\";\nimport { FixedRollingArray } from \"../utils/FixedRollingArray\";\nimport recorderWorkletFactory from \"./recorderWorkletFactory\";\n\nconst CHANNELS = 1; // stereo isn't important\nexport const SAMPLE_RATE = 48000; // 48khz is what WebRTC uses. 12khz is where we lose quality.\nconst TARGET_MAX_LENGTH = 900; // 15 minutes in seconds. Somewhat arbitrary, though longer == larger files.\nconst TARGET_WARN_TIME_LEFT = 10; // 10 seconds, also somewhat arbitrary.\n\nexport const RECORDING_PLAYBACK_SAMPLES = 44;\n\ninterface RecorderOptions {\n    bitrate: number;\n    encoderApplication: number;\n}\n\nexport const voiceRecorderOptions: RecorderOptions = {\n    bitrate: 24000, // recommended Opus bitrate for high-quality VoIP\n    encoderApplication: 2048, // voice\n};\n\nexport const highQualityRecorderOptions: RecorderOptions = {\n    bitrate: 96000, // recommended Opus bitrate for high-quality music/audio streaming\n    encoderApplication: 2049, // full band audio\n};\n\nexport interface IRecordingUpdate {\n    waveform: number[]; // floating points between 0 (low) and 1 (high).\n    timeSeconds: number; // float\n}\n\nexport enum RecordingState {\n    Started = \"started\",\n    EndingSoon = \"ending_soon\", // emits an object with a single numerical value: secondsLeft\n    Ended = \"ended\",\n    Uploading = \"uploading\",\n    Uploaded = \"uploaded\",\n}\n\nexport class VoiceRecording extends EventEmitter implements IDestroyable {\n    private recorder?: Recorder;\n    private recorderContext?: AudioContext;\n    private recorderSource?: MediaStreamAudioSourceNode;\n    private recorderStream?: MediaStream;\n    private recorderWorklet?: AudioWorkletNode;\n    private recorderProcessor?: ScriptProcessorNode;\n    private recording = false;\n    private observable?: SimpleObservable<IRecordingUpdate>;\n    private targetMaxLength: number | null = TARGET_MAX_LENGTH;\n    public amplitudes: number[] = []; // at each second mark, generated\n    private liveWaveform = new FixedRollingArray(RECORDING_PLAYBACK_SAMPLES, 0);\n    public onDataAvailable?: (data: ArrayBuffer) => void;\n\n    public get contentType(): string {\n        return \"audio/ogg\";\n    }\n\n    public get durationSeconds(): number {\n        if (!this.recorder || !this.recorderContext) throw new Error(\"Duration not available without a recording\");\n        return this.recorderContext.currentTime;\n    }\n\n    public get isRecording(): boolean {\n        return this.recording;\n    }\n\n    public emit(event: string, ...args: any[]): boolean {\n        super.emit(event, ...args);\n        super.emit(UPDATE_EVENT, event, ...args);\n        return true; // we don't ever care if the event had listeners, so just return \"yes\"\n    }\n\n    public disableMaxLength(): void {\n        this.targetMaxLength = null;\n    }\n\n    private shouldRecordInHighQuality(): boolean {\n        // Non-voice use case is suspected when noise suppression is disabled by the user.\n        // When recording complex audio, higher quality is required to avoid audio artifacts.\n        // This is a really arbitrary decision, but it can be refined/replaced at any time.\n        return !MediaDeviceHandler.getAudioNoiseSuppression();\n    }\n\n    private async makeRecorder(): Promise<void> {\n        try {\n            const requestedDeviceId = MediaDeviceHandler.getAudioInput();\n            const deviceIdConstraint =\n                requestedDeviceId && requestedDeviceId !== \"default\" ? { deviceId: { exact: requestedDeviceId } } : {};\n\n            this.recorderStream = await navigator.mediaDevices.getUserMedia({\n                audio: {\n                    channelCount: CHANNELS,\n                    ...deviceIdConstraint,\n                    autoGainControl: { ideal: MediaDeviceHandler.getAudioAutoGainControl() },\n                    echoCancellation: { ideal: MediaDeviceHandler.getAudioEchoCancellation() },\n                    noiseSuppression: { ideal: MediaDeviceHandler.getAudioNoiseSuppression() },\n                },\n            });\n            this.recorderContext = createAudioContext({\n                // latencyHint: \"interactive\", // we don't want a latency hint (this causes data smoothing)\n            });\n            this.recorderSource = this.recorderContext.createMediaStreamSource(this.recorderStream);\n\n            // Connect our inputs and outputs\n            if (this.recorderContext.audioWorklet) {\n                // Set up our worklet. We use this for timing information and waveform analysis: the\n                // web audio API prefers this be done async to avoid holding the main thread with math.\n                await recorderWorkletFactory(this.recorderContext);\n\n                this.recorderWorklet = new AudioWorkletNode(this.recorderContext, WORKLET_NAME);\n                this.recorderSource.connect(this.recorderWorklet);\n                this.recorderWorklet.connect(this.recorderContext.destination);\n\n                // Dev note: we can't use `addEventListener` for some reason. It just doesn't work.\n                this.recorderWorklet.port.onmessage = (ev) => {\n                    switch (ev.data[\"ev\"]) {\n                        case PayloadEvent.Timekeep:\n                            this.processAudioUpdate(ev.data[\"timeSeconds\"]);\n                            break;\n                        case PayloadEvent.AmplitudeMark:\n                            // Sanity check to make sure we're adding about one sample per second\n                            if (ev.data[\"forIndex\"] === this.amplitudes.length) {\n                                this.amplitudes.push(ev.data[\"amplitude\"]);\n                                this.liveWaveform.pushValue(ev.data[\"amplitude\"]);\n                            }\n                            break;\n                    }\n                };\n            } else {\n                // Safari fallback: use a processor node instead, buffered to 1024 bytes of data\n                // like the worklet is.\n                this.recorderProcessor = this.recorderContext.createScriptProcessor(1024, CHANNELS, CHANNELS);\n                this.recorderSource.connect(this.recorderProcessor);\n                this.recorderProcessor.connect(this.recorderContext.destination);\n                this.recorderProcessor.addEventListener(\"audioprocess\", this.onAudioProcess);\n            }\n\n            const recorderOptions = this.shouldRecordInHighQuality()\n                ? highQualityRecorderOptions\n                : voiceRecorderOptions;\n            const { encoderApplication, bitrate } = recorderOptions;\n\n            this.recorder = new Recorder({\n                encoderPath, // magic from webpack\n                encoderSampleRate: SAMPLE_RATE,\n                encoderApplication: encoderApplication,\n                streamPages: true, // this speeds up the encoding process by using CPU over time\n                encoderFrameSize: 20, // ms, arbitrary frame size we send to the encoder\n                numberOfChannels: CHANNELS,\n                sourceNode: this.recorderSource,\n                encoderBitRate: bitrate,\n\n                // We use low values for the following to ease CPU usage - the resulting waveform\n                // is indistinguishable for a voice message. Note that the underlying library will\n                // pick defaults which prefer the highest possible quality, CPU be damned.\n                encoderComplexity: 3, // 0-10, 10 is slow and high quality.\n                resampleQuality: 3, // 0-10, 10 is slow and high quality\n            });\n\n            // not using EventEmitter here because it leads to detached bufferes\n            this.recorder.ondataavailable = (data: ArrayBuffer) => this.onDataAvailable?.(data);\n        } catch (e) {\n            logger.error(\"Error starting recording: \", e);\n            if (e instanceof DOMException) {\n                // Unhelpful DOMExceptions are common - parse them sanely\n                logger.error(`${e.name} (${e.code}): ${e.message}`);\n            }\n\n            // Clean up as best as possible\n            if (this.recorderStream) this.recorderStream.getTracks().forEach((t) => t.stop());\n            if (this.recorderSource) this.recorderSource.disconnect();\n            if (this.recorder) this.recorder.close();\n            if (this.recorderContext) {\n                // noinspection ES6MissingAwait - not important that we wait\n                this.recorderContext.close();\n            }\n\n            throw e; // rethrow so upstream can handle it\n        }\n    }\n\n    public get liveData(): SimpleObservable<IRecordingUpdate> {\n        if (!this.recording || !this.observable) throw new Error(\"No observable when not recording\");\n        return this.observable;\n    }\n\n    public get isSupported(): boolean {\n        return !!Recorder.isRecordingSupported();\n    }\n\n    private onAudioProcess = (ev: AudioProcessingEvent): void => {\n        this.processAudioUpdate(ev.playbackTime);\n\n        // We skip the functionality of the worklet regarding waveform calculations: we\n        // should get that information pretty quick during the playback info.\n    };\n\n    private processAudioUpdate = (timeSeconds: number): void => {\n        if (!this.recording) return;\n\n        this.observable!.update({\n            waveform: this.liveWaveform.value.map((v) => clamp(v, 0, 1)),\n            timeSeconds: timeSeconds,\n        });\n\n        // Now that we've updated the data/waveform, let's do a time check. We don't want to\n        // go horribly over the limit. We also emit a warning state if needed.\n        //\n        // We use the recorder's perspective of time to make sure we don't cut off the last\n        // frame of audio, otherwise we end up with a 14:59 clip (899.68 seconds). This extra\n        // safety can allow us to overshoot the target a bit, but at least when we say 15min\n        // maximum we actually mean it.\n        //\n        // In testing, recorder time and worker time lag by about 400ms, which is roughly the\n        // time needed to encode a sample/frame.\n        //\n\n        if (!this.targetMaxLength) {\n            // skip time checks if max length has been disabled\n            return;\n        }\n\n        const secondsLeft = TARGET_MAX_LENGTH - this.recorderSeconds!;\n        if (secondsLeft < 0) {\n            // go over to make sure we definitely capture that last frame\n            // noinspection JSIgnoredPromiseFromCall - we aren't concerned with it overlapping\n            this.stop();\n        } else if (secondsLeft <= TARGET_WARN_TIME_LEFT) {\n            Singleflight.for(this, \"ending_soon\").do(() => {\n                this.emit(RecordingState.EndingSoon, { secondsLeft });\n                return Singleflight.Void;\n            });\n        }\n    };\n\n    /**\n     * {@link https://github.com/chris-rudmin/opus-recorder#instance-fields ref for recorderSeconds}\n     */\n    public get recorderSeconds(): number | undefined {\n        if (!this.recorder) return undefined;\n        return this.recorder.encodedSamplePosition / 48000;\n    }\n\n    public async start(): Promise<void> {\n        if (this.recording) {\n            throw new Error(\"Recording already in progress\");\n        }\n        if (this.observable) {\n            this.observable.close();\n        }\n        this.observable = new SimpleObservable<IRecordingUpdate>();\n        await this.makeRecorder();\n        await this.recorder?.start();\n        this.recording = true;\n        this.emit(RecordingState.Started);\n    }\n\n    public async stop(): Promise<void> {\n        return Singleflight.for(this, \"stop\").do(async (): Promise<void> => {\n            if (!this.recording) {\n                throw new Error(\"No recording to stop\");\n            }\n\n            // Disconnect the source early to start shutting down resources\n            await this.recorder!.stop(); // stop first to flush the last frame\n            this.recorderSource!.disconnect();\n            if (this.recorderWorklet) this.recorderWorklet.disconnect();\n            if (this.recorderProcessor) {\n                this.recorderProcessor.disconnect();\n                this.recorderProcessor.removeEventListener(\"audioprocess\", this.onAudioProcess);\n            }\n\n            // close the context after the recorder so the recorder doesn't try to\n            // connect anything to the context (this would generate a warning)\n            await this.recorderContext!.close();\n\n            // Now stop all the media tracks so we can release them back to the user/OS\n            this.recorderStream!.getTracks().forEach((t) => t.stop());\n\n            // Finally do our post-processing and clean up\n            this.recording = false;\n            this.recorder!.close();\n            this.emit(RecordingState.Ended);\n        });\n    }\n\n    public destroy(): void {\n        // noinspection JSIgnoredPromiseFromCall - not concerned about stop() being called async here\n        this.stop();\n        this.removeAllListeners();\n        this.onDataAvailable = undefined;\n        Singleflight.forgetAllFor(this);\n        // noinspection JSIgnoredPromiseFromCall - not concerned about being called async here\n        this.observable?.close();\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport mxRecorderWorkletPath from \"./RecorderWorklet\";\n\nexport default function recorderWorkletFactory(context: AudioContext): Promise<void> {\n    // In future we should be using the built-in worklet support in Webpack 5 with the syntax\n    // described in https://github.com/webpack/webpack.js.org/issues/6869:\n    // addModule(/* webpackChunkName: \"recorder.worklet\" */ new URL(\"./RecorderWorklet.ts\", import.meta.url));\n    return context.audioWorklet.addModule(mxRecorderWorkletPath);\n}\n","export default __webpack_public_path__ + \"decoderWorker.min.wasm\";","export default __webpack_public_path__ + \"wave-encoderWorker.min.9f737c9.js\";","export default __webpack_public_path__ + \"opus-decoderWorker.min.f69d392.js\";","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n// @ts-ignore - we know that this is not a module. We're looking for a path.\nimport decoderWasmPath from \"opus-recorder/dist/decoderWorker.min.wasm\";\nimport wavEncoderPath from \"opus-recorder/dist/waveWorker.min.js\";\nimport decoderPath from \"opus-recorder/dist/decoderWorker.min.js\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { SAMPLE_RATE } from \"./VoiceRecording\";\n\nexport function createAudioContext(opts?: AudioContextOptions): AudioContext {\n    if (window.AudioContext) {\n        const ctx = new AudioContext(opts);\n        // Initialize in suspended state, as Firefox starts using\n        // CPU/battery right away, even if we don't play any sound yet.\n        void ctx.suspend();\n        return ctx;\n    } else {\n        throw new Error(\"Unsupported browser\");\n    }\n}\n\nexport function decodeOgg(audioBuffer: ArrayBuffer): Promise<ArrayBuffer> {\n    // Condensed version of decoder example, using a promise:\n    // https://github.com/chris-rudmin/opus-recorder/blob/master/example/decoder.html\n    return new Promise((resolve) => {\n        // no reject because the workers don't seem to have a fail path\n        logger.log(\"Decoder WASM path: \" + decoderWasmPath); // so we use the variable (avoid tree shake)\n        const typedArray = new Uint8Array(audioBuffer);\n        const decoderWorker = new Worker(decoderPath);\n        const wavWorker = new Worker(wavEncoderPath);\n\n        decoderWorker.postMessage({\n            command: \"init\",\n            decoderSampleRate: SAMPLE_RATE,\n            outputBufferSampleRate: SAMPLE_RATE,\n        });\n\n        wavWorker.postMessage({\n            command: \"init\",\n            wavBitDepth: 24, // standard for 48khz (SAMPLE_RATE)\n            wavSampleRate: SAMPLE_RATE,\n        });\n\n        decoderWorker.onmessage = (ev) => {\n            if (ev.data === null) {\n                // null == done\n                wavWorker.postMessage({ command: \"done\" });\n                return;\n            }\n\n            wavWorker.postMessage(\n                {\n                    command: \"encode\",\n                    buffers: ev.data,\n                },\n                ev.data.map((b: Float32Array) => b.buffer),\n            );\n        };\n\n        wavWorker.onmessage = (ev) => {\n            if (ev.data.message === \"page\") {\n                // The encoding comes through as a single page\n                resolve(new Blob([ev.data.page], { type: \"audio/wav\" }).arrayBuffer());\n            }\n        };\n\n        decoderWorker.postMessage(\n            {\n                command: \"decode\",\n                pages: typedArray,\n            },\n            [typedArray.buffer],\n        );\n    });\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { arraySeed } from \"../utils/arrays\";\n\nexport const WORKLET_NAME = \"mx-voice-worklet\";\n\nexport enum PayloadEvent {\n    Timekeep = \"timekeep\",\n    AmplitudeMark = \"amplitude_mark\",\n}\n\nexport interface IPayload {\n    ev: PayloadEvent;\n}\n\nexport interface ITimingPayload extends IPayload {\n    ev: PayloadEvent.Timekeep;\n    timeSeconds: number;\n}\n\nexport interface IAmplitudePayload extends IPayload {\n    ev: PayloadEvent.AmplitudeMark;\n    forIndex: number;\n    amplitude: number;\n}\n\nexport const PLAYBACK_WAVEFORM_SAMPLES = 39;\nexport const DEFAULT_WAVEFORM = arraySeed(0, PLAYBACK_WAVEFORM_SAMPLES);\n","/*\nCopyright 2017-2024 New Vector Ltd.\nCopyright 2017 Vector Creations Ltd\nCopyright 2016 Aviral Dasgupta\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type React from \"react\";\nimport { TimelineRenderingType } from \"../contexts/RoomContext\";\nimport type { ICompletion, ISelectionRange } from \"./Autocompleter\";\n\nexport interface ICommand {\n    command: RegExpExecArray | null;\n    range: {\n        start: number;\n        end: number;\n    };\n}\n\nexport interface IAutocompleteOptions {\n    commandRegex?: RegExp;\n    forcedCommandRegex?: RegExp;\n    renderingType?: TimelineRenderingType;\n}\n\nexport default abstract class AutocompleteProvider {\n    public commandRegex?: RegExp;\n    public forcedCommandRegex?: RegExp;\n\n    protected renderingType: TimelineRenderingType = TimelineRenderingType.Room;\n\n    protected constructor({ commandRegex, forcedCommandRegex, renderingType }: IAutocompleteOptions) {\n        if (commandRegex) {\n            if (!commandRegex.global) {\n                throw new Error(\"commandRegex must have global flag set\");\n            }\n            this.commandRegex = commandRegex;\n        }\n        if (forcedCommandRegex) {\n            if (!forcedCommandRegex.global) {\n                throw new Error(\"forcedCommandRegex must have global flag set\");\n            }\n            this.forcedCommandRegex = forcedCommandRegex;\n        }\n        if (renderingType) {\n            this.renderingType = renderingType;\n        }\n    }\n\n    public destroy(): void {\n        // stub\n    }\n\n    /**\n     * Of the matched commands in the query, returns the first that contains or is contained by the selection, or null.\n     * @param {string} query The query string\n     * @param {ISelectionRange} selection Selection to search\n     * @param {boolean} force True if the user is forcing completion\n     * @returns {object} { command, range } where both objects fields are null if no match\n     */\n    public getCurrentCommand(query: string, selection: ISelectionRange, force = false): Partial<ICommand> {\n        let commandRegex = this.commandRegex;\n\n        if (force && this.shouldForceComplete()) {\n            commandRegex = this.forcedCommandRegex || /\\S+/g;\n        }\n\n        if (!commandRegex) {\n            return {};\n        }\n\n        commandRegex.lastIndex = 0;\n\n        let match: RegExpExecArray | null;\n        while ((match = commandRegex.exec(query)) !== null) {\n            const start = match.index;\n            const end = start + match[0].length;\n            if (selection.start <= end && selection.end >= start) {\n                return {\n                    command: match,\n                    range: {\n                        start,\n                        end,\n                    },\n                };\n            }\n        }\n        return {\n            command: null,\n            range: {\n                start: -1,\n                end: -1,\n            },\n        };\n    }\n\n    public abstract getCompletions(\n        query: string,\n        selection: ISelectionRange,\n        force: boolean,\n        limit: number,\n    ): Promise<ICompletion[]>;\n\n    public abstract getName(): string;\n\n    public abstract renderCompletions(completions: React.ReactNode[]): React.ReactNode | null;\n\n    // Whether we should provide completions even if triggered forcefully, without a sigil.\n    public shouldForceComplete(): boolean {\n        return false;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2018 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2017 Vector Creations Ltd\nCopyright 2017 New Vector Ltd\nCopyright 2016 Aviral Dasgupta\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { _t } from \"../languageHandler\";\nimport AutocompleteProvider from \"./AutocompleteProvider\";\nimport QueryMatcher from \"./QueryMatcher\";\nimport { TextualCompletion } from \"./Components\";\nimport { type ICompletion, type ISelectionRange } from \"./Autocompleter\";\nimport { type Command, Commands, CommandMap } from \"../slash-commands/SlashCommands\";\nimport { type TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\n\nconst COMMAND_RE = /(^\\/\\w*)(?: .*)?/g;\n\nexport default class CommandProvider extends AutocompleteProvider {\n    public matcher: QueryMatcher<Command>;\n    private room: Room;\n    public constructor(room: Room, renderingType?: TimelineRenderingType) {\n        super({ commandRegex: COMMAND_RE, renderingType });\n        this.matcher = new QueryMatcher(Commands, {\n            keys: [\"command\", \"args\", \"description\"],\n            funcs: [({ aliases }) => aliases.join(\" \")], // aliases\n            context: renderingType,\n        });\n        this.room = room;\n    }\n\n    public async getCompletions(\n        query: string,\n        selection: ISelectionRange,\n        force?: boolean,\n        limit = -1,\n    ): Promise<ICompletion[]> {\n        const { command, range } = this.getCurrentCommand(query, selection);\n        if (!command) return [];\n\n        const cli = MatrixClientPeg.get();\n\n        let matches: Command[] = [];\n        // check if the full match differs from the first word (i.e. returns false if the command has args)\n        if (command[0] !== command[1]) {\n            // The input looks like a command with arguments, perform exact match\n            const name = command[1].slice(1); // strip leading `/`\n            if (CommandMap.has(name) && CommandMap.get(name)!.isEnabled(cli, this.room.roomId)) {\n                // some commands, namely `me` don't suit having the usage shown whilst typing their arguments\n                if (CommandMap.get(name)!.hideCompletionAfterSpace) return [];\n                matches = [CommandMap.get(name)!];\n            }\n        } else {\n            if (query === \"/\") {\n                // If they have just entered `/` show everything\n                // We exclude the limit on purpose to have a comprehensive list\n                matches = Commands;\n            } else {\n                // otherwise fuzzy match against all of the fields\n                matches = this.matcher.match(command[1], limit);\n            }\n        }\n\n        return matches\n            .filter((cmd) => {\n                const display = !cmd.renderingTypes || cmd.renderingTypes.includes(this.renderingType);\n                return cmd.isEnabled(cli, this.room.roomId) && display;\n            })\n            .map((result) => {\n                let completion = result.getCommand() + \" \";\n                const usedAlias = result.aliases.find((alias) => `/${alias}` === command[1]);\n                // If the command (or an alias) is the same as the one they entered, we don't want to discard their arguments\n                if (usedAlias || result.getCommand() === command[1]) {\n                    completion = command[0];\n                }\n\n                return {\n                    completion,\n                    type: \"command\",\n                    component: (\n                        <TextualCompletion\n                            title={`/${usedAlias || result.command}`}\n                            subtitle={result.args}\n                            description={_t(result.description)}\n                        />\n                    ),\n                    range: range!,\n                };\n            });\n    }\n\n    public getName(): string {\n        return \"*️⃣ \" + _t(\"composer|autocomplete|command_description\");\n    }\n\n    public renderCompletions(completions: React.ReactNode[]): React.ReactNode {\n        return (\n            <div\n                className=\"mx_Autocomplete_Completion_container_pill\"\n                role=\"presentation\"\n                aria-label={_t(\"composer|autocomplete|command_a11y\")}\n            >\n                {completions}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2016 Aviral Dasgupta\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type Ref, type JSX } from \"react\";\nimport classNames from \"classnames\";\n\n/* These were earlier stateless functional components but had to be converted\nsince we need to use refs/findDOMNode to access the underlying DOM node to focus the correct completion,\nsomething that is not entirely possible with stateless functional components. One could\npresumably wrap them in a <div> before rendering but I think this is the better way to do it.\n */\n\ninterface ITextualCompletionProps {\n    \"title\"?: string;\n    \"subtitle\"?: string;\n    \"description\"?: string;\n    \"className\"?: string;\n    \"aria-selected\"?: boolean;\n    \"ref\"?: Ref<HTMLDivElement>;\n}\n\nexport const TextualCompletion = (props: ITextualCompletionProps): JSX.Element => {\n    const {\n        title,\n        subtitle,\n        description,\n        className,\n        \"aria-selected\": ariaSelectedAttribute,\n        ref,\n        ...restProps\n    } = props;\n    return (\n        <div\n            {...restProps}\n            className={classNames(\"mx_Autocomplete_Completion_block\", className)}\n            role=\"option\"\n            aria-selected={ariaSelectedAttribute}\n            ref={ref}\n        >\n            <span className=\"mx_Autocomplete_Completion_title\">{title}</span>\n            <span className=\"mx_Autocomplete_Completion_subtitle\">{subtitle}</span>\n            <span className=\"mx_Autocomplete_Completion_description\">{description}</span>\n        </div>\n    );\n};\n\ninterface IPillCompletionProps extends ITextualCompletionProps {\n    /** An icon displayed after the title */\n    titleIcon?: React.ReactNode;\n    children?: React.ReactNode;\n}\n\nexport const PillCompletion = (props: IPillCompletionProps): JSX.Element => {\n    const {\n        title,\n        subtitle,\n        description,\n        className,\n        children,\n        titleIcon,\n        \"aria-selected\": ariaSelectedAttribute,\n        ref,\n        ...restProps\n    } = props;\n    return (\n        <div\n            {...restProps}\n            className={classNames(\"mx_Autocomplete_Completion_pill\", className)}\n            role=\"option\"\n            aria-selected={ariaSelectedAttribute}\n            ref={ref}\n        >\n            {children}\n            <span className=\"mx_Autocomplete_Completion_title\">{title}</span>\n            {titleIcon}\n            <span className=\"mx_Autocomplete_Completion_subtitle\">{subtitle}</span>\n            <span className=\"mx_Autocomplete_Completion_description\">{description}</span>\n        </div>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2018 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2018 New Vector Ltd\nCopyright 2017 Aviral Dasgupta\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { at, uniq } from \"lodash\";\nimport { removeHiddenChars } from \"matrix-js-sdk/src/utils\";\n\nimport { type TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { type Leaves } from \"../@types/common\";\n\ninterface IOptions<T extends object> {\n    keys: Array<Leaves<T>>;\n    funcs?: Array<(o: T) => string | string[]>;\n    shouldMatchWordsOnly?: boolean;\n    // whether to apply unhomoglyph and strip diacritics to fuzz up the search. Defaults to true\n    fuzzy?: boolean;\n    context?: TimelineRenderingType;\n}\n\n/**\n * Simple search matcher that matches any results with the query string anywhere\n * in the search string. Returns matches in the order the query string appears\n * in the search key, earliest first, then in the order the search key appears\n * in the provided array of keys, then in the order the items appeared in the\n * source array.\n *\n * @param {Object[]} objects Initial list of objects. Equivalent to calling\n *     setObjects() after construction\n * @param {Object} options Options object\n * @param {string[]} options.keys List of keys to use as indexes on the objects\n * @param {function[]} options.funcs List of functions that when called with the\n *     object as an arg will return a string to use as an index\n */\nexport default class QueryMatcher<T extends object> {\n    private _options: IOptions<T>;\n    private _items = new Map<string, { object: T; keyWeight: number }[]>();\n\n    public constructor(objects: T[], options: IOptions<T> = { keys: [] }) {\n        this._options = options;\n\n        this.setObjects(objects);\n\n        // By default, we remove any non-alphanumeric characters ([^A-Za-z0-9_]) from the\n        // query and the value being queried before matching\n        if (this._options.shouldMatchWordsOnly === undefined) {\n            this._options.shouldMatchWordsOnly = true;\n        }\n    }\n\n    public setObjects(objects: T[]): void {\n        this._items = new Map();\n\n        for (const object of objects) {\n            // Need to use unsafe coerce here because the objects can have any\n            // type for their values. We assume that those values who's keys have\n            // been specified will be string. Also, we cannot infer all the\n            // types of the keys of the objects at compile.\n            const keyValues = at<string>(<any>object, this._options.keys);\n\n            if (this._options.funcs) {\n                for (const f of this._options.funcs) {\n                    const v = f(object);\n                    if (Array.isArray(v)) {\n                        keyValues.push(...v);\n                    } else {\n                        keyValues.push(v);\n                    }\n                }\n            }\n\n            for (const [index, keyValue] of Object.entries(keyValues)) {\n                if (!keyValue) continue; // skip falsy keyValues\n                const key = this.processQuery(keyValue);\n                if (!this._items.has(key)) {\n                    this._items.set(key, []);\n                }\n                this._items.get(key)!.push({\n                    keyWeight: Number(index),\n                    object,\n                });\n            }\n        }\n    }\n\n    public match(query: string, limit = -1): T[] {\n        query = this.processQuery(query);\n        if (this._options.shouldMatchWordsOnly) {\n            query = query.replace(/[^\\w]/g, \"\");\n        }\n        if (query.length === 0) {\n            return [];\n        }\n        const matches: {\n            index: number;\n            object: T;\n            keyWeight: number;\n        }[] = [];\n        // Iterate through the map & check each key.\n        // ES6 Map iteration order is defined to be insertion order, so results\n        // here will come out in the order they were put in.\n        for (const [key, candidates] of this._items.entries()) {\n            let resultKey = key;\n            if (this._options.shouldMatchWordsOnly) {\n                resultKey = resultKey.replace(/[^\\w]/g, \"\");\n            }\n            const index = resultKey.indexOf(query);\n            if (index !== -1) {\n                matches.push(...candidates.map((candidate) => ({ index, ...candidate })));\n            }\n        }\n\n        // Sort matches by where the query appeared in the search key, then by\n        // where the matched key appeared in the provided array of keys.\n        matches.sort((a, b) => {\n            if (a.index < b.index) {\n                return -1;\n            } else if (a.index === b.index) {\n                if (a.keyWeight < b.keyWeight) {\n                    return -1;\n                } else if (a.keyWeight === b.keyWeight) {\n                    return 0;\n                }\n            }\n\n            return 1;\n        });\n\n        // Now map the keys to the result objects. Also remove any duplicates.\n        const dedupped = uniq(matches.map((match) => match.object));\n        const maxLength = limit === -1 ? dedupped.length : limit;\n\n        return dedupped.slice(0, maxLength);\n    }\n\n    private processQuery(query: string): string {\n        if (this._options.fuzzy !== false) {\n            // lower case both the input and the output for consistency\n            return removeHiddenChars(query.toLowerCase()).toLowerCase();\n        }\n        return query.toLowerCase();\n    }\n}\n","/*\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient, ClientEvent } from \"matrix-js-sdk/src/matrix\";\nimport { BaseViewModel, type UserStatusIconViewSnapshot } from \"@element-hq/web-shared-components\";\n\nimport { fetchUserStatus, validateUserStatus } from \"../../utils/userStatus\";\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nexport interface UserStatusIconViewModelProps {\n    /**\n     * The ID of the user whose status should be displayed.\n     */\n    userId: string;\n    /**\n     * The Matrix client instance.\n     */\n    matrixClient: MatrixClient;\n}\n\nexport class UserStatusIconViewModel extends BaseViewModel<UserStatusIconViewSnapshot, UserStatusIconViewModelProps> {\n    public constructor(props: UserStatusIconViewModelProps) {\n        super(props, { status: undefined });\n\n        if (!SettingsStore.getValue(\"feature_user_status\")) {\n            return;\n        }\n\n        this.disposables.trackListener(\n            props.matrixClient,\n            ClientEvent.UserProfileUpdate,\n            this.onUserProfileUpdate as (...args: unknown[]) => void,\n        );\n\n        fetchUserStatus(props.matrixClient, props.userId)\n            .then((status) => {\n                if (this.isDisposed) return;\n                this.snapshot.merge({ status });\n            })\n            .catch((err) => {\n                logger.warn(\"Failed to fetch user status:\", err);\n            });\n    }\n\n    private onUserProfileUpdate = (syncedUserId: string, syncProfile: Record<string, unknown> | null): void => {\n        if (syncedUserId !== this.props.userId) return;\n        this.snapshot.merge({ status: validateUserStatus(syncProfile?.[\"org.matrix.msc4426.status\"]) });\n    };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2018 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2017, 2018 New Vector Ltd\nCopyright 2017 Vector Creations Ltd\nCopyright 2016 Aviral Dasgupta\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { sortBy } from \"lodash\";\nimport {\n    type MatrixEvent,\n    type Room,\n    RoomEvent,\n    type RoomMember,\n    type RoomState,\n    RoomStateEvent,\n    type IRoomTimelineData,\n} from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\nimport { UserStatusIconView } from \"@element-hq/web-shared-components\";\n\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport QueryMatcher from \"./QueryMatcher\";\nimport { PillCompletion } from \"./Components\";\nimport { UserStatusIconViewModel } from \"../viewmodels/status/UserStatusIconViewModel\";\nimport AutocompleteProvider from \"./AutocompleteProvider\";\nimport { _t } from \"../languageHandler\";\nimport { makeUserPermalink } from \"../utils/permalinks/Permalinks\";\nimport { type ICompletion, type ISelectionRange } from \"./Autocompleter\";\nimport MemberAvatar from \"../components/views/avatars/MemberAvatar\";\nimport { type TimelineRenderingType } from \"../contexts/RoomContext\";\nimport UserIdentifierCustomisations from \"../customisations/UserIdentifier\";\n\nconst USER_REGEX = /\\B@\\S*/g;\n\n// used when you hit 'tab' - we allow some separator chars at the beginning\n// to allow you to tab-complete /mat into /(matthew)\nconst FORCED_USER_REGEX = /[^/,.():; \\t\\n]\\S*/g;\n\nexport default class UserProvider extends AutocompleteProvider {\n    public matcher: QueryMatcher<RoomMember>;\n    public users?: RoomMember[];\n    public room: Room;\n    private statusViewModels = new Map<string, UserStatusIconViewModel>();\n\n    public constructor(room: Room, renderingType?: TimelineRenderingType) {\n        super({\n            commandRegex: USER_REGEX,\n            forcedCommandRegex: FORCED_USER_REGEX,\n            renderingType,\n        });\n        this.room = room;\n        this.matcher = new QueryMatcher<RoomMember>([], {\n            keys: [\"name\"],\n            funcs: [(obj) => obj.userId.slice(1)], // index by user id minus the leading '@'\n            shouldMatchWordsOnly: false,\n        });\n\n        MatrixClientPeg.safeGet().on(RoomEvent.Timeline, this.onRoomTimeline);\n        MatrixClientPeg.safeGet().on(RoomStateEvent.Update, this.onRoomStateUpdate);\n    }\n\n    public destroy(): void {\n        MatrixClientPeg.get()?.removeListener(RoomEvent.Timeline, this.onRoomTimeline);\n        MatrixClientPeg.get()?.removeListener(RoomStateEvent.Update, this.onRoomStateUpdate);\n        for (const vm of this.statusViewModels.values()) vm.dispose();\n        this.statusViewModels.clear();\n    }\n\n    private getStatusViewModel(userId: string): UserStatusIconViewModel {\n        let vm = this.statusViewModels.get(userId);\n        if (!vm) {\n            vm = new UserStatusIconViewModel({ userId, matrixClient: MatrixClientPeg.safeGet() });\n            this.statusViewModels.set(userId, vm);\n        }\n        return vm;\n    }\n\n    private onRoomTimeline = (\n        ev: MatrixEvent,\n        room: Room | undefined,\n        toStartOfTimeline: boolean | undefined,\n        removed: boolean,\n        data: IRoomTimelineData,\n    ): void => {\n        if (!room) return; // notification timeline, we'll get this event again with a room specific timeline\n        if (removed) return;\n        if (room.roomId !== this.room.roomId) return;\n\n        // ignore events from filtered timelines\n        if (data.timeline.getTimelineSet() !== room.getUnfilteredTimelineSet()) return;\n\n        // ignore anything but real-time updates at the end of the room:\n        // updates from pagination will happen when the paginate completes.\n        if (toStartOfTimeline || !data || !data.liveEvent) return;\n\n        // TODO: lazyload if we have no ev.sender room member?\n        this.onUserSpoke(ev.sender);\n    };\n\n    private onRoomStateUpdate = (state: RoomState): void => {\n        // ignore updates in other rooms\n        if (state.roomId !== this.room.roomId) return;\n\n        // blow away the users cache\n        this.users = undefined;\n    };\n\n    public async getCompletions(\n        rawQuery: string,\n        selection: ISelectionRange,\n        force = false,\n        limit = -1,\n    ): Promise<ICompletion[]> {\n        // lazy-load user list into matcher\n        if (!this.users) this.makeUsers();\n\n        const { command, range } = this.getCurrentCommand(rawQuery, selection, force);\n\n        const fullMatch = command?.[0];\n        // Don't search if the query is a single \"@\"\n        if (fullMatch && fullMatch !== \"@\") {\n            // Don't include the '@' in our search query - it's only used as a way to trigger completion\n            const query = fullMatch.startsWith(\"@\") ? fullMatch.substring(1) : fullMatch;\n            return this.matcher.match(query, limit).map((user) => {\n                const description = UserIdentifierCustomisations.getDisplayUserIdentifier?.(user.userId, {\n                    roomId: this.room.roomId,\n                    withDisplayName: true,\n                });\n                const displayName = user.name || user.userId || \"\";\n                return {\n                    // Length of completion should equal length of text in decorator. draft-js\n                    // relies on the length of the entity === length of the text in the decoration.\n                    completion: user.rawDisplayName,\n                    completionId: user.userId,\n                    type: \"user\",\n                    suffix: selection.beginning && range!.start === 0 ? \": \" : \" \",\n                    href: makeUserPermalink(user.userId),\n                    component: (\n                        <PillCompletion\n                            title={displayName}\n                            titleIcon={<UserStatusIconView vm={this.getStatusViewModel(user.userId)} />}\n                            description={description ?? undefined}\n                        >\n                            <MemberAvatar member={user} size=\"24px\" />\n                        </PillCompletion>\n                    ),\n                    range: range!,\n                };\n            });\n        }\n        return [];\n    }\n\n    public getName(): string {\n        return _t(\"composer|autocomplete|user_description\");\n    }\n\n    private makeUsers(): void {\n        const events = this.room.getLiveTimeline().getEvents();\n        const lastSpoken: Record<string, number> = {};\n\n        for (const event of events) {\n            lastSpoken[event.getSender()!] = event.getTs();\n        }\n\n        const currentUserId = MatrixClientPeg.safeGet().credentials.userId;\n        this.users = this.room.getJoinedMembers().filter(({ userId }) => userId !== currentUserId);\n        this.users = this.users.concat(this.room.getMembersWithMembership(KnownMembership.Invite));\n\n        this.users = sortBy(this.users, (member) => 1e20 - lastSpoken[member.userId] || 1e20);\n\n        this.matcher.setObjects(this.users);\n    }\n\n    public onUserSpoke(user: RoomMember | null): void {\n        if (!this.users) return;\n        if (!user) return;\n        if (user.userId === MatrixClientPeg.safeGet().getSafeUserId()) return;\n\n        // Move the user that spoke to the front of the array\n        this.users.splice(\n            this.users.findIndex((user2) => user2.userId === user.userId),\n            1,\n        );\n        this.users = [user, ...this.users];\n\n        this.matcher.setObjects(this.users);\n    }\n\n    public renderCompletions(completions: React.ReactNode[]): React.ReactNode {\n        return (\n            <div\n                className=\"mx_Autocomplete_Completion_container_pill\"\n                role=\"presentation\"\n                aria-label={_t(\"composer|autocomplete|user_a11y\")}\n            >\n                {completions}\n            </div>\n        );\n    }\n\n    public shouldForceComplete(): boolean {\n        return true;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { EventType } from \"matrix-js-sdk/src/matrix\";\nimport { NamespacedValue } from \"matrix-js-sdk/src/NamespacedValue\";\n\nexport const JitsiCallMemberEventType = \"io.element.video.member\";\n\nexport interface JitsiCallMemberContent {\n    // Connected device IDs\n    devices: string[];\n    // Time at which this state event should be considered stale\n    expires_ts: number;\n}\n\n// Element Call no longer sends this event type; it only exists to support timeline rendering of\n// group calls from a previous iteration of the group VoIP MSCs (MSC3401) which used it.\nexport const ElementCallEventType = new NamespacedValue(null, EventType.GroupCallPrefix);\n\nexport const ElementCallMemberEventType = new NamespacedValue(null, EventType.GroupCallMemberPrefix);\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport { RovingAccessibleButton } from \"../RovingTabIndex\";\n\ninterface IProps extends React.ComponentProps<typeof RovingAccessibleButton> {\n    label?: string;\n}\n\n// Semantic component for representing a role=menuitem\nexport const MenuItem: React.FC<IProps> = ({ children, label, ...props }) => {\n    const ariaLabel = props[\"aria-label\"] || label;\n\n    return (\n        <RovingAccessibleButton {...props} role=\"menuitem\" aria-label={ariaLabel}>\n            {children}\n        </RovingAccessibleButton>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport { RovingAccessibleButton } from \"../RovingTabIndex\";\n\ninterface IProps extends React.ComponentProps<typeof RovingAccessibleButton> {\n    label?: string;\n    active: boolean;\n}\n\n// Semantic component for representing a role=menuitemcheckbox\nexport const MenuItemCheckbox: React.FC<IProps> = ({ children, label, active, disabled, ...props }) => {\n    return (\n        <RovingAccessibleButton\n            {...props}\n            role=\"menuitemcheckbox\"\n            aria-checked={active}\n            aria-disabled={disabled}\n            disabled={disabled}\n            aria-label={label}\n        >\n            {children}\n        </RovingAccessibleButton>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, {\n    type JSX,\n    type CSSProperties,\n    type RefObject,\n    type SyntheticEvent,\n    useRef,\n    useState,\n    type AriaRole,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport classNames from \"classnames\";\nimport FocusLock from \"react-focus-lock\";\nimport { TooltipProvider } from \"@vector-im/compound-web\";\n\nimport { type Writeable } from \"../../@types/common\";\nimport UIStore from \"../../stores/UIStore\";\nimport { checkInputableElement, RovingTabIndexProvider } from \"../../accessibility/RovingTabIndex\";\nimport { KeyBindingAction } from \"../../accessibility/KeyboardShortcuts\";\nimport { getKeyBindingsManager } from \"../../KeyBindingsManager\";\nimport Modal, { ModalManagerEvent } from \"../../Modal\";\n\n// Shamelessly ripped off Modal.js.  There's probably a better way\n// of doing reusable widgets like dialog boxes & menus where we go and\n// pass in a custom control as the actual body.\n\nconst WINDOW_PADDING = 10;\nconst ContextualMenuContainerId = \"mx_ContextualMenu_Container\";\n\nfunction getOrCreateContainer(): HTMLDivElement {\n    let container = document.getElementById(ContextualMenuContainerId) as HTMLDivElement;\n\n    if (!container) {\n        container = document.createElement(\"div\");\n        container.id = ContextualMenuContainerId;\n        document.body.appendChild(container);\n    }\n\n    return container;\n}\n\nexport interface IPosition {\n    top?: number;\n    bottom?: number;\n    left?: number;\n    right?: number;\n    rightAligned?: boolean;\n    bottomAligned?: boolean;\n}\n\nexport enum ChevronFace {\n    Top = \"top\",\n    Bottom = \"bottom\",\n    Left = \"left\",\n    Right = \"right\",\n    None = \"none\",\n}\n\nexport interface MenuProps extends IPosition {\n    menuWidth?: number;\n    menuHeight?: number;\n\n    chevronOffset?: number;\n    chevronFace?: ChevronFace;\n\n    menuPaddingTop?: number;\n    menuPaddingBottom?: number;\n    menuPaddingLeft?: number;\n    menuPaddingRight?: number;\n\n    zIndex?: number;\n}\n\nexport interface IProps extends MenuProps {\n    // If true, insert an invisible screen-sized element behind the menu that when clicked will close it.\n    \"hasBackground\"?: boolean;\n    // whether this context menu should be focus managed. If false it must handle itself\n    \"managed\"?: boolean;\n    \"wrapperClassName\"?: string;\n    \"menuClassName\"?: string;\n\n    // If true, this context menu will be mounted as a child to the parent container. Otherwise\n    // it will be mounted to a container at the root of the DOM.\n    \"mountAsChild\"?: boolean;\n\n    // If specified, contents will be wrapped in a FocusLock, this is only needed if the context menu is being rendered\n    // within an existing FocusLock e.g inside a modal.\n    \"focusLock\"?: boolean;\n\n    // call onFinished on any interaction with the menu\n    \"closeOnInteraction\"?: boolean;\n\n    // Function to be called on menu close\n    \"onFinished\"(this: void): void;\n    // on resize callback\n    \"windowResize\"?(this: void): void;\n\n    // Role & label for accessibility\n    \"role\"?: AriaRole;\n    \"aria-label\"?: string;\n}\n\ninterface IState {\n    contextMenuElem?: HTMLDivElement;\n}\n\n// Generic ContextMenu Portal wrapper\n// all options inside the menu should be of role=menuitem/menuitemcheckbox/menuitemradiobutton and have tabIndex={-1}\n// this will allow the ContextMenu to manage its own focus using arrow keys as per the ARIA guidelines.\nexport default class ContextMenu extends React.PureComponent<React.PropsWithChildren<IProps>, IState> {\n    private readonly initialFocus: HTMLElement;\n\n    public static defaultProps = {\n        hasBackground: true,\n        managed: true,\n    };\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {};\n\n        // persist what had focus when we got initialized so we can return it after\n        this.initialFocus = document.activeElement as HTMLElement;\n    }\n\n    public componentDidMount(): void {\n        Modal.on(ModalManagerEvent.Opened, this.onModalOpen);\n    }\n\n    public componentWillUnmount(): void {\n        Modal.off(ModalManagerEvent.Opened, this.onModalOpen);\n        // return focus to the thing which had it before us\n        this.initialFocus.focus();\n    }\n\n    private onModalOpen = (): void => {\n        this.props.onFinished?.();\n    };\n\n    private collectContextMenuRect = (element: HTMLDivElement): void => {\n        // We don't need to clean up when unmounting, so ignore\n        if (!element) return;\n\n        const first =\n            element.querySelector<HTMLElement>('[role^=\"menuitem\"]') ||\n            element.querySelector<HTMLElement>(\"[tabindex]\");\n\n        if (first) {\n            first.focus();\n        }\n\n        this.setState({\n            contextMenuElem: element,\n        });\n    };\n\n    private onContextMenu = (e: React.MouseEvent): void => {\n        if (this.props.onFinished) {\n            this.props.onFinished();\n\n            e.preventDefault();\n            e.stopPropagation();\n            const x = e.clientX;\n            const y = e.clientY;\n\n            // XXX: This isn't pretty but the only way to allow opening a different context menu on right click whilst\n            // a context menu and its click-guard are up without completely rewriting how the context menus work.\n            setTimeout(() => {\n                const clickEvent = new MouseEvent(\"contextmenu\", {\n                    clientX: x,\n                    clientY: y,\n                    screenX: 0,\n                    screenY: 0,\n                    button: 0, // Left\n                    relatedTarget: null,\n                });\n                document.elementFromPoint(x, y)?.dispatchEvent(clickEvent);\n            }, 0);\n        }\n    };\n\n    private onContextMenuPreventBubbling = (e: React.MouseEvent): void => {\n        // stop propagation so that any context menu handlers don't leak out of this context menu\n        // but do not inhibit the default browser menu\n        e.stopPropagation();\n    };\n\n    // Prevent clicks on the background from going through to the component which opened the menu.\n    private onFinished = (ev: React.MouseEvent): void => {\n        ev.stopPropagation();\n        ev.preventDefault();\n        this.props.onFinished?.();\n    };\n\n    private onClick = (ev: React.MouseEvent): void => {\n        // Don't allow clicks to escape the context menu wrapper\n        ev.stopPropagation();\n\n        if (this.props.closeOnInteraction) {\n            this.props.onFinished?.();\n        }\n    };\n\n    // We now only handle closing the ContextMenu in this keyDown handler.\n    // All of the item/option navigation is delegated to RovingTabIndex.\n    private onKeyDown = (ev: React.KeyboardEvent): void => {\n        ev.stopPropagation(); // prevent keyboard propagating out of the context menu, we're focus-locked\n\n        const action = getKeyBindingsManager().getAccessibilityAction(ev);\n\n        // If someone is managing their own focus, we will only exit for them with Escape.\n        // They are probably using props.focusLock along with this option as well.\n        if (!this.props.managed) {\n            if (action === KeyBindingAction.Escape) {\n                this.props.onFinished();\n            }\n            return;\n        }\n\n        // When an <input> is focused, only handle the Escape key\n        if (checkInputableElement(ev.target as HTMLElement) && action !== KeyBindingAction.Escape) {\n            return;\n        }\n\n        if (\n            [\n                KeyBindingAction.Escape,\n                // You can only navigate the ContextMenu by arrow keys and Home/End (see RovingTabIndex).\n                // Tabbing to the next section of the page, will close the ContextMenu.\n                KeyBindingAction.Tab,\n                // When someone moves left or right along a <Toolbar /> (like the\n                // MessageActionBar), we should close any ContextMenu that is open.\n                KeyBindingAction.ArrowLeft,\n                KeyBindingAction.ArrowRight,\n            ].includes(action!)\n        ) {\n            this.props.onFinished();\n        }\n    };\n\n    protected renderMenu(hasBackground = this.props.hasBackground): JSX.Element {\n        const position: Partial<Writeable<DOMRect>> = {};\n        const {\n            top,\n            bottom,\n            left,\n            right,\n            bottomAligned,\n            rightAligned,\n            menuClassName,\n            menuHeight,\n            menuWidth,\n            menuPaddingLeft,\n            menuPaddingRight,\n            menuPaddingBottom,\n            menuPaddingTop,\n            zIndex,\n            children,\n            focusLock,\n            managed,\n            wrapperClassName,\n            chevronFace: propsChevronFace,\n            chevronOffset: propsChevronOffset,\n            mountAsChild,\n            role,\n            \"aria-label\": ariaLabel,\n            ...props\n        } = this.props;\n\n        if (top) {\n            position.top = top;\n        } else {\n            position.bottom = bottom;\n        }\n\n        let chevronFace: ChevronFace;\n        if (left) {\n            position.left = left;\n            chevronFace = ChevronFace.Left;\n        } else {\n            position.right = right;\n            chevronFace = ChevronFace.Right;\n        }\n\n        const contextMenuRect = this.state.contextMenuElem ? this.state.contextMenuElem.getBoundingClientRect() : null;\n\n        const chevronOffset: CSSProperties = {};\n        if (propsChevronFace) {\n            chevronFace = propsChevronFace;\n        }\n        const hasChevron = chevronFace && chevronFace !== ChevronFace.None;\n\n        if (chevronFace === ChevronFace.Top || chevronFace === ChevronFace.Bottom) {\n            chevronOffset.left = propsChevronOffset;\n        } else {\n            chevronOffset.top = propsChevronOffset;\n        }\n\n        // If we know the dimensions of the context menu, adjust its position to\n        // keep it within the bounds of the (padded) window\n        const { windowWidth, windowHeight } = UIStore.instance;\n        if (contextMenuRect) {\n            if (position.top !== undefined) {\n                let maxTop = windowHeight - WINDOW_PADDING;\n                if (!bottomAligned) {\n                    maxTop -= contextMenuRect.height;\n                }\n                position.top = Math.min(position.top, maxTop);\n                // Adjust the chevron if necessary\n                if (chevronOffset.top !== undefined) {\n                    chevronOffset.top = propsChevronOffset! + top! - position.top;\n                }\n            } else if (position.bottom !== undefined) {\n                position.bottom = Math.min(position.bottom, windowHeight - contextMenuRect.height - WINDOW_PADDING);\n                if (chevronOffset.top !== undefined) {\n                    chevronOffset.top = propsChevronOffset! + position.bottom - bottom!;\n                }\n            }\n            if (position.left !== undefined) {\n                let maxLeft = windowWidth - WINDOW_PADDING;\n                if (!rightAligned) {\n                    maxLeft -= contextMenuRect.width;\n                }\n                position.left = Math.min(position.left, maxLeft);\n                if (chevronOffset.left !== undefined) {\n                    chevronOffset.left = propsChevronOffset! + left! - position.left;\n                }\n            } else if (position.right !== undefined) {\n                position.right = Math.min(position.right, windowWidth - contextMenuRect.width - WINDOW_PADDING);\n                if (chevronOffset.left !== undefined) {\n                    chevronOffset.left = propsChevronOffset! + position.right - right!;\n                }\n            }\n        }\n\n        let chevron;\n        if (hasChevron) {\n            chevron = <div style={chevronOffset} className={\"mx_ContextualMenu_chevron_\" + chevronFace} />;\n        }\n\n        const menuClasses = classNames(\n            {\n                mx_ContextualMenu: true,\n                /**\n                 * In some cases we may get the number of 0, which still means that we're supposed to properly\n                 * add the specific position class, but as it was falsy things didn't work as intended.\n                 * In addition, defensively check for counter cases where we may get more than one value,\n                 * even if we shouldn't.\n                 */\n                mx_ContextualMenu_left: !hasChevron && position.left !== undefined && !position.right,\n                mx_ContextualMenu_right: !hasChevron && position.right !== undefined && !position.left,\n                mx_ContextualMenu_top: !hasChevron && position.top !== undefined && !position.bottom,\n                mx_ContextualMenu_bottom: !hasChevron && position.bottom !== undefined && !position.top,\n                mx_ContextualMenu_withChevron_left: chevronFace === ChevronFace.Left,\n                mx_ContextualMenu_withChevron_right: chevronFace === ChevronFace.Right,\n                mx_ContextualMenu_withChevron_top: chevronFace === ChevronFace.Top,\n                mx_ContextualMenu_withChevron_bottom: chevronFace === ChevronFace.Bottom,\n                mx_ContextualMenu_rightAligned: rightAligned === true,\n                mx_ContextualMenu_bottomAligned: bottomAligned === true,\n            },\n            menuClassName,\n        );\n\n        const menuStyle: CSSProperties = {};\n        if (menuWidth) {\n            menuStyle.width = menuWidth;\n        }\n\n        if (menuHeight) {\n            menuStyle.height = menuHeight;\n        }\n\n        if (!isNaN(Number(menuPaddingTop))) {\n            menuStyle[\"paddingTop\"] = menuPaddingTop;\n        }\n        if (!isNaN(Number(menuPaddingLeft))) {\n            menuStyle[\"paddingLeft\"] = menuPaddingLeft;\n        }\n        if (!isNaN(Number(menuPaddingBottom))) {\n            menuStyle[\"paddingBottom\"] = menuPaddingBottom;\n        }\n        if (!isNaN(Number(menuPaddingRight))) {\n            menuStyle[\"paddingRight\"] = menuPaddingRight;\n        }\n\n        const wrapperStyle: CSSProperties = {};\n        if (!isNaN(Number(zIndex))) {\n            menuStyle[\"zIndex\"] = zIndex! + 1;\n            wrapperStyle[\"zIndex\"] = zIndex;\n        }\n\n        let background: JSX.Element;\n        if (hasBackground) {\n            background = (\n                <div\n                    className=\"mx_ContextualMenu_background\"\n                    style={wrapperStyle}\n                    onClick={this.onFinished}\n                    onContextMenu={this.onContextMenu}\n                />\n            );\n        }\n\n        let body = (\n            <>\n                {chevron}\n                {children}\n            </>\n        );\n\n        if (focusLock) {\n            body = <FocusLock returnFocus>{body}</FocusLock>;\n        }\n\n        // filter props that are invalid for DOM elements\n        const {\n            hasBackground: _hasBackground, // eslint-disable-line @typescript-eslint/no-unused-vars\n            onFinished: _onFinished, // eslint-disable-line @typescript-eslint/no-unused-vars\n            ...divProps\n        } = props;\n\n        return (\n            <RovingTabIndexProvider handleHomeEnd handleUpDown onKeyDown={this.onKeyDown}>\n                {({ onKeyDownHandler }) => (\n                    <div\n                        className={classNames(\"mx_ContextualMenu_wrapper\", wrapperClassName)}\n                        style={{ ...position, ...wrapperStyle }}\n                        onClick={this.onClick}\n                        onKeyDown={onKeyDownHandler}\n                        onContextMenu={this.onContextMenuPreventBubbling}\n                        role={role}\n                        aria-label={ariaLabel}\n                    >\n                        {background}\n                        <TooltipProvider>\n                            <div\n                                className={menuClasses}\n                                style={menuStyle}\n                                ref={this.collectContextMenuRect}\n                                role={managed ? \"menu\" : undefined}\n                                {...divProps}\n                            >\n                                {body}\n                            </div>\n                        </TooltipProvider>\n                    </div>\n                )}\n            </RovingTabIndexProvider>\n        );\n    }\n\n    public render(): JSX.Element {\n        if (this.props.mountAsChild) {\n            // Render as a child of the current parent\n            return this.renderMenu();\n        } else {\n            // Render as a child of a container at the root of the DOM\n            return ReactDOM.createPortal(this.renderMenu(), getOrCreateContainer());\n        }\n    }\n}\n\nexport type ToRightOf = {\n    left: number;\n    top: number;\n    chevronOffset: number;\n};\n\n// Placement method for <ContextMenu /> to position context menu to right of elementRect with chevronOffset\nexport const toRightOf = (elementRect: Pick<DOMRect, \"right\" | \"top\" | \"height\">, chevronOffset = 12): ToRightOf => {\n    const left = elementRect.right + window.scrollX + 3;\n    let top = elementRect.top + elementRect.height / 2 + window.scrollY;\n    top -= chevronOffset + 8; // where 8 is half the height of the chevron\n    return { left, top, chevronOffset };\n};\n\n// Placement method for <ContextMenu /> to position context menu right-aligned and flowing to the left of elementRect,\n// and either above or below: wherever there is more space (maybe this should be aboveOrBelowLeftOf?)\nexport const aboveLeftOf = (\n    elementRect: Pick<DOMRect, \"right\" | \"top\" | \"bottom\">,\n    chevronFace = ChevronFace.None,\n    vPadding = 0,\n): MenuProps => {\n    const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace };\n\n    const buttonRight = elementRect.right + window.scrollX;\n    const buttonBottom = elementRect.bottom + window.scrollY;\n    const buttonTop = elementRect.top + window.scrollY;\n    // Align the right edge of the menu to the right edge of the button\n    menuOptions.right = UIStore.instance.windowWidth - buttonRight;\n    // Align the menu vertically on whichever side of the button has more space available.\n    if (buttonBottom < UIStore.instance.windowHeight / 2) {\n        menuOptions.top = buttonBottom + vPadding;\n    } else {\n        menuOptions.bottom = UIStore.instance.windowHeight - buttonTop + vPadding;\n    }\n\n    return menuOptions;\n};\n\n// Placement method for <ContextMenu /> to position context menu right-aligned and flowing to the right of elementRect,\n// and either above or below: wherever there is more space (maybe this should be aboveOrBelowRightOf?)\nexport const aboveRightOf = (\n    elementRect: Pick<DOMRect, \"left\" | \"top\" | \"bottom\">,\n    chevronFace = ChevronFace.None,\n    vPadding = 0,\n): MenuProps => {\n    const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace };\n\n    const buttonLeft = elementRect.left + window.scrollX;\n    const buttonBottom = elementRect.bottom + window.scrollY;\n    const buttonTop = elementRect.top + window.scrollY;\n    // Align the left edge of the menu to the left edge of the button\n    menuOptions.left = buttonLeft;\n    // Align the menu vertically on whichever side of the button has more space available.\n    if (buttonBottom < UIStore.instance.windowHeight / 2) {\n        menuOptions.top = buttonBottom + vPadding;\n    } else {\n        menuOptions.bottom = UIStore.instance.windowHeight - buttonTop + vPadding;\n    }\n\n    return menuOptions;\n};\n\n// Placement method for <ContextMenu /> to position context menu right-aligned and flowing to the left of elementRect\n// and always above elementRect\nexport const alwaysMenuProps = (\n    elementRect: Pick<DOMRect, \"right\" | \"bottom\" | \"top\">,\n    chevronFace = ChevronFace.None,\n    vPadding = 0,\n): IPosition & { chevronFace: ChevronFace } => {\n    const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace };\n\n    const buttonRight = elementRect.right + window.scrollX;\n    const buttonTop = elementRect.top + window.scrollY;\n    // Align the right edge of the menu to the right edge of the button\n    menuOptions.right = UIStore.instance.windowWidth - buttonRight;\n    // Align the menu vertically above the menu\n    menuOptions.bottom = UIStore.instance.windowHeight - buttonTop + vPadding;\n\n    return menuOptions;\n};\n\n// Placement method for <ContextMenu /> to position context menu right-aligned and flowing to the right of elementRect\n// and always above elementRect\nexport const alwaysAboveRightOf = (\n    elementRect: Pick<DOMRect, \"left\" | \"top\">,\n    chevronFace = ChevronFace.None,\n    vPadding = 0,\n): IPosition & { chevronFace: ChevronFace } => {\n    const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace };\n\n    const buttonLeft = elementRect.left + window.scrollX;\n    const buttonTop = elementRect.top + window.scrollY;\n    // Align the left edge of the menu to the left edge of the button\n    menuOptions.left = buttonLeft;\n    // Align the menu vertically above the menu\n    menuOptions.bottom = UIStore.instance.windowHeight - buttonTop + vPadding;\n\n    return menuOptions;\n};\n\ntype ContextMenuTuple<T> = [\n    boolean,\n    RefObject<T | null>,\n    (ev?: SyntheticEvent) => void,\n    (ev?: SyntheticEvent) => void,\n    (val: boolean) => void,\n];\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint\nexport const useContextMenu = <T extends HTMLElement = HTMLElement>(\n    inputRef?: RefObject<T | null>,\n): ContextMenuTuple<T> => {\n    let button = useRef<T>(null);\n    if (inputRef) {\n        // if we are given a ref, use it instead of ours\n        button = inputRef;\n    }\n\n    const [isOpen, setIsOpen] = useState(false);\n    const open = (ev?: SyntheticEvent): void => {\n        ev?.preventDefault();\n        ev?.stopPropagation();\n        setIsOpen(true);\n    };\n    const close = (ev?: SyntheticEvent): void => {\n        ev?.preventDefault();\n        ev?.stopPropagation();\n        setIsOpen(false);\n    };\n\n    // eslint-disable-next-line react-compiler/react-compiler\n    return [button.current ? isOpen : false, button, open, close, setIsOpen];\n};\n\n// re-export the semantic helper components for simplicity\nexport { ContextMenuButton } from \"../../accessibility/context_menu/ContextMenuButton\";\nexport { ContextMenuTooltipButton } from \"../../accessibility/context_menu/ContextMenuTooltipButton\";\nexport { MenuItem } from \"../../accessibility/context_menu/MenuItem\";\nexport { MenuItemCheckbox } from \"../../accessibility/context_menu/MenuItemCheckbox\";\nexport { MenuItemRadio } from \"../../accessibility/context_menu/MenuItemRadio\";\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createRef } from \"react\";\nimport {\n    AuthType,\n    type IAuthData,\n    type AuthDict,\n    type IInputs,\n    InteractiveAuth,\n    type IStageStatus,\n} from \"matrix-js-sdk/src/interactive-auth\";\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport getEntryComponentForLoginType, {\n    type ContinueKind,\n    CustomAuthType,\n    type IStageComponent,\n} from \"../views/auth/InteractiveAuthEntryComponents\";\nimport Spinner from \"../views/elements/Spinner\";\n\nexport const ERROR_USER_CANCELLED = new Error(\"User cancelled auth session\");\n\nexport type InteractiveAuthCallback<T> = {\n    (success: true, response: T, extra?: { emailSid?: string; clientSecret?: string }): Promise<void>;\n    (success: false, response: IAuthData | Error): Promise<void>;\n};\n\nexport interface InteractiveAuthProps<T> {\n    // matrix client to use for UI auth requests\n    matrixClient: MatrixClient;\n    // response from initial request. If not supplied, will do a request on mount.\n    authData?: IAuthData;\n    // Inputs provided by the user to the auth process\n    // and used by various stages. As passed to js-sdk\n    // interactive-auth\n    inputs?: IInputs;\n    sessionId?: string;\n    clientSecret?: string;\n    emailSid?: string;\n    // If true, poll to see if the auth flow has been completed out-of-band\n    poll?: boolean;\n    // continueText and continueKind are passed straight through to the AuthEntryComponent.\n    continueText?: string;\n    continueKind?: ContinueKind;\n    // callback\n    makeRequest(auth: AuthDict | null): Promise<T>;\n    // callback called when the auth process has finished,\n    // successfully or unsuccessfully.\n    // @param {boolean} status True if the operation requiring\n    //     auth was completed successfully, false if canceled.\n    // @param {object} result The result of the authenticated call\n    //     if successful, otherwise the error object.\n    // @param {object} extra Additional information about the UI Auth\n    //     process:\n    //      * emailSid {string} If email auth was performed, the sid of\n    //            the auth session.\n    //      * clientSecret {string} The client secret used in auth\n    //            sessions with the ID server.\n    onAuthFinished: InteractiveAuthCallback<T>;\n    // As js-sdk interactive-auth\n    requestEmailToken?(email: string, secret: string, attempt: number, session: string): Promise<{ sid: string }>;\n    // Called when the stage changes, or the stage's phase changes. First\n    // argument is the stage, second is the phase. Some stages do not have\n    // phases and will be counted as 0 (numeric).\n    onStagePhaseChange?(stage: AuthType | CustomAuthType | null, phase: number): void;\n}\n\ninterface IState {\n    authStage?: CustomAuthType | AuthType;\n    stageState?: IStageStatus;\n    busy: boolean;\n    errorText?: string;\n    errorCode?: string;\n    submitButtonEnabled: boolean;\n}\n\nexport default class InteractiveAuthComponent<T> extends React.Component<InteractiveAuthProps<T>, IState> {\n    private readonly authLogic: InteractiveAuth<T>;\n    private readonly stageComponent = createRef<IStageComponent>();\n    private intervalId: number | null = null;\n\n    private unmounted = false;\n\n    public constructor(props: InteractiveAuthProps<T>) {\n        super(props);\n\n        this.state = {\n            busy: false,\n            submitButtonEnabled: false,\n        };\n\n        this.authLogic = new InteractiveAuth<T>({\n            authData: this.props.authData,\n            doRequest: this.requestCallback,\n            busyChanged: this.onBusyChanged,\n            inputs: this.props.inputs,\n            stateUpdated: this.authStateUpdated,\n            matrixClient: this.props.matrixClient,\n            sessionId: this.props.sessionId,\n            clientSecret: this.props.clientSecret,\n            emailSid: this.props.emailSid,\n            requestEmailToken: this.requestEmailToken,\n            supportedStages: [\n                AuthType.Password,\n                AuthType.Recaptcha,\n                AuthType.Email,\n                AuthType.Msisdn,\n                AuthType.Terms,\n                AuthType.RegistrationToken,\n                AuthType.UnstableRegistrationToken,\n                AuthType.Sso,\n                AuthType.SsoUnstable,\n                AuthType.OAuth,\n                CustomAuthType.MasCrossSigningReset,\n            ],\n        });\n    }\n\n    public componentDidMount(): void {\n        this.unmounted = false;\n\n        if (this.props.poll) {\n            this.intervalId = window.setInterval(() => {\n                this.authLogic.poll();\n            }, 2000);\n        }\n\n        this.authLogic\n            .attemptAuth()\n            .then(async (result) => {\n                const extra = {\n                    emailSid: this.authLogic.getEmailSid(),\n                    clientSecret: this.authLogic.getClientSecret(),\n                };\n                await this.props.onAuthFinished(true, result, extra);\n            })\n            .catch(async (error) => {\n                await this.props.onAuthFinished(false, error);\n                logger.error(\"Error during user-interactive auth:\", error);\n                if (this.unmounted) {\n                    return;\n                }\n\n                const msg = error.message || error.toString();\n                this.setState({\n                    errorText: msg,\n                    errorCode: error.errcode,\n                });\n            });\n    }\n\n    public componentWillUnmount(): void {\n        this.unmounted = true;\n\n        if (this.intervalId !== null) {\n            clearInterval(this.intervalId);\n        }\n    }\n\n    private requestEmailToken = async (\n        email: string,\n        secret: string,\n        attempt: number,\n        session: string,\n    ): Promise<{ sid: string }> => {\n        this.setState({\n            busy: true,\n        });\n        try {\n            // We know this method only gets called on flows where requestEmailToken is passed but types don't\n            return await this.props.requestEmailToken!(email, secret, attempt, session);\n        } finally {\n            this.setState({\n                busy: false,\n            });\n        }\n    };\n\n    private authStateUpdated = (stageType: AuthType, stageState: IStageStatus): void => {\n        const oldStage = this.state.authStage;\n        this.setState(\n            {\n                busy: false,\n                authStage: stageType,\n                stageState: stageState,\n                errorText: stageState.error,\n                errorCode: stageState.errcode,\n            },\n            () => {\n                if (oldStage !== stageType) {\n                    this.setFocus();\n                } else if (!stageState.error) {\n                    this.stageComponent.current?.attemptFailed?.();\n                }\n            },\n        );\n    };\n\n    private requestCallback = (auth: AuthDict | null, background: boolean): Promise<T> => {\n        // This wrapper just exists because the js-sdk passes a second\n        // 'busy' param for backwards compat. This throws the tests off\n        // so discard it here.\n        return this.props.makeRequest(auth);\n    };\n\n    private onBusyChanged = (busy: boolean): void => {\n        // if we've started doing stuff, reset the error messages\n        // The JS SDK eagerly reports itself as \"not busy\" right after any\n        // immediate work has completed, but that's not really what we want at\n        // the UI layer, so we ignore this signal and show a spinner until\n        // there's a new screen to show the user. This is implemented by setting\n        // `busy: false` in `authStateUpdated`.\n        // See also https://github.com/vector-im/element-web/issues/12546\n        if (busy) {\n            this.setState({\n                busy: true,\n                errorText: undefined,\n                errorCode: undefined,\n            });\n        }\n\n        // authStateUpdated is not called during sso flows\n        if (!busy && (this.state.authStage === AuthType.Sso || this.state.authStage === AuthType.SsoUnstable)) {\n            this.setState({ busy });\n        }\n    };\n\n    private setFocus(): void {\n        this.stageComponent.current?.focus?.();\n    }\n\n    private submitAuthDict = (authData: AuthDict): void => {\n        this.authLogic.submitAuthDict(authData);\n    };\n\n    private onPhaseChange = (newPhase: number): void => {\n        this.props.onStagePhaseChange?.(this.state.authStage ?? null, newPhase || 0);\n    };\n\n    private onStageCancel = async (): Promise<void> => {\n        await this.props.onAuthFinished(false, ERROR_USER_CANCELLED);\n    };\n\n    private onAuthStageFailed = async (e: Error): Promise<void> => {\n        await this.props.onAuthFinished(false, e);\n    };\n\n    private setEmailSid = (sid: string): void => {\n        this.authLogic.setEmailSid(sid);\n    };\n\n    public render(): React.ReactNode {\n        const stage = this.state.authStage;\n        if (!stage) {\n            if (this.state.busy) {\n                return <Spinner />;\n            } else {\n                return null;\n            }\n        }\n\n        const StageComponent = getEntryComponentForLoginType(stage);\n        return (\n            <StageComponent\n                ref={this.stageComponent as any}\n                loginType={stage}\n                matrixClient={this.props.matrixClient}\n                authSessionId={this.authLogic.getSessionId()}\n                clientSecret={this.authLogic.getClientSecret()}\n                stageParams={this.authLogic.getStageParams(stage)}\n                submitAuthDict={this.submitAuthDict}\n                errorText={this.state.errorText}\n                errorCode={this.state.errorCode}\n                busy={this.state.busy}\n                inputs={this.props.inputs}\n                stageState={this.state.stageState}\n                fail={this.onAuthStageFailed}\n                setEmailSid={this.setEmailSid}\n                onPhaseChange={this.onPhaseChange}\n                requestEmailToken={this.authLogic.requestEmailToken}\n                continueText={this.props.continueText}\n                continueKind={this.props.continueKind}\n                onCancel={this.onStageCancel}\n            />\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { EventType, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { CallEvent, CallState, CallType, type MatrixCall } from \"matrix-js-sdk/src/webrtc/call\";\nimport { EventEmitter } from \"events\";\n\nimport { LegacyCallHandlerEvent } from \"../../LegacyCallHandler\";\nimport { MatrixClientPeg } from \"../../MatrixClientPeg\";\nimport { SDKContextClass } from \"../../contexts/SDKContextClass.ts\";\n\nexport enum LegacyCallEventGrouperEvent {\n    StateChanged = \"state_changed\",\n    SilencedChanged = \"silenced_changed\",\n    LengthChanged = \"length_changed\",\n}\n\nconst CONNECTING_STATES = [\n    CallState.Connecting,\n    CallState.WaitLocalMedia,\n    CallState.CreateOffer,\n    CallState.CreateAnswer,\n];\n\nconst SUPPORTED_STATES = [CallState.Connected, CallState.Ringing, CallState.Ended];\n\nconst isCallEventType = (eventType: string): boolean =>\n    eventType.startsWith(\"m.call.\") || eventType.startsWith(\"org.matrix.call.\");\n\nexport const isCallEvent = (event: MatrixEvent): boolean => isCallEventType(event.getType());\n\nexport function buildLegacyCallEventGroupers(\n    callEventGroupers: Map<string, LegacyCallEventGrouper>,\n    events?: MatrixEvent[],\n): Map<string, LegacyCallEventGrouper> {\n    const newCallEventGroupers = new Map();\n    events?.forEach((ev) => {\n        if (!isCallEvent(ev)) {\n            return;\n        }\n\n        const callId = ev.getContent().call_id;\n        if (!newCallEventGroupers.has(callId)) {\n            if (callEventGroupers.has(callId)) {\n                // reuse the LegacyCallEventGrouper object where possible\n                newCallEventGroupers.set(callId, callEventGroupers.get(callId));\n            } else {\n                newCallEventGroupers.set(callId, new LegacyCallEventGrouper());\n            }\n        }\n        newCallEventGroupers.get(callId).add(ev);\n    });\n    return newCallEventGroupers;\n}\n\nexport default class LegacyCallEventGrouper extends EventEmitter {\n    private events: Set<MatrixEvent> = new Set<MatrixEvent>();\n    private call: MatrixCall | null = null;\n    public state?: CallState;\n\n    public constructor() {\n        super();\n\n        SDKContextClass.instance.legacyCallHandler.addListener(LegacyCallHandlerEvent.CallsChanged, this.setCall);\n        SDKContextClass.instance.legacyCallHandler.addListener(\n            LegacyCallHandlerEvent.SilencedCallsChanged,\n            this.onSilencedCallsChanged,\n        );\n    }\n\n    private get invite(): MatrixEvent | undefined {\n        return [...this.events].find((event) => event.getType() === EventType.CallInvite);\n    }\n\n    private get hangup(): MatrixEvent | undefined {\n        return [...this.events].find((event) => event.getType() === EventType.CallHangup);\n    }\n\n    private get reject(): MatrixEvent | undefined {\n        return [...this.events].find((event) => event.getType() === EventType.CallReject);\n    }\n\n    private get selectAnswer(): MatrixEvent | undefined {\n        return [...this.events].find((event) => event.getType() === EventType.CallSelectAnswer);\n    }\n\n    public get isVoice(): boolean | undefined {\n        const invite = this.invite;\n        if (!invite) return undefined;\n\n        // FIXME: Find a better way to determine this from the event?\n        if (invite.getContent()?.offer?.sdp?.indexOf(\"m=video\") !== -1) return false;\n        return true;\n    }\n\n    public get hangupReason(): string | null {\n        return this.call?.hangupReason ?? this.hangup?.getContent()?.reason ?? null;\n    }\n\n    public get rejectParty(): string | undefined {\n        return this.reject?.getSender();\n    }\n\n    public get gotRejected(): boolean {\n        return Boolean(this.reject);\n    }\n\n    public get duration(): number | null {\n        if (!this.hangup?.getDate() || !this.selectAnswer?.getDate()) return null;\n        return this.hangup.getDate()!.getTime() - this.selectAnswer.getDate()!.getTime();\n    }\n\n    /**\n     * Returns true if there are only events from the other side - we missed the call\n     */\n    public get callWasMissed(): boolean {\n        return (\n            this.state === CallState.Ended &&\n            ![...this.events].some((event) => event.sender?.userId === MatrixClientPeg.safeGet().getUserId())\n        );\n    }\n\n    private get callId(): string | undefined {\n        return [...this.events][0]?.getContent()?.call_id;\n    }\n\n    private get roomId(): string | undefined {\n        return [...this.events][0]?.getRoomId();\n    }\n\n    private onSilencedCallsChanged = (): void => {\n        const newState = SDKContextClass.instance.legacyCallHandler.isCallSilenced(this.callId);\n        this.emit(LegacyCallEventGrouperEvent.SilencedChanged, newState);\n    };\n\n    private onLengthChanged = (length: number): void => {\n        this.emit(LegacyCallEventGrouperEvent.LengthChanged, length);\n    };\n\n    public answerCall = (): void => {\n        const roomId = this.roomId;\n        if (!roomId) return;\n        SDKContextClass.instance.legacyCallHandler.answerCall(roomId);\n    };\n\n    public rejectCall = (): void => {\n        const roomId = this.roomId;\n        if (!roomId) return;\n        SDKContextClass.instance.legacyCallHandler.hangupOrReject(roomId, true);\n    };\n\n    public callBack = (): void => {\n        const roomId = this.roomId;\n        if (!roomId) return;\n        SDKContextClass.instance.legacyCallHandler.placeCall(roomId, this.isVoice ? CallType.Voice : CallType.Video);\n    };\n\n    public toggleSilenced = (): void => {\n        const silenced = SDKContextClass.instance.legacyCallHandler.isCallSilenced(this.callId);\n        if (silenced) {\n            SDKContextClass.instance.legacyCallHandler.unSilenceCall(this.callId);\n        } else {\n            SDKContextClass.instance.legacyCallHandler.silenceCall(this.callId);\n        }\n    };\n\n    private setCallListeners(): void {\n        if (!this.call) return;\n        this.call.addListener(CallEvent.State, this.setState);\n        this.call.addListener(CallEvent.LengthChanged, this.onLengthChanged);\n    }\n\n    private setState = (): void => {\n        if (this.call && CONNECTING_STATES.includes(this.call.state)) {\n            this.state = CallState.Connecting;\n        } else if (this.call && SUPPORTED_STATES.includes(this.call.state)) {\n            this.state = this.call.state;\n        } else {\n            if (this.reject) {\n                this.state = CallState.Ended;\n            } else if (this.hangup) {\n                this.state = CallState.Ended;\n            } else if (this.invite && this.call) {\n                this.state = CallState.Connecting;\n            }\n        }\n        this.emit(LegacyCallEventGrouperEvent.StateChanged, this.state);\n    };\n\n    private setCall = (): void => {\n        const callId = this.callId;\n        if (!callId || this.call) return;\n\n        this.call = SDKContextClass.instance.legacyCallHandler.getCallById(callId);\n        this.setCallListeners();\n        this.setState();\n    };\n\n    public add(event: MatrixEvent): void {\n        if (this.events.has(event)) return; // nothing to do\n        this.events.add(event);\n        this.setCall();\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015-2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createRef, type CSSProperties, type ReactNode } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { AutoHideScrollbar } from \"@element-hq/web-shared-components\";\n\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport Timer from \"../../utils/Timer\";\nimport { getKeyBindingsManager } from \"../../KeyBindingsManager\";\nimport { KeyBindingAction } from \"../../accessibility/KeyboardShortcuts\";\nimport { SDKContext } from \"../../contexts/SDKContext\";\n\n// The amount of extra scroll distance to allow prior to unfilling.\n// See getExcessHeight.\nconst UNPAGINATION_PADDING = 6000;\n// The number of milliseconds to debounce calls to onUnfillRequest,\n// to prevent many scroll events causing many unfilling requests.\nconst UNFILL_REQUEST_DEBOUNCE_MS = 200;\n// updateHeight makes the height a `Math.ceil` multiple of this, so we don't have to update the height too often.\n// It also allows the user to scroll past the pagination spinner a bit, so they don't feel blocked so\n// much while the content loads.\nconst PAGE_SIZE = 400;\n\nconst debuglog = (...args: any[]): void => {\n    if (SettingsStore.getValue(\"debug_scroll_panel\")) {\n        logger.log.call(console, \"ScrollPanel debuglog:\", ...args);\n    }\n};\n\ninterface IProps {\n    /* stickyBottom: if set to true, then once the user hits the bottom of\n     * the list, any new children added to the list will cause the list to\n     * scroll down to show the new element, rather than preserving the\n     * existing view.\n     */\n    stickyBottom?: boolean;\n\n    /* startAtBottom: if set to true, the view is assumed to start\n     * scrolled to the bottom.\n     * XXX: It's likely this is unnecessary and can be derived from\n     * stickyBottom, but I'm adding an extra parameter to ensure\n     * behaviour stays the same for other uses of ScrollPanel.\n     * If so, let's remove this parameter down the line.\n     */\n    startAtBottom?: boolean;\n\n    /* className: classnames to add to the top-level div\n     */\n    className?: string;\n\n    /* style: styles to add to the top-level div\n     */\n    style?: CSSProperties;\n\n    /* fixedChildren: allows for children to be passed which are rendered outside\n     * of the wrapper\n     */\n    fixedChildren?: ReactNode;\n    children?: ReactNode;\n\n    /* onFillRequest(backwards): a callback which is called on scroll when\n     * the user nears the start (backwards = true) or end (backwards =\n     * false) of the list.\n     *\n     * This should return a promise; no more calls will be made until the\n     * promise completes.\n     *\n     * The promise should resolve to true if there is more data to be\n     * retrieved in this direction (in which case onFillRequest may be\n     * called again immediately), or false if there is no more data in this\n     * direction (at this time) - which will stop the pagination cycle until\n     * the user scrolls again.\n     */\n    onFillRequest?(backwards: boolean): Promise<boolean>;\n\n    /* onUnfillRequest(backwards): a callback which is called on scroll when\n     * there are children elements that are far out of view and could be removed\n     * without causing pagination to occur.\n     *\n     * This function should accept a boolean, which is true to indicate the back/top\n     * of the panel and false otherwise, and a scroll token, which refers to the\n     * first element to remove if removing from the front/bottom, and last element\n     * to remove if removing from the back/top.\n     */\n    onUnfillRequest?(backwards: boolean, scrollToken: string): void;\n\n    /* onScroll: a callback which is called whenever any scroll happens.\n     */\n    onScroll?(event: Event): void;\n}\n\n/* This component implements an intelligent scrolling list.\n *\n * It wraps a list of <li> children; when items are added to the start or end\n * of the list, the scroll position is updated so that the user still sees the\n * same position in the list.\n *\n * It also provides a hook which allows parents to provide more list elements\n * when we get close to the start or end of the list.\n *\n * Each child element should have a 'data-scroll-tokens'. This string of\n * comma-separated tokens may contain a single token or many, where many indicates\n * that the element contains elements that have scroll tokens themselves. The first\n * token in 'data-scroll-tokens' is used to serialise the scroll state, and returned\n * as the 'trackedScrollToken' attribute by getScrollState().\n *\n * IMPORTANT: INDIVIDUAL TOKENS WITHIN 'data-scroll-tokens' MUST NOT CONTAIN COMMAS.\n *\n * Some notes about the implementation:\n *\n * The saved 'scrollState' can exist in one of two states:\n *\n *   - stuckAtBottom: (the default, and restored by resetScrollState): the\n *     viewport is scrolled down as far as it can be. When the children are\n *     updated, the scroll position will be updated to ensure it is still at\n *     the bottom.\n *\n *   - fixed, in which the viewport is conceptually tied at a specific scroll\n *     offset.  We don't save the absolute scroll offset, because that would be\n *     affected by window width, zoom level, amount of scrollback, etc. Instead,\n *     we save an identifier for the last fully-visible message, and the number\n *     of pixels the window was scrolled below it - which is hopefully near\n *     enough.\n *\n * The 'stickyBottom' property controls the behaviour when we reach the bottom\n * of the window (either through a user-initiated scroll, or by calling\n * scrollToBottom). If stickyBottom is enabled, the scrollState will enter\n * 'stuckAtBottom' state - ensuring that new additions cause the window to\n * scroll down further. If stickyBottom is disabled, we just save the scroll\n * offset as normal.\n */\n\nexport interface IScrollState {\n    stuckAtBottom?: boolean;\n    trackedNode?: HTMLElement;\n    trackedScrollToken?: string;\n    bottomOffset?: number;\n    pixelOffset?: number;\n}\n\ninterface IPreventShrinkingState {\n    offsetFromBottom: number;\n    offsetNode: HTMLElement;\n}\n\nexport default class ScrollPanel extends React.Component<IProps> {\n    // noinspection JSUnusedLocalSymbols\n    public static defaultProps = {\n        stickyBottom: true,\n        startAtBottom: true,\n        onFillRequest: function (backwards: boolean) {\n            return Promise.resolve(false);\n        },\n        onUnfillRequest: function (backwards: boolean, scrollToken: string) {},\n        onScroll: function () {},\n    };\n\n    private readonly pendingFillRequests: Record<\"b\" | \"f\", boolean | null> = {\n        b: null,\n        f: null,\n    };\n    private readonly itemlist = createRef<HTMLOListElement>();\n    private unmounted = false;\n    private scrollTimeout?: Timer;\n    // Are we currently trying to backfill?\n    private isFilling = false;\n    // Is the current fill request caused by a props update?\n    private isFillingDueToPropsUpdate = false;\n    // Did another request to check the fill state arrive while we were trying to backfill?\n    private fillRequestWhileRunning = false;\n    // Is that next fill request scheduled because of a props update?\n    private pendingFillDueToPropsUpdate = false;\n    private scrollState!: IScrollState;\n    private preventShrinkingState: IPreventShrinkingState | null = null;\n    private unfillDebouncer: number | null = null;\n    private bottomGrowth!: number;\n    private minListHeight!: number;\n    private heightUpdateInProgress = false;\n    public divScroll: HTMLDivElement | null = null;\n\n    public static contextType = SDKContext;\n    declare public context: React.ContextType<typeof SDKContext>;\n\n    public constructor(props: IProps, context: React.ContextType<typeof SDKContext>) {\n        super(props, context);\n\n        this.resetScrollState();\n    }\n\n    public componentDidMount(): void {\n        this.unmounted = false;\n        this.context?.resizeNotifier?.on(\"middlePanelResizedNoisy\", this.onResize);\n        this.checkScroll();\n    }\n\n    public componentDidUpdate(): void {\n        // after adding event tiles, we may need to tweak the scroll (either to\n        // keep at the bottom of the timeline, or to maintain the view after\n        // adding events to the top).\n        //\n        // This will also re-check the fill state, in case the pagination was inadequate\n        this.checkScroll(true);\n        this.updatePreventShrinking();\n    }\n\n    public componentWillUnmount(): void {\n        // set a boolean to say we've been unmounted, which any pending\n        // promises can use to throw away their results.\n        //\n        // (We could use isMounted(), but facebook have deprecated that.)\n        this.unmounted = true;\n\n        this.context?.resizeNotifier?.removeListener(\"middlePanelResizedNoisy\", this.onResize);\n\n        this.divScroll = null;\n    }\n\n    private onScroll = (ev: Event): void => {\n        // skip scroll events caused by resizing\n        if (this.context?.resizeNotifier && this.context.resizeNotifier.isResizing) return;\n        debuglog(\"onScroll called past resize gate; scroll node top:\", this.getScrollNode().scrollTop);\n        this.scrollTimeout?.restart();\n        this.saveScrollState();\n        this.updatePreventShrinking();\n        this.props.onScroll?.(ev);\n        // noinspection JSIgnoredPromiseFromCall\n        this.checkFillState();\n    };\n\n    private onResize = (): void => {\n        debuglog(\"onResize called\");\n        this.checkScroll();\n        // update preventShrinkingState if present\n        if (this.preventShrinkingState) {\n            this.preventShrinking();\n        }\n    };\n\n    // after an update to the contents of the panel, check that the scroll is\n    // where it ought to be, and set off pagination requests if necessary.\n    public checkScroll = (isFromPropsUpdate = false): void => {\n        if (this.unmounted) {\n            return;\n        }\n        // We don't care if these two conditions race - they're different trees.\n        // noinspection JSIgnoredPromiseFromCall\n        this.restoreSavedScrollState();\n        // noinspection JSIgnoredPromiseFromCall\n        this.checkFillState(0, isFromPropsUpdate);\n    };\n\n    // return true if the content is fully scrolled down right now; else false.\n    //\n    // note that this is independent of the 'stuckAtBottom' state - it is simply\n    // about whether the content is scrolled down right now, irrespective of\n    // whether it will stay that way when the children update.\n    public isAtBottom = (): boolean => {\n        const sn = this.getScrollNode();\n        // fractional values (both too big and too small)\n        // for scrollTop happen on certain browsers/platforms\n        // when scrolled all the way down. E.g. Chrome 72 on debian.\n        //\n        // We therefore leave a bit of wiggle-room and assume we're at the\n        // bottom if the unscrolled area is less than one pixel high.\n        //\n        // non-standard DPI settings also seem to have effect here and can\n        // actually lead to scrollTop+clientHeight being *larger* than\n        // scrollHeight. (observed in element-desktop on Ubuntu 20.04)\n        //\n        return sn.scrollHeight - (sn.scrollTop + sn.clientHeight) <= 1;\n    };\n\n    // returns the vertical height in the given direction that can be removed from\n    // the content box (which has a height of scrollHeight, see checkFillState) without\n    // pagination occurring.\n    //\n    // padding* = UNPAGINATION_PADDING\n    //\n    // ### Region determined as excess.\n    //\n    //   .---------.                        -              -\n    //   |#########|                        |              |\n    //   |#########|   -                    |  scrollTop   |\n    //   |         |   | padding*           |              |\n    //   |         |   |                    |              |\n    // .-+---------+-. -  -                 |              |\n    // : |         | :    |                 |              |\n    // : |         | :    |  clientHeight   |              |\n    // : |         | :    |                 |              |\n    // .-+---------+-.    -                 -              |\n    // | |         | |    |                                |\n    // | |         | |    |  clientHeight                  | scrollHeight\n    // | |         | |    |                                |\n    // `-+---------+-'    -                                |\n    // : |         | :    |                                |\n    // : |         | :    |  clientHeight                  |\n    // : |         | :    |                                |\n    // `-+---------+-' -  -                                |\n    //   |         |   | padding*                          |\n    //   |         |   |                                   |\n    //   |#########|   -                                   |\n    //   |#########|                                       |\n    //   `---------'                                       -\n    private getExcessHeight(backwards: boolean): number {\n        const sn = this.getScrollNode();\n        const contentHeight = this.getMessagesHeight();\n        const listHeight = this.getListHeight();\n        const clippedHeight = contentHeight - listHeight;\n        const unclippedScrollTop = sn.scrollTop + clippedHeight;\n\n        if (backwards) {\n            return unclippedScrollTop - sn.clientHeight - UNPAGINATION_PADDING;\n        } else {\n            return contentHeight - (unclippedScrollTop + 2 * sn.clientHeight) - UNPAGINATION_PADDING;\n        }\n    }\n\n    // check the scroll state and send out backfill requests if necessary.\n    public checkFillState = async (depth = 0, isFromPropsUpdate = false): Promise<void> => {\n        if (this.unmounted) {\n            return;\n        }\n\n        const isFirstCall = depth === 0;\n        const sn = this.getScrollNode();\n\n        // if there is less than a screen's worth of messages above or below the\n        // viewport, try to get some more messages.\n        //\n        // scrollTop is the number of pixels between the top of the content and\n        //     the top of the viewport.\n        //\n        // scrollHeight is the total height of the content.\n        //\n        // clientHeight is the height of the viewport (excluding borders,\n        // margins, and scrollbars).\n        //\n        //\n        //   .---------.          -                 -\n        //   |         |          |  scrollTop      |\n        // .-+---------+-.    -   -                 |\n        // | |         | |    |                     |\n        // | |         | |    |  clientHeight       | scrollHeight\n        // | |         | |    |                     |\n        // `-+---------+-'    -                     |\n        //   |         |                            |\n        //   |         |                            |\n        //   `---------'                            -\n        //\n\n        // as filling is async and recursive,\n        // don't allow more than 1 chain of calls concurrently\n        // do make a note when a new request comes in while already running one,\n        // so we can trigger a new chain of calls once done.\n        // However, we make an exception for when we're already filling due to a\n        // props (or children) update, because very often the children include\n        // spinners to say whether we're paginating or not, so this would cause\n        // infinite paginating.\n        if (isFirstCall) {\n            if (this.isFilling && !this.isFillingDueToPropsUpdate) {\n                debuglog(\"isFilling: not entering while request is ongoing, marking for a subsequent request\");\n                this.fillRequestWhileRunning = true;\n                this.pendingFillDueToPropsUpdate = isFromPropsUpdate;\n                return;\n            }\n            debuglog(\"isFilling: setting\");\n            this.isFilling = true;\n            this.isFillingDueToPropsUpdate = isFromPropsUpdate;\n        }\n\n        const itemlist = this.itemlist.current;\n        const firstTile = itemlist?.firstElementChild as HTMLElement | undefined;\n        const fillPromises: Promise<void>[] = [];\n\n        // if scrollTop gets to 1 screen from the top of the first tile,\n        // try backward filling\n        if (!firstTile || sn.scrollTop - firstTile.offsetTop < sn.clientHeight) {\n            // need to back-fill\n            fillPromises.push(this.maybeFill(depth, true));\n        }\n        // if scrollTop gets to 2 screens from the end (so 1 screen below viewport),\n        // try forward filling\n        if (sn.scrollHeight - sn.scrollTop < sn.clientHeight * 2) {\n            // need to forward-fill\n            fillPromises.push(this.maybeFill(depth, false));\n        }\n\n        if (fillPromises.length) {\n            try {\n                await Promise.all(fillPromises);\n            } catch (err) {\n                logger.error(err);\n            }\n        }\n        if (isFirstCall) {\n            debuglog(\"isFilling: clearing\");\n            this.isFilling = false;\n            this.isFillingDueToPropsUpdate = false;\n        }\n\n        if (this.fillRequestWhileRunning) {\n            const refillDueToPropsUpdate = this.pendingFillDueToPropsUpdate;\n            this.fillRequestWhileRunning = false;\n            this.pendingFillDueToPropsUpdate = false;\n            // noinspection ES6MissingAwait\n            this.checkFillState(0, refillDueToPropsUpdate);\n        }\n    };\n\n    // check if unfilling is possible and send an unfill request if necessary\n    private checkUnfillState(backwards: boolean): void {\n        let excessHeight = this.getExcessHeight(backwards);\n        if (excessHeight <= 0 || !this.itemlist.current) {\n            return;\n        }\n\n        const origExcessHeight = excessHeight;\n\n        const tiles = this.itemlist.current.children;\n\n        // The scroll token of the first/last tile to be unpaginated\n        let markerScrollToken: string | null = null;\n\n        // Subtract heights of tiles to simulate the tiles being unpaginated until the\n        // excess height is less than the height of the next tile to subtract. This\n        // prevents excessHeight becoming negative, which could lead to future\n        // pagination.\n        //\n        // If backwards is true, we unpaginate (remove) tiles from the back (top).\n        let tile: HTMLElement;\n        for (let i = 0; i < tiles.length; i++) {\n            tile = tiles[backwards ? i : tiles.length - 1 - i] as HTMLElement;\n            // Subtract height of tile as if it were unpaginated\n            excessHeight -= tile.clientHeight;\n            //If removing the tile would lead to future pagination, break before setting scroll token\n            if (tile.clientHeight > excessHeight) {\n                break;\n            }\n            // The tile may not have a scroll token, so guard it\n            if (tile.dataset.scrollTokens) {\n                markerScrollToken = tile.dataset.scrollTokens.split(\",\")[0];\n            }\n        }\n\n        if (markerScrollToken) {\n            // Use a debouncer to prevent multiple unfill calls in quick succession\n            // This is to make the unfilling process less aggressive\n            if (this.unfillDebouncer) {\n                clearTimeout(this.unfillDebouncer);\n            }\n            this.unfillDebouncer = window.setTimeout(() => {\n                this.unfillDebouncer = null;\n                debuglog(\"unfilling now\", { backwards, origExcessHeight });\n                this.props.onUnfillRequest?.(backwards, markerScrollToken!);\n            }, UNFILL_REQUEST_DEBOUNCE_MS);\n        }\n    }\n\n    // check if there is already a pending fill request. If not, set one off.\n    private maybeFill(depth: number, backwards: boolean): Promise<void> {\n        const dir = backwards ? \"b\" : \"f\";\n        if (this.pendingFillRequests[dir]) {\n            debuglog(\"Already a fill in progress - not starting another; direction=\", dir);\n            return Promise.resolve();\n        }\n\n        debuglog(\"starting fill; direction=\", dir);\n\n        // onFillRequest can end up calling us recursively (via onScroll\n        // events) so make sure we set this before firing off the call.\n        this.pendingFillRequests[dir] = true;\n\n        // wait 1ms before paginating, because otherwise\n        // this will block the scroll event handler for +700ms\n        // if messages are already cached in memory,\n        // This would cause jumping to happen on Chrome/macOS.\n        return new Promise((resolve) => window.setTimeout(resolve, 1))\n            .then(() => {\n                return this.props.onFillRequest?.(backwards);\n            })\n            .finally(() => {\n                this.pendingFillRequests[dir] = false;\n            })\n            .then((hasMoreResults) => {\n                if (this.unmounted) {\n                    return;\n                }\n                // Unpaginate once filling is complete\n                this.checkUnfillState(!backwards);\n\n                debuglog(\"fill complete; hasMoreResults=\", hasMoreResults, \"direction=\", dir);\n                if (hasMoreResults) {\n                    // further pagination requests have been disabled until now, so\n                    // it's time to check the fill state again in case the pagination\n                    // was insufficient.\n                    return this.checkFillState(depth + 1);\n                }\n            });\n    }\n\n    /* get the current scroll state. This returns an object with the following\n     * properties:\n     *\n     * boolean stuckAtBottom: true if we are tracking the bottom of the\n     *   scroll. false if we are tracking a particular child.\n     *\n     * string trackedScrollToken: undefined if stuckAtBottom is true; if it is\n     *   false, the first token in data-scroll-tokens of the child which we are\n     *   tracking.\n     *\n     * number bottomOffset: undefined if stuckAtBottom is true; if it is false,\n     *   the number of pixels the bottom of the tracked child is above the\n     *   bottom of the scroll panel.\n     */\n    public getScrollState = (): IScrollState => this.scrollState;\n\n    /* reset the saved scroll state.\n     *\n     * This is useful if the list is being replaced, and you don't want to\n     * preserve scroll even if new children happen to have the same scroll\n     * tokens as old ones.\n     *\n     * This will cause the viewport to be scrolled down to the bottom on the\n     * next update of the child list. This is different to scrollToBottom(),\n     * which would save the current bottom-most child as the active one (so is\n     * no use if no children exist yet, or if you are about to replace the\n     * child list.)\n     */\n    public resetScrollState = (): void => {\n        this.scrollState = {\n            stuckAtBottom: this.props.startAtBottom,\n        };\n        this.bottomGrowth = 0;\n        this.minListHeight = 0;\n        this.scrollTimeout = new Timer(100);\n        this.heightUpdateInProgress = false;\n    };\n\n    /**\n     * jump to the top of the content.\n     */\n    public scrollToTop = (): void => {\n        this.getScrollNode().scrollTop = 0;\n        this.saveScrollState();\n    };\n\n    /**\n     * jump to the bottom of the content.\n     */\n    public scrollToBottom = (): void => {\n        // the easiest way to make sure that the scroll state is correctly\n        // saved is to do the scroll, then save the updated state. (Calculating\n        // it ourselves is hard, and we can't rely on an onScroll callback\n        // happening, since there may be no user-visible change here).\n        const sn = this.getScrollNode();\n        sn.scrollTop = sn.scrollHeight;\n        this.saveScrollState();\n    };\n\n    /**\n     * Page up/down.\n     *\n     * @param {number} multiple: -1 to page up, +1 to page down\n     */\n    public scrollRelative = (multiple: -1 | 1): void => {\n        const scrollNode = this.getScrollNode();\n        // TODO: Document what magic number 0.9 is doing\n        const delta = multiple * scrollNode.clientHeight * 0.9;\n        scrollNode.scrollBy(0, delta);\n        this.saveScrollState();\n    };\n\n    /**\n     * Scroll up/down in response to a scroll key\n     * @param {object} ev the keyboard event\n     */\n    public handleScrollKey = (ev: React.KeyboardEvent | KeyboardEvent): void => {\n        const roomAction = getKeyBindingsManager().getRoomAction(ev);\n        switch (roomAction) {\n            case KeyBindingAction.ScrollUp:\n                this.scrollRelative(-1);\n                break;\n            case KeyBindingAction.ScrollDown:\n                this.scrollRelative(1);\n                break;\n            case KeyBindingAction.JumpToFirstMessage:\n                this.scrollToTop();\n                break;\n            case KeyBindingAction.JumpToLatestMessage:\n                this.scrollToBottom();\n                break;\n        }\n    };\n\n    /* Scroll the panel to bring the DOM node with the scroll token\n     * `scrollToken` into view.\n     *\n     * offsetBase gives the reference point for the pixelOffset. 0 means the\n     * top of the container, 1 means the bottom, and fractional values mean\n     * somewhere in the middle. If omitted, it defaults to 0.\n     *\n     * pixelOffset gives the number of pixels *above* the offsetBase that the\n     * node (specifically, the bottom of it) will be positioned. If omitted, it\n     * defaults to 0.\n     */\n    public scrollToToken = (scrollToken: string, pixelOffset = 0, offsetBase = 0): void => {\n        // set the trackedScrollToken, so we can get the node through getTrackedNode\n        this.scrollState = {\n            stuckAtBottom: false,\n            trackedScrollToken: scrollToken,\n        };\n        const trackedNode = this.getTrackedNode();\n        const scrollNode = this.getScrollNode();\n        if (trackedNode) {\n            // set the scrollTop to the position we want.\n            // note though, that this might not succeed if the combination of offsetBase and pixelOffset\n            // would position the trackedNode towards the top of the viewport.\n            // This because when setting the scrollTop only 10 or so events might be loaded,\n            // not giving enough content below the trackedNode to scroll downwards\n            // enough, so it ends up in the top of the viewport.\n            debuglog(\"scrollToken: setting scrollTop\", { offsetBase, pixelOffset, offsetTop: trackedNode.offsetTop });\n            scrollNode.scrollTop = trackedNode.offsetTop - scrollNode.clientHeight * offsetBase + pixelOffset;\n            this.saveScrollState();\n        }\n    };\n\n    private saveScrollState(): void {\n        if (this.props.stickyBottom && this.isAtBottom()) {\n            this.scrollState = { stuckAtBottom: true };\n            debuglog(\"saved stuckAtBottom state\");\n            return;\n        }\n\n        const scrollNode = this.getScrollNode();\n        const viewportBottom = scrollNode.scrollHeight - (scrollNode.scrollTop + scrollNode.clientHeight);\n\n        const itemlist = this.itemlist.current;\n        if (!itemlist) return;\n        const messages = itemlist.children;\n        let node: HTMLElement | null = null;\n\n        // TODO: do a binary search here, as items are sorted by offsetTop\n        // loop backwards, from bottom-most message (as that is the most common case)\n        for (let i = messages.length - 1; i >= 0; --i) {\n            const htmlMessage = messages[i] as HTMLElement;\n            if (!htmlMessage.dataset?.scrollTokens) {\n                // dataset is only specified on HTMLElements\n                continue;\n            }\n            node = htmlMessage;\n            // break at the first message (coming from the bottom)\n            // that has it's offsetTop above the bottom of the viewport.\n            if (this.topFromBottom(node) > viewportBottom) {\n                // Use this node as the scrollToken\n                break;\n            }\n        }\n\n        if (!node) {\n            debuglog(\"unable to save scroll state: found no children in the viewport\");\n            return;\n        }\n        const scrollToken = node!.dataset.scrollTokens?.split(\",\")[0];\n        debuglog(\"saving anchored scroll state to message\", scrollToken);\n        const bottomOffset = this.topFromBottom(node);\n        this.scrollState = {\n            stuckAtBottom: false,\n            trackedNode: node,\n            trackedScrollToken: scrollToken,\n            bottomOffset: bottomOffset,\n            pixelOffset: bottomOffset - viewportBottom, //needed for restoring the scroll position when coming back to the room\n        };\n    }\n\n    private async restoreSavedScrollState(): Promise<void> {\n        const scrollState = this.scrollState;\n\n        if (scrollState.stuckAtBottom) {\n            const sn = this.getScrollNode();\n            if (sn.scrollTop !== sn.scrollHeight) {\n                sn.scrollTop = sn.scrollHeight;\n            }\n        } else if (scrollState.trackedScrollToken) {\n            const itemlist = this.itemlist.current;\n            const trackedNode = this.getTrackedNode();\n            if (trackedNode) {\n                const newBottomOffset = this.topFromBottom(trackedNode);\n                const bottomDiff = newBottomOffset - (scrollState.bottomOffset ?? 0);\n                this.bottomGrowth += bottomDiff;\n                scrollState.bottomOffset = newBottomOffset;\n                const newHeight = `${this.getListHeight()}px`;\n                if (itemlist && itemlist.style.height !== newHeight) {\n                    itemlist.style.height = newHeight;\n                }\n                debuglog(\"balancing height because messages below viewport grew by\", bottomDiff);\n            }\n        }\n        if (!this.heightUpdateInProgress) {\n            this.heightUpdateInProgress = true;\n            try {\n                await this.updateHeight();\n            } finally {\n                this.heightUpdateInProgress = false;\n            }\n        } else {\n            debuglog(\"not updating height because request already in progress\");\n        }\n    }\n\n    // need a better name that also indicates this will change scrollTop? Rebalance height? Reveal content?\n    private async updateHeight(): Promise<void> {\n        // wait until user has stopped scrolling\n        if (this.scrollTimeout?.isRunning()) {\n            debuglog(\"updateHeight waiting for scrolling to end ... \");\n            await this.scrollTimeout.finished();\n            debuglog(\"updateHeight actually running now\");\n        } else {\n            debuglog(\"updateHeight running without delay\");\n        }\n\n        // We might have unmounted since the timer finished, so abort if so.\n        if (this.unmounted) {\n            debuglog(\"updateHeight: abort due to unmount\");\n            return;\n        }\n\n        const sn = this.getScrollNode();\n        const itemlist = this.itemlist.current;\n        const contentHeight = this.getMessagesHeight();\n        // Only round to the nearest page when we're basing the height off the content, not off the scrollNode height\n        // otherwise it'll cause too much overscroll which makes it possible to entirely scroll content off-screen.\n        if (contentHeight < sn.clientHeight) {\n            this.minListHeight = sn.clientHeight;\n        } else {\n            this.minListHeight = Math.ceil(contentHeight / PAGE_SIZE) * PAGE_SIZE;\n        }\n        this.bottomGrowth = 0;\n        const newHeight = `${this.getListHeight()}px`;\n\n        const scrollState = this.scrollState;\n        if (scrollState.stuckAtBottom) {\n            if (itemlist && itemlist.style.height !== newHeight) {\n                itemlist.style.height = newHeight;\n            }\n            if (sn.scrollTop !== sn.scrollHeight) {\n                sn.scrollTop = sn.scrollHeight;\n            }\n            debuglog(\"updateHeight to\", newHeight);\n        } else if (scrollState.trackedScrollToken) {\n            const trackedNode = this.getTrackedNode();\n            // if the timeline has been reloaded\n            // this can be called before scrollToBottom or whatever has been called\n            // so don't do anything if the node has disappeared from\n            // the currently filled piece of the timeline\n            if (trackedNode) {\n                const oldTop = trackedNode.offsetTop;\n                if (itemlist && itemlist.style.height !== newHeight) {\n                    itemlist.style.height = newHeight;\n                }\n                const newTop = trackedNode.offsetTop;\n                const topDiff = newTop - oldTop;\n                // important to scroll by a relative amount as\n                // reading scrollTop and then setting it might\n                // yield out of date values and cause a jump\n                // when setting it\n                sn.scrollBy(0, topDiff);\n                debuglog(\"updateHeight to\", { newHeight, topDiff });\n            }\n        }\n    }\n\n    private getTrackedNode(): HTMLElement | undefined {\n        const scrollState = this.scrollState;\n        const trackedNode = scrollState.trackedNode;\n\n        if (!trackedNode?.parentElement && this.itemlist.current) {\n            let node: HTMLElement | undefined = undefined;\n            const messages = this.itemlist.current.children;\n            const scrollToken = scrollState.trackedScrollToken;\n\n            for (let i = messages.length - 1; i >= 0; --i) {\n                const m = messages[i] as HTMLElement;\n                // 'data-scroll-tokens' is a DOMString of comma-separated scroll tokens\n                // There might only be one scroll token\n                if (scrollToken && m.dataset.scrollTokens?.split(\",\").includes(scrollToken!)) {\n                    node = m;\n                    break;\n                }\n            }\n            if (node) {\n                debuglog(\"had to find tracked node again for token:\", scrollState.trackedScrollToken);\n            }\n            scrollState.trackedNode = node;\n        }\n\n        if (!scrollState.trackedNode) {\n            debuglog(\"No node with token:\", scrollState.trackedScrollToken);\n            return;\n        }\n\n        return scrollState.trackedNode;\n    }\n\n    private getListHeight(): number {\n        return this.bottomGrowth + this.minListHeight;\n    }\n\n    private getMessagesHeight(): number {\n        const itemlist = this.itemlist.current;\n        const lastNode = itemlist?.lastElementChild as HTMLElement;\n        const lastNodeBottom = lastNode ? lastNode.offsetTop + lastNode.clientHeight : 0;\n        const firstNodeTop = (itemlist?.firstElementChild as HTMLElement)?.offsetTop ?? 0;\n        // 18 is itemlist padding\n        return lastNodeBottom - firstNodeTop + 18 * 2;\n    }\n\n    private topFromBottom(node: HTMLElement): number {\n        if (!this.itemlist.current) return -1;\n        // current capped height - distance from top = distance from bottom of container to top of tracked element\n        return this.itemlist.current.clientHeight - node.offsetTop;\n    }\n\n    /* get the DOM node which has the scrollTop property we care about for our\n     * message panel.\n     */\n    private getScrollNode(): HTMLDivElement {\n        if (this.unmounted) {\n            // this shouldn't happen, but when it does, turn the NPE into\n            // something more meaningful.\n            throw new Error(\"ScrollPanel.getScrollNode called when unmounted\");\n        }\n\n        if (!this.divScroll) {\n            // Likewise, we should have the ref by this point, but if not\n            // turn the NPE into something meaningful.\n            throw new Error(\"ScrollPanel.getScrollNode called before AutoHideScrollbar ref collected\");\n        }\n\n        return this.divScroll;\n    }\n\n    private collectScroll = (divScroll: HTMLDivElement | null): void => {\n        this.divScroll = divScroll;\n    };\n\n    /**\n    Mark the bottom offset of the last tile, so we can balance it out when\n    anything below it changes, by calling updatePreventShrinking, to keep\n    the same minimum bottom offset, effectively preventing the timeline to shrink.\n    */\n    public preventShrinking = (): void => {\n        const messageList = this.itemlist.current;\n        const tiles = messageList?.children;\n        if (!tiles) {\n            return;\n        }\n        let lastTileNode;\n        for (let i = tiles.length - 1; i >= 0; i--) {\n            const node = tiles[i] as HTMLElement;\n            if (node.dataset.scrollTokens) {\n                lastTileNode = node;\n                break;\n            }\n        }\n        if (!lastTileNode) {\n            return;\n        }\n        this.clearPreventShrinking();\n        const offsetFromBottom = messageList.clientHeight - (lastTileNode.offsetTop + lastTileNode.clientHeight);\n        this.preventShrinkingState = {\n            offsetFromBottom: offsetFromBottom,\n            offsetNode: lastTileNode,\n        };\n        debuglog(\"prevent shrinking, last tile \", offsetFromBottom, \"px from bottom\");\n    };\n\n    /** Clear shrinking prevention. Used internally, and when the timeline is reloaded. */\n    public clearPreventShrinking = (): void => {\n        const messageList = this.itemlist.current;\n        const balanceElement = messageList && messageList.parentElement;\n        if (balanceElement) balanceElement.style.removeProperty(\"paddingBottom\");\n        this.preventShrinkingState = null;\n        debuglog(\"prevent shrinking cleared\");\n    };\n\n    /**\n    update the container padding to balance\n    the bottom offset of the last tile since\n    preventShrinking was called.\n    Clears the prevent-shrinking state ones the offset\n    from the bottom of the marked tile grows larger than\n    what it was when marking.\n    */\n    public updatePreventShrinking = (): void => {\n        if (this.preventShrinkingState && this.itemlist.current) {\n            const sn = this.getScrollNode();\n            const scrollState = this.scrollState;\n            const messageList = this.itemlist.current;\n            const { offsetNode, offsetFromBottom } = this.preventShrinkingState;\n            // element used to set paddingBottom to balance the typing notifs disappearing\n            const balanceElement = messageList.parentElement;\n            // if the offsetNode got unmounted, clear\n            let shouldClear = !offsetNode.parentElement;\n            // also if 200px from bottom\n            if (!shouldClear && !scrollState.stuckAtBottom) {\n                const spaceBelowViewport = sn.scrollHeight - (sn.scrollTop + sn.clientHeight);\n                shouldClear = spaceBelowViewport >= 200;\n            }\n            // try updating if not clearing\n            if (!shouldClear) {\n                const currentOffset = messageList.clientHeight - (offsetNode.offsetTop + offsetNode.clientHeight);\n                const offsetDiff = offsetFromBottom - currentOffset;\n                if (offsetDiff > 0 && balanceElement) {\n                    balanceElement.style.paddingBottom = `${offsetDiff}px`;\n                    debuglog(\"update prevent shrinking \", offsetDiff, \"px from bottom\");\n                } else if (offsetDiff < 0) {\n                    shouldClear = true;\n                }\n            }\n            if (shouldClear) {\n                this.clearPreventShrinking();\n            }\n        }\n    };\n\n    public render(): ReactNode {\n        // TODO: the classnames on the div and ol could do with being updated to\n        // reflect the fact that we don't necessarily contain a list of messages.\n        // it's not obvious why we have a separate div and ol anyway.\n\n        // give the <ol> an explicit role=list because Safari+VoiceOver seems to think an ordered-list with\n        // list-style-type: none; is no longer a list\n        return (\n            <AutoHideScrollbar\n                wrappedRef={this.collectScroll}\n                onScroll={this.onScroll}\n                className={`mx_AutoHideScrollbar mx_ScrollPanel ${this.props.className}`}\n                style={this.props.style}\n            >\n                {this.props.fixedChildren}\n                <div className=\"mx_RoomView_messageListWrapper\">\n                    <ol ref={this.itemlist} className=\"mx_RoomView_MessageList\" aria-live=\"polite\">\n                        {this.props.children}\n                    </ol>\n                </div>\n            </AutoHideScrollbar>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createRef, type HTMLProps } from \"react\";\nimport { throttle } from \"lodash\";\nimport classNames from \"classnames\";\nimport { CloseIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport AccessibleButton from \"../../components/views/elements/AccessibleButton\";\nimport { getKeyBindingsManager } from \"../../KeyBindingsManager\";\nimport { KeyBindingAction } from \"../../accessibility/KeyboardShortcuts\";\n\ninterface IProps extends HTMLProps<HTMLInputElement> {\n    onSearch: (query: string) => void;\n    onCleared?: (source?: string) => void;\n    onKeyDown?: (ev: React.KeyboardEvent) => void;\n    onFocus?: (ev: React.FocusEvent) => void;\n    onBlur?: (ev: React.FocusEvent) => void;\n    className?: string;\n    placeholder: string;\n    blurredPlaceholder?: string;\n    autoFocus?: boolean;\n    initialValue?: string;\n    collapsed?: boolean;\n}\n\ninterface IState {\n    searchTerm: string;\n    blurred: boolean;\n}\n\nexport default class SearchBox extends React.Component<IProps, IState> {\n    private search = createRef<HTMLInputElement>();\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            searchTerm: props.initialValue || \"\",\n            blurred: true,\n        };\n    }\n\n    private onChange = (): void => {\n        if (!this.search.current) return;\n        this.setState({ searchTerm: this.search.current.value });\n        this.onSearch();\n    };\n\n    private onSearch = throttle(\n        (): void => {\n            this.props.onSearch(this.search.current?.value ?? \"\");\n        },\n        200,\n        { trailing: true, leading: true },\n    );\n\n    private onKeyDown = (ev: React.KeyboardEvent): void => {\n        const action = getKeyBindingsManager().getAccessibilityAction(ev);\n        switch (action) {\n            case KeyBindingAction.Escape:\n                this.clearSearch(\"keyboard\");\n                break;\n        }\n        if (this.props.onKeyDown) this.props.onKeyDown(ev);\n    };\n\n    private onFocus = (ev: React.FocusEvent): void => {\n        this.setState({ blurred: false });\n        (ev.target as HTMLInputElement).select();\n        if (this.props.onFocus) {\n            this.props.onFocus(ev);\n        }\n    };\n\n    private onBlur = (ev: React.FocusEvent): void => {\n        this.setState({ blurred: true });\n        if (this.props.onBlur) {\n            this.props.onBlur(ev);\n        }\n    };\n\n    private clearSearch(source?: string): void {\n        if (this.search.current) this.search.current.value = \"\";\n        this.onChange();\n        this.props.onCleared?.(source);\n    }\n\n    public render(): React.ReactNode {\n        /* eslint @typescript-eslint/no-unused-vars: [\"error\", { \"ignoreRestSiblings\": true }] */\n        const {\n            onSearch,\n            onCleared,\n            onKeyDown,\n            onFocus,\n            onBlur,\n            className = \"\",\n            placeholder,\n            blurredPlaceholder,\n            autoFocus,\n            initialValue,\n            collapsed,\n            ...props\n        } = this.props;\n\n        // check for collapsed here and\n        // not at parent so we keep\n        // searchTerm in our state\n        // when collapsing and expanding\n        if (collapsed) {\n            return null;\n        }\n        const clearButton =\n            !this.state.blurred || this.state.searchTerm ? (\n                <AccessibleButton\n                    key=\"button\"\n                    tabIndex={-1}\n                    className=\"mx_SearchBox_closeButton\"\n                    onClick={() => {\n                        this.clearSearch(\"button\");\n                    }}\n                >\n                    <CloseIcon />\n                </AccessibleButton>\n            ) : undefined;\n\n        // show a shorter placeholder when blurred, if requested\n        // this is used for the room filter field that has\n        // the explore button next to it when blurred\n        return (\n            <div className={classNames(\"mx_SearchBox\", \"mx_textinput\", { mx_SearchBox_blurred: this.state.blurred })}>\n                <input\n                    {...props}\n                    key=\"searchfield\"\n                    type=\"text\"\n                    ref={this.search}\n                    className={\"mx_textinput_icon mx_textinput_search \" + className}\n                    value={this.state.searchTerm}\n                    onFocus={this.onFocus}\n                    onChange={this.onChange}\n                    onKeyDown={this.onKeyDown}\n                    onBlur={this.onBlur}\n                    placeholder={this.state.blurred ? blurredPlaceholder || placeholder : placeholder}\n                    autoComplete=\"off\"\n                    autoFocus={this.props.autoFocus}\n                    data-testid=\"searchbox-input\"\n                />\n                {clearButton}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2025 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\n\nimport AccessibleButton from \"../views/elements/AccessibleButton\";\n\nconst SpacePillButton: React.FC<{\n    title: string;\n    icon: JSX.Element;\n    description: string;\n    onClick(this: void): void;\n}> = ({ title, icon, description, onClick }) => {\n    return (\n        <AccessibleButton className=\"mx_SpacePillButton\" onClick={onClick}>\n            {icon}\n            {title}\n            <div>{description}</div>\n        </AccessibleButton>\n    );\n};\n\nexport default SpacePillButton;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2015, 2016 , 2019, 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport SyntaxHighlight from \"../views/elements/SyntaxHighlight\";\nimport { _t } from \"../../languageHandler\";\nimport MatrixClientContext from \"../../contexts/MatrixClientContext\";\nimport { canEditContent } from \"../../utils/EventUtils\";\nimport { MatrixClientPeg } from \"../../MatrixClientPeg\";\nimport BaseDialog from \"../views/dialogs/BaseDialog\";\nimport { DevtoolsContext } from \"../views/dialogs/devtools/BaseTool\";\nimport { StateEventEditor } from \"../views/dialogs/devtools/RoomState\";\nimport { stringify, TimelineEventEditor } from \"../views/dialogs/devtools/Event\";\nimport CopyableText from \"../views/elements/CopyableText\";\n\ninterface IProps {\n    mxEvent: MatrixEvent; // the MatrixEvent associated with the context menu\n    ignoreEdits?: boolean;\n    onFinished(): void;\n}\n\ninterface IState {\n    isEditing: boolean;\n}\n\nexport default class ViewSource extends React.Component<IProps, IState> {\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            isEditing: false,\n        };\n    }\n\n    private onBack = (): void => {\n        // TODO: refresh the \"Event ID:\" modal header\n        this.setState({ isEditing: false });\n    };\n\n    private onEdit(): void {\n        this.setState({ isEditing: true });\n    }\n\n    // returns the dialog body for viewing the event source\n    private viewSourceContent(): JSX.Element {\n        let mxEvent = this.props.mxEvent.replacingEvent() || this.props.mxEvent; // show the replacing event, not the original, if it is an edit\n        if (this.props.ignoreEdits) {\n            mxEvent = this.props.mxEvent;\n        }\n\n        const isEncrypted = mxEvent.isEncrypted();\n        // @ts-ignore\n        const decryptedEventSource = mxEvent.clearEvent; // FIXME: clearEvent is private\n        const originalEventSource = mxEvent.event;\n        const copyOriginalFunc = (): string => {\n            return stringify(originalEventSource);\n        };\n        if (isEncrypted) {\n            const copyDecryptedFunc = (): string => {\n                return stringify(decryptedEventSource || {});\n            };\n            return (\n                <>\n                    <details open className=\"mx_ViewSource_details\">\n                        <summary>\n                            <span className=\"mx_ViewSource_heading\">\n                                {_t(\"devtools|view_source_decrypted_event_source\")}\n                            </span>\n                        </summary>\n                        {decryptedEventSource ? (\n                            <CopyableText getTextToCopy={copyDecryptedFunc}>\n                                <SyntaxHighlight language=\"json\">{stringify(decryptedEventSource)}</SyntaxHighlight>\n                            </CopyableText>\n                        ) : (\n                            <div>{_t(\"devtools|view_source_decrypted_event_source_unavailable\")}</div>\n                        )}\n                    </details>\n                    <details className=\"mx_ViewSource_details\">\n                        <summary>\n                            <span className=\"mx_ViewSource_heading\">{_t(\"devtools|original_event_source\")}</span>\n                        </summary>\n                        <CopyableText getTextToCopy={copyOriginalFunc}>\n                            <SyntaxHighlight language=\"json\">{stringify(originalEventSource)}</SyntaxHighlight>\n                        </CopyableText>\n                    </details>\n                </>\n            );\n        } else {\n            return (\n                <>\n                    <div className=\"mx_ViewSource_heading\">{_t(\"devtools|original_event_source\")}</div>\n                    <CopyableText getTextToCopy={copyOriginalFunc}>\n                        <SyntaxHighlight language=\"json\">{stringify(originalEventSource)}</SyntaxHighlight>\n                    </CopyableText>\n                </>\n            );\n        }\n    }\n\n    // returns the SendCustomEvent component prefilled with the correct details\n    private editSourceContent(): JSX.Element {\n        const mxEvent = this.props.mxEvent.replacingEvent() || this.props.mxEvent; // show the replacing event, not the original, if it is an edit\n\n        const isStateEvent = mxEvent.isState();\n        const roomId = mxEvent.getRoomId();\n\n        if (isStateEvent) {\n            return (\n                <MatrixClientContext.Consumer>\n                    {(cli) => (\n                        // oxlint-disable-next-line react/jsx-no-constructed-context-values\n                        <DevtoolsContext.Provider value={{ room: cli.getRoom(roomId)! }}>\n                            <StateEventEditor onBack={this.onBack} mxEvent={mxEvent} />\n                        </DevtoolsContext.Provider>\n                    )}\n                </MatrixClientContext.Consumer>\n            );\n        }\n\n        return (\n            <MatrixClientContext.Consumer>\n                {(cli) => (\n                    // oxlint-disable-next-line react/jsx-no-constructed-context-values\n                    <DevtoolsContext.Provider value={{ room: cli.getRoom(roomId)! }}>\n                        <TimelineEventEditor onBack={this.onBack} mxEvent={mxEvent} />\n                    </DevtoolsContext.Provider>\n                )}\n            </MatrixClientContext.Consumer>\n        );\n    }\n\n    private canSendStateEvent(mxEvent: MatrixEvent): boolean {\n        const cli = MatrixClientPeg.safeGet();\n        const room = cli.getRoom(mxEvent.getRoomId());\n        return !!room?.currentState.mayClientSendStateEvent(mxEvent.getType(), cli);\n    }\n\n    public render(): React.ReactNode {\n        const mxEvent = this.props.mxEvent.replacingEvent() || this.props.mxEvent; // show the replacing event, not the original, if it is an edit\n\n        const isEditing = this.state.isEditing;\n        const roomId = mxEvent.getRoomId()!;\n        const eventId = mxEvent.getId()!;\n        const canEdit = mxEvent.isState()\n            ? this.canSendStateEvent(mxEvent)\n            : canEditContent(MatrixClientPeg.safeGet(), this.props.mxEvent);\n        return (\n            <BaseDialog className=\"mx_ViewSource\" onFinished={this.props.onFinished} title={_t(\"action|view_source\")}>\n                <div className=\"mx_ViewSource_header\">\n                    <CopyableText getTextToCopy={() => roomId} border={false}>\n                        {_t(\"devtools|room_id\", { roomId })}\n                    </CopyableText>\n                    <CopyableText getTextToCopy={() => eventId} border={false}>\n                        {_t(\"devtools|event_id\", { eventId })}\n                    </CopyableText>\n                    {mxEvent.threadRootId && (\n                        <CopyableText getTextToCopy={() => mxEvent.threadRootId!} border={false}>\n                            {_t(\"devtools|thread_root_id\", {\n                                threadRootId: mxEvent.threadRootId,\n                            })}\n                        </CopyableText>\n                    )}\n                </div>\n                {isEditing ? this.editSourceContent() : this.viewSourceContent()}\n                {!isEditing && canEdit && (\n                    <div className=\"mx_Dialog_buttons\">\n                        <button onClick={() => this.onEdit()}>{_t(\"action|edit\")}</button>\n                    </div>\n                )}\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { createContext, type Dispatch, type Reducer, type ReducerState } from \"react\";\n\nimport type { AuthHeaderReducer } from \"./AuthHeaderProvider\";\n\ntype ReducerAction<R extends Reducer<any, any>> = R extends Reducer<any, infer A> ? A : never;\n\ninterface AuthHeaderContextType {\n    state: ReducerState<AuthHeaderReducer>;\n    dispatch: Dispatch<ReducerAction<AuthHeaderReducer>>;\n}\n\nexport const AuthHeaderContext = createContext<AuthHeaderContextType | undefined>(undefined);\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { isEqual } from \"lodash\";\nimport React, { type JSX, type ComponentProps, type PropsWithChildren, type Reducer, useReducer, useMemo } from \"react\";\n\nimport { AuthHeaderContext } from \"./AuthHeaderContext\";\nimport { type AuthHeaderModifier } from \"./AuthHeaderModifier\";\n\nexport enum AuthHeaderActionType {\n    Add,\n    Remove,\n}\n\ninterface AuthHeaderAction {\n    type: AuthHeaderActionType;\n    value: ComponentProps<typeof AuthHeaderModifier>;\n}\n\nexport type AuthHeaderReducer = Reducer<ComponentProps<typeof AuthHeaderModifier>[], AuthHeaderAction>;\n\nexport function AuthHeaderProvider({ children }: PropsWithChildren): JSX.Element {\n    const [state, dispatch] = useReducer<ComponentProps<typeof AuthHeaderModifier>[], [AuthHeaderAction]>(\n        (state: ComponentProps<typeof AuthHeaderModifier>[], action: AuthHeaderAction) => {\n            switch (action.type) {\n                case AuthHeaderActionType.Add:\n                    return [action.value, ...state];\n                case AuthHeaderActionType.Remove:\n                    return state.length && isEqual(state[0], action.value) ? state.slice(1) : state;\n            }\n        },\n        [] as ComponentProps<typeof AuthHeaderModifier>[],\n    );\n    const context = useMemo(() => ({ state, dispatch }), [state, dispatch]);\n    return <AuthHeaderContext.Provider value={context}>{children}</AuthHeaderContext.Provider>;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type HTMLAttributes, type ReactNode } from \"react\";\nimport { PlayPauseButton as SharedPlayPauseButton } from \"@element-hq/web-shared-components\";\n\nimport { type Playback, PlaybackState } from \"../../../audio/Playback\";\n\ntype Props = HTMLAttributes<HTMLButtonElement> & {\n    // Playback instance to manipulate. Cannot change during the component lifecycle.\n    playback: Playback;\n\n    // The playback phase to render. Able to change during the component lifecycle.\n    playbackPhase: PlaybackState;\n};\n\n/**\n * Displays a play/pause button (activating the play/pause function of the recorder)\n * to be displayed in reference to a recording.\n */\nexport default class PlayPauseButton extends React.PureComponent<Props> {\n    private onClick = (): void => {\n        void this.toggleState();\n    };\n\n    public async toggleState(): Promise<void> {\n        await this.props.playback.toggle();\n    }\n\n    public render(): ReactNode {\n        const { playback, playbackPhase, ...restProps } = this.props;\n\n        return (\n            <SharedPlayPauseButton\n                data-testid=\"play-pause-button\"\n                className=\"mx_PlayPauseButton\"\n                togglePlay={this.onClick}\n                playing={playback.isPlaying}\n                disabled={playbackPhase === PlaybackState.Decoding}\n                {...restProps}\n            />\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021-2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { Clock } from \"@element-hq/web-shared-components\";\n\nimport { type Playback, PlaybackState } from \"../../../audio/Playback\";\nimport { UPDATE_EVENT } from \"../../../stores/AsyncStore\";\n\ninterface IProps {\n    playback: Playback;\n\n    // The default number of seconds to show when the playback has completed or\n    // has not started. Not used during playback, even when paused. Defaults to\n    // clip duration length.\n    defaultDisplaySeconds?: number;\n}\n\ninterface IState {\n    seconds: number;\n    durationSeconds: number;\n    playbackPhase: PlaybackState;\n}\n\n/**\n * A clock for a playback of a recording.\n */\nexport default class PlaybackClock extends React.PureComponent<IProps, IState> {\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            seconds: this.props.playback.clockInfo.timeSeconds,\n            // we track the duration on state because we won't really know what the clip duration\n            // is until the first time update, and as a PureComponent we are trying to dedupe state\n            // updates as much as possible. This is just the easiest way to avoid a forceUpdate() or\n            // member property to track \"did we get a duration\".\n            durationSeconds: this.props.playback.clockInfo.durationSeconds,\n            playbackPhase: PlaybackState.Stopped, // assume not started, so full clock\n        };\n    }\n\n    public componentDidMount(): void {\n        this.props.playback.on(UPDATE_EVENT, this.onPlaybackUpdate);\n        this.props.playback.clockInfo.liveData.onUpdate(this.onTimeUpdate);\n    }\n\n    private onPlaybackUpdate = (ev: PlaybackState): void => {\n        // Convert Decoding -> Stopped because we don't care about the distinction here\n        if (ev === PlaybackState.Decoding) ev = PlaybackState.Stopped;\n        this.setState({ playbackPhase: ev });\n    };\n\n    private onTimeUpdate = (time: number[]): void => {\n        this.setState({ seconds: time[0], durationSeconds: time[1] });\n    };\n\n    public render(): React.ReactNode {\n        let seconds = this.state.seconds;\n        if (this.state.playbackPhase === PlaybackState.Stopped) {\n            if (Number.isFinite(this.props.defaultDisplaySeconds)) {\n                seconds = this.props.defaultDisplaySeconds ?? this.props.playback.durationSeconds;\n            } else {\n                seconds = this.state.durationSeconds;\n            }\n        }\n        return <Clock seconds={seconds} role=\"timer\" />;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021, 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createRef, type ReactNode } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { type Playback, type PlaybackState } from \"../../../audio/Playback\";\nimport { UPDATE_EVENT } from \"../../../stores/AsyncStore\";\nimport { _t } from \"../../../languageHandler\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport { KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\nimport type LegacySeekBar from \"./LegacySeekBar\";\nimport type PlayPauseButton from \"./PlayPauseButton\";\n\nexport interface IProps {\n    // Playback instance to render. Cannot change during component lifecycle: create\n    // an all-new component instead.\n    playback: Playback;\n\n    mediaName?: string;\n}\n\ninterface IState {\n    playbackPhase: PlaybackState;\n    error?: boolean;\n}\n\nexport default abstract class AudioPlayerBase<T extends IProps = IProps> extends React.PureComponent<T, IState> {\n    protected seekRef = createRef<LegacySeekBar>();\n    protected playPauseRef = createRef<PlayPauseButton>();\n\n    public constructor(props: T) {\n        super(props);\n\n        // Playback instances can be reused in the composer\n        this.state = {\n            playbackPhase: this.props.playback.currentState,\n        };\n    }\n\n    public componentDidMount(): void {\n        // We don't need to de-register: the class handles this for us internally\n        this.props.playback.on(UPDATE_EVENT, this.onPlaybackUpdate);\n\n        // Don't wait for the promise to complete - it will emit a progress update when it\n        // is done, and it's not meant to take long anyhow.\n        this.props.playback.prepare().catch((e) => {\n            logger.error(\"Error processing audio file:\", e);\n            this.setState({ error: true });\n        });\n    }\n\n    protected onKeyDown = (ev: React.KeyboardEvent): void => {\n        let handled = true;\n        const action = getKeyBindingsManager().getAccessibilityAction(ev);\n\n        switch (action) {\n            case KeyBindingAction.Space:\n                this.playPauseRef.current?.toggleState();\n                break;\n            case KeyBindingAction.ArrowLeft:\n                this.seekRef.current?.left();\n                break;\n            case KeyBindingAction.ArrowRight:\n                this.seekRef.current?.right();\n                break;\n            default:\n                handled = false;\n                break;\n        }\n\n        // stopPropagation() prevents the FocusComposer catch-all from triggering,\n        // but we need to do it on key down instead of press (even though the user\n        // interaction is typically on press).\n        if (handled) {\n            ev.stopPropagation();\n        }\n    };\n\n    private onPlaybackUpdate = (ev: PlaybackState): void => {\n        this.setState({ playbackPhase: ev });\n    };\n\n    protected abstract renderComponent(): ReactNode;\n\n    public render(): ReactNode {\n        return (\n            <>\n                {this.renderComponent()}\n                {this.state.error && (\n                    <div className=\"text-warning\">{_t(\"timeline|m.audio|error_downloading_audio\")}</div>\n                )}\n            </>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent, type CSSProperties, type ReactNode } from \"react\";\nimport { percentageOf } from \"@element-hq/web-shared-components\";\n\nimport { type PlaybackInterface } from \"../../../audio/Playback\";\nimport { MarkedExecution } from \"../../../utils/MarkedExecution\";\nimport { _t } from \"../../../languageHandler\";\n\ninterface IProps {\n    // Playback instance to render. Cannot change during component lifecycle: create\n    // an all-new component instead.\n    playback: PlaybackInterface;\n\n    // Tab index for the underlying component. Useful if the seek bar is in a managed state.\n    // Defaults to zero.\n    tabIndex?: number;\n\n    disabled?: boolean;\n}\n\ninterface IState {\n    percentage: number;\n}\n\ninterface ISeekCSS extends CSSProperties {\n    \"--fillTo\": number;\n}\n\nconst ARROW_SKIP_SECONDS = 5; // arbitrary\n\n/**\n * @deprecated Use {@link SeekBar} instead.\n */\nexport default class LegacySeekBar extends React.PureComponent<IProps, IState> {\n    // We use an animation frame request to avoid overly spamming prop updates, even if we aren't\n    // really using anything demanding on the CSS front.\n\n    private animationFrameFn: MarkedExecution = new MarkedExecution(\n        () => this.doUpdate(),\n        () => requestAnimationFrame(() => this.animationFrameFn.trigger()),\n    );\n\n    public static defaultProps = {\n        tabIndex: 0,\n        disabled: false,\n    };\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            percentage: percentageOf(this.props.playback.timeSeconds, 0, this.props.playback.durationSeconds),\n        };\n    }\n\n    public componentDidMount(): void {\n        // We don't need to de-register: the class handles this for us internally\n        this.props.playback.liveData.onUpdate(() => this.animationFrameFn.mark());\n    }\n\n    private doUpdate(): void {\n        this.setState({\n            percentage: percentageOf(this.props.playback.timeSeconds, 0, this.props.playback.durationSeconds),\n        });\n    }\n\n    public left(): void {\n        // noinspection JSIgnoredPromiseFromCall\n        this.props.playback.skipTo(this.props.playback.timeSeconds - ARROW_SKIP_SECONDS);\n    }\n\n    public right(): void {\n        // noinspection JSIgnoredPromiseFromCall\n        this.props.playback.skipTo(this.props.playback.timeSeconds + ARROW_SKIP_SECONDS);\n    }\n\n    private onChange = (ev: ChangeEvent<HTMLInputElement>): void => {\n        // Thankfully, onChange is only called when the user changes the value, not when we\n        // change the value on the component. We can use this as a reliable \"skip to X\" function.\n        //\n        // noinspection JSIgnoredPromiseFromCall\n        this.props.playback.skipTo(Number(ev.target.value) * this.props.playback.durationSeconds);\n    };\n\n    private onMouseDown = (event: React.MouseEvent<Element, MouseEvent>): void => {\n        // do not propagate mouse down events, because these should be handled by the seekbar\n        event.stopPropagation();\n    };\n\n    public render(): ReactNode {\n        // We use a range input to avoid having to re-invent accessibility handling on\n        // a custom set of divs.\n        return (\n            <input\n                type=\"range\"\n                className=\"mx_SeekBar\"\n                tabIndex={this.props.tabIndex}\n                onChange={this.onChange}\n                onMouseDown={this.onMouseDown}\n                min={0}\n                max={1}\n                value={this.state.percentage}\n                step={0.001}\n                style={{ \"--fillTo\": this.state.percentage } as ISeekCSS}\n                disabled={this.props.disabled}\n                aria-label={_t(\"a11y|seek_bar_label\")}\n            />\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { percentageOf } from \"@element-hq/web-shared-components\";\n\nimport { arraySeed, arrayTrimFill } from \"../../../utils/arrays\";\nimport Waveform from \"./Waveform\";\nimport { type Playback } from \"../../../audio/Playback\";\nimport { PLAYBACK_WAVEFORM_SAMPLES } from \"../../../audio/consts\";\n\ninterface IProps {\n    playback: Playback;\n}\n\ninterface IState {\n    heights: number[];\n    progress: number;\n}\n\n/**\n * A waveform which shows the waveform of a previously recorded recording\n */\nexport default class PlaybackWaveform extends React.PureComponent<IProps, IState> {\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            heights: this.toHeights(this.props.playback.waveform),\n            progress: 0, // default no progress\n        };\n    }\n\n    public componentDidMount(): void {\n        this.props.playback.waveformData.onUpdate(this.onWaveformUpdate);\n        this.props.playback.clockInfo.liveData.onUpdate(this.onTimeUpdate);\n    }\n\n    private toHeights(waveform: number[]): number[] {\n        const seed = arraySeed(0, PLAYBACK_WAVEFORM_SAMPLES);\n        return arrayTrimFill(waveform, PLAYBACK_WAVEFORM_SAMPLES, seed);\n    }\n\n    private onWaveformUpdate = (waveform: number[]): void => {\n        this.setState({ heights: this.toHeights(waveform) });\n    };\n\n    private onTimeUpdate = (time: number[]): void => {\n        // Track percentages to a general precision to avoid over-waking the component.\n        const progress = Number(percentageOf(time[0], 0, time[1]).toFixed(3));\n        this.setState({ progress });\n    };\n\n    public render(): React.ReactNode {\n        return <Waveform relHeights={this.state.heights} progress={this.state.progress} />;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021, 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode } from \"react\";\nimport { MediaBody } from \"@element-hq/web-shared-components\";\n\nimport PlayPauseButton from \"./PlayPauseButton\";\nimport PlaybackClock from \"./PlaybackClock\";\nimport AudioPlayerBase, { type IProps as IAudioPlayerBaseProps } from \"./AudioPlayerBase\";\nimport LegacySeekBar from \"./LegacySeekBar\";\nimport PlaybackWaveform from \"./PlaybackWaveform\";\nimport { PlaybackState } from \"../../../audio/Playback\";\n\nexport enum PlaybackLayout {\n    /**\n     * Clock on the left side of a waveform, without seek bar.\n     */\n    Composer,\n\n    /**\n     * Clock on the right side of a waveform, with an added seek bar.\n     */\n    Timeline,\n}\n\ninterface IProps extends IAudioPlayerBaseProps {\n    layout?: PlaybackLayout; // Defaults to Timeline layout\n}\n\nexport default class RecordingPlayback extends AudioPlayerBase<IProps> {\n    // This component is rendered in two ways: the composer and timeline. They have different\n    // rendering properties (specifically the difference of a waveform or not).\n\n    private renderComposerLook(): ReactNode {\n        return (\n            <>\n                <PlaybackClock playback={this.props.playback} />\n                <PlaybackWaveform playback={this.props.playback} />\n            </>\n        );\n    }\n\n    private renderTimelineLook(): ReactNode {\n        return (\n            <>\n                <div className=\"mx_RecordingPlayback_timelineLayoutMiddle\">\n                    <PlaybackWaveform playback={this.props.playback} />\n                    <LegacySeekBar\n                        playback={this.props.playback}\n                        tabIndex={0} // allow keyboard users to fall into the seek bar\n                        disabled={this.state.playbackPhase === PlaybackState.Decoding}\n                        ref={this.seekRef}\n                    />\n                </div>\n                <PlaybackClock playback={this.props.playback} />\n            </>\n        );\n    }\n\n    protected renderComponent(): ReactNode {\n        let body: ReactNode;\n        switch (this.props.layout) {\n            case PlaybackLayout.Composer:\n                body = this.renderComposerLook();\n                break;\n            case PlaybackLayout.Timeline: // default is timeline, fall through.\n            default:\n                body = this.renderTimelineLook();\n                break;\n        }\n\n        return (\n            <MediaBody\n                className=\"mx_VoiceMessagePrimaryContainer\"\n                onKeyDown={this.onKeyDown}\n                data-testid=\"recording-playback\"\n            >\n                <PlayPauseButton\n                    playback={this.props.playback}\n                    playbackPhase={this.state.playbackPhase}\n                    ref={this.playPauseRef}\n                />\n                {body}\n            </MediaBody>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type CSSProperties } from \"react\";\nimport classNames from \"classnames\";\n\ninterface WaveformCSSProperties extends CSSProperties {\n    \"--barHeight\": number;\n}\n\ninterface IProps {\n    relHeights: number[]; // relative heights (0-1)\n    progress: number; // percent complete, 0-1, default 100%\n}\n\n/**\n * A simple waveform component. This renders bars (centered vertically) for each\n * height provided in the component properties. Updating the properties will update\n * the rendered waveform.\n *\n * For CSS purposes, a mx_Waveform_bar_100pct class is added when the bar should be\n * \"filled\", as a demonstration of the progress property.\n */\nexport default class Waveform extends React.PureComponent<IProps> {\n    public static defaultProps = {\n        progress: 1,\n    };\n\n    public render(): React.ReactNode {\n        return (\n            <div className=\"mx_Waveform\">\n                {this.props.relHeights.map((h, i) => {\n                    const progress = this.props.progress;\n                    const isCompleteBar = i / this.props.relHeights.length <= progress && progress > 0;\n                    const classes = classNames({\n                        mx_Waveform_bar: true,\n                        mx_Waveform_bar_100pct: isCompleteBar,\n                    });\n                    return (\n                        <span\n                            key={i}\n                            style={\n                                {\n                                    \"--barHeight\": h,\n                                } as WaveformCSSProperties\n                            }\n                            className={classes}\n                        />\n                    );\n                })}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type ReactNode, useContext, useEffect } from \"react\";\n\nimport { AuthHeaderContext } from \"./AuthHeaderContext\";\nimport { AuthHeaderActionType } from \"./AuthHeaderProvider\";\n\ninterface Props {\n    title: ReactNode;\n    icon?: ReactNode;\n    hideServerPicker?: boolean;\n}\n\nexport function AuthHeaderModifier(props: Props): null {\n    const context = useContext(AuthHeaderContext);\n    const dispatch = context?.dispatch ?? null;\n    useEffect(() => {\n        if (!dispatch) {\n            return;\n        }\n        dispatch({ type: AuthHeaderActionType.Add, value: props });\n        return () => dispatch({ type: AuthHeaderActionType.Remove, value: props });\n    }, [props, dispatch]);\n    return null;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, createRef } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { _t } from \"../../../languageHandler\";\n\nconst DIV_ID = \"mx_recaptcha\";\n\ninterface ICaptchaFormProps {\n    sitePublicKey: string;\n    onCaptchaResponse: (response: string) => void;\n}\n\ninterface ICaptchaFormState {\n    errorText?: string;\n}\n\n/**\n * A pure UI component which displays a captcha form.\n */\nexport default class CaptchaForm extends React.Component<ICaptchaFormProps, ICaptchaFormState> {\n    private captchaWidgetId?: string;\n    private recaptchaContainer = createRef<HTMLDivElement>();\n\n    public constructor(props: ICaptchaFormProps) {\n        super(props);\n\n        this.state = {\n            errorText: undefined,\n        };\n    }\n\n    public componentDidMount(): void {\n        // Just putting a script tag into the returned jsx doesn't work, annoyingly,\n        // so we do this instead.\n        if (this.isRecaptchaReady()) {\n            // already loaded\n            this.onCaptchaLoaded();\n        } else {\n            logger.log(\"Loading recaptcha script...\");\n            window.mxOnRecaptchaLoaded = () => {\n                this.onCaptchaLoaded();\n            };\n            const scriptTag = document.createElement(\"script\");\n            scriptTag.setAttribute(\n                \"src\",\n                `https://www.recaptcha.net/recaptcha/api.js?onload=mxOnRecaptchaLoaded&render=explicit`,\n            );\n            this.recaptchaContainer.current?.appendChild(scriptTag);\n        }\n    }\n\n    public componentWillUnmount(): void {\n        this.resetRecaptcha();\n        // Resettting the captcha does not clear the challenge overlay from the body in android webviews.\n        // Search for an iframe with the challenge src and remove it's topmost ancestor from the body.\n        // TODO: Remove this when the \"mobile_register\" page is retired.\n        const iframes = document.querySelectorAll(\"iframe\");\n        for (const iframe of iframes) {\n            if (iframe.src.includes(\"https://www.recaptcha.net/recaptcha/api2/bframe\")) {\n                let parentBeforeBody: HTMLElement | null = iframe;\n                do {\n                    parentBeforeBody = parentBeforeBody.parentElement;\n                } while (parentBeforeBody?.parentElement && parentBeforeBody.parentElement != document.body);\n                parentBeforeBody?.remove();\n            }\n        }\n    }\n\n    // Borrowed directly from: https://github.com/codeep/react-recaptcha-google/commit/e118fa5670fa268426969323b2e7fe77698376ba\n    private isRecaptchaReady(): boolean {\n        return (\n            typeof window !== \"undefined\" &&\n            typeof global.grecaptcha !== \"undefined\" &&\n            typeof global.grecaptcha.render === \"function\"\n        );\n    }\n\n    private renderRecaptcha(divId: string): void {\n        if (!this.isRecaptchaReady()) {\n            logger.error(\"grecaptcha not loaded!\");\n            throw new Error(\"Recaptcha did not load successfully\");\n        }\n\n        const publicKey = this.props.sitePublicKey;\n        if (!publicKey) {\n            logger.error(\"No public key for recaptcha!\");\n            throw new Error(\"This server has not supplied enough information for Recaptcha authentication\");\n        }\n\n        logger.info(`Rendering to ${divId}`);\n        this.captchaWidgetId = global.grecaptcha?.render(divId, {\n            sitekey: publicKey,\n            callback: this.props.onCaptchaResponse,\n        });\n    }\n\n    private resetRecaptcha(): void {\n        if (this.captchaWidgetId) {\n            global?.grecaptcha?.reset(this.captchaWidgetId);\n        }\n    }\n\n    private onCaptchaLoaded(): void {\n        logger.log(\"Loaded recaptcha script.\");\n        try {\n            this.renderRecaptcha(DIV_ID);\n            // clear error if re-rendered\n            this.setState({\n                errorText: undefined,\n            });\n        } catch (e) {\n            this.setState({\n                errorText: e instanceof Error ? e.message : String(e),\n            });\n        }\n    }\n\n    public render(): React.ReactNode {\n        let error: JSX.Element | undefined;\n        if (this.state.errorText) {\n            error = <div className=\"error\">{this.state.errorText}</div>;\n        }\n\n        return (\n            <div ref={this.recaptchaContainer}>\n                <p>{_t(\"auth|captcha_description\")}</p>\n                <div id={DIV_ID} />\n                {error}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2016-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport classNames from \"classnames\";\nimport { type InternationalisedPolicy, type Terms, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { AuthType, type AuthDict, type IInputs, type IStageStatus } from \"matrix-js-sdk/src/interactive-auth\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport React, { type JSX, type ChangeEvent, createRef, type FormEvent, Fragment } from \"react\";\nimport { Button } from \"@vector-im/compound-web\";\nimport PopOutIcon from \"@vector-im/compound-design-tokens/assets/web/icons/pop-out\";\nimport UserProfileSolidIcon from \"@vector-im/compound-design-tokens/assets/web/icons/user-profile-solid\";\n\nimport EmailPromptIcon from \"../../../../res/img/element-icons/email-prompt.svg\";\nimport { _t } from \"../../../languageHandler\";\nimport { AuthHeaderModifier } from \"../../structures/auth/header/AuthHeaderModifier\";\nimport AccessibleButton, { type AccessibleButtonKind, type ButtonEvent } from \"../elements/AccessibleButton\";\nimport Field from \"../elements/Field\";\nimport Spinner from \"../elements/Spinner\";\nimport CaptchaForm from \"./CaptchaForm\";\nimport { pickBestPolicyLanguage } from \"../../../Terms.ts\";\nimport { EncryptionCardButtons } from \"../settings/encryption/EncryptionCardButtons.tsx\";\nimport { EncryptionCard } from \"../settings/encryption/EncryptionCard.tsx\";\n\n/* This file contains a collection of components which are used by the\n * InteractiveAuth to prompt the user to enter the information needed\n * for an auth stage. (The intention is that they could also be used for other\n * components, such as the registration flow).\n *\n * Call getEntryComponentForLoginType() to get a component suitable for a\n * particular login type. Each component requires the same properties:\n *\n * matrixClient:           A matrix client. May be a different one to the one\n *                         currently being used generally (eg. to register with\n *                         one HS whilst being a guest on another).\n * loginType:              the login type of the auth stage being attempted\n * authSessionId:          session id from the server\n * clientSecret:           The client secret in use for identity server auth sessions\n * stageParams:            params from the server for the stage being attempted\n * errorText:              error message from a previous attempt to authenticate\n * submitAuthDict:         a function which will be called with the new auth dict\n * busy:                   a boolean indicating whether the auth logic is doing something\n *                         the user needs to wait for.\n * inputs:                 Object of inputs provided by the user, as in js-sdk\n *                         interactive-auth\n * stageState:             Stage-specific object used for communicating state information\n *                         to the UI from the state-specific auth logic.\n *                         Defined keys for stages are:\n *                             m.login.email.identity:\n *                              * emailSid: string representing the sid of the active\n *                                          verification session from the identity server,\n *                                          or null if no session is active.\n * fail:                   a function which should be called with an error object if an\n *                         error occurred during the auth stage. This will cause the auth\n *                         session to be failed and the process to go back to the start.\n * setEmailSid:            m.login.email.identity only: a function to be called with the\n *                         email sid after a token is requested.\n * onPhaseChange:          A function which is called when the stage's phase changes. If\n *                         the stage has no phases, call this with DEFAULT_PHASE. Takes\n *                         one argument, the phase, and is always defined/required.\n * continueText:           For stages which have a continue button, the text to use.\n * continueKind:           For stages which have a continue button, the style of button to\n *                         use. For example, 'danger' or 'primary'.\n * onCancel                A function with no arguments which is called by the stage if the\n *                         user knowingly cancelled/dismissed the authentication attempt.\n *\n * Each component may also provide the following functions (beyond the standard React ones):\n *    focus: set the input focus appropriately in the form.\n */\n\nexport const DEFAULT_PHASE = 0;\n\ninterface IAuthEntryProps {\n    matrixClient: MatrixClient;\n    loginType: string;\n    authSessionId?: string;\n    errorText?: string;\n    errorCode?: string;\n    // Is the auth logic currently waiting for something to happen?\n    busy?: boolean;\n    onPhaseChange: (phase: number) => void;\n    submitAuthDict: (auth: AuthDict) => void;\n    requestEmailToken?: () => Promise<void>;\n    fail: (error: Error) => void;\n    clientSecret: string;\n}\n\ninterface IPasswordAuthEntryState {\n    password: string;\n}\n\nexport class PasswordAuthEntry extends React.Component<IAuthEntryProps, IPasswordAuthEntryState> {\n    public static LOGIN_TYPE = AuthType.Password;\n\n    public constructor(props: IAuthEntryProps) {\n        super(props);\n\n        this.state = {\n            password: \"\",\n        };\n    }\n\n    public componentDidMount(): void {\n        this.props.onPhaseChange(DEFAULT_PHASE);\n    }\n\n    private onSubmit = (e: FormEvent): void => {\n        e.preventDefault();\n        if (this.props.busy) return;\n\n        this.props.submitAuthDict({\n            type: AuthType.Password,\n            identifier: {\n                type: \"m.id.user\",\n                user: this.props.matrixClient.credentials.userId,\n            },\n            password: this.state.password,\n        });\n    };\n\n    private onPasswordFieldChange = (ev: ChangeEvent<HTMLInputElement>): void => {\n        // enable the submit button iff the password is non-empty\n        this.setState({\n            password: ev.target.value,\n        });\n    };\n\n    public render(): React.ReactNode {\n        const passwordBoxClass = classNames({\n            error: this.props.errorText,\n        });\n\n        let submitButtonOrSpinner;\n        if (this.props.busy) {\n            submitButtonOrSpinner = <Spinner />;\n        } else {\n            submitButtonOrSpinner = (\n                <input\n                    type=\"submit\"\n                    className=\"mx_Dialog_primary\"\n                    disabled={!this.state.password}\n                    value={_t(\"action|continue\")}\n                />\n            );\n        }\n\n        let errorSection;\n        if (this.props.errorText) {\n            errorSection = (\n                <div className=\"error\" role=\"alert\">\n                    {this.props.errorText}\n                </div>\n            );\n        }\n\n        return (\n            <div>\n                <p>{_t(\"auth|uia|password_prompt\")}</p>\n                <form onSubmit={this.onSubmit} className=\"mx_InteractiveAuthEntryComponents_passwordSection\">\n                    <Field\n                        className={passwordBoxClass}\n                        type=\"password\"\n                        name=\"passwordField\"\n                        label={_t(\"common|password\")}\n                        autoFocus={true}\n                        value={this.state.password}\n                        onChange={this.onPasswordFieldChange}\n                    />\n                    {errorSection}\n                    <div className=\"mx_button_row\">{submitButtonOrSpinner}</div>\n                </form>\n            </div>\n        );\n    }\n}\n\n/* eslint-disable camelcase */\ninterface IRecaptchaAuthEntryProps extends IAuthEntryProps {\n    stageParams?: {\n        public_key?: string;\n    };\n}\n/* eslint-enable camelcase */\n\nexport class RecaptchaAuthEntry extends React.Component<IRecaptchaAuthEntryProps> {\n    public static LOGIN_TYPE = AuthType.Recaptcha;\n\n    public componentDidMount(): void {\n        this.props.onPhaseChange(DEFAULT_PHASE);\n    }\n\n    private onCaptchaResponse = (response: string): void => {\n        this.props.submitAuthDict({\n            type: AuthType.Recaptcha,\n            response: response,\n        });\n    };\n\n    public render(): React.ReactNode {\n        if (this.props.busy) {\n            return <Spinner />;\n        }\n\n        let errorText = this.props.errorText;\n\n        let sitePublicKey: string | undefined;\n        if (!this.props.stageParams || !this.props.stageParams.public_key) {\n            errorText = _t(\"auth|uia|recaptcha_missing_params\");\n        } else {\n            sitePublicKey = this.props.stageParams.public_key;\n        }\n\n        let errorSection: JSX.Element | undefined;\n        if (errorText) {\n            errorSection = (\n                <div className=\"error\" role=\"alert\">\n                    {errorText}\n                </div>\n            );\n        }\n\n        return (\n            <div>\n                {sitePublicKey && (\n                    <CaptchaForm sitePublicKey={sitePublicKey} onCaptchaResponse={this.onCaptchaResponse} />\n                )}\n                {errorSection}\n            </div>\n        );\n    }\n}\n\ninterface ITermsAuthEntryProps extends IAuthEntryProps {\n    stageParams?: Partial<Terms>;\n}\n\ninterface LocalisedPolicyWithId extends InternationalisedPolicy {\n    id: string;\n}\n\ninterface ITermsAuthEntryState {\n    policies: LocalisedPolicyWithId[];\n    toggledPolicies: {\n        [policy: string]: boolean;\n    };\n    errorText?: string;\n}\n\nexport class TermsAuthEntry extends React.Component<ITermsAuthEntryProps, ITermsAuthEntryState> {\n    public static LOGIN_TYPE = AuthType.Terms;\n\n    public constructor(props: ITermsAuthEntryProps) {\n        super(props);\n\n        // example stageParams:\n        //\n        // {\n        //     \"policies\": {\n        //         \"privacy_policy\": {\n        //             \"version\": \"1.0\",\n        //             \"en\": {\n        //                 \"name\": \"Privacy Policy\",\n        //                 \"url\": \"https://example.org/privacy-1.0-en.html\",\n        //             },\n        //             \"fr\": {\n        //                 \"name\": \"Politique de confidentialité\",\n        //                 \"url\": \"https://example.org/privacy-1.0-fr.html\",\n        //             },\n        //         },\n        //         \"other_policy\": { ... },\n        //     }\n        // }\n\n        const allPolicies = this.props.stageParams?.policies || {};\n        const initToggles: Record<string, boolean> = {};\n        const pickedPolicies: {\n            id: string;\n            name: string;\n            url: string;\n        }[] = [];\n        for (const policyId of Object.keys(allPolicies)) {\n            const policy = allPolicies[policyId];\n            const langPolicy = pickBestPolicyLanguage(policy);\n            if (!langPolicy) throw new Error(\"Failed to find a policy to show the user\");\n\n            initToggles[policyId] = false;\n\n            pickedPolicies.push({\n                id: policyId,\n                name: langPolicy.name,\n                url: langPolicy.url,\n            });\n        }\n\n        this.state = {\n            toggledPolicies: initToggles,\n            policies: pickedPolicies,\n        };\n    }\n\n    public componentDidMount(): void {\n        this.props.onPhaseChange(DEFAULT_PHASE);\n    }\n\n    private togglePolicy(policyId: string): void {\n        const newToggles: Record<string, boolean> = {};\n        for (const policy of this.state.policies) {\n            let checked = this.state.toggledPolicies[policy.id];\n            if (policy.id === policyId) checked = !checked;\n\n            newToggles[policy.id] = checked;\n        }\n        this.setState({ toggledPolicies: newToggles });\n    }\n\n    private trySubmit = (): void => {\n        let allChecked = true;\n        for (const policy of this.state.policies) {\n            const checked = this.state.toggledPolicies[policy.id];\n            allChecked = allChecked && checked;\n        }\n\n        if (allChecked) {\n            this.props.submitAuthDict({ type: AuthType.Terms });\n        } else {\n            this.setState({ errorText: _t(\"auth|uia|terms_invalid\") });\n        }\n    };\n\n    public render(): React.ReactNode {\n        if (this.props.busy) {\n            return <Spinner />;\n        }\n\n        const checkboxes: JSX.Element[] = [];\n        let allChecked = true;\n        for (const policy of this.state.policies) {\n            const checked = this.state.toggledPolicies[policy.id];\n            allChecked = allChecked && checked;\n\n            checkboxes.push(\n                // XXX: replace with StyledCheckbox\n                <label key={\"policy_checkbox_\" + policy.id} className=\"mx_InteractiveAuthEntryComponents_termsPolicy\">\n                    <input type=\"checkbox\" onChange={() => this.togglePolicy(policy.id)} checked={checked} />\n                    <a href={policy.url} target=\"_blank\" rel=\"noreferrer noopener\">\n                        {policy.name}\n                    </a>\n                </label>,\n            );\n        }\n\n        let errorSection;\n        if (this.props.errorText || this.state.errorText) {\n            errorSection = (\n                <div className=\"error\" role=\"alert\">\n                    {this.props.errorText || this.state.errorText}\n                </div>\n            );\n        }\n\n        return (\n            <div className=\"mx_InteractiveAuthEntryComponents\">\n                <p>{_t(\"auth|uia|terms\")}</p>\n                {checkboxes}\n                {errorSection}\n                <AccessibleButton\n                    kind=\"primary\"\n                    className=\"mx_InteractiveAuthEntryComponents_termsSubmit\"\n                    onClick={this.trySubmit}\n                    disabled={!allChecked}\n                >\n                    {_t(\"action|accept\")}\n                </AccessibleButton>\n            </div>\n        );\n    }\n}\n\ninterface IEmailIdentityAuthEntryProps extends IAuthEntryProps {\n    inputs?: {\n        emailAddress?: string;\n    };\n    stageState?: {\n        emailSid?: string;\n    };\n}\n\ninterface IEmailIdentityAuthEntryState {\n    requested: boolean;\n    requesting: boolean;\n}\n\nexport class EmailIdentityAuthEntry extends React.Component<\n    IEmailIdentityAuthEntryProps,\n    IEmailIdentityAuthEntryState\n> {\n    public static LOGIN_TYPE = AuthType.Email;\n\n    public constructor(props: IEmailIdentityAuthEntryProps) {\n        super(props);\n\n        this.state = {\n            requested: false,\n            requesting: false,\n        };\n    }\n\n    public componentDidMount(): void {\n        this.props.onPhaseChange(DEFAULT_PHASE);\n    }\n\n    public render(): React.ReactNode {\n        let errorSection;\n        // ignore the error when errcode is M_UNAUTHORIZED as we expect that error until the link is clicked.\n        if (this.props.errorText && this.props.errorCode !== \"M_UNAUTHORIZED\") {\n            errorSection = (\n                <div className=\"error\" role=\"alert\">\n                    {this.props.errorText}\n                </div>\n            );\n        }\n\n        // This component is now only displayed once the token has been requested,\n        // so we know the email has been sent. It can also get loaded after the user\n        // has clicked the validation link if the server takes a while to propagate\n        // the validation internally. If we're in the session spawned from clicking\n        // the validation link, we won't know the email address, so if we don't have it,\n        // assume that the link has been clicked and the server will realise when we poll.\n        // We only have a session ID if the user has clicked the link in their email,\n        // so show a loading state instead of \"an email has been sent to...\" because\n        // that's confusing when you've already read that email.\n        if (this.props.inputs?.emailAddress === undefined || this.props.stageState?.emailSid) {\n            if (errorSection) {\n                return errorSection;\n            }\n            return <Spinner />;\n        } else {\n            return (\n                <div className=\"mx_InteractiveAuthEntryComponents_emailWrapper\">\n                    <AuthHeaderModifier\n                        title={_t(\"auth|uia|email_auth_header\")}\n                        icon={<img src={EmailPromptIcon} role=\"presentation\" alt=\"\" width={16} />}\n                        hideServerPicker={true}\n                    />\n                    <p>\n                        {_t(\"auth|uia|email\", {\n                            emailAddress: <strong>{this.props.inputs.emailAddress}</strong>,\n                        })}\n                    </p>\n                    {this.state.requesting ? (\n                        <p className=\"secondary\">\n                            {_t(\n                                \"auth|uia|email_resend_prompt\",\n                                {},\n                                {\n                                    a: (text: string) => (\n                                        <Fragment>\n                                            <AccessibleButton element=\"a\" kind=\"link_inline\" onClick={null} disabled>\n                                                {text} <Spinner as=\"span\" size={14} />\n                                            </AccessibleButton>\n                                        </Fragment>\n                                    ),\n                                },\n                            )}\n                        </p>\n                    ) : (\n                        <p className=\"secondary\">\n                            {_t(\n                                \"auth|uia|email_resend_prompt\",\n                                {},\n                                {\n                                    a: (text: string) => (\n                                        <AccessibleButton\n                                            element=\"a\"\n                                            kind=\"link_inline\"\n                                            title={\n                                                this.state.requested ? _t(\"auth|uia|email_resent\") : _t(\"action|resend\")\n                                            }\n                                            onTooltipOpenChange={\n                                                this.state.requested\n                                                    ? (open) => {\n                                                          if (!open) this.setState({ requested: false });\n                                                      }\n                                                    : undefined\n                                            }\n                                            onClick={async (): Promise<void> => {\n                                                this.setState({ requesting: true });\n                                                try {\n                                                    await this.props.requestEmailToken?.();\n                                                } catch (e) {\n                                                    logger.warn(\"Email token request failed: \", e);\n                                                } finally {\n                                                    this.setState({ requested: true, requesting: false });\n                                                }\n                                            }}\n                                        >\n                                            {text}\n                                        </AccessibleButton>\n                                    ),\n                                },\n                            )}\n                        </p>\n                    )}\n                    {errorSection}\n                </div>\n            );\n        }\n    }\n}\n\ninterface IMsisdnAuthEntryProps extends IAuthEntryProps {\n    inputs?: {\n        phoneCountry?: string;\n        phoneNumber?: string;\n    };\n}\n\ninterface IMsisdnAuthEntryState {\n    token: string;\n    requestingToken: boolean;\n    errorText: string | null;\n}\n\nexport class MsisdnAuthEntry extends React.Component<IMsisdnAuthEntryProps, IMsisdnAuthEntryState> {\n    public static LOGIN_TYPE = AuthType.Msisdn;\n\n    private submitUrl?: string;\n    private sid?: string;\n    private msisdn?: string;\n\n    public constructor(props: IMsisdnAuthEntryProps) {\n        super(props);\n\n        this.state = {\n            token: \"\",\n            requestingToken: false,\n            errorText: \"\",\n        };\n    }\n\n    public componentDidMount(): void {\n        this.props.onPhaseChange(DEFAULT_PHASE);\n\n        this.setState({ requestingToken: true });\n        this.requestMsisdnToken()\n            .catch((e) => {\n                this.props.fail(e);\n            })\n            .finally(() => {\n                this.setState({ requestingToken: false });\n            });\n    }\n\n    /*\n     * Requests a verification token by SMS.\n     */\n    private requestMsisdnToken(): Promise<void> {\n        return this.props.matrixClient\n            .requestRegisterMsisdnToken(\n                this.props.inputs?.phoneCountry ?? \"\",\n                this.props.inputs?.phoneNumber ?? \"\",\n                this.props.clientSecret,\n                1, // TODO: Multiple send attempts?\n            )\n            .then((result) => {\n                this.submitUrl = result.submit_url;\n                this.sid = result.sid;\n                this.msisdn = result.msisdn;\n            });\n    }\n\n    private onTokenChange = (e: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({\n            token: e.target.value,\n        });\n    };\n\n    private onFormSubmit = async (e: FormEvent): Promise<void> => {\n        e.preventDefault();\n        if (this.state.token == \"\") return;\n\n        this.setState({\n            errorText: null,\n        });\n\n        try {\n            let result: { success: boolean };\n            if (this.submitUrl && this.sid) {\n                result = await this.props.matrixClient.submitMsisdnTokenOtherUrl(\n                    this.submitUrl,\n                    this.sid,\n                    this.props.clientSecret,\n                    this.state.token,\n                );\n            } else {\n                throw new Error(\"The registration with MSISDN flow is misconfigured\");\n            }\n            if (result.success) {\n                const creds = {\n                    sid: this.sid,\n                    client_secret: this.props.clientSecret,\n                };\n                this.props.submitAuthDict({\n                    type: AuthType.Msisdn,\n                    threepid_creds: creds,\n                });\n            } else {\n                this.setState({\n                    errorText: _t(\"auth|uia|msisdn_token_incorrect\"),\n                });\n            }\n        } catch (e) {\n            this.props.fail(e instanceof Error ? e : new Error(\"Failed to submit msisdn token\"));\n            logger.log(\"Failed to submit msisdn token\");\n        }\n    };\n\n    public render(): React.ReactNode {\n        if (this.state.requestingToken) {\n            return <Spinner />;\n        } else {\n            const enableSubmit = Boolean(this.state.token);\n            const submitClasses = classNames({\n                mx_InteractiveAuthEntryComponents_msisdnSubmit: true,\n                mx_GeneralButton: true,\n            });\n            let errorSection;\n            if (this.state.errorText) {\n                errorSection = (\n                    <div className=\"error\" role=\"alert\">\n                        {this.state.errorText}\n                    </div>\n                );\n            }\n            return (\n                <div>\n                    <p>{_t(\"auth|uia|msisdn\", { msisdn: <i>{this.msisdn}</i> })}</p>\n                    <p>{_t(\"auth|uia|msisdn_token_prompt\")}</p>\n                    <div className=\"mx_InteractiveAuthEntryComponents_msisdnWrapper\">\n                        <form onSubmit={this.onFormSubmit}>\n                            <input\n                                type=\"text\"\n                                className=\"mx_InteractiveAuthEntryComponents_msisdnEntry\"\n                                value={this.state.token}\n                                onChange={this.onTokenChange}\n                                aria-label={_t(\"auth|uia|code\")}\n                            />\n                            <br />\n                            <input\n                                type=\"submit\"\n                                value={_t(\"action|submit\")}\n                                className={submitClasses}\n                                disabled={!enableSubmit}\n                            />\n                        </form>\n                        {errorSection}\n                    </div>\n                </div>\n            );\n        }\n    }\n}\n\ninterface IRegistrationTokenAuthEntryState {\n    registrationToken: string;\n}\n\nexport class RegistrationTokenAuthEntry extends React.Component<IAuthEntryProps, IRegistrationTokenAuthEntryState> {\n    public static readonly LOGIN_TYPE = AuthType.RegistrationToken;\n\n    public constructor(props: IAuthEntryProps) {\n        super(props);\n\n        this.state = {\n            registrationToken: \"\",\n        };\n    }\n\n    public componentDidMount(): void {\n        this.props.onPhaseChange(DEFAULT_PHASE);\n    }\n\n    private onSubmit = (e: FormEvent): void => {\n        e.preventDefault();\n        if (this.props.busy) return;\n\n        this.props.submitAuthDict({\n            // Could be AuthType.RegistrationToken or AuthType.UnstableRegistrationToken\n            type: this.props.loginType,\n            token: this.state.registrationToken,\n        });\n    };\n\n    private onRegistrationTokenFieldChange = (ev: ChangeEvent<HTMLInputElement>): void => {\n        // enable the submit button if the registration token is non-empty\n        this.setState({\n            registrationToken: ev.target.value,\n        });\n    };\n\n    public render(): React.ReactNode {\n        const registrationTokenBoxClass = classNames({\n            error: this.props.errorText,\n        });\n\n        let submitButtonOrSpinner;\n        if (this.props.busy) {\n            submitButtonOrSpinner = <Spinner />;\n        } else {\n            submitButtonOrSpinner = (\n                <AccessibleButton onClick={this.onSubmit} kind=\"primary\" disabled={!this.state.registrationToken}>\n                    {_t(\"action|continue\")}\n                </AccessibleButton>\n            );\n        }\n\n        let errorSection;\n        if (this.props.errorText) {\n            errorSection = (\n                <div className=\"error\" role=\"alert\">\n                    {this.props.errorText}\n                </div>\n            );\n        }\n\n        return (\n            <div>\n                <p>{_t(\"auth|uia|registration_token_prompt\")}</p>\n                <form onSubmit={this.onSubmit} className=\"mx_InteractiveAuthEntryComponents_registrationTokenSection\">\n                    <Field\n                        className={registrationTokenBoxClass}\n                        type=\"text\"\n                        name=\"registrationTokenField\"\n                        label={_t(\"auth|uia|registration_token_label\")}\n                        autoFocus={true}\n                        value={this.state.registrationToken}\n                        onChange={this.onRegistrationTokenFieldChange}\n                    />\n                    {errorSection}\n                    <div className=\"mx_button_row\">{submitButtonOrSpinner}</div>\n                </form>\n            </div>\n        );\n    }\n}\n\n// Subset of AccessibleButtonKind which can be specified for the continue button\nexport type ContinueKind = Extract<AccessibleButtonKind, \"primary\" | \"danger\">;\n\ninterface ISSOAuthEntryProps extends IAuthEntryProps {\n    continueText?: string;\n    continueKind?: ContinueKind;\n    onCancel?: () => void;\n}\n\ninterface ISSOAuthEntryState {\n    phase: number;\n    attemptFailed: boolean;\n}\n\nexport class SSOAuthEntry extends React.Component<ISSOAuthEntryProps, ISSOAuthEntryState> {\n    public static LOGIN_TYPE = AuthType.Sso;\n    public static UNSTABLE_LOGIN_TYPE = AuthType.SsoUnstable;\n\n    public static PHASE_PREAUTH = 1; // button to start SSO\n    public static PHASE_POSTAUTH = 2; // button to confirm SSO completed\n\n    private ssoUrl: string;\n    private popupWindow: Window | null;\n\n    public constructor(props: ISSOAuthEntryProps) {\n        super(props);\n\n        if (!this.props.authSessionId) throw new Error(\"This UIA flow requires an authSessionId\");\n\n        // We actually send the user through fallback auth so we don't have to\n        // deal with a redirect back to us, losing application context.\n        this.ssoUrl = props.matrixClient.getFallbackAuthUrl(this.props.loginType, this.props.authSessionId);\n\n        this.popupWindow = null;\n\n        this.state = {\n            phase: SSOAuthEntry.PHASE_PREAUTH,\n            attemptFailed: false,\n        };\n    }\n\n    public componentDidMount(): void {\n        window.addEventListener(\"message\", this.onReceiveMessage);\n        this.props.onPhaseChange(SSOAuthEntry.PHASE_PREAUTH);\n    }\n\n    public componentWillUnmount(): void {\n        window.removeEventListener(\"message\", this.onReceiveMessage);\n        if (this.popupWindow) {\n            this.popupWindow.close();\n            this.popupWindow = null;\n        }\n    }\n\n    public attemptFailed = (): void => {\n        this.setState({\n            attemptFailed: true,\n        });\n    };\n\n    private onReceiveMessage = (event: MessageEvent): void => {\n        if (event.data === \"authDone\" && event.source === this.popupWindow) {\n            if (this.popupWindow) {\n                this.popupWindow.close();\n                this.popupWindow = null;\n            }\n        }\n    };\n\n    private onStartAuthClick = (): void => {\n        // Note: We don't use PlatformPeg's startSsoAuth functions because we almost\n        // certainly will need to open the thing in a new tab to avoid losing application\n        // context.\n\n        this.popupWindow = window.open(this.ssoUrl, \"_blank\");\n        this.setState({ phase: SSOAuthEntry.PHASE_POSTAUTH });\n        this.props.onPhaseChange(SSOAuthEntry.PHASE_POSTAUTH);\n    };\n\n    private onConfirmClick = (): void => {\n        this.props.submitAuthDict({});\n    };\n\n    public render(): React.ReactNode {\n        let continueButton: JSX.Element;\n\n        const cancelButton = (\n            <AccessibleButton\n                onClick={this.props.onCancel ?? null}\n                kind={this.props.continueKind ? `${this.props.continueKind}_outline` : \"primary_outline\"}\n            >\n                {_t(\"action|cancel\")}\n            </AccessibleButton>\n        );\n        if (this.state.phase === SSOAuthEntry.PHASE_PREAUTH) {\n            continueButton = (\n                <AccessibleButton onClick={this.onStartAuthClick} kind={this.props.continueKind || \"primary\"}>\n                    {this.props.continueText || _t(\"auth|sso\")}\n                </AccessibleButton>\n            );\n        } else {\n            continueButton = (\n                <AccessibleButton onClick={this.onConfirmClick} kind={this.props.continueKind || \"primary\"}>\n                    {this.props.continueText || _t(\"action|confirm\")}\n                </AccessibleButton>\n            );\n        }\n\n        let errorSection;\n        if (this.props.errorText) {\n            errorSection = (\n                <div className=\"error\" role=\"alert\">\n                    {this.props.errorText}\n                </div>\n            );\n        } else if (this.state.attemptFailed) {\n            errorSection = (\n                <div className=\"error\" role=\"alert\">\n                    {_t(\"auth|uia|sso_failed\")}\n                </div>\n            );\n        }\n\n        return (\n            <Fragment>\n                {errorSection}\n                <div className=\"mx_InteractiveAuthEntryComponents_sso_buttons\">\n                    {this.props.busy ? (\n                        <Spinner size={24} />\n                    ) : (\n                        <>\n                            {cancelButton}\n                            {continueButton}\n                        </>\n                    )}\n                </div>\n            </Fragment>\n        );\n    }\n}\n\nexport class FallbackAuthEntry<T extends object> extends React.Component<IAuthEntryProps & T> {\n    protected popupWindow: Window | null;\n    protected fallbackButton = createRef<HTMLDivElement>();\n\n    public constructor(props: IAuthEntryProps & T) {\n        super(props);\n\n        // we have to make the user click a button, as browsers will block\n        // the popup if we open it immediately.\n        this.popupWindow = null;\n    }\n\n    public componentDidMount(): void {\n        window.addEventListener(\"message\", this.onReceiveMessage);\n        this.props.onPhaseChange(DEFAULT_PHASE);\n    }\n\n    public componentWillUnmount(): void {\n        window.removeEventListener(\"message\", this.onReceiveMessage);\n        this.popupWindow?.close();\n    }\n\n    public focus = (): void => {\n        this.fallbackButton.current?.focus();\n    };\n\n    private onShowFallbackClick = (e: ButtonEvent): void => {\n        if (!this.props.authSessionId) return;\n\n        e.preventDefault();\n        e.stopPropagation();\n\n        const url = this.props.matrixClient.getFallbackAuthUrl(this.props.loginType, this.props.authSessionId);\n        this.popupWindow = window.open(url, \"_blank\");\n    };\n\n    private onReceiveMessage = (event: MessageEvent): void => {\n        if (event.data === \"authDone\" && event.source === this.popupWindow) {\n            this.props.submitAuthDict({});\n        }\n    };\n\n    public render(): React.ReactNode {\n        let errorSection;\n        if (this.props.errorText) {\n            errorSection = (\n                <div className=\"error\" role=\"alert\">\n                    {this.props.errorText}\n                </div>\n            );\n        }\n        return (\n            <div>\n                <AccessibleButton kind=\"link\" ref={this.fallbackButton} onClick={this.onShowFallbackClick}>\n                    {_t(\"auth|uia|fallback_button\")}\n                </AccessibleButton>\n                {errorSection}\n            </div>\n        );\n    }\n}\n\nexport enum CustomAuthType {\n    // This is the unstable value from MSC4312\n    MasCrossSigningReset = \"org.matrix.cross_signing_reset\",\n}\n\nexport class MasUnlockCrossSigningAuthEntry extends FallbackAuthEntry<{\n    stageParams?: {\n        url?: string;\n    };\n}> {\n    public static readonly LOGIN_TYPE = AuthType.OAuth;\n    public static readonly UNSTABLE_LOGIN_TYPE = CustomAuthType.MasCrossSigningReset;\n\n    private onGoToAccountClick = (): void => {\n        if (!this.props.stageParams?.url) return;\n        this.popupWindow = window.open(this.props.stageParams.url, \"_blank\");\n    };\n\n    private onRetryClick = (): void => {\n        this.props.submitAuthDict({ type: MasUnlockCrossSigningAuthEntry.LOGIN_TYPE });\n    };\n\n    public render(): React.ReactNode {\n        return (\n            <EncryptionCard\n                Icon={UserProfileSolidIcon}\n                title={_t(\"auth|uia|mas_cross_signing_reset_title\")}\n                description={_t(\"auth|uia|mas_cross_signing_reset_description\", {\n                    serverName: this.props.matrixClient.getDomain(),\n                })}\n            >\n                <EncryptionCardButtons>\n                    <Button\n                        Icon={PopOutIcon}\n                        onClick={this.onGoToAccountClick}\n                        autoFocus\n                        kind=\"primary\"\n                        className=\"mx_Dialog_nonDialogButton\"\n                    >\n                        {_t(\"auth|uia|mas_cross_signing_reset_cta\")}\n                    </Button>\n                    <Button onClick={this.onRetryClick} kind=\"tertiary\" className=\"mx_Dialog_nonDialogButton\">\n                        {_t(\"action|retry\")}\n                    </Button>\n                </EncryptionCardButtons>\n            </EncryptionCard>\n        );\n    }\n}\n\nexport interface IStageComponentProps extends IAuthEntryProps {\n    stageParams?: Record<string, any>;\n    inputs?: IInputs;\n    stageState?: IStageStatus;\n    continueText?: string;\n    continueKind?: ContinueKind;\n    setEmailSid?(sid: string): void;\n    onCancel?(): void;\n    requestEmailToken?(): Promise<void>;\n}\n\nexport interface IStageComponent extends React.ComponentClass<React.PropsWithRef<IStageComponentProps>> {\n    attemptFailed?(): void;\n    focus?(): void;\n}\n\nexport default function getEntryComponentForLoginType(loginType: AuthType | CustomAuthType): IStageComponent {\n    switch (loginType) {\n        case AuthType.OAuth:\n        case CustomAuthType.MasCrossSigningReset:\n            return MasUnlockCrossSigningAuthEntry;\n        case AuthType.Password:\n            return PasswordAuthEntry;\n        case AuthType.Recaptcha:\n            return RecaptchaAuthEntry;\n        case AuthType.Email:\n            return EmailIdentityAuthEntry;\n        case AuthType.Msisdn:\n            return MsisdnAuthEntry;\n        case AuthType.Terms:\n            return TermsAuthEntry;\n        case AuthType.RegistrationToken:\n        case AuthType.UnstableRegistrationToken:\n            return RegistrationTokenAuthEntry;\n        case AuthType.Sso:\n        case AuthType.SsoUnstable:\n            return SSOAuthEntry;\n        default:\n            return FallbackAuthEntry;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type AriaRole, type JSX, type Ref, useCallback, useContext, useEffect, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { ClientEvent, type SyncState } from \"matrix-js-sdk/src/matrix\";\nimport { Avatar } from \"@vector-im/compound-web\";\n\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { useTypedEventEmitter } from \"../../../hooks/useEventEmitter\";\nimport { _t } from \"../../../languageHandler\";\nimport { useScopedRoomContext } from \"../../../contexts/ScopedRoomContext.tsx\";\n\ninterface IProps {\n    name?: React.ComponentProps<typeof Avatar>[\"name\"]; // The name (first initial used as default)\n    idName?: React.ComponentProps<typeof Avatar>[\"id\"]; // ID for generating hash colours\n    title?: string; // onHover title text\n    url?: string | null; // highest priority of them all, shortcut to set in urls[0]\n    urls?: string[]; // [highest_priority, ... , lowest_priority]\n    type?: React.ComponentProps<typeof Avatar>[\"type\"];\n    size: string;\n    onClick?: (ev: ButtonEvent) => void;\n    className?: string;\n    tabIndex?: number;\n    altText?: string;\n    role?: AriaRole;\n    ref?: Ref<HTMLElement>;\n}\n\nconst calculateUrls = (url?: string | null, urls?: string[], lowBandwidth = false): string[] => {\n    // work out the full set of urls to try to load. This is formed like so:\n    // imageUrls: [ props.url, ...props.urls ]\n\n    let _urls: string[] = [];\n    if (!lowBandwidth) {\n        _urls = urls || [];\n\n        if (url) {\n            // copy urls and put url first\n            _urls = [url, ..._urls];\n        }\n    }\n\n    // deduplicate URLs\n    return Array.from(new Set(_urls));\n};\n\nconst useImageUrl = ({ url, urls }: { url?: string | null; urls?: string[] }): [string, () => void] => {\n    // Since this is a hot code path and the settings store can be slow, we\n    // use the cached lowBandwidth value from the room context if it exists\n    const roomContext = useScopedRoomContext(\"lowBandwidth\");\n    const lowBandwidth = roomContext?.lowBandwidth ?? SettingsStore.getValue(\"lowBandwidth\");\n\n    const [imageUrls, setUrls] = useState<string[]>(calculateUrls(url, urls, lowBandwidth));\n    const [urlsIndex, setIndex] = useState<number>(0);\n\n    const onError = useCallback(() => {\n        setIndex((i) => i + 1); // try the next one\n    }, []);\n\n    useEffect(() => {\n        setUrls(calculateUrls(url, urls, lowBandwidth));\n        setIndex(0);\n    }, [url, JSON.stringify(urls)]); // eslint-disable-line react-hooks/exhaustive-deps\n\n    const cli = useContext(MatrixClientContext);\n    const onClientSync = useCallback((syncState: SyncState, prevState: SyncState | null) => {\n        // Consider the client reconnected if there is no error with syncing.\n        // This means the state could be RECONNECTING, SYNCING, PREPARED or CATCHUP.\n        const reconnected = syncState !== \"ERROR\" && prevState !== syncState;\n        if (reconnected) {\n            setIndex(0);\n        }\n    }, []);\n    useTypedEventEmitter(cli, ClientEvent.Sync, onClientSync);\n\n    const imageUrl = imageUrls[urlsIndex];\n    return [imageUrl, onError];\n};\n\nconst BaseAvatar = (props: IProps): JSX.Element => {\n    const {\n        name,\n        idName,\n        title,\n        url,\n        urls,\n        size = \"40px\",\n        onClick,\n        className,\n        type = \"round\",\n        altText = _t(\"common|avatar\"),\n        ref,\n        ...otherProps\n    } = props;\n\n    const [imageUrl, onError] = useImageUrl({ url, urls });\n\n    const extraProps: Partial<React.ComponentProps<typeof Avatar>> = {};\n\n    if (onClick) {\n        extraProps[\"aria-live\"] = \"off\";\n        extraProps[\"role\"] = \"button\";\n    } else if (!imageUrl) {\n        extraProps[\"role\"] = \"presentation\";\n        extraProps[\"aria-label\"] = undefined;\n    } else {\n        extraProps[\"role\"] = undefined;\n    }\n\n    return (\n        <Avatar\n            ref={ref}\n            src={imageUrl}\n            id={idName ?? \"\"}\n            name={name ?? \"\"}\n            type={type}\n            size={size}\n            className={classNames(\"mx_BaseAvatar\", className)}\n            aria-label={altText}\n            onError={onError}\n            title={title}\n            onClick={onClick}\n            {...extraProps}\n            {...otherProps}\n            data-testid=\"avatar-img\"\n        />\n    );\n};\n\nexport default BaseAvatar;\nexport type BaseAvatarType = React.FC<IProps>;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport classNames from \"classnames\";\nimport {\n    EventType,\n    JoinRule,\n    type MatrixEvent,\n    type Room,\n    RoomEvent,\n    type User,\n    UserEvent,\n} from \"matrix-js-sdk/src/matrix\";\nimport { UnstableValue } from \"matrix-js-sdk/src/NamespacedValue\";\nimport { Tooltip } from \"@vector-im/compound-web\";\nimport { PublicIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport RoomAvatar from \"./RoomAvatar\";\nimport NotificationBadge from \"../rooms/NotificationBadge\";\nimport { RoomNotificationStateStore } from \"../../../stores/notifications/RoomNotificationStateStore\";\nimport { type NotificationState } from \"../../../stores/notifications/NotificationState\";\nimport { isPresenceEnabled } from \"../../../utils/presence\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport { _t } from \"../../../languageHandler\";\nimport DMRoomMap from \"../../../utils/DMRoomMap\";\nimport { type IOOBData } from \"../../../stores/ThreepidInviteStore\";\nimport { getJoinedNonFunctionalMembers } from \"../../../utils/room/getJoinedNonFunctionalMembers\";\n\ninterface IProps {\n    room: Room;\n    size: string;\n    displayBadge?: boolean;\n    /**\n     * If true, show nothing if the notification would only cause a dot to be shown rather than\n     * a badge. That is: only display badges and not dots. Default: false.\n     */\n    hideIfDot?: boolean;\n    oobData?: IOOBData;\n    viewAvatarOnClick?: boolean;\n    tooltipProps?: {\n        tabIndex?: number;\n    };\n    className?: string;\n}\n\ninterface IState {\n    notificationState?: NotificationState;\n    icon: Icon;\n}\n\nconst BUSY_PRESENCE_NAME = new UnstableValue(\"busy\", \"org.matrix.msc3026.busy\");\n\nenum Icon {\n    // Note: the names here are used in CSS class names\n    None = \"NONE\", // ... except this one\n    Globe = \"GLOBE\",\n    PresenceOnline = \"ONLINE\",\n    PresenceAway = \"AWAY\",\n    PresenceOffline = \"OFFLINE\",\n    PresenceBusy = \"BUSY\",\n}\n\nfunction tooltipText(variant: Icon): string | undefined {\n    switch (variant) {\n        case Icon.Globe:\n            return _t(\"room|header|room_is_public\");\n        case Icon.PresenceOnline:\n            return _t(\"presence|online\");\n        case Icon.PresenceAway:\n            return _t(\"presence|away\");\n        case Icon.PresenceOffline:\n            return _t(\"presence|offline\");\n        case Icon.PresenceBusy:\n            return _t(\"presence|busy\");\n    }\n}\n\n/**\n * @deprecated Use {@link RoomAvatarView} instead.\n */\nexport default class DecoratedRoomAvatar extends React.PureComponent<IProps, IState> {\n    private _dmUser: User | null = null;\n    private isUnmounted = false;\n    private isWatchingTimeline = false;\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            notificationState: RoomNotificationStateStore.instance.getRoomState(this.props.room),\n            icon: this.calculateIcon(),\n        };\n    }\n\n    public componentWillUnmount(): void {\n        this.isUnmounted = true;\n        if (this.isWatchingTimeline) this.props.room.off(RoomEvent.Timeline, this.onRoomTimeline);\n        this.dmUser = null; // clear listeners, if any\n    }\n\n    private get isPublicRoom(): boolean {\n        return this.props.room.getJoinRule() === JoinRule.Public;\n    }\n\n    private get dmUser(): User | null {\n        return this._dmUser;\n    }\n\n    private set dmUser(val: User | null) {\n        const oldUser = this._dmUser;\n        this._dmUser = val;\n        if (oldUser && oldUser !== this._dmUser) {\n            oldUser.off(UserEvent.CurrentlyActive, this.onPresenceUpdate);\n            oldUser.off(UserEvent.Presence, this.onPresenceUpdate);\n        }\n        if (this._dmUser && oldUser !== this._dmUser) {\n            this._dmUser.on(UserEvent.CurrentlyActive, this.onPresenceUpdate);\n            this._dmUser.on(UserEvent.Presence, this.onPresenceUpdate);\n        }\n    }\n\n    private onRoomTimeline = (ev: MatrixEvent, room?: Room): void => {\n        if (this.isUnmounted) return;\n        if (this.props.room.roomId !== room?.roomId) return;\n\n        if (ev.getType() === EventType.RoomJoinRules || ev.getType() === EventType.RoomMember) {\n            const newIcon = this.calculateIcon();\n            if (newIcon !== this.state.icon) {\n                this.setState({ icon: newIcon });\n            }\n        }\n    };\n\n    private onPresenceUpdate = (): void => {\n        if (this.isUnmounted) return;\n\n        const newIcon = this.getPresenceIcon();\n        if (newIcon !== this.state.icon) this.setState({ icon: newIcon });\n    };\n\n    private getPresenceIcon(): Icon {\n        if (!this.dmUser) return Icon.None;\n\n        let icon = Icon.None;\n\n        const isOnline = this.dmUser.currentlyActive || this.dmUser.presence === \"online\";\n        if (BUSY_PRESENCE_NAME.matches(this.dmUser.presence)) {\n            icon = Icon.PresenceBusy;\n        } else if (isOnline) {\n            icon = Icon.PresenceOnline;\n        } else if (this.dmUser.presence === \"offline\") {\n            icon = Icon.PresenceOffline;\n        } else if (this.dmUser.presence === \"unavailable\") {\n            icon = Icon.PresenceAway;\n        }\n\n        return icon;\n    }\n\n    private calculateIcon(): Icon {\n        let icon = Icon.None;\n\n        // We look at the DMRoomMap and not the tag here so that we don't exclude DMs in Favourites\n        const otherUserId = DMRoomMap.shared().getUserIdForRoomId(this.props.room.roomId);\n        if (otherUserId && getJoinedNonFunctionalMembers(this.props.room).length === 2) {\n            // Track presence, if available\n            if (isPresenceEnabled(this.props.room.client)) {\n                this.dmUser = MatrixClientPeg.safeGet().getUser(otherUserId);\n                icon = this.getPresenceIcon();\n            }\n        } else {\n            // Track publicity\n            icon = this.isPublicRoom ? Icon.Globe : Icon.None;\n            if (!this.isWatchingTimeline) {\n                this.props.room.on(RoomEvent.Timeline, this.onRoomTimeline);\n                this.isWatchingTimeline = true;\n            }\n        }\n        return icon;\n    }\n\n    public render(): React.ReactNode {\n        // Spread the remaining props to make it work with compound component\n        const { room, size, displayBadge, hideIfDot, oobData, viewAvatarOnClick, tooltipProps, className, ...props } =\n            this.props;\n\n        let badge: React.ReactNode;\n        if (this.props.displayBadge && this.state.notificationState) {\n            badge = (\n                <NotificationBadge\n                    notification={this.state.notificationState}\n                    hideIfDot={this.props.hideIfDot}\n                    roomId={this.props.room.roomId}\n                />\n            );\n        }\n\n        let icon: JSX.Element | undefined;\n        if (this.state.icon !== Icon.None) {\n            icon = (\n                <div\n                    tabIndex={this.props.tooltipProps?.tabIndex ?? 0}\n                    className={`mx_DecoratedRoomAvatar_icon mx_DecoratedRoomAvatar_icon_${this.state.icon.toLowerCase()}`}\n                >\n                    {this.state.icon === Icon.Globe ? <PublicIcon /> : null}\n                </div>\n            );\n        }\n\n        const classes = classNames(\n            \"mx_DecoratedRoomAvatar\",\n            {\n                mx_DecoratedRoomAvatar_cutout: icon,\n            },\n            className,\n        );\n\n        return (\n            <div className={classes} {...props}>\n                <RoomAvatar\n                    room={this.props.room}\n                    size={this.props.size}\n                    oobData={this.props.oobData}\n                    viewAvatarOnClick={this.props.viewAvatarOnClick}\n                />\n                {icon && (\n                    <Tooltip label={tooltipText(this.state.icon)!} placement=\"bottom\">\n                        {icon}\n                    </Tooltip>\n                )}\n                {badge}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2022 The Matrix.org Foundation C.I.C.\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ReactNode, type Ref, useContext } from \"react\";\nimport { type RoomMember, type ResizeMethod } from \"matrix-js-sdk/src/matrix\";\n\nimport dis from \"../../../dispatcher/dispatcher\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport BaseAvatar from \"./BaseAvatar\";\nimport { mediaFromMxc } from \"../../../customisations/Media\";\nimport { CardContext } from \"../right_panel/context\";\nimport UserIdentifierCustomisations from \"../../../customisations/UserIdentifier\";\nimport { useRoomMemberProfile } from \"../../../hooks/room/useRoomMemberProfile\";\nimport { _t } from \"../../../languageHandler\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext.tsx\";\n\ninterface IProps extends Omit<React.ComponentProps<typeof BaseAvatar>, \"name\" | \"idName\" | \"url\"> {\n    member: RoomMember | null;\n    fallbackUserId?: string;\n    size: string;\n    resizeMethod?: ResizeMethod;\n    // Whether the onClick of the avatar should be overridden to dispatch `Action.ViewUser`\n    viewUserOnClick?: boolean;\n    pushUserOnClick?: boolean;\n    title?: string;\n    style?: any;\n    forceHistorical?: boolean; // true to deny `useOnlyCurrentProfiles` usage. Default false.\n    hideTitle?: boolean;\n    children?: ReactNode;\n    ref?: Ref<HTMLElement>;\n}\n\nexport default function MemberAvatar({\n    size,\n    resizeMethod = \"crop\",\n    viewUserOnClick,\n    forceHistorical,\n    fallbackUserId,\n    hideTitle,\n    member: propsMember,\n    ref,\n    ...props\n}: IProps): JSX.Element {\n    const cli = useContext(MatrixClientContext);\n    const card = useContext(CardContext);\n\n    const member = useRoomMemberProfile({\n        userId: propsMember?.userId,\n        member: propsMember,\n        forceHistorical: forceHistorical,\n    });\n\n    const name = member?.name ?? fallbackUserId;\n    let title: string | undefined = props.title;\n    let imageUrl: string | null | undefined;\n    if (member?.name) {\n        if (member.getMxcAvatarUrl()) {\n            imageUrl = mediaFromMxc(member.getMxcAvatarUrl() ?? \"\", cli).getThumbnailOfSourceHttp(\n                parseInt(size, 10),\n                parseInt(size, 10),\n                resizeMethod,\n            );\n        }\n\n        if (!title) {\n            title =\n                UserIdentifierCustomisations.getDisplayUserIdentifier(member?.userId ?? \"\", {\n                    roomId: member?.roomId ?? \"\",\n                }) ?? fallbackUserId;\n        }\n    }\n\n    return (\n        <BaseAvatar\n            {...props}\n            size={size}\n            name={name ?? \"\"}\n            title={hideTitle ? undefined : title}\n            idName={member?.userId ?? fallbackUserId}\n            url={imageUrl}\n            onClick={\n                viewUserOnClick\n                    ? () => {\n                          dis.dispatch({\n                              action: Action.ViewUser,\n                              member: propsMember,\n                              push: card.isCard,\n                          });\n                      }\n                    : props.onClick\n            }\n            altText={_t(\"common|user_avatar\")}\n            ref={ref}\n        />\n    );\n}\n","/*\nCopyright 2024, 2025 New Vector Ltd.\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useCallback, useMemo, type ComponentProps } from \"react\";\nimport { type Room, RoomType, KnownMembership, EventType, RoomEvent } from \"matrix-js-sdk/src/matrix\";\nimport { type RoomAvatarEventContent } from \"matrix-js-sdk/src/types\";\n\nimport BaseAvatar from \"./BaseAvatar\";\nimport ImageView from \"../elements/ImageView\";\nimport Modal from \"../../../Modal\";\nimport * as Avatar from \"../../../Avatar\";\nimport { mediaFromMxc } from \"../../../customisations/Media\";\nimport { type IOOBData } from \"../../../stores/ThreepidInviteStore\";\nimport { filterBoolean } from \"../../../utils/arrays\";\nimport { useSettingValue } from \"../../../hooks/useSettings\";\nimport { useRoomState } from \"../../../hooks/useRoomState\";\nimport { useRoomIdName } from \"../../../hooks/room/useRoomIdName\";\nimport { MediaPreviewValue } from \"../../../@types/media_preview\";\nimport { useTypedEventEmitterState } from \"../../../hooks/useEventEmitter\";\n\ninterface IProps extends Omit<ComponentProps<typeof BaseAvatar>, \"name\" | \"idName\" | \"url\" | \"onClick\" | \"size\"> {\n    // Room may be left unset here, but if it is,\n    // oobData.avatarUrl should be set (else there\n    // would be nowhere to get the avatar from)\n    room?: Room;\n    // Optional here.\n    size?: ComponentProps<typeof BaseAvatar>[\"size\"];\n    oobData?: IOOBData & {\n        roomId?: string;\n    };\n    viewAvatarOnClick?: boolean;\n    onClick?(this: void): void;\n}\n\nconst RoomAvatar: React.FC<IProps> = ({ room, viewAvatarOnClick, onClick, oobData, size = \"36px\", ...otherProps }) => {\n    const name = useTypedEventEmitterState(room, RoomEvent.Name, () => room?.name);\n    const roomName = name ?? oobData?.name ?? \"?\";\n    const avatarEvent = useRoomState(room, (state) => state.getStateEvents(EventType.RoomAvatar, \"\"));\n    const roomIdName = useRoomIdName(room, oobData);\n\n    const showAvatarsOnInvites =\n        useSettingValue(\"mediaPreviewConfig\", room?.roomId).invite_avatars === MediaPreviewValue.On;\n\n    const onRoomAvatarClick = useCallback(() => {\n        const avatarUrl = Avatar.avatarUrlForRoom(room ?? null);\n        if (!avatarUrl) return;\n        const params = {\n            src: avatarUrl,\n            name: room?.name,\n        };\n\n        Modal.createDialog(ImageView, params, \"mx_Dialog_lightbox\", undefined, true);\n    }, [room]);\n\n    const urls = useMemo(() => {\n        const myMembership = room?.getMyMembership();\n        if (!showAvatarsOnInvites && (myMembership === KnownMembership.Invite || !myMembership)) {\n            // The user has opted out of showing avatars, so return no urls here.\n            return [];\n        }\n\n        // parseInt ignores suffixes.\n        const sizeInt = parseInt(size, 10);\n        let oobAvatar: string | null = null;\n        if (oobData?.avatarUrl) {\n            oobAvatar = mediaFromMxc(oobData?.avatarUrl).getThumbnailOfSourceHttp(sizeInt, sizeInt, \"crop\");\n        }\n\n        return filterBoolean([\n            oobAvatar, // highest priority\n            Avatar.avatarUrlForRoom(\n                room ?? null,\n                sizeInt,\n                sizeInt,\n                \"crop\",\n                avatarEvent?.getContent<RoomAvatarEventContent>().url,\n            ),\n        ]);\n    }, [showAvatarsOnInvites, room, size, avatarEvent, oobData]);\n\n    return (\n        <BaseAvatar\n            {...otherProps}\n            size={size}\n            type={(room?.getType() ?? oobData?.roomType) === RoomType.Space ? \"square\" : \"round\"}\n            name={roomName}\n            idName={roomIdName}\n            urls={urls}\n            onClick={viewAvatarOnClick && urls[0] ? onRoomAvatarClick : onClick}\n        />\n    );\n};\n\nexport default RoomAvatar;\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { useDmMember } from \"../../components/views/avatars/WithPresenceIndicator.tsx\";\nimport { LocalRoom } from \"../../models/LocalRoom.ts\";\n\n/**\n * Determine a stable ID for generating hash colours. If the room\n * is a DM (or local room), then the other user's ID will be used.\n * @param oobData - out-of-band information about the room\n * @returns An ID string, or undefined if the room and oobData are undefined.\n */\nexport function useRoomIdName(room?: Room, oobData?: { roomId?: string }): string | undefined {\n    const dmMember = useDmMember(room);\n    if (dmMember) {\n        // If the room is a DM, we use the other user's ID for the color hash\n        // in order to match the room avatar with their avatar\n        return dmMember.userId;\n    } else if (room instanceof LocalRoom && room.targets.length === 1) {\n        return room.targets[0].userId;\n    } else if (room) {\n        return room.roomId;\n    } else {\n        return oobData?.roomId;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport { type RoomMember } from \"matrix-js-sdk/src/matrix\";\n\nimport emailPillAvatar from \"../../../../res/img/icon-email-pill-avatar.svg\";\nimport { mediaFromMxc } from \"../../../customisations/Media\";\nimport { type Member, type ThreepidMember } from \"../../../utils/direct-messages\";\nimport BaseAvatar from \"./BaseAvatar\";\n\ninterface SearchResultAvatarProps {\n    user: Member | RoomMember;\n    size: string;\n}\n\nexport function SearchResultAvatar({ user, size }: SearchResultAvatarProps): JSX.Element {\n    if ((user as ThreepidMember).isEmail) {\n        // we can’t show a real avatar here, but we try to create the exact same markup that a real avatar would have\n        // BaseAvatar makes the avatar, if it's not clickable but just for decoration, invisible to screenreaders by\n        // specifically setting an empty alt text, so we do the same.\n        return (\n            <img\n                className=\"mx_SearchResultAvatar mx_SearchResultAvatar_threepidAvatar\"\n                alt=\"\"\n                src={emailPillAvatar}\n                width={size}\n                height={size}\n            />\n        );\n    } else {\n        const avatarUrl = user.getMxcAvatarUrl();\n        return (\n            <BaseAvatar\n                className=\"mx_SearchResultAvatar\"\n                url={avatarUrl ? mediaFromMxc(avatarUrl).getSquareThumbnailHttp(parseInt(size, 10)) : null}\n                name={user.name}\n                idName={user.userId}\n                size={size}\n            />\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2024 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ReactNode, useEffect, useState } from \"react\";\nimport {\n    ClientEvent,\n    type Room,\n    type RoomMember,\n    RoomStateEvent,\n    type User,\n    UserEvent,\n} from \"matrix-js-sdk/src/matrix\";\n\nimport { isPresenceEnabled } from \"../../../utils/presence\";\nimport DMRoomMap from \"../../../utils/DMRoomMap\";\nimport { getJoinedNonFunctionalMembers } from \"../../../utils/room/getJoinedNonFunctionalMembers\";\nimport { useEventEmitter } from \"../../../hooks/useEventEmitter\";\nimport { BUSY_PRESENCE_NAME } from \"../rooms/PresenceLabel\";\nimport AvatarPresenceIconView from \"../rooms/MemberList/tiles/common/PresenceIconView\";\n\ninterface Props {\n    room: Room;\n    children: ReactNode;\n}\n\nexport enum Presence {\n    // This class used to have its own presence indicator and has been\n    // updated to use the new one so presence colours / icons match across the app.\n    // These values are the ones from the wire that PresenceIconView expects,\n    // but really some of the logic here could be deduplicated.\n    Online = \"online\",\n    Away = \"unavailable\",\n    Offline = \"offline\",\n    Busy = \"busy\",\n}\n\nfunction getDmMember(room: Room): RoomMember | null {\n    const otherUserId = DMRoomMap.shared().getUserIdForRoomId(room.roomId);\n    return otherUserId ? room.getMember(otherUserId) : null;\n}\n\nexport const useDmMember = (room?: Room): RoomMember | null => {\n    const [dmMember, setDmMember] = useState<RoomMember | null>(room ? getDmMember(room) : null);\n    const updateDmMember = (): void => {\n        setDmMember(room ? getDmMember(room) : null);\n    };\n\n    useEventEmitter(room?.currentState, RoomStateEvent.Members, updateDmMember);\n    useEventEmitter(room?.client, ClientEvent.AccountData, updateDmMember);\n    useEffect(updateDmMember, [room]);\n\n    return dmMember;\n};\n\nfunction getPresenceFromUser(user: User | null | undefined): Presence | null {\n    if (!user) return null;\n\n    const presence = user.presence;\n    const isOnline = user.currentlyActive || presence === \"online\";\n    if (BUSY_PRESENCE_NAME.matches(presence)) {\n        return Presence.Busy;\n    }\n    if (isOnline) {\n        return Presence.Online;\n    }\n    if (presence === \"offline\") {\n        return Presence.Offline;\n    }\n    if (presence === \"unavailable\") {\n        return Presence.Away;\n    }\n\n    return null;\n}\n\nfunction getPresence(room: Room, member: RoomMember | null): Presence | null {\n    // Fall back to client.getUser() when member.user is not yet linked during initial sync\n    const user = member?.user ?? (member ? room.client.getUser(member.userId) : null);\n    return getPresenceFromUser(user);\n}\n\nexport const usePresence = (room: Room, member: RoomMember | null): Presence | null => {\n    const [presence, setPresence] = useState<Presence | null>(getPresence(room, member));\n    const updatePresence = (): void => {\n        setPresence(getPresence(room, member));\n    };\n\n    useEventEmitter(member?.user, UserEvent.Presence, updatePresence);\n    useEventEmitter(member?.user, UserEvent.CurrentlyActive, updatePresence);\n    // Also listen at client level to catch presence events when member.user is not yet linked\n    useEventEmitter(room.client, UserEvent.Presence, (_event: unknown, user: User) => {\n        if (user?.userId === member?.userId) updatePresence();\n    });\n    useEffect(updatePresence, [room, member]);\n\n    if (getJoinedNonFunctionalMembers(room).length !== 2 || !isPresenceEnabled(room.client)) return null;\n    return presence;\n};\n\nconst WithPresenceIndicator: React.FC<Props> = ({ room, children }) => {\n    const dmMember = useDmMember(room);\n    const presence = usePresence(room, dmMember);\n\n    let icon: JSX.Element | undefined;\n    if (presence) {\n        icon = <AvatarPresenceIconView presenceState={presence} />;\n    }\n\n    if (!presence) return <>{children}</>;\n\n    return (\n        <div className=\"mx_WithPresenceIndicator\">\n            {children}\n            <div className=\"mx_WithPresenceIndicator_icon\">{icon}</div>\n        </div>\n    );\n};\n\nexport default WithPresenceIndicator;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { BeaconEvent, type Beacon } from \"matrix-js-sdk/src/matrix\";\n\nimport { formatDuration } from \"../../../DateUtils\";\nimport { useEventEmitterState } from \"../../../hooks/useEventEmitter\";\nimport { useInterval } from \"../../../hooks/useTimeout\";\nimport { _t } from \"../../../languageHandler\";\nimport { getBeaconMsUntilExpiry } from \"../../../utils/beacon\";\n\nconst MINUTE_MS = 60000;\nconst HOUR_MS = MINUTE_MS * 60;\nconst getUpdateInterval = (ms: number): number => {\n    // every 10 mins when more than an hour\n    if (ms > HOUR_MS) {\n        return MINUTE_MS * 10;\n    }\n    // every minute when more than a minute\n    if (ms > MINUTE_MS) {\n        return MINUTE_MS;\n    }\n    // otherwise every second\n    return 1000;\n};\nconst useMsRemaining = (beacon: Beacon): number => {\n    const beaconInfo = useEventEmitterState(beacon, BeaconEvent.Update, () => beacon.beaconInfo);\n\n    const [msRemaining, setMsRemaining] = useState(() => (beaconInfo ? getBeaconMsUntilExpiry(beaconInfo) : 0));\n\n    useEffect(() => {\n        if (!beaconInfo) {\n            return;\n        }\n        setMsRemaining(getBeaconMsUntilExpiry(beaconInfo));\n    }, [beaconInfo]);\n\n    const updateMsRemaining = useCallback(() => {\n        if (!beaconInfo) {\n            return;\n        }\n        const ms = getBeaconMsUntilExpiry(beaconInfo);\n        setMsRemaining(ms);\n    }, [beaconInfo]);\n\n    useInterval(updateMsRemaining, getUpdateInterval(msRemaining));\n\n    return msRemaining;\n};\n\nconst LiveTimeRemaining: React.FC<{ beacon: Beacon }> = ({ beacon }) => {\n    const msRemaining = useMsRemaining(beacon);\n\n    const timeRemaining = formatDuration(msRemaining);\n    const liveTimeRemaining = _t(\"time|left\", { timeRemaining });\n\n    return (\n        <span data-testid=\"room-live-share-expiry\" className=\"mx_LiveTimeRemaining\">\n            {liveTimeRemaining}\n        </span>\n    );\n};\n\nexport default LiveTimeRemaining;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type HTMLProps } from \"react\";\nimport classNames from \"classnames\";\nimport { type Beacon } from \"matrix-js-sdk/src/matrix\";\n\nimport StyledLiveBeaconIcon from \"./StyledLiveBeaconIcon\";\nimport { _t } from \"../../../languageHandler\";\nimport LiveTimeRemaining from \"./LiveTimeRemaining\";\nimport { BeaconDisplayStatus } from \"./displayStatus\";\nimport { getBeaconExpiryTimestamp } from \"../../../utils/beacon\";\nimport { formatTime } from \"../../../DateUtils\";\n\ninterface Props {\n    displayStatus: BeaconDisplayStatus;\n    displayLiveTimeRemaining?: boolean;\n    withIcon?: boolean;\n    beacon?: Beacon;\n    label?: string;\n}\n\nconst BeaconExpiryTime: React.FC<{ beacon: Beacon }> = ({ beacon }) => {\n    const expiryTime = formatTime(new Date(getBeaconExpiryTimestamp(beacon)));\n    return <span className=\"mx_BeaconStatus_expiryTime\">{_t(\"location_sharing|live_until\", { expiryTime })}</span>;\n};\n\nconst BeaconStatus: React.FC<Props & HTMLProps<HTMLDivElement>> = ({\n    beacon,\n    displayStatus,\n    displayLiveTimeRemaining,\n    label,\n    className,\n    children,\n    withIcon,\n    ...rest\n}) => {\n    const isIdle = displayStatus === BeaconDisplayStatus.Loading || displayStatus === BeaconDisplayStatus.Stopped;\n\n    return (\n        <div {...rest} className={classNames(\"mx_BeaconStatus\", `mx_BeaconStatus_${displayStatus}`, className)}>\n            {withIcon && (\n                <StyledLiveBeaconIcon\n                    className=\"mx_BeaconStatus_icon\"\n                    withError={displayStatus === BeaconDisplayStatus.Error}\n                    isIdle={isIdle}\n                />\n            )}\n            <div className=\"mx_BeaconStatus_description\">\n                {displayStatus === BeaconDisplayStatus.Loading && (\n                    <span className=\"mx_BeaconStatus_description_status\">\n                        {_t(\"location_sharing|loading_live_location\")}\n                    </span>\n                )}\n                {displayStatus === BeaconDisplayStatus.Stopped && (\n                    <span className=\"mx_BeaconStatus_description_status\">\n                        {_t(\"location_sharing|live_location_ended\")}\n                    </span>\n                )}\n                {displayStatus === BeaconDisplayStatus.Error && (\n                    <span className=\"mx_BeaconStatus_description_status\">\n                        {_t(\"location_sharing|live_location_error\")}\n                    </span>\n                )}\n                {displayStatus === BeaconDisplayStatus.Active && beacon && (\n                    <>\n                        <span className=\"mx_BeaconStatus_label\">{label}</span>\n                        {displayLiveTimeRemaining ? (\n                            <LiveTimeRemaining beacon={beacon} />\n                        ) : (\n                            <BeaconExpiryTime beacon={beacon} />\n                        )}\n                    </>\n                )}\n            </div>\n            {children}\n        </div>\n    );\n};\n\nexport default BeaconStatus;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Beacon } from \"matrix-js-sdk/src/matrix\";\nimport React, { type HTMLProps } from \"react\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { useOwnLiveBeacons } from \"../../../utils/beacon\";\nimport { preventDefaultWrapper } from \"../../../utils/NativeEventUtils\";\nimport BeaconStatus from \"./BeaconStatus\";\nimport { BeaconDisplayStatus } from \"./displayStatus\";\nimport AccessibleButton, { type ButtonEvent } from \"../elements/AccessibleButton\";\n\ninterface Props {\n    displayStatus: BeaconDisplayStatus;\n    className?: string;\n    beacon?: Beacon;\n    withIcon?: boolean;\n}\n\n/**\n * Wraps BeaconStatus with more capabilities\n * for errors and actions available for users own live beacons\n */\nconst OwnBeaconStatus: React.FC<Props & HTMLProps<HTMLDivElement>> = ({ beacon, displayStatus, ...rest }) => {\n    const {\n        hasLocationPublishError,\n        hasStopSharingError,\n        stoppingInProgress,\n        onStopSharing,\n        onResetLocationPublishError,\n    } = useOwnLiveBeacons(beacon?.identifier ? [beacon?.identifier] : []);\n\n    // combine display status with errors that only occur for user's own beacons\n    const ownDisplayStatus = hasLocationPublishError || hasStopSharingError ? BeaconDisplayStatus.Error : displayStatus;\n\n    return (\n        <BeaconStatus\n            beacon={beacon}\n            displayStatus={ownDisplayStatus}\n            label={_t(\"location_sharing|live_location_enabled\")}\n            displayLiveTimeRemaining\n            {...rest}\n        >\n            {ownDisplayStatus === BeaconDisplayStatus.Active && (\n                <AccessibleButton\n                    data-testid=\"beacon-status-stop-beacon\"\n                    kind=\"link\"\n                    // eat events here to avoid 1) the map and 2) reply or thread tiles\n                    // moving under the beacon status on stop/retry click\n                    onClick={preventDefaultWrapper<ButtonEvent>(onStopSharing)}\n                    className=\"mx_OwnBeaconStatus_button mx_OwnBeaconStatus_destructiveButton\"\n                    disabled={stoppingInProgress}\n                >\n                    {_t(\"action|stop\")}\n                </AccessibleButton>\n            )}\n            {hasLocationPublishError && (\n                <AccessibleButton\n                    data-testid=\"beacon-status-reset-wire-error\"\n                    kind=\"link\"\n                    // eat events here to avoid 1) the map and 2) reply or thread tiles\n                    // moving under the beacon status on stop/retry click\n                    onClick={preventDefaultWrapper(onResetLocationPublishError)}\n                    className=\"mx_OwnBeaconStatus_button mx_OwnBeaconStatus_destructiveButton\"\n                >\n                    {_t(\"action|retry\")}\n                </AccessibleButton>\n            )}\n            {hasStopSharingError && (\n                <AccessibleButton\n                    data-testid=\"beacon-status-stop-beacon-retry\"\n                    kind=\"link\"\n                    // eat events here to avoid 1) the map and 2) reply or thread tiles\n                    // moving under the beacon status on stop/retry click\n                    onClick={preventDefaultWrapper(onStopSharing)}\n                    className=\"mx_OwnBeaconStatus_button mx_OwnBeaconStatus_destructiveButton\"\n                >\n                    {_t(\"action|retry\")}\n                </AccessibleButton>\n            )}\n        </BeaconStatus>\n    );\n};\n\nexport default OwnBeaconStatus;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport classNames from \"classnames\";\n\nimport { Icon as LiveLocationIcon } from \"../../../../res/img/location/live-location.svg\";\n\ninterface Props extends React.SVGProps<SVGSVGElement> {\n    // use error styling when true\n    withError?: boolean;\n    isIdle?: boolean;\n}\nconst StyledLiveBeaconIcon: React.FC<Props> = ({ className, withError, isIdle, ...props }) => (\n    <LiveLocationIcon\n        {...props}\n        className={classNames(\"mx_StyledLiveBeaconIcon\", className, {\n            mx_StyledLiveBeaconIcon_error: withError,\n            mx_StyledLiveBeaconIcon_idle: isIdle,\n        })}\n    />\n);\n\nexport default StyledLiveBeaconIcon;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type ContentHelpers } from \"matrix-js-sdk/src/matrix\";\n\nexport enum BeaconDisplayStatus {\n    Loading = \"Loading\",\n    Error = \"Error\",\n    Stopped = \"Stopped\",\n    Active = \"Active\",\n}\nexport const getBeaconDisplayStatus = (\n    isLive: boolean,\n    latestLocationState?: ContentHelpers.BeaconLocationState,\n    error?: Error,\n    waitingToStart?: boolean,\n): BeaconDisplayStatus => {\n    if (error) {\n        return BeaconDisplayStatus.Error;\n    }\n    if (waitingToStart) {\n        return BeaconDisplayStatus.Loading;\n    }\n    if (!isLive) {\n        return BeaconDisplayStatus.Stopped;\n    }\n    if (!latestLocationState) {\n        return BeaconDisplayStatus.Loading;\n    }\n    return BeaconDisplayStatus.Active;\n};\n","/*\nCopyright 2024,2025 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode, useState } from \"react\";\n\nimport QuestionDialog from \"./QuestionDialog\";\nimport { _t } from \"../../../languageHandler\";\nimport Field from \"../elements/Field\";\nimport { submitFeedback } from \"../../../rageshake/submit-rageshake\";\nimport StyledCheckbox from \"../elements/StyledCheckbox\";\nimport Modal from \"../../../Modal\";\nimport InfoDialog from \"./InfoDialog\";\n\ninterface IProps {\n    title: string;\n    subheading?: string;\n    rageshakeLabel?: string;\n    rageshakeData?: Record<string, any>;\n    children?: ReactNode;\n    onFinished(this: void, sendFeedback?: boolean): void;\n}\n\nconst GenericFeatureFeedbackDialog: React.FC<IProps> = ({\n    title,\n    subheading,\n    children,\n    rageshakeLabel,\n    rageshakeData,\n    onFinished,\n}) => {\n    const [comment, setComment] = useState(\"\");\n    const [canContact, setCanContact] = useState(false);\n\n    const sendFeedback = async (ok: boolean): Promise<void> => {\n        if (!ok) return onFinished(false);\n        // TODO: Handle rejection.\n        submitFeedback(rageshakeLabel, comment, canContact, rageshakeData);\n        onFinished(true);\n\n        Modal.createDialog(InfoDialog, {\n            title,\n            description: _t(\"feedback|sent\"),\n            button: _t(\"action|close\"),\n            hasCloseButton: false,\n            fixedWidth: false,\n        });\n    };\n\n    return (\n        <QuestionDialog\n            className=\"mx_GenericFeatureFeedbackDialog\"\n            hasCancelButton={true}\n            title={title}\n            description={\n                <React.Fragment>\n                    <div className=\"mx_GenericFeatureFeedbackDialog_subheading\">\n                        {subheading}\n                        &nbsp;\n                        {_t(\"feedback|platform_username\")}\n                        &nbsp;\n                        {children}\n                    </div>\n\n                    <Field\n                        id=\"feedbackComment\"\n                        label={_t(\"common|feedback\")}\n                        type=\"text\"\n                        autoComplete=\"off\"\n                        value={comment}\n                        element=\"textarea\"\n                        onChange={(ev) => {\n                            setComment(ev.target.value);\n                        }}\n                        autoFocus={true}\n                    />\n                    <StyledCheckbox\n                        checked={canContact}\n                        onChange={(e) => setCanContact((e.target as HTMLInputElement).checked)}\n                    >\n                        {_t(\"feedback|can_contact_label\")}\n                    </StyledCheckbox>\n                </React.Fragment>\n            }\n            button={_t(\"feedback|send_feedback_action\")}\n            buttonDisabled={!comment}\n            onFinished={sendFeedback}\n        />\n    );\n};\n\nexport default GenericFeatureFeedbackDialog;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport { _t } from \"../../../languageHandler\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport defaultDispatcher from \"../../../dispatcher/dispatcher\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport { UserTab } from \"./UserTab\";\nimport GenericFeatureFeedbackDialog from \"./GenericFeatureFeedbackDialog\";\nimport { type SettingKey } from \"../../../settings/Settings.tsx\";\n\n// XXX: Keep this around for re-use in future Betas\n\ninterface IProps {\n    featureId: SettingKey;\n    onFinished(this: void, sendFeedback?: boolean): void;\n}\n\nconst BetaFeedbackDialog: React.FC<IProps> = ({ featureId, onFinished }) => {\n    const info = SettingsStore.getBetaInfo(featureId);\n    if (!info) return null;\n\n    return (\n        <GenericFeatureFeedbackDialog\n            title={_t(\"labs|beta_feedback_title\", { featureName: info.title })}\n            subheading={info.feedbackSubheading ? _t(info.feedbackSubheading) : undefined}\n            onFinished={onFinished}\n            rageshakeLabel={info.feedbackLabel}\n            rageshakeData={Object.fromEntries(\n                (SettingsStore.getBetaInfo(featureId)?.extraSettings || []).map((k) => {\n                    return [k, SettingsStore.getValue(k)];\n                }),\n            )}\n        >\n            <AccessibleButton\n                kind=\"link_inline\"\n                onClick={() => {\n                    onFinished();\n                    defaultDispatcher.dispatch({\n                        action: Action.ViewUserSettings,\n                        initialTabId: UserTab.Labs,\n                    });\n                }}\n            >\n                {_t(\"labs|beta_feedback_leave_button\")}\n            </AccessibleButton>\n        </GenericFeatureFeedbackDialog>\n    );\n};\n\nexport default BetaFeedbackDialog;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode, useState } from \"react\";\nimport { sleep } from \"matrix-js-sdk/src/utils\";\n\nimport { _t } from \"../../../languageHandler\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { SettingLevel } from \"../../../settings/SettingLevel\";\nimport Modal from \"../../../Modal\";\nimport BetaFeedbackDialog from \"../dialogs/BetaFeedbackDialog\";\nimport SdkConfig from \"../../../SdkConfig\";\nimport SettingsFlag from \"../elements/SettingsFlag\";\nimport { useFeatureEnabled } from \"../../../hooks/useSettings\";\nimport InlineSpinner from \"../elements/InlineSpinner\";\nimport { shouldShowFeedback } from \"../../../utils/Feedback\";\nimport { type FeatureSettingKey } from \"../../../settings/Settings.tsx\";\n\n// XXX: Keep this around for re-use in future Betas\n\ninterface IProps {\n    title?: string;\n    featureId: FeatureSettingKey;\n}\n\ninterface IBetaPillProps {\n    onClick?: () => void;\n    tooltipTitle?: string;\n    tooltipCaption?: string;\n}\n\nexport const BetaPill: React.FC<IBetaPillProps> = ({\n    onClick,\n    tooltipTitle = _t(\"labs|beta_feature\"),\n    tooltipCaption = _t(\"labs|click_for_info\"),\n}) => {\n    if (onClick) {\n        return (\n            <AccessibleButton\n                className=\"mx_BetaCard_betaPill\"\n                aria-label={`${tooltipTitle} ${tooltipCaption}`}\n                title={tooltipTitle}\n                caption={tooltipCaption}\n                onClick={onClick}\n            >\n                {_t(\"common|beta\")}\n            </AccessibleButton>\n        );\n    }\n\n    return <span className=\"mx_BetaCard_betaPill\">{_t(\"common|beta\")}</span>;\n};\n\nconst BetaCard: React.FC<IProps> = ({ title: titleOverride, featureId }) => {\n    const info = SettingsStore.getBetaInfo(featureId);\n    const value = useFeatureEnabled(featureId);\n    const [busy, setBusy] = useState(false);\n    if (!info) return null; // Beta is invalid/disabled\n\n    const { title, caption, faq, image, feedbackLabel, feedbackSubheading, extraSettings, requiresRefresh } = info;\n\n    let feedbackButton;\n    if (value && feedbackLabel && feedbackSubheading && shouldShowFeedback()) {\n        feedbackButton = (\n            <AccessibleButton\n                onClick={() => {\n                    Modal.createDialog(BetaFeedbackDialog, { featureId });\n                }}\n                kind=\"primary\"\n            >\n                {_t(\"common|feedback\")}\n            </AccessibleButton>\n        );\n    }\n\n    let refreshWarning: string | undefined;\n    if (requiresRefresh) {\n        const brand = SdkConfig.get().brand;\n        refreshWarning = value ? _t(\"labs|leave_beta_reload\", { brand }) : _t(\"labs|join_beta_reload\", { brand });\n    }\n\n    let content: ReactNode;\n    if (busy) {\n        content = <InlineSpinner />;\n    } else if (value) {\n        content = _t(\"labs|leave_beta\");\n    } else {\n        content = _t(\"labs|join_beta\");\n    }\n\n    return (\n        <div className=\"mx_BetaCard\">\n            <div className=\"mx_BetaCard_columns\">\n                <div className=\"mx_BetaCard_columns_description\">\n                    <h3 className=\"mx_BetaCard_title\">\n                        <span>{titleOverride || _t(title)}</span>\n                        <BetaPill />\n                    </h3>\n                    <div className=\"mx_BetaCard_caption\">{caption()}</div>\n                    <div className=\"mx_BetaCard_buttons\">\n                        {feedbackButton}\n                        <AccessibleButton\n                            onClick={async (): Promise<void> => {\n                                setBusy(true);\n                                // make it look like we're doing something for two seconds,\n                                // otherwise users think clicking did nothing\n                                if (!requiresRefresh) {\n                                    await sleep(2000);\n                                }\n                                await SettingsStore.setValue(featureId, null, SettingLevel.DEVICE, !value);\n                                if (!requiresRefresh) {\n                                    setBusy(false);\n                                }\n                            }}\n                            kind={feedbackButton ? \"primary_outline\" : \"primary\"}\n                            disabled={busy}\n                        >\n                            {content}\n                        </AccessibleButton>\n                    </div>\n                    {refreshWarning && <div className=\"mx_BetaCard_refreshWarning\">{refreshWarning}</div>}\n                    {faq && <div className=\"mx_BetaCard_faq\">{faq(value)}</div>}\n                </div>\n                <div className=\"mx_BetaCard_columns_image_wrapper\">\n                    <img className=\"mx_BetaCard_columns_image\" src={image} alt=\"\" />\n                </div>\n            </div>\n            {extraSettings && value && (\n                <div className=\"mx_BetaCard_relatedSettings\">\n                    {extraSettings.map((key) => (\n                        <SettingsFlag key={key} name={key} level={SettingLevel.DEVICE} />\n                    ))}\n                </div>\n            )}\n        </div>\n    );\n};\n\nexport default BetaCard;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ReactNode } from \"react\";\nimport classNames from \"classnames\";\nimport { CheckIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport ContextMenu, {\n    ChevronFace,\n    type IProps as IContextMenuProps,\n    MenuItem,\n    MenuItemCheckbox,\n    MenuItemRadio,\n} from \"../../structures/ContextMenu\";\nimport { _t } from \"../../../languageHandler\";\n\ninterface IProps extends IContextMenuProps {\n    className?: string;\n    compact?: boolean;\n}\n\ninterface IOptionListProps {\n    first?: boolean;\n    red?: boolean;\n    label?: string;\n    className?: string;\n    children: ReactNode;\n}\n\ninterface IOptionProps extends React.ComponentProps<typeof MenuItem> {\n    icon?: ReactNode;\n    isDestructive?: boolean;\n}\n\ninterface ICheckboxProps extends React.ComponentProps<typeof MenuItemCheckbox> {\n    icon?: ReactNode;\n    words?: boolean;\n}\n\ninterface IRadioProps extends React.ComponentProps<typeof MenuItemRadio> {\n    icon?: ReactNode;\n}\n\nexport const IconizedContextMenuRadio: React.FC<IRadioProps> = ({ label, icon, active, className, ...props }) => {\n    return (\n        <MenuItemRadio\n            {...props}\n            className={classNames(className, {\n                mx_IconizedContextMenu_item: true,\n                mx_IconizedContextMenu_active: active,\n            })}\n            active={active}\n            label={label}\n        >\n            {icon}\n            <span className=\"mx_IconizedContextMenu_label\">{label}</span>\n            {active && <CheckIcon className=\"mx_IconizedContextMenu_checked\" />}\n        </MenuItemRadio>\n    );\n};\n\nexport const IconizedContextMenuCheckbox: React.FC<ICheckboxProps> = ({\n    label,\n    icon,\n    active,\n    className,\n    words,\n    ...props\n}) => {\n    let marker: JSX.Element | undefined;\n    if (words) {\n        marker = (\n            <span className=\"mx_IconizedContextMenu_activeText\">{active ? _t(\"common|on\") : _t(\"common|off\")}</span>\n        );\n    } else if (active) {\n        marker = <CheckIcon className=\"mx_IconizedContextMenu_checked\" />;\n    }\n\n    return (\n        <MenuItemCheckbox\n            {...props}\n            className={classNames(className, {\n                mx_IconizedContextMenu_item: true,\n                mx_IconizedContextMenu_active: active,\n            })}\n            active={active}\n            label={label}\n        >\n            {icon}\n            <span className=\"mx_IconizedContextMenu_label\">{label}</span>\n            {marker}\n        </MenuItemCheckbox>\n    );\n};\n\nexport const IconizedContextMenuOption: React.FC<IOptionProps> = ({\n    label,\n    className,\n    icon,\n    children,\n    isDestructive,\n    ...props\n}) => {\n    return (\n        <MenuItem\n            element=\"li\"\n            {...props}\n            className={classNames(className, {\n                mx_IconizedContextMenu_item: true,\n                mx_IconizedContextMenu_itemDestructive: isDestructive,\n            })}\n            label={label}\n        >\n            {icon}\n            <span className=\"mx_IconizedContextMenu_label\">{label}</span>\n            {children}\n        </MenuItem>\n    );\n};\n\nexport const IconizedContextMenuOptionList: React.FC<IOptionListProps> = ({\n    first,\n    red,\n    className,\n    label,\n    children,\n}) => {\n    const classes = classNames(\"mx_IconizedContextMenu_optionList\", className, {\n        mx_IconizedContextMenu_optionList_notFirst: !first,\n        mx_IconizedContextMenu_optionList_red: red,\n    });\n\n    return (\n        <div className={classes}>\n            {label && (\n                <div>\n                    <span className=\"mx_IconizedContextMenu_optionList_label\">{label}</span>\n                </div>\n            )}\n            {children}\n        </div>\n    );\n};\n\nconst IconizedContextMenu: React.FC<React.PropsWithChildren<IProps>> = ({ className, children, compact, ...props }) => {\n    const classes = classNames(\"mx_IconizedContextMenu\", className, {\n        mx_IconizedContextMenu_compact: compact,\n    });\n\n    return (\n        <ContextMenu chevronFace={ChevronFace.None} {...props}>\n            <ul role=\"none\" className={classes}>\n                {children}\n            </ul>\n        </ContextMenu>\n    );\n};\n\nexport default IconizedContextMenu;\n","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ReplyIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M9.405 5.708c.39-.39.39-1.025 0-1.416a.996.996 0 0 0-1.412 0L3.294 9.006a1.004 1.004 0 0 0 0 1.416l4.699 4.714a.996.996 0 0 0 1.412 0c.39-.39.39-1.025 0-1.416l-3.043-3.053h9.153c1.887 0 3.485 1.604 3.485 3.666C19 16.396 17.402 18 15.515 18h-2.093a1 1 0 1 0 0 2h2.093C18.58 20 21 17.425 21 14.333s-2.419-5.666-5.485-5.666H6.456z\"\n    })\n  });\n}\n;\nReplyIcon.displayName = \"ReplyIcon\";\nexport default forwardRef(ReplyIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction ReactionAddIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M14.74 2.38C13.87 2.133 12.95 2 12 2 6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10c0-.95-.133-1.87-.38-2.74a5 5 0 0 1-1.886.687 8 8 0 1 1-5.68-5.68c.1-.684.339-1.323.687-1.887\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M15.536 14.121a1 1 0 0 1 0 1.415A5 5 0 0 1 12 17c-1.38 0-2.632-.56-3.535-1.464a1 1 0 1 1 1.414-1.415A3 3 0 0 0 12 15c.829 0 1.577-.335 2.121-.879a1 1 0 0 1 1.415 0M8.5 12a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3m8.5-1.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0M18 6h-1a.97.97 0 0 1-.712-.287A.97.97 0 0 1 16 5q0-.424.288-.713A.97.97 0 0 1 17 4h1V3q0-.424.288-.712A.97.97 0 0 1 19 2q.424 0 .712.288Q20 2.575 20 3v1h1q.424 0 .712.287Q22 4.576 22 5t-.288.713A.97.97 0 0 1 21 6h-1v1q0 .424-.288.713A.97.97 0 0 1 19 8a.97.97 0 0 1-.712-.287A.97.97 0 0 1 18 7z\"\n    })]\n  });\n}\n;\nReactionAddIcon.displayName = \"ReactionAddIcon\";\nexport default forwardRef(ReactionAddIcon);","/*\nCopyright 2022 - 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport {\n    type ExtensibleEventType,\n    type IPartialEvent,\n    isEventTypeSame,\n    M_TEXT,\n    REFERENCE_RELATION,\n} from \"../@types/extensible_events.ts\";\nimport { M_POLL_END, type PollEndEventContent } from \"../@types/polls.ts\";\nimport { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\nimport { MessageEvent } from \"./MessageEvent.ts\";\n\n/**\n * Represents a poll end/closure event.\n */\nexport class PollEndEvent extends ExtensibleEvent<PollEndEventContent> {\n    /**\n     * The poll start event ID referenced by the response.\n     */\n    public readonly pollEventId: string;\n\n    /**\n     * The closing message for the event.\n     */\n    public readonly closingMessage: MessageEvent;\n\n    /**\n     * Creates a new PollEndEvent from a pure format. Note that the event is *not*\n     * parsed here: it will be treated as a literal m.poll.response primary typed event.\n     * @param wireFormat - The event.\n     */\n    public constructor(wireFormat: IPartialEvent<PollEndEventContent>) {\n        super(wireFormat);\n\n        const rel = this.wireContent[\"m.relates_to\"];\n        if (!REFERENCE_RELATION.matches(rel?.rel_type) || typeof rel?.event_id !== \"string\") {\n            throw new InvalidEventError(\"Relationship must be a reference to an event\");\n        }\n\n        this.pollEventId = rel.event_id;\n        this.closingMessage = new MessageEvent(this.wireFormat);\n    }\n\n    public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n        return isEventTypeSame(primaryEventType, M_POLL_END);\n    }\n\n    public serialize(): IPartialEvent<object> {\n        return {\n            type: M_POLL_END.name,\n            content: {\n                \"m.relates_to\": {\n                    rel_type: REFERENCE_RELATION.name,\n                    event_id: this.pollEventId,\n                },\n                [M_POLL_END.name]: {},\n                ...this.closingMessage.serialize().content,\n            },\n        };\n    }\n\n    /**\n     * Creates a new PollEndEvent from a poll event ID.\n     * @param pollEventId - The poll start event ID.\n     * @param message - A closing message, typically revealing the top answer.\n     * @returns The representative poll closure event.\n     */\n    public static from(pollEventId: string, message: string): PollEndEvent {\n        return new PollEndEvent({\n            type: M_POLL_END.name,\n            content: {\n                \"m.relates_to\": {\n                    rel_type: REFERENCE_RELATION.name,\n                    event_id: pollEventId,\n                },\n                [M_POLL_END.name]: {},\n                [M_TEXT.name]: message,\n            },\n        });\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type MatrixEvent, type MatrixClient, type TimelineEvents } from \"matrix-js-sdk/src/matrix\";\nimport { PollEndEvent } from \"matrix-js-sdk/src/extensible_events_v1/PollEndEvent\";\n\nimport { _t } from \"../../../languageHandler\";\nimport QuestionDialog from \"./QuestionDialog\";\nimport { findTopAnswer } from \"../messages/MPollBody\";\nimport Modal from \"../../../Modal\";\nimport ErrorDialog from \"./ErrorDialog\";\n\ninterface IProps {\n    matrixClient: MatrixClient;\n    event: MatrixEvent;\n    onFinished: (success?: boolean) => void;\n}\n\nexport default class EndPollDialog extends React.Component<IProps> {\n    private onFinished = async (endPoll: boolean): Promise<void> => {\n        if (endPoll) {\n            const room = this.props.matrixClient.getRoom(this.props.event.getRoomId());\n            const poll = room?.polls.get(this.props.event.getId()!);\n\n            if (!poll) {\n                throw new Error(\"No poll instance found in room.\");\n            }\n\n            try {\n                const responses = await poll.getResponses();\n                const topAnswer = findTopAnswer(this.props.event, responses);\n\n                const message =\n                    topAnswer === \"\" ? _t(\"poll|end_message_no_votes\") : _t(\"poll|end_message\", { topAnswer });\n\n                const endEvent = PollEndEvent.from(this.props.event.getId()!, message).serialize();\n\n                await this.props.matrixClient.sendEvent(\n                    this.props.event.getRoomId()!,\n                    endEvent.type as keyof TimelineEvents,\n                    endEvent.content as TimelineEvents[keyof TimelineEvents],\n                );\n            } catch (e) {\n                console.error(\"Failed to submit poll response event:\", e);\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"poll|error_ending_title\"),\n                    description: _t(\"poll|error_ending_description\"),\n                });\n            }\n        }\n        this.props.onFinished(endPoll);\n    };\n\n    public render(): React.ReactNode {\n        return (\n            <QuestionDialog\n                title={_t(\"poll|end_title\")}\n                description={_t(\"poll|end_description\")}\n                button={_t(\"poll|end_title\")}\n                onFinished={(endPoll: boolean) => this.onFinished(endPoll)}\n            />\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015-2023 The Matrix.org Foundation C.I.C.\nCopyright 2021, 2022 Šimon Brandner <simon.bra.ag@gmail.com>\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, createRef, useContext } from \"react\";\nimport {\n    EventStatus,\n    type MatrixEvent,\n    MatrixEventEvent,\n    RoomMemberEvent,\n    EventType,\n    RelationType,\n    type Relations,\n    Thread,\n    M_POLL_START,\n} from \"matrix-js-sdk/src/matrix\";\nimport {\n    CheckIcon,\n    ChevronUpIcon,\n    EditIcon,\n    ErrorSolidIcon,\n    InlineCodeIcon,\n    LinkIcon,\n    PinIcon,\n    QuoteIcon,\n    ReactionAddIcon,\n    ReplyIcon,\n    RestartIcon,\n    ThreadsIcon,\n    UnpinIcon,\n    DeleteIcon,\n    ForwardIcon,\n    PopOutIcon,\n    VisibilityOnIcon,\n    ShareIcon,\n    CopyIcon,\n    TreeIcon,\n} from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport dis from \"../../../dispatcher/dispatcher\";\nimport { _t } from \"../../../languageHandler\";\nimport Modal from \"../../../Modal\";\nimport Resend from \"../../../Resend\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { isUrlPermitted } from \"../../../HtmlUtils\";\nimport { canEditContent, editEvent, isContentActionable } from \"../../../utils/EventUtils\";\nimport IconizedContextMenu, { IconizedContextMenuOption, IconizedContextMenuOptionList } from \"./IconizedContextMenu\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport { type RoomPermalinkCreator } from \"../../../utils/permalinks/Permalinks\";\nimport { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport { copyPlaintext, getSelectedText } from \"../../../utils/strings\";\nimport ContextMenu, { toRightOf, type MenuProps } from \"../../structures/ContextMenu\";\nimport ReactionPicker from \"../emojipicker/ReactionPicker\";\nimport ViewSource from \"../../structures/ViewSource\";\nimport { createRedactEventDialog } from \"../dialogs/ConfirmRedactDialog\";\nimport { ShareDialog } from \"../dialogs/ShareDialog\";\nimport RoomContext, { TimelineRenderingType } from \"../../../contexts/RoomContext\";\nimport EndPollDialog from \"../dialogs/EndPollDialog\";\nimport { isPollEnded } from \"../messages/MPollBody\";\nimport { type ViewRoomPayload } from \"../../../dispatcher/payloads/ViewRoomPayload\";\nimport { type GetRelationsForEvent, type IEventTileOps } from \"../rooms/EventTile\";\nimport { type OpenForwardDialogPayload } from \"../../../dispatcher/payloads/OpenForwardDialogPayload\";\nimport { type OpenReportEventDialogPayload } from \"../../../dispatcher/payloads/OpenReportEventDialogPayload\";\nimport { createMapSiteLinkFromEvent } from \"../../../utils/location\";\nimport { getForwardableEvent } from \"../../../events/forward/getForwardableEvent\";\nimport { getShareableLocationEvent } from \"../../../events/location/getShareableLocationEvent\";\nimport { type ShowThreadPayload } from \"../../../dispatcher/payloads/ShowThreadPayload\";\nimport { CardContext } from \"../right_panel/context\";\nimport PinningUtils from \"../../../utils/PinningUtils\";\nimport PosthogTrackers from \"../../../PosthogTrackers.ts\";\n\ninterface IReplyInThreadButton {\n    mxEvent: MatrixEvent;\n    closeMenu: () => void;\n}\n\nconst ReplyInThreadButton: React.FC<IReplyInThreadButton> = ({ mxEvent, closeMenu }) => {\n    const context = useContext(CardContext);\n    const relationType = mxEvent?.getRelation()?.rel_type;\n\n    // Can't create a thread from an event with an existing relation\n    if (Boolean(relationType) && relationType !== RelationType.Thread) return null;\n\n    const onClick = (): void => {\n        if (mxEvent.getThread() && !mxEvent.isThreadRoot) {\n            dis.dispatch<ShowThreadPayload>({\n                action: Action.ShowThread,\n                rootEvent: mxEvent.getThread()!.rootEvent!,\n                initialEvent: mxEvent,\n                scroll_into_view: true,\n                highlighted: true,\n                push: context.isCard,\n            });\n        } else {\n            dis.dispatch<ShowThreadPayload>({\n                action: Action.ShowThread,\n                rootEvent: mxEvent,\n                push: context.isCard,\n            });\n        }\n        closeMenu();\n    };\n\n    return <IconizedContextMenuOption icon={<ThreadsIcon />} label={_t(\"action|reply_in_thread\")} onClick={onClick} />;\n};\n\ninterface IProps extends MenuProps {\n    /* the MatrixEvent associated with the context menu */\n    mxEvent: MatrixEvent;\n    // An optional EventTileOps implementation that can be used to unhide preview widgets\n    eventTileOps?: IEventTileOps;\n    // Callback called when the menu is dismissed\n    permalinkCreator?: RoomPermalinkCreator;\n    /* an optional function to be called when the user clicks collapse thread, if not provided hide button */\n    collapseReplyChain?(): void;\n    /* callback called when the menu is dismissed */\n    onFinished(): void;\n    // If the menu is inside a dialog, we sometimes need to close that dialog after click (forwarding)\n    onCloseDialog?(): void;\n    // True if the menu is being used as a right click menu\n    rightClick?: boolean;\n    // The Relations model from the JS SDK for reactions to `mxEvent`\n    reactions?: Relations | null;\n    // A permalink to this event or an href of an anchor element the user has clicked\n    link?: string;\n\n    getRelationsForEvent?: GetRelationsForEvent;\n}\n\ninterface IState {\n    canRedact: boolean;\n    canPin: boolean;\n    reactionPickerDisplayed: boolean;\n}\n\nexport default class MessageContextMenu extends React.Component<IProps, IState> {\n    public static contextType = RoomContext;\n    declare public context: React.ContextType<typeof RoomContext>;\n\n    private reactButtonRef = createRef<any>(); // XXX Ref to a functional component\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            canRedact: false,\n            canPin: false,\n            reactionPickerDisplayed: false,\n        };\n    }\n\n    public componentDidMount(): void {\n        MatrixClientPeg.safeGet().on(RoomMemberEvent.PowerLevel, this.checkPermissions);\n\n        // re-check the permissions on send progress (`maySendRedactionForEvent` only returns true for events that have\n        // been fully sent and echoed back, and we want to ensure the \"Remove\" option is added once that happens.)\n        this.props.mxEvent.on(MatrixEventEvent.Status, this.checkPermissions);\n\n        this.checkPermissions();\n    }\n\n    public componentWillUnmount(): void {\n        const cli = MatrixClientPeg.get();\n        if (cli) {\n            cli.removeListener(RoomMemberEvent.PowerLevel, this.checkPermissions);\n        }\n        this.props.mxEvent.removeListener(MatrixEventEvent.Status, this.checkPermissions);\n    }\n\n    private checkPermissions = (): void => {\n        const cli = MatrixClientPeg.safeGet();\n        const room = cli.getRoom(this.props.mxEvent.getRoomId());\n\n        // We explicitly decline to show the redact option on ACL events as it has a potential\n        // to obliterate the room - https://github.com/matrix-org/synapse/issues/4042\n        // Similarly for encryption events, since redacting them \"breaks everything\"\n        const canRedact =\n            !!room?.currentState.maySendRedactionForEvent(this.props.mxEvent, cli.getSafeUserId()) &&\n            this.props.mxEvent.getType() !== EventType.RoomServerAcl &&\n            this.props.mxEvent.getType() !== EventType.RoomEncryption;\n\n        const canPin = PinningUtils.canPin(cli, this.props.mxEvent) || PinningUtils.canUnpin(cli, this.props.mxEvent);\n\n        this.setState({ canRedact, canPin });\n    };\n\n    private canEndPoll(mxEvent: MatrixEvent): boolean {\n        return (\n            M_POLL_START.matches(mxEvent.getType()) &&\n            this.state.canRedact &&\n            !isPollEnded(mxEvent, MatrixClientPeg.safeGet())\n        );\n    }\n\n    /**\n     * Returns true if the current selection is entirely within a single \"mx_MTextBody\" element.\n     */\n    private isSelectionWithinSingleTextBody(): boolean {\n        const selection = window.getSelection();\n        if (!selection || selection.rangeCount === 0) return false;\n        const range = selection.getRangeAt(0);\n\n        function getParentByClass(node: Node | null, className: string): HTMLElement | null {\n            while (node) {\n                if (node instanceof HTMLElement && node.classList.contains(className)) {\n                    return node;\n                }\n                node = node.parentNode;\n            }\n            return null;\n        }\n\n        const startTextBody = getParentByClass(range.startContainer, \"mx_MTextBody\");\n        const endTextBody = getParentByClass(range.endContainer, \"mx_MTextBody\");\n\n        return !!startTextBody && startTextBody === endTextBody;\n    }\n\n    private onResendReactionsClick = (): void => {\n        for (const reaction of this.getUnsentReactions()) {\n            Resend.resend(MatrixClientPeg.safeGet(), reaction);\n        }\n        this.closeMenu();\n    };\n\n    private onJumpToRelatedEventClick = (relatedEventId: string): void => {\n        dis.dispatch({\n            action: \"view_room\",\n            room_id: this.props.mxEvent.getRoomId(),\n            event_id: relatedEventId,\n            highlighted: true,\n        });\n    };\n\n    private onReportEventClick = (): void => {\n        dis.dispatch<OpenReportEventDialogPayload>({\n            action: Action.OpenReportEventDialog,\n            event: this.props.mxEvent,\n        });\n        this.closeMenu();\n    };\n\n    private onViewSourceClick = (): void => {\n        Modal.createDialog(\n            ViewSource,\n            {\n                mxEvent: this.props.mxEvent,\n            },\n            \"mx_Dialog_viewsource\",\n        );\n        this.closeMenu();\n    };\n\n    private onRedactClick = (): void => {\n        const { mxEvent, onCloseDialog } = this.props;\n        createRedactEventDialog({\n            mxEvent,\n            onCloseDialog,\n        });\n        this.closeMenu();\n    };\n\n    private onForwardClick = (forwardableEvent: MatrixEvent) => (): void => {\n        dis.dispatch<OpenForwardDialogPayload>({\n            action: Action.OpenForwardDialog,\n            event: forwardableEvent,\n            permalinkCreator: this.props.permalinkCreator ?? null,\n        });\n        this.closeMenu();\n    };\n\n    private onPinClick = (isPinned: boolean): void => {\n        // Pin or unpin in background\n        PinningUtils.pinOrUnpinEvent(MatrixClientPeg.safeGet(), this.props.mxEvent);\n        PosthogTrackers.trackPinUnpinMessage(isPinned ? \"Pin\" : \"Unpin\", \"Timeline\");\n\n        this.closeMenu();\n    };\n\n    private closeMenu = (): void => {\n        this.props.onFinished();\n    };\n\n    private onUnhidePreviewClick = (): void => {\n        this.props.eventTileOps?.unhideWidget();\n        this.closeMenu();\n    };\n\n    private onShareClick = (e: ButtonEvent): void => {\n        e.preventDefault();\n        Modal.createDialog(ShareDialog, {\n            target: this.props.mxEvent,\n            permalinkCreator: this.props.permalinkCreator,\n        });\n        this.closeMenu();\n    };\n\n    private onCopyLinkClick = (e: ButtonEvent): void => {\n        e.preventDefault(); // So that we don't open the permalink\n        if (!this.props.link) return;\n        copyPlaintext(this.props.link);\n        this.closeMenu();\n    };\n\n    private onCollapseReplyChainClick = (): void => {\n        this.props.collapseReplyChain?.();\n        this.closeMenu();\n    };\n\n    private onCopyClick = (): void => {\n        copyPlaintext(getSelectedText());\n        this.closeMenu();\n    };\n\n    private onQuoteClick = (): void => {\n        const selectedText = getSelectedText();\n        if (selectedText) {\n            // Format as markdown quote\n            const quotedText = selectedText\n                .trim()\n                .split(/\\r?\\n/)\n                .map((line) => `> ${line}`)\n                .join(\"\\n\");\n            dis.dispatch({\n                action: Action.ComposerInsert,\n                text: \"\\n\" + quotedText + \"\\n\\n \",\n                timelineRenderingType: this.context.timelineRenderingType,\n            });\n        }\n        this.closeMenu();\n    };\n\n    private onEditClick = (): void => {\n        editEvent(\n            MatrixClientPeg.safeGet(),\n            this.props.mxEvent,\n            this.context.timelineRenderingType,\n            this.props.getRelationsForEvent,\n        );\n        this.closeMenu();\n    };\n\n    private onReplyClick = (): void => {\n        dis.dispatch({\n            action: \"reply_to_event\",\n            event: this.props.mxEvent,\n            context: this.context.timelineRenderingType,\n        });\n        this.closeMenu();\n    };\n\n    private onReactClick = (): void => {\n        this.setState({ reactionPickerDisplayed: true });\n    };\n\n    private onCloseReactionPicker = (): void => {\n        this.setState({ reactionPickerDisplayed: false });\n        this.closeMenu();\n    };\n\n    private onEndPollClick = (): void => {\n        const matrixClient = MatrixClientPeg.safeGet();\n        Modal.createDialog(\n            EndPollDialog,\n            {\n                matrixClient,\n                event: this.props.mxEvent,\n            },\n            \"mx_Dialog_endPoll\",\n        );\n        this.closeMenu();\n    };\n\n    private getReactions(filter: (e: MatrixEvent) => boolean): MatrixEvent[] {\n        const cli = MatrixClientPeg.safeGet();\n        const room = cli.getRoom(this.props.mxEvent.getRoomId());\n        const eventId = this.props.mxEvent.getId();\n        return (\n            room?.getPendingEvents().filter((e) => {\n                const relation = e.getRelation();\n                return relation?.rel_type === RelationType.Annotation && relation.event_id === eventId && filter(e);\n            }) ?? []\n        );\n    }\n\n    private getUnsentReactions(): MatrixEvent[] {\n        return this.getReactions((e) => e.status === EventStatus.NOT_SENT);\n    }\n\n    private viewInRoom = (): void => {\n        dis.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            event_id: this.props.mxEvent.getId(),\n            highlighted: true,\n            room_id: this.props.mxEvent.getRoomId(),\n            metricsTrigger: undefined, // room doesn't change\n        });\n        this.closeMenu();\n    };\n\n    public render(): React.ReactNode {\n        const cli = MatrixClientPeg.safeGet();\n        const me = cli.getUserId();\n        const { mxEvent, rightClick, link, eventTileOps, reactions, collapseReplyChain, ...other } = this.props;\n        delete other.getRelationsForEvent;\n        delete other.permalinkCreator;\n\n        const eventStatus = mxEvent.status;\n        const unsentReactionsCount = this.getUnsentReactions().length;\n        const contentActionable = isContentActionable(mxEvent);\n        const permalink = this.props.permalinkCreator?.forEvent(this.props.mxEvent.getId()!);\n        // status is SENT before remote-echo, null after\n        const isSent = !eventStatus || eventStatus === EventStatus.SENT;\n        const { timelineRenderingType, canReact, canSendMessages } = this.context;\n        const isThread =\n            timelineRenderingType === TimelineRenderingType.Thread ||\n            timelineRenderingType === TimelineRenderingType.ThreadsList;\n        const isThreadRootEvent = isThread && mxEvent?.getThread()?.rootEvent === mxEvent;\n\n        let resendReactionsButton: JSX.Element | undefined;\n        if (!mxEvent.isRedacted() && unsentReactionsCount !== 0) {\n            resendReactionsButton = (\n                <IconizedContextMenuOption\n                    icon={<RestartIcon />}\n                    label={_t(\"timeline|context_menu|resent_unsent_reactions\", { unsentCount: unsentReactionsCount })}\n                    onClick={this.onResendReactionsClick}\n                />\n            );\n        }\n\n        let redactButton: JSX.Element | undefined;\n        if (isSent && this.state.canRedact) {\n            redactButton = (\n                <IconizedContextMenuOption\n                    icon={<DeleteIcon />}\n                    label={_t(\"action|remove\")}\n                    onClick={this.onRedactClick}\n                />\n            );\n        }\n\n        let openInMapSiteButton: JSX.Element | undefined;\n        const shareableLocationEvent = getShareableLocationEvent(mxEvent, cli);\n        if (shareableLocationEvent) {\n            const mapSiteLink = createMapSiteLinkFromEvent(shareableLocationEvent);\n            openInMapSiteButton = (\n                <IconizedContextMenuOption\n                    icon={<PopOutIcon />}\n                    onClick={null}\n                    label={_t(\"timeline|context_menu|open_in_osm\")}\n                    element=\"a\"\n                    {...{\n                        href: mapSiteLink,\n                        target: \"_blank\",\n                        rel: \"noreferrer noopener\",\n                    }}\n                />\n            );\n        }\n\n        let forwardButton: JSX.Element | undefined;\n        const forwardableEvent = getForwardableEvent(mxEvent, cli);\n        if (contentActionable && forwardableEvent) {\n            forwardButton = (\n                <IconizedContextMenuOption\n                    icon={<ForwardIcon />}\n                    label={_t(\"action|forward\")}\n                    onClick={this.onForwardClick(forwardableEvent)}\n                />\n            );\n        }\n\n        // This is specifically not behind the developerMode flag to give people insight into the Matrix\n        const viewSourceButton = (\n            <IconizedContextMenuOption\n                icon={<InlineCodeIcon />}\n                label={_t(\"timeline|context_menu|view_source\")}\n                onClick={this.onViewSourceClick}\n            />\n        );\n\n        let unhidePreviewButton: JSX.Element | undefined;\n        if (eventTileOps?.isWidgetHidden()) {\n            unhidePreviewButton = (\n                <IconizedContextMenuOption\n                    icon={<VisibilityOnIcon />}\n                    label={_t(\"timeline|context_menu|show_url_preview\")}\n                    onClick={this.onUnhidePreviewClick}\n                />\n            );\n        }\n\n        let permalinkButton: JSX.Element | undefined;\n        if (permalink) {\n            permalinkButton = (\n                <IconizedContextMenuOption\n                    icon={<ShareIcon />}\n                    onClick={this.onShareClick}\n                    label={_t(\"action|share\")}\n                    element=\"a\"\n                    {\n                        // XXX: Typescript signature for AccessibleButton doesn't work properly for non-inputs like `a`\n                        ...{\n                            href: permalink,\n                            target: \"_blank\",\n                            rel: \"noreferrer noopener\",\n                        }\n                    }\n                />\n            );\n        }\n\n        let endPollButton: JSX.Element | undefined;\n        if (this.canEndPoll(mxEvent)) {\n            endPollButton = (\n                <IconizedContextMenuOption\n                    icon={<CheckIcon />}\n                    label={_t(\"poll|end_title\")}\n                    onClick={this.onEndPollClick}\n                />\n            );\n        }\n\n        // Bridges can provide a 'external_url' to link back to the source.\n        let externalURLButton: JSX.Element | undefined;\n        if (\n            typeof mxEvent.getContent().external_url === \"string\" &&\n            isUrlPermitted(mxEvent.getContent().external_url)\n        ) {\n            externalURLButton = (\n                <IconizedContextMenuOption\n                    icon={<LinkIcon />}\n                    onClick={this.closeMenu}\n                    label={_t(\"timeline|context_menu|external_url\")}\n                    element=\"a\"\n                    {\n                        // XXX: Typescript signature for AccessibleButton doesn't work properly for non-inputs like `a`\n                        ...{\n                            target: \"_blank\",\n                            rel: \"noreferrer noopener\",\n                            href: mxEvent.getContent().external_url,\n                        }\n                    }\n                />\n            );\n        }\n\n        let collapseReplyChainButton: JSX.Element | undefined;\n        if (collapseReplyChain) {\n            collapseReplyChainButton = (\n                <IconizedContextMenuOption\n                    icon={<ChevronUpIcon />}\n                    label={_t(\"timeline|context_menu|collapse_reply_thread\")}\n                    onClick={this.onCollapseReplyChainClick}\n                />\n            );\n        }\n\n        let jumpToRelatedEventButton: JSX.Element | undefined;\n        const relatedEventId = mxEvent.getAssociatedId();\n        if (relatedEventId && SettingsStore.getValue(\"developerMode\")) {\n            jumpToRelatedEventButton = (\n                <IconizedContextMenuOption\n                    icon={<TreeIcon />}\n                    label={_t(\"timeline|context_menu|view_related_event\")}\n                    onClick={() => this.onJumpToRelatedEventClick(relatedEventId)}\n                />\n            );\n        }\n\n        let reportEventButton: JSX.Element | undefined;\n        if (mxEvent.getSender() !== me) {\n            reportEventButton = (\n                <IconizedContextMenuOption\n                    icon={<ErrorSolidIcon />}\n                    label={_t(\"timeline|context_menu|report\")}\n                    onClick={this.onReportEventClick}\n                />\n            );\n        }\n\n        let copyLinkButton: JSX.Element | undefined;\n        if (link) {\n            copyLinkButton = (\n                <IconizedContextMenuOption\n                    icon={<CopyIcon />}\n                    onClick={this.onCopyLinkClick}\n                    label={_t(\"action|copy_link\")}\n                    element=\"a\"\n                    {\n                        // XXX: Typescript signature for AccessibleButton doesn't work properly for non-inputs like `a`\n                        ...{\n                            href: link,\n                            target: \"_blank\",\n                            rel: \"noreferrer noopener\",\n                        }\n                    }\n                />\n            );\n        }\n\n        const selectedText = getSelectedText();\n\n        let copyButton: JSX.Element | undefined;\n        if (rightClick && selectedText) {\n            copyButton = (\n                <IconizedContextMenuOption\n                    icon={<CopyIcon />}\n                    label={_t(\"action|copy\")}\n                    triggerOnMouseDown={true} // We use onMouseDown so that the selection isn't cleared when we click\n                    onClick={this.onCopyClick}\n                />\n            );\n        }\n\n        let quoteButton: JSX.Element | undefined;\n        if (rightClick && selectedText && selectedText.trim().length > 0 && this.isSelectionWithinSingleTextBody()) {\n            quoteButton = (\n                <IconizedContextMenuOption\n                    icon={<QuoteIcon />}\n                    label={_t(\"action|quote\")}\n                    triggerOnMouseDown={true}\n                    onClick={this.onQuoteClick}\n                />\n            );\n        }\n\n        let editButton: JSX.Element | undefined;\n        if (rightClick && canEditContent(cli, mxEvent)) {\n            editButton = (\n                <IconizedContextMenuOption icon={<EditIcon />} label={_t(\"action|edit\")} onClick={this.onEditClick} />\n            );\n        }\n\n        let replyButton: JSX.Element | undefined;\n        if (rightClick && contentActionable && canSendMessages) {\n            replyButton = (\n                <IconizedContextMenuOption\n                    icon={<ReplyIcon />}\n                    label={_t(\"action|reply\")}\n                    onClick={this.onReplyClick}\n                />\n            );\n        }\n\n        let replyInThreadButton: JSX.Element | undefined;\n        if (\n            rightClick &&\n            contentActionable &&\n            canSendMessages &&\n            Thread.hasServerSideSupport &&\n            timelineRenderingType !== TimelineRenderingType.Thread\n        ) {\n            replyInThreadButton = <ReplyInThreadButton mxEvent={mxEvent} closeMenu={this.closeMenu} />;\n        }\n\n        let reactButton: JSX.Element | undefined;\n        if (rightClick && contentActionable && canReact) {\n            reactButton = (\n                <IconizedContextMenuOption\n                    icon={<ReactionAddIcon />}\n                    label={_t(\"action|react\")}\n                    onClick={this.onReactClick}\n                    inputRef={this.reactButtonRef}\n                />\n            );\n        }\n\n        let pinButton: JSX.Element | undefined;\n        if (rightClick && this.state.canPin) {\n            const isPinned = PinningUtils.isPinned(MatrixClientPeg.safeGet(), this.props.mxEvent);\n            pinButton = (\n                <IconizedContextMenuOption\n                    icon={isPinned ? <UnpinIcon /> : <PinIcon />}\n                    label={isPinned ? _t(\"action|unpin\") : _t(\"action|pin\")}\n                    onClick={() => this.onPinClick(isPinned)}\n                />\n            );\n        }\n\n        let viewInRoomButton: JSX.Element | undefined;\n        if (isThreadRootEvent) {\n            viewInRoomButton = (\n                <IconizedContextMenuOption\n                    icon={<VisibilityOnIcon />}\n                    label={_t(\"timeline|mab|view_in_room\")}\n                    onClick={this.viewInRoom}\n                />\n            );\n        }\n\n        let nativeItemsList: JSX.Element | undefined;\n        if (copyButton || quoteButton || copyLinkButton) {\n            nativeItemsList = (\n                <IconizedContextMenuOptionList>\n                    {copyButton}\n                    {quoteButton}\n                    {copyLinkButton}\n                </IconizedContextMenuOptionList>\n            );\n        }\n\n        let quickItemsList: JSX.Element | undefined;\n        if (editButton || replyButton || reactButton || pinButton) {\n            quickItemsList = (\n                <IconizedContextMenuOptionList>\n                    {reactButton}\n                    {replyButton}\n                    {replyInThreadButton}\n                    {editButton}\n                    {pinButton}\n                </IconizedContextMenuOptionList>\n            );\n        }\n\n        const commonItemsList = (\n            <IconizedContextMenuOptionList>\n                {viewInRoomButton}\n                {openInMapSiteButton}\n                {endPollButton}\n                {forwardButton}\n                {permalinkButton}\n                {reportEventButton}\n                {externalURLButton}\n                {jumpToRelatedEventButton}\n                {unhidePreviewButton}\n                {viewSourceButton}\n                {resendReactionsButton}\n                {collapseReplyChainButton}\n            </IconizedContextMenuOptionList>\n        );\n\n        let redactItemList: JSX.Element | undefined;\n        if (redactButton) {\n            redactItemList = <IconizedContextMenuOptionList red>{redactButton}</IconizedContextMenuOptionList>;\n        }\n\n        let reactionPicker: JSX.Element | undefined;\n        if (this.state.reactionPickerDisplayed) {\n            const buttonRect = (this.reactButtonRef.current as HTMLElement)?.getBoundingClientRect();\n            reactionPicker = (\n                <ContextMenu {...toRightOf(buttonRect)} onFinished={this.closeMenu} managed={false} focusLock>\n                    <ReactionPicker mxEvent={mxEvent} onFinished={this.onCloseReactionPicker} reactions={reactions} />\n                </ContextMenu>\n            );\n        }\n\n        return (\n            <React.Fragment>\n                <IconizedContextMenu\n                    {...other}\n                    className=\"mx_MessageContextMenu\"\n                    compact={true}\n                    data-testid=\"mx_MessageContextMenu\"\n                >\n                    {nativeItemsList}\n                    {quickItemsList}\n                    {commonItemsList}\n                    {redactItemList}\n                </IconizedContextMenu>\n                {reactionPicker}\n            </React.Fragment>\n        );\n    }\n}\n","/*\nCopyright 2024,2025 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactElement, type ReactNode, useContext, useId, useMemo, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { type Room, EventType } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\nimport { sleep } from \"matrix-js-sdk/src/utils\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { CheckIcon, ErrorIcon, RestartIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\nimport { AutoHideScrollbar } from \"@element-hq/web-shared-components\";\n\nimport { _t, _td } from \"../../../languageHandler\";\nimport BaseDialog from \"./BaseDialog\";\nimport Dropdown from \"../elements/Dropdown\";\nimport SearchBox from \"../../structures/SearchBox\";\nimport RoomAvatar from \"../avatars/RoomAvatar\";\nimport { getDisplayAliasForRoom } from \"../../../Rooms\";\nimport AccessibleButton, { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport DMRoomMap from \"../../../utils/DMRoomMap\";\nimport { calculateRoomVia } from \"../../../utils/permalinks/Permalinks\";\nimport StyledCheckbox from \"../elements/StyledCheckbox\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { sortRoomsByRecency } from \"../../../utils/room/sortRoomsByRecency\";\nimport ProgressBar from \"../elements/ProgressBar\";\nimport DecoratedRoomAvatar from \"../avatars/DecoratedRoomAvatar\";\nimport QueryMatcher from \"../../../autocomplete/QueryMatcher\";\nimport LazyRenderList from \"../elements/LazyRenderList\";\nimport { useSettingValue } from \"../../../hooks/useSettings\";\nimport { filterBoolean } from \"../../../utils/arrays\";\nimport { type NonEmptyArray } from \"../../../@types/common\";\nimport { SDKContextClass } from \"../../../contexts/SDKContextClass.ts\";\n\n// These values match CSS\nconst ROW_HEIGHT = 32 + 12;\nconst HEADER_HEIGHT = 15;\nconst GROUP_MARGIN = 24;\n\ninterface IProps {\n    space: Room;\n    onCreateRoomClick(this: void, ev: ButtonEvent): void;\n    onAddSubspaceClick(this: void): void;\n    onFinished(this: void, added?: boolean): void;\n}\n\nexport const Entry: React.FC<{\n    room: Room;\n    checked: boolean;\n    onChange?(this: void, value: boolean): void;\n}> = ({ room, checked, onChange }) => {\n    const id = useId();\n    return (\n        <li id={id} className=\"mx_AddExistingToSpace_entry\" aria-label={room.name}>\n            {room?.isSpaceRoom() ? (\n                <RoomAvatar room={room} size=\"32px\" />\n            ) : (\n                <DecoratedRoomAvatar room={room} size=\"32px\" />\n            )}\n            <span className=\"mx_AddExistingToSpace_entry_name\">{room.name}</span>\n            <StyledCheckbox\n                aria-labelledby={id}\n                onChange={onChange ? (e) => onChange(e.currentTarget.checked) : undefined}\n                checked={checked}\n                disabled={!onChange}\n            />\n        </li>\n    );\n};\n\ntype OnChangeFn = (checked: boolean, room: Room) => void;\n\ntype Renderer = (\n    rooms: Room[],\n    selectedToAdd: Set<Room>,\n    scrollState: IScrollState,\n    onChange: undefined | OnChangeFn,\n) => ReactNode;\n\ninterface IAddExistingToSpaceProps {\n    space: Room;\n    footerPrompt?: ReactNode;\n    filterPlaceholder: string;\n    emptySelectionButton?: ReactNode;\n    onFinished(this: void, added: boolean): void;\n    roomsRenderer?: Renderer;\n    spacesRenderer?: Renderer;\n    dmsRenderer?: Renderer;\n}\n\ninterface IScrollState {\n    scrollTop: number;\n    height: number;\n}\n\nconst getScrollState = (\n    { scrollTop, height }: IScrollState,\n    numItems: number,\n    ...prevGroupSizes: number[]\n): IScrollState => {\n    let heightBefore = 0;\n    prevGroupSizes.forEach((size) => {\n        heightBefore += GROUP_MARGIN + HEADER_HEIGHT + size * ROW_HEIGHT;\n    });\n\n    const viewportTop = scrollTop;\n    const viewportBottom = viewportTop + height;\n    const listTop = heightBefore + HEADER_HEIGHT;\n    const listBottom = listTop + numItems * ROW_HEIGHT;\n    const top = Math.max(viewportTop, listTop);\n    const bottom = Math.min(viewportBottom, listBottom);\n    // the viewport height and scrollTop passed to the LazyRenderList\n    // is capped at the intersection with the real viewport, so lists\n    // out of view are passed height 0, so they won't render any items.\n    return {\n        scrollTop: Math.max(0, scrollTop - listTop),\n        height: Math.max(0, bottom - top),\n    };\n};\n\nexport const AddExistingToSpace: React.FC<IAddExistingToSpaceProps> = ({\n    space,\n    footerPrompt,\n    emptySelectionButton,\n    filterPlaceholder,\n    roomsRenderer,\n    dmsRenderer,\n    spacesRenderer,\n    onFinished,\n}) => {\n    const cli = useContext(MatrixClientContext);\n    const msc3946ProcessDynamicPredecessor = useSettingValue(\"feature_dynamic_room_predecessors\");\n    const visibleRooms = useMemo(\n        () =>\n            cli\n                ?.getVisibleRooms(msc3946ProcessDynamicPredecessor)\n                .filter((r) => r.getMyMembership() === KnownMembership.Join) ?? [],\n        [cli, msc3946ProcessDynamicPredecessor],\n    );\n\n    const scrollRef = useRef<HTMLDivElement | null>(null);\n    const [scrollState, setScrollState] = useState<IScrollState>({\n        // these are estimates which update as soon as it mounts\n        scrollTop: 0,\n        height: 600,\n    });\n\n    const [selectedToAdd, setSelectedToAdd] = useState(new Set<Room>());\n    const [progress, setProgress] = useState<number | null>(null);\n    const [error, setError] = useState(false);\n    const [query, setQuery] = useState(\"\");\n    const lcQuery = query.toLowerCase().trim();\n\n    const existingSubspacesSet = useMemo(\n        () => new Set(SDKContextClass.instance.spaceStore.getChildSpaces(space.roomId)),\n        [space],\n    );\n    const existingRoomsSet = useMemo(\n        () => new Set(SDKContextClass.instance.spaceStore.getChildRooms(space.roomId)),\n        [space],\n    );\n\n    const [spaces, rooms, dms] = useMemo(() => {\n        let rooms = visibleRooms;\n\n        if (lcQuery) {\n            const matcher = new QueryMatcher<Room>(visibleRooms, {\n                keys: [\"name\"],\n                funcs: [(r) => filterBoolean([r.getCanonicalAlias(), ...r.getAltAliases()])],\n                shouldMatchWordsOnly: false,\n            });\n\n            rooms = matcher.match(lcQuery);\n        }\n\n        const joinRule = space.getJoinRule();\n        return sortRoomsByRecency(rooms, cli.getSafeUserId()).reduce<[spaces: Room[], rooms: Room[], dms: Room[]]>(\n            (arr, room) => {\n                if (room.isSpaceRoom()) {\n                    if (room !== space && !existingSubspacesSet.has(room)) {\n                        arr[0].push(room);\n                    }\n                } else if (!existingRoomsSet.has(room)) {\n                    if (!DMRoomMap.shared().getUserIdForRoomId(room.roomId)) {\n                        arr[1].push(room);\n                    } else if (joinRule !== \"public\") {\n                        // Only show DMs for non-public spaces as they make very little sense in spaces other than \"Just Me\" ones.\n                        arr[2].push(room);\n                    }\n                }\n                return arr;\n            },\n            [[], [], []],\n        );\n    }, [visibleRooms, space, lcQuery, existingRoomsSet, existingSubspacesSet, cli]);\n\n    const addRooms = async (): Promise<void> => {\n        setError(false);\n        setProgress(0);\n\n        let error = false;\n\n        for (const room of selectedToAdd) {\n            const via = calculateRoomVia(room);\n            try {\n                await SDKContextClass.instance.spaceStore\n                    .addRoomToSpace(space, room.roomId, via)\n                    .catch(async (e): Promise<void> => {\n                        if (e.errcode === \"M_LIMIT_EXCEEDED\") {\n                            await sleep(e.data.retry_after_ms);\n                            await SDKContextClass.instance.spaceStore.addRoomToSpace(space, room.roomId, via); // retry\n                            return;\n                        }\n\n                        throw e;\n                    });\n                setProgress((i) => (i ?? 0) + 1);\n            } catch (e) {\n                logger.error(\"Failed to add rooms to space\", e);\n                error = true;\n                break;\n            }\n        }\n\n        if (!error) {\n            onFinished(true);\n        } else {\n            setError(error);\n        }\n    };\n\n    const busy = progress !== null;\n\n    let footer;\n    if (error) {\n        footer = (\n            <>\n                <ErrorIcon height=\"24px\" width=\"24px\" />\n\n                <span className=\"mx_AddExistingToSpaceDialog_error\">\n                    <div className=\"mx_AddExistingToSpaceDialog_errorHeading\">\n                        {_t(\"space|add_existing_room_space|error_heading\")}\n                    </div>\n                    <div className=\"mx_AddExistingToSpaceDialog_errorCaption\">{_t(\"action|try_again\")}</div>\n                </span>\n\n                <AccessibleButton className=\"mx_AddExistingToSpaceDialog_retryButton\" onClick={addRooms}>\n                    <RestartIcon />\n                    {_t(\"action|retry\")}\n                </AccessibleButton>\n            </>\n        );\n    } else if (busy) {\n        footer = (\n            <span>\n                <ProgressBar value={progress} max={selectedToAdd.size} />\n                <div className=\"mx_AddExistingToSpaceDialog_progressText\">\n                    {_t(\"space|add_existing_room_space|progress_text\", {\n                        count: selectedToAdd.size,\n                        progress,\n                    })}\n                </div>\n            </span>\n        );\n    } else {\n        let button = emptySelectionButton;\n        if (!button || selectedToAdd.size > 0) {\n            button = (\n                <AccessibleButton kind=\"primary\" disabled={selectedToAdd.size < 1} onClick={addRooms}>\n                    {_t(\"action|add\")}\n                </AccessibleButton>\n            );\n        }\n\n        footer = (\n            <>\n                <span>{footerPrompt}</span>\n\n                {button}\n            </>\n        );\n    }\n\n    const onChange =\n        !busy && !error\n            ? (checked: boolean, room: Room) => {\n                  if (checked) {\n                      selectedToAdd.add(room);\n                  } else {\n                      selectedToAdd.delete(room);\n                  }\n                  setSelectedToAdd(new Set(selectedToAdd));\n              }\n            : undefined;\n\n    // only count spaces when alone as they're shown on a separate modal all on their own\n    const numSpaces = spacesRenderer && !dmsRenderer && !roomsRenderer ? spaces.length : 0;\n    const numRooms = roomsRenderer ? rooms.length : 0;\n    const numDms = dmsRenderer ? dms.length : 0;\n\n    let noResults = true;\n    if (numSpaces > 0 || numRooms > 0 || numDms > 0) {\n        noResults = false;\n    }\n\n    const onScroll = (): void => {\n        const body = scrollRef.current;\n        if (!body) return;\n        setScrollState({\n            scrollTop: body.scrollTop,\n            height: body.clientHeight,\n        });\n    };\n\n    const wrappedRef = (body: HTMLDivElement | null): void => {\n        scrollRef.current = body;\n        if (!body) return;\n        setScrollState({\n            scrollTop: body.scrollTop,\n            height: body.clientHeight,\n        });\n    };\n\n    const roomsScrollState = getScrollState(scrollState, numRooms);\n    const spacesScrollState = getScrollState(scrollState, numSpaces, numRooms);\n    const dmsScrollState = getScrollState(scrollState, numDms, numSpaces, numRooms);\n\n    return (\n        <div className=\"mx_AddExistingToSpace\">\n            <SearchBox\n                className=\"mx_textinput_icon mx_textinput_search\"\n                placeholder={filterPlaceholder}\n                onSearch={setQuery}\n                autoFocus={true}\n            />\n            <AutoHideScrollbar\n                className=\"mx_AutoHideScrollbar mx_AddExistingToSpace_content\"\n                onScroll={onScroll}\n                wrappedRef={wrappedRef}\n            >\n                {rooms.length > 0 && roomsRenderer\n                    ? roomsRenderer(rooms, selectedToAdd, roomsScrollState, onChange)\n                    : undefined}\n\n                {spaces.length > 0 && spacesRenderer\n                    ? spacesRenderer(spaces, selectedToAdd, spacesScrollState, onChange)\n                    : null}\n\n                {dms.length > 0 && dmsRenderer ? dmsRenderer(dms, selectedToAdd, dmsScrollState, onChange) : null}\n\n                {noResults ? (\n                    <span className=\"mx_AddExistingToSpace_noResults\">{_t(\"common|no_results\")}</span>\n                ) : undefined}\n            </AutoHideScrollbar>\n\n            <div className=\"mx_AddExistingToSpace_footer\">{footer}</div>\n        </div>\n    );\n};\n\nconst defaultRendererFactory =\n    (title: TranslationKey): Renderer =>\n    (rooms, selectedToAdd, { scrollTop, height }, onChange) => (\n        <div className=\"mx_AddExistingToSpace_section\">\n            <h3>{_t(title)}</h3>\n            <LazyRenderList\n                element=\"ul\"\n                itemHeight={ROW_HEIGHT}\n                items={rooms}\n                scrollTop={scrollTop}\n                height={height}\n                renderItem={(room) => (\n                    <Entry\n                        key={room.roomId}\n                        room={room}\n                        checked={selectedToAdd.has(room)}\n                        onChange={\n                            onChange\n                                ? (checked: boolean) => {\n                                      onChange(checked, room);\n                                  }\n                                : undefined\n                        }\n                    />\n                )}\n            />\n        </div>\n    );\n\nexport const defaultRoomsRenderer = defaultRendererFactory(_td(\"common|rooms\"));\nexport const defaultSpacesRenderer = defaultRendererFactory(_td(\"common|spaces\"));\nexport const defaultDmsRenderer = defaultRendererFactory(_td(\"space|add_existing_room_space|dm_heading\"));\n\ninterface ISubspaceSelectorProps {\n    title: string;\n    space: Room;\n    value: Room;\n    onChange(this: void, space: Room): void;\n}\n\nexport const SubspaceSelector: React.FC<ISubspaceSelectorProps> = ({ title, space, value, onChange }) => {\n    const options = useMemo(() => {\n        return [\n            space,\n            ...SDKContextClass.instance.spaceStore.getChildSpaces(space.roomId).filter((space) => {\n                return space.currentState.maySendStateEvent(EventType.SpaceChild, space.client.getSafeUserId());\n            }),\n        ];\n    }, [space]);\n\n    let body;\n    if (options.length > 1) {\n        body = (\n            <Dropdown\n                id=\"mx_SpaceSelectDropdown\"\n                className=\"mx_SpaceSelectDropdown\"\n                onOptionChange={(key: string) => {\n                    onChange(options.find((space) => space.roomId === key) || space);\n                }}\n                value={value.roomId}\n                label={_t(\"space|add_existing_room_space|space_dropdown_label\")}\n            >\n                {\n                    options.map((space) => {\n                        const classes = classNames({\n                            mx_SubspaceSelector_dropdownOptionActive: space === value,\n                        });\n                        return (\n                            <div key={space.roomId} className={classes}>\n                                <RoomAvatar room={space} size=\"24px\" />\n                                {space.name || getDisplayAliasForRoom(space) || space.roomId}\n                                {space === value ? <CheckIcon /> : null}\n                            </div>\n                        );\n                    }) as NonEmptyArray<ReactElement & { key: string }>\n                }\n            </Dropdown>\n        );\n    } else {\n        body = (\n            <div className=\"mx_SubspaceSelector_onlySpace\">\n                {space.name || getDisplayAliasForRoom(space) || space.roomId}\n            </div>\n        );\n    }\n\n    return (\n        <div className=\"mx_SubspaceSelector\">\n            <RoomAvatar room={value} size=\"40px\" />\n            <div>\n                <h1>{title}</h1>\n                {body}\n            </div>\n        </div>\n    );\n};\n\nconst AddExistingToSpaceDialog: React.FC<IProps> = ({ space, onCreateRoomClick, onAddSubspaceClick, onFinished }) => {\n    const [selectedSpace, setSelectedSpace] = useState(space);\n\n    return (\n        <BaseDialog\n            title={\n                <SubspaceSelector\n                    title={_t(\"space|add_existing_room_space|space_dropdown_title\")}\n                    space={space}\n                    value={selectedSpace}\n                    onChange={setSelectedSpace}\n                />\n            }\n            className=\"mx_AddExistingToSpaceDialog\"\n            contentId=\"mx_AddExistingToSpace\"\n            onFinished={onFinished}\n            fixedWidth={false}\n        >\n            <MatrixClientContext.Provider value={space.client}>\n                <AddExistingToSpace\n                    space={space}\n                    onFinished={onFinished}\n                    footerPrompt={\n                        <>\n                            <div>{_t(\"space|add_existing_room_space|create\")}</div>\n                            <AccessibleButton\n                                kind=\"link\"\n                                onClick={(ev: ButtonEvent) => {\n                                    onCreateRoomClick(ev);\n                                    onFinished();\n                                }}\n                            >\n                                {_t(\"space|add_existing_room_space|create_prompt\")}\n                            </AccessibleButton>\n                        </>\n                    }\n                    filterPlaceholder={_t(\"space|room_filter_placeholder\")}\n                    roomsRenderer={defaultRoomsRenderer}\n                    spacesRenderer={() => (\n                        <div className=\"mx_AddExistingToSpace_section\">\n                            <h3>{_t(\"common|spaces\")}</h3>\n                            <AccessibleButton\n                                kind=\"link\"\n                                onClick={() => {\n                                    onAddSubspaceClick();\n                                    onFinished();\n                                }}\n                            >\n                                {_t(\"space|add_existing_room_space|subspace_moved_note\")}\n                            </AccessibleButton>\n                        </div>\n                    )}\n                    dmsRenderer={defaultDmsRenderer}\n                />\n            </MatrixClientContext.Provider>\n        </BaseDialog>\n    );\n};\n\nexport default AddExistingToSpaceDialog;\n","/*\nCopyright 2026 Element Creations Ltd.\nCopyright 2024 New Vector Ltd.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2019 The Matrix.org Foundation C.I.C.\nCopyright 2018 New Vector Ltd\nCopyright 2017 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ReactNode } from \"react\";\nimport { Link, Text } from \"@vector-im/compound-web\";\n\nimport SdkConfig from \"../../../SdkConfig\";\nimport Modal from \"../../../Modal\";\nimport { _t } from \"../../../languageHandler\";\nimport sendBugReport, { downloadBugReport, RageshakeError } from \"../../../rageshake/submit-rageshake\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport QuestionDialog from \"./QuestionDialog\";\nimport BaseDialog from \"./BaseDialog\";\nimport Field from \"../elements/Field\";\nimport Spinner from \"../elements/Spinner\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport { sendSentryReport } from \"../../../sentry\";\nimport defaultDispatcher from \"../../../dispatcher/dispatcher\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport { getBrowserSupport } from \"../../../SupportedBrowser\";\nimport { BugReportEndpointURLLocal } from \"../../../IConfigOptions\";\n\nexport interface BugReportDialogProps {\n    onFinished: (success: boolean) => void;\n    initialText?: string;\n    label?: string;\n    error?: unknown;\n}\n\ninterface IState {\n    sendLogs: boolean;\n    busy: boolean;\n    err: ReactNode | null;\n    issueUrl: string;\n    text: string;\n    progress: string | null;\n    downloadBusy: boolean;\n    downloadProgress: string | null;\n}\n\nexport default class BugReportDialog extends React.Component<BugReportDialogProps, IState> {\n    private unmounted: boolean;\n    private issueRef: React.RefObject<Field | null>;\n    private readonly isLocalOnly: boolean;\n\n    public constructor(props: BugReportDialogProps) {\n        super(props);\n\n        this.state = {\n            sendLogs: true,\n            busy: false,\n            err: null,\n            issueUrl: \"\",\n            text: props.initialText || \"\",\n            progress: null,\n            downloadBusy: false,\n            downloadProgress: null,\n        };\n\n        this.unmounted = false;\n        this.issueRef = React.createRef();\n        // This config is static at runtime, but may change during tests.\n        this.isLocalOnly = SdkConfig.get().bug_report_endpoint_url === BugReportEndpointURLLocal;\n    }\n\n    public componentDidMount(): void {\n        this.unmounted = false;\n        this.issueRef.current?.focus();\n\n        // Get all of the extra info dumped to the console when someone is about\n        // to send debug logs. Since this is a fire and forget action, we do\n        // this when the bug report dialog is opened instead of when we submit\n        // logs because we have no signal to know when all of the various\n        // components have finished logging. Someone could potentially send logs\n        // before we fully dump everything but it's probably unlikely.\n        defaultDispatcher.dispatch({\n            action: Action.DumpDebugLogs,\n        });\n    }\n\n    public componentWillUnmount(): void {\n        this.unmounted = true;\n    }\n\n    private onCancel = (): void => {\n        this.props.onFinished(false);\n    };\n\n    private getErrorText(error: Error | RageshakeError): ReactNode {\n        if (error instanceof RageshakeError) {\n            let errorText;\n            switch (error.errorcode) {\n                case \"DISALLOWED_APP\":\n                    errorText = _t(\"bug_reporting|failed_send_logs_causes|disallowed_app\");\n                    break;\n                case \"REJECTED_BAD_VERSION\":\n                    errorText = _t(\"bug_reporting|failed_send_logs_causes|rejected_version\");\n                    break;\n                case \"REJECTED_UNEXPECTED_RECOVERY_KEY\":\n                    errorText = _t(\"bug_reporting|failed_send_logs_causes|rejected_recovery_key\");\n                    break;\n                default:\n                    if (error.errorcode?.startsWith(\"REJECTED\")) {\n                        errorText = _t(\"bug_reporting|failed_send_logs_causes|rejected_generic\");\n                    } else {\n                        errorText = _t(\"bug_reporting|failed_send_logs_causes|server_unknown_error\");\n                    }\n                    break;\n            }\n            return (\n                <>\n                    <p>{errorText}</p>\n                    {error.policyURL && (\n                        <Link size=\"md\" target=\"_blank\" href={error.policyURL}>\n                            {_t(\"action|learn_more\")}\n                        </Link>\n                    )}\n                </>\n            );\n        } else {\n            return <p>{_t(\"bug_reporting|failed_send_logs_causes|unknown_error\")}</p>;\n        }\n    }\n\n    private onSubmit = (): void => {\n        if ((!this.state.text || !this.state.text.trim()) && (!this.state.issueUrl || !this.state.issueUrl.trim())) {\n            this.setState({\n                err: _t(\"bug_reporting|error_empty\"),\n            });\n            return;\n        }\n\n        const userText =\n            (this.state.text.length > 0 ? this.state.text + \"\\n\\n\" : \"\") +\n            \"Issue: \" +\n            (this.state.issueUrl.length > 0 ? this.state.issueUrl : \"No issue link given\");\n\n        this.setState({ busy: true, progress: null, err: null });\n        this.sendProgressCallback(_t(\"bug_reporting|preparing_logs\"));\n\n        if (this.isLocalOnly) {\n            // Shouldn't reach here, but throw in case we do.\n            this.setState({\n                err: _t(\"bug_reporting|failed_send_logs_causes|unknown_error\"),\n            });\n            return;\n        }\n\n        sendBugReport(SdkConfig.get().bug_report_endpoint_url, {\n            userText,\n            sendLogs: true,\n            progressCallback: this.sendProgressCallback,\n            labels: this.props.label ? [this.props.label] : [],\n        }).then(\n            () => {\n                if (!this.unmounted) {\n                    this.props.onFinished(false);\n                    Modal.createDialog(QuestionDialog, {\n                        title: _t(\"bug_reporting|logs_sent\"),\n                        description: _t(\"bug_reporting|thank_you\"),\n                        hasCancelButton: false,\n                    });\n                }\n            },\n            (err) => {\n                if (!this.unmounted) {\n                    this.setState({\n                        busy: false,\n                        progress: null,\n                        err: this.getErrorText(err),\n                    });\n                }\n            },\n        );\n\n        sendSentryReport(this.state.text, this.state.issueUrl, this.props.error);\n    };\n\n    private onDownload = async (): Promise<void> => {\n        this.setState({ downloadBusy: true });\n        this.downloadProgressCallback(_t(\"bug_reporting|preparing_download\"));\n\n        try {\n            await downloadBugReport({\n                sendLogs: true,\n                progressCallback: this.downloadProgressCallback,\n                labels: this.props.label ? [this.props.label] : [],\n            });\n\n            this.setState({\n                downloadBusy: false,\n                downloadProgress: null,\n            });\n        } catch (err) {\n            if (!this.unmounted) {\n                this.setState({\n                    downloadBusy: false,\n                    downloadProgress:\n                        _t(\"bug_reporting|failed_download_logs\") + `${err instanceof Error ? err.message : \"\"}`,\n                });\n            }\n        }\n    };\n\n    private onTextChange = (ev: React.FormEvent<HTMLTextAreaElement>): void => {\n        this.setState({ text: ev.currentTarget.value });\n    };\n\n    private onIssueUrlChange = (ev: React.FormEvent<HTMLInputElement>): void => {\n        this.setState({ issueUrl: ev.currentTarget.value });\n    };\n\n    private sendProgressCallback = (progress: string): void => {\n        if (this.unmounted) {\n            return;\n        }\n        this.setState({ progress });\n    };\n\n    private downloadProgressCallback = (downloadProgress: string): void => {\n        if (this.unmounted) {\n            return;\n        }\n        this.setState({ downloadProgress });\n    };\n\n    public render(): React.ReactNode {\n        let error: JSX.Element | undefined;\n        if (this.state.err) {\n            error = <div className=\"error\">{this.state.err}</div>;\n        }\n\n        let progress: JSX.Element | undefined;\n        if (this.state.busy) {\n            progress = (\n                <div className=\"progress\">\n                    <Spinner />\n                    {this.state.progress} ...\n                </div>\n            );\n        }\n\n        let warning: JSX.Element | undefined;\n        if (\n            (window.Modernizr && Object.values(window.Modernizr).some((support) => support === false)) ||\n            !getBrowserSupport()\n        ) {\n            warning = <Text weight=\"semibold\">{_t(\"bug_reporting|unsupported_browser\")}</Text>;\n        }\n\n        return (\n            <BaseDialog\n                className=\"mx_BugReportDialog\"\n                onFinished={this.onCancel}\n                title={this.isLocalOnly ? _t(\"bug_reporting|download_logs\") : _t(\"bug_reporting|submit_debug_logs\")}\n                contentId=\"mx_Dialog_content\"\n            >\n                <div className=\"mx_Dialog_content\" id=\"mx_Dialog_content\">\n                    {warning}\n                    <Text>{_t(\"bug_reporting|description\")}</Text>\n                    {this.isLocalOnly ? (\n                        <>{this.state.downloadProgress && <span>{this.state.downloadProgress} ...</span>}</>\n                    ) : (\n                        <>\n                            <Text weight=\"semibold\">\n                                {_t(\n                                    \"bug_reporting|before_submitting\",\n                                    {},\n                                    {\n                                        a: (sub) => (\n                                            <Link target=\"_blank\" href={SdkConfig.get().feedback.new_issue_url}>\n                                                {sub}\n                                            </Link>\n                                        ),\n                                    },\n                                )}\n                            </Text>\n\n                            <div className=\"mx_BugReportDialog_download\">\n                                <AccessibleButton\n                                    onClick={this.onDownload}\n                                    kind=\"link\"\n                                    disabled={this.state.downloadBusy}\n                                >\n                                    {_t(\"bug_reporting|download_logs\")}\n                                </AccessibleButton>\n                                {this.state.downloadProgress && <span>{this.state.downloadProgress} ...</span>}\n                            </div>\n\n                            <Field\n                                type=\"text\"\n                                className=\"mx_BugReportDialog_field_input\"\n                                label={_t(\"bug_reporting|github_issue\")}\n                                onChange={this.onIssueUrlChange}\n                                value={this.state.issueUrl}\n                                placeholder=\"https://github.com/vector-im/element-web/issues/...\"\n                                ref={this.issueRef}\n                            />\n                            <Field\n                                className=\"mx_BugReportDialog_field_input\"\n                                element=\"textarea\"\n                                label={_t(\"bug_reporting|textarea_label\")}\n                                rows={5}\n                                onChange={this.onTextChange}\n                                value={this.state.text}\n                                placeholder={_t(\"bug_reporting|additional_context\")}\n                            />\n                            {progress}\n                            {error}\n                        </>\n                    )}\n                </div>\n                <DialogButtons\n                    primaryButton={this.isLocalOnly ? _t(\"bug_reporting|download_logs\") : _t(\"bug_reporting|send_logs\")}\n                    onPrimaryButtonClick={this.isLocalOnly ? this.onDownload : this.onSubmit}\n                    focus={true}\n                    onCancel={this.onCancel}\n                    disabled={this.isLocalOnly ? this.state.downloadBusy : this.state.busy}\n                />\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017 Vector Creations Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type IRedactOpts, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport React from \"react\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport Modal from \"../../../Modal\";\nimport ErrorDialog from \"./ErrorDialog\";\nimport TextInputDialog from \"./TextInputDialog\";\n\ninterface IProps {\n    event: MatrixEvent;\n    onFinished(success?: false, reason?: void): void;\n    onFinished(success: true, reason?: string): void;\n}\n\n/*\n * A dialog for confirming a redaction.\n */\nexport default class ConfirmRedactDialog extends React.Component<IProps> {\n    public render(): React.ReactNode {\n        let description = _t(\"redact|confirm_description\");\n        if (this.props.event.isState()) {\n            description += \" \" + _t(\"redact|confirm_description_state\");\n        }\n\n        return (\n            <TextInputDialog\n                onFinished={this.props.onFinished}\n                title={_t(\"redact|confirm_button\")}\n                description={description}\n                placeholder={_t(\"redact|reason_label\")}\n                focus\n                button={_t(\"action|remove\")}\n            />\n        );\n    }\n}\n\nexport function createRedactEventDialog({\n    mxEvent,\n    onCloseDialog = () => {},\n}: {\n    mxEvent: MatrixEvent;\n    onCloseDialog?: () => void;\n}): void {\n    const eventId = mxEvent.getId();\n\n    if (!eventId) throw new Error(\"cannot redact event without ID\");\n\n    const roomId = mxEvent.getRoomId();\n\n    if (!roomId) throw new Error(`cannot redact event ${mxEvent.getId()} without room ID`);\n    const { finished } = Modal.createDialog(ConfirmRedactDialog, { event: mxEvent }, \"mx_Dialog_confirmredact\");\n\n    finished.then(async ([proceed, reason]) => {\n        if (!proceed) return;\n\n        const cli = MatrixClientPeg.safeGet();\n        const withRelTypes: Pick<IRedactOpts, \"with_rel_types\"> = {};\n\n        try {\n            onCloseDialog?.();\n            await cli.redactEvent(roomId, eventId, undefined, {\n                ...(reason ? { reason } : {}),\n                ...withRelTypes,\n            });\n        } catch (e: any) {\n            const code = e.errcode || e.statusCode;\n            // only show the dialog if failing for something other than a network error\n            // (e.g. no errcode or statusCode) as in that case the redactions end up in the\n            // detached queue and we show the room status bar to allow retry\n            if (typeof code !== \"undefined\") {\n                // display error message stating you couldn't delete this.\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"common|error\"),\n                    description: _t(\"redact|error\", { code }),\n                });\n            }\n        }\n    });\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017 Vector Creations Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent, type FormEvent, type ReactNode } from \"react\";\nimport { type RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport classNames from \"classnames\";\n\nimport { _t } from \"../../../languageHandler\";\nimport MemberAvatar from \"../avatars/MemberAvatar\";\nimport BaseDialog from \"./BaseDialog\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport Field from \"../elements/Field\";\nimport UserIdentifierCustomisations from \"../../../customisations/UserIdentifier\";\n\ninterface IProps {\n    // matrix-js-sdk (room) member object.\n    member: RoomMember;\n    action: string; // eg. 'Ban'\n    title: string; // eg. 'Ban this user?'\n\n    // Whether to display a text field for a reason\n    // If true, the second argument to onFinished will\n    // be the string entered.\n    askReason?: boolean;\n    danger?: boolean;\n    children?: ReactNode;\n    className?: string;\n    roomId?: string;\n    onFinished: (success?: boolean, reason?: string) => void;\n}\n\ninterface IState {\n    reason: string;\n}\n\n/*\n * A dialog for confirming an operation on another user.\n * Takes a user ID and a verb, displays the target user prominently\n * such that it should be easy to confirm that the operation is being\n * performed on the right person, and displays the operation prominently\n * to make it obvious what is going to happen.\n * Also tweaks the style for 'dangerous' actions (albeit only with colour)\n */\nexport default class ConfirmUserActionDialog extends React.Component<IProps, IState> {\n    public static defaultProps: Partial<IProps> = {\n        danger: false,\n        askReason: false,\n    };\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            reason: \"\",\n        };\n    }\n\n    private onOk = (ev: FormEvent): void => {\n        ev.preventDefault();\n        this.props.onFinished(true, this.state.reason);\n    };\n\n    private onCancel = (): void => {\n        this.props.onFinished(false);\n    };\n\n    private onReasonChange = (ev: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({\n            reason: ev.target.value,\n        });\n    };\n\n    public render(): React.ReactNode {\n        const confirmButtonClass = this.props.danger ? \"danger\" : \"\";\n\n        let reasonBox;\n        if (this.props.askReason) {\n            reasonBox = (\n                <form onSubmit={this.onOk}>\n                    <Field\n                        type=\"text\"\n                        onChange={this.onReasonChange}\n                        value={this.state.reason}\n                        className=\"mx_ConfirmUserActionDialog_reasonField\"\n                        label={_t(\"room_settings|permissions|ban_reason\")}\n                        autoFocus={true}\n                    />\n                </form>\n            );\n        }\n\n        const avatar = <MemberAvatar member={this.props.member} size=\"48px\" />;\n        const name = this.props.member.name;\n        const userId = this.props.member.userId;\n\n        const displayUserIdentifier = UserIdentifierCustomisations.getDisplayUserIdentifier(userId, {\n            roomId: this.props.roomId,\n            withDisplayName: true,\n        });\n\n        return (\n            <BaseDialog\n                className={classNames(\"mx_ConfirmUserActionDialog\", this.props.className)}\n                onFinished={this.props.onFinished}\n                title={this.props.title}\n                contentId=\"mx_Dialog_content\"\n            >\n                <div id=\"mx_Dialog_content\" className=\"mx_Dialog_content\">\n                    <div className=\"mx_ConfirmUserActionDialog_user\">\n                        <div className=\"mx_ConfirmUserActionDialog_avatar\">{avatar}</div>\n                        <div className=\"mx_ConfirmUserActionDialog_name\">{name}</div>\n                        <div className=\"mx_ConfirmUserActionDialog_userId\">{displayUserIdentifier}</div>\n                    </div>\n\n                    {reasonBox}\n                    {this.props.children}\n                </div>\n                <DialogButtons\n                    primaryButton={this.props.action}\n                    onPrimaryButtonClick={this.onOk}\n                    primaryButtonClass={confirmButtonClass}\n                    focus={!this.props.askReason}\n                    onCancel={this.onCancel}\n                />\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020, 2021 The Matrix.org Foundation C.I.C.\nCopyright 2017 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, {\n    type JSX,\n    type ChangeEvent,\n    createRef,\n    type KeyboardEvent,\n    type SyntheticEvent,\n    type ChangeEventHandler,\n} from \"react\";\nimport { type Room, RoomType, JoinRule, Preset, Visibility } from \"matrix-js-sdk/src/matrix\";\nimport { Form, SettingsToggleInput } from \"@vector-im/compound-web\";\n\nimport SdkConfig from \"../../../SdkConfig\";\nimport withValidation, { type IFieldState, type IValidationResult } from \"../elements/Validation\";\nimport { _t } from \"../../../languageHandler\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport { checkUserIsAllowedToChangeEncryption, type IOpts } from \"../../../createRoom\";\nimport Field from \"../elements/Field\";\nimport RoomAliasField from \"../elements/RoomAliasField\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport BaseDialog from \"../dialogs/BaseDialog\";\nimport JoinRuleDropdown from \"../elements/JoinRuleDropdown\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport { KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\nimport { privateShouldBeEncrypted } from \"../../../utils/rooms\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { UIFeature } from \"../../../settings/UIFeature\";\n\ninterface IProps {\n    type?: RoomType;\n    defaultPublic?: boolean;\n    defaultName?: string;\n    parentSpace?: Room;\n    defaultEncrypted?: boolean;\n    defaultStateEncrypted?: boolean;\n    onFinished(proceed?: false): void;\n    onFinished(proceed: true, opts: IOpts): void;\n}\n\ninterface IState {\n    /**\n     * The selected room join rule.\n     */\n    joinRule: JoinRule;\n    /**\n     * Indicates whether the created room should have public visibility (ie, it should be\n     * shown in the public room list). Only applicable if `joinRule` == `JoinRule.Knock`.\n     */\n    isPublicKnockRoom: boolean;\n    /**\n     * Indicates whether end-to-end encryption is enabled for the room.\n     */\n    isEncrypted: boolean;\n    /**\n     * Indicates whether end-to-end state encryption is enabled for this room.\n     * See MSC4362. Available if feature_msc4362_encrypted_state_events is enabled.\n     */\n    isStateEncrypted: boolean;\n    /**\n     * The room name.\n     */\n    name: string;\n    /**\n     * The room topic.\n     */\n    topic: string;\n    /**\n     * The room alias.\n     */\n    alias: string;\n    /**\n     * Indicates whether the details section is open.\n     */\n    detailsOpen: boolean;\n    /**\n     * Indicates whether federation is disabled for the room.\n     */\n    noFederate: boolean;\n    /**\n     * Indicates whether the room name is valid.\n     */\n    nameIsValid: boolean;\n    /**\n     * Indicates whether the user can change encryption settings for the room.\n     */\n    canChangeEncryption: boolean;\n}\n\nexport default class CreateRoomDialog extends React.Component<IProps, IState> {\n    private readonly askToJoinEnabled: boolean;\n    private readonly advancedSettingsEnabled: boolean;\n    private readonly allowCreatingPublicRooms: boolean;\n    private readonly supportsRestricted: boolean;\n    private nameField = createRef<Field>();\n    private aliasField = createRef<RoomAliasField>();\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.askToJoinEnabled = SettingsStore.getValue(\"feature_ask_to_join\");\n        this.advancedSettingsEnabled = SettingsStore.getValue(UIFeature.AdvancedSettings);\n        this.allowCreatingPublicRooms = SettingsStore.getValue(UIFeature.AllowCreatingPublicRooms);\n\n        this.supportsRestricted = !!this.props.parentSpace;\n        const defaultPublic = this.allowCreatingPublicRooms && this.props.defaultPublic;\n\n        let joinRule = JoinRule.Invite;\n        if (defaultPublic) {\n            joinRule = JoinRule.Public;\n        } else if (this.supportsRestricted) {\n            joinRule = JoinRule.Restricted;\n        }\n\n        const cli = MatrixClientPeg.safeGet();\n        this.state = {\n            isPublicKnockRoom: defaultPublic || false,\n            isEncrypted: this.props.defaultEncrypted ?? privateShouldBeEncrypted(cli),\n            isStateEncrypted: this.props.defaultStateEncrypted ?? false,\n            joinRule,\n            name: this.props.defaultName || \"\",\n            topic: \"\",\n            alias: \"\",\n            detailsOpen: false,\n            noFederate: SdkConfig.get().default_federate === false,\n            nameIsValid: false,\n            canChangeEncryption: false,\n        };\n    }\n\n    private roomCreateOptions(): IOpts {\n        const opts: IOpts = {};\n        const createOpts: IOpts[\"createOpts\"] = (opts.createOpts = {});\n        opts.roomType = this.props.type;\n        opts.name = this.state.name;\n\n        if (this.state.joinRule === JoinRule.Public) {\n            createOpts.visibility = Visibility.Public;\n            createOpts.preset = Preset.PublicChat;\n            opts.guestAccess = false;\n            const { alias } = this.state;\n            createOpts.room_alias_name = alias.substring(1, alias.indexOf(\":\"));\n        } else {\n            const encryptedStateFeature = SettingsStore.getValue(\"feature_msc4362_encrypted_state_events\", null, false);\n\n            opts.encryption = this.state.isEncrypted;\n            opts.stateEncryption = encryptedStateFeature && this.state.isStateEncrypted;\n        }\n\n        if (this.state.topic) {\n            opts.topic = this.state.topic;\n        }\n        if (this.state.noFederate) {\n            createOpts.creation_content = { \"m.federate\": false };\n        }\n\n        opts.parentSpace = this.props.parentSpace;\n        if (this.props.parentSpace && this.state.joinRule === JoinRule.Restricted) {\n            opts.joinRule = JoinRule.Restricted;\n        }\n\n        if (this.state.joinRule === JoinRule.Knock) {\n            opts.joinRule = JoinRule.Knock;\n            createOpts.visibility = this.state.isPublicKnockRoom ? Visibility.Public : Visibility.Private;\n        }\n\n        return opts;\n    }\n\n    public componentDidMount(): void {\n        const cli = MatrixClientPeg.safeGet();\n        checkUserIsAllowedToChangeEncryption(cli, Preset.PrivateChat).then(({ allowChange, forcedValue }) =>\n            this.setState((state) => ({\n                canChangeEncryption: allowChange,\n                // override with forcedValue if it is set\n                isEncrypted: forcedValue ?? state.isEncrypted,\n            })),\n        );\n\n        // move focus to first field when showing dialog\n        this.nameField.current?.focus();\n    }\n\n    private onKeyDown = (event: KeyboardEvent): void => {\n        const action = getKeyBindingsManager().getAccessibilityAction(event);\n        switch (action) {\n            case KeyBindingAction.Enter:\n                this.onOk();\n                event.preventDefault();\n                event.stopPropagation();\n                break;\n        }\n    };\n\n    private onOk = async (): Promise<void> => {\n        if (!this.nameField.current) return;\n        const activeElement = document.activeElement as HTMLElement;\n        activeElement?.blur();\n        await this.nameField.current.validate({ allowEmpty: false });\n        if (this.aliasField.current) {\n            await this.aliasField.current.validate({ allowEmpty: false });\n        }\n        // Validation and state updates are async, so we need to wait for them to complete\n        // first. Queue a `setState` callback and wait for it to resolve.\n        await new Promise<void>((resolve) => this.setState({}, resolve));\n        if (this.state.nameIsValid && (!this.aliasField.current || this.aliasField.current.isValid)) {\n            this.props.onFinished(true, this.roomCreateOptions());\n        } else {\n            let field: RoomAliasField | Field | null = null;\n            if (!this.state.nameIsValid) {\n                field = this.nameField.current;\n            } else if (this.aliasField.current && !this.aliasField.current.isValid) {\n                field = this.aliasField.current;\n            }\n            if (field) {\n                field.focus();\n                await field.validate({ allowEmpty: false, focused: true });\n            }\n        }\n    };\n\n    private onCancel = (): void => {\n        this.props.onFinished(false);\n    };\n\n    private onNameChange = (ev: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({ name: ev.target.value });\n    };\n\n    private onTopicChange = (ev: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({ topic: ev.target.value });\n    };\n\n    private onJoinRuleChange = (joinRule: JoinRule): void => {\n        this.setState({ joinRule });\n    };\n\n    private onEncryptedChange: ChangeEventHandler<HTMLInputElement> = (evt): void => {\n        this.setState({ isEncrypted: evt.target.checked });\n    };\n\n    private onStateEncryptedChange: ChangeEventHandler<HTMLInputElement> = (evt): void => {\n        this.setState({ isStateEncrypted: evt.target.checked });\n    };\n\n    private onAliasChange = (alias: string): void => {\n        this.setState({ alias });\n    };\n\n    private onDetailsToggled = (ev: SyntheticEvent<HTMLDetailsElement>): void => {\n        this.setState({ detailsOpen: (ev.target as HTMLDetailsElement).open });\n    };\n\n    private onNoFederateChange: ChangeEventHandler<HTMLInputElement> = (evt): void => {\n        this.setState({ noFederate: evt.target.checked });\n    };\n\n    private onNameValidate = async (fieldState: IFieldState): Promise<IValidationResult> => {\n        const result = await CreateRoomDialog.validateRoomName(fieldState);\n        this.setState({ nameIsValid: !!result.valid });\n        return result;\n    };\n\n    private onIsPublicKnockRoomChange: ChangeEventHandler<HTMLInputElement> = (evt): void => {\n        this.setState({ isPublicKnockRoom: evt.target.checked });\n    };\n\n    private static validateRoomName = withValidation({\n        rules: [\n            {\n                key: \"required\",\n                test: async ({ value }) => !!value,\n                invalid: () => _t(\"create_room|name_validation_required\"),\n            },\n        ],\n    });\n\n    public render(): React.ReactNode {\n        const isVideoRoom = this.props.type === RoomType.ElementVideo || this.props.type === RoomType.UnstableCall;\n\n        let aliasField: JSX.Element | undefined;\n        if (this.state.joinRule === JoinRule.Public) {\n            const domain = MatrixClientPeg.safeGet().getDomain()!;\n            aliasField = (\n                <div className=\"mx_CreateRoomDialog_aliasContainer\">\n                    <RoomAliasField\n                        ref={this.aliasField}\n                        onChange={this.onAliasChange}\n                        domain={domain}\n                        value={this.state.alias}\n                    />\n                </div>\n            );\n        }\n\n        let publicPrivateLabel: JSX.Element | undefined;\n        if (this.state.joinRule === JoinRule.Restricted) {\n            publicPrivateLabel = (\n                <p>\n                    {_t(\n                        \"create_room|join_rule_restricted_label\",\n                        {},\n                        {\n                            SpaceName: () => (\n                                <strong>{this.props.parentSpace?.name ?? _t(\"common|unnamed_space\")}</strong>\n                            ),\n                        },\n                    )}\n                    &nbsp;\n                    {_t(\"create_room|join_rule_change_notice\")}\n                </p>\n            );\n        } else if (this.state.joinRule === JoinRule.Public && this.props.parentSpace) {\n            publicPrivateLabel = (\n                <p>\n                    {_t(\n                        \"create_room|join_rule_public_parent_space_label\",\n                        {},\n                        {\n                            SpaceName: () => (\n                                <strong>{this.props.parentSpace?.name ?? _t(\"common|unnamed_space\")}</strong>\n                            ),\n                        },\n                    )}\n                    &nbsp;\n                    {_t(\"create_room|join_rule_change_notice\")}\n                </p>\n            );\n        } else if (this.state.joinRule === JoinRule.Public) {\n            publicPrivateLabel = (\n                <p>\n                    {_t(\"create_room|join_rule_public_label\")}\n                    &nbsp;\n                    {_t(\"create_room|join_rule_change_notice\")}\n                </p>\n            );\n        } else if (this.state.joinRule === JoinRule.Invite) {\n            publicPrivateLabel = (\n                <p>\n                    {_t(\"create_room|join_rule_invite_label\")}\n                    &nbsp;\n                    {_t(\"create_room|join_rule_change_notice\")}\n                </p>\n            );\n        } else if (this.state.joinRule === JoinRule.Knock) {\n            publicPrivateLabel = <p>{_t(\"create_room|join_rule_knock_label\")}</p>;\n        }\n\n        let visibilitySection: JSX.Element | undefined;\n        if (this.state.joinRule === JoinRule.Knock) {\n            visibilitySection = (\n                <SettingsToggleInput\n                    name=\"publish-room\"\n                    className=\"mx_CreateRoomDialog_labelledCheckbox\"\n                    label={_t(\"room_settings|security|publish_room\")}\n                    onChange={this.onIsPublicKnockRoomChange}\n                    checked={this.state.isPublicKnockRoom}\n                />\n            );\n        }\n\n        let e2eeSection: JSX.Element | undefined;\n        if (this.state.joinRule !== JoinRule.Public) {\n            let microcopy: string;\n            if (privateShouldBeEncrypted(MatrixClientPeg.safeGet())) {\n                if (this.state.canChangeEncryption) {\n                    microcopy = isVideoRoom\n                        ? _t(\"create_room|encrypted_video_room_warning\")\n                        : _t(\"create_room|encrypted_warning\");\n                } else {\n                    microcopy = _t(\"create_room|encryption_forced\");\n                }\n            } else {\n                microcopy = _t(\"settings|security|e2ee_default_disabled_warning\");\n            }\n            e2eeSection = (\n                <SettingsToggleInput\n                    name=\"encryption-toggle\"\n                    label={_t(\"create_room|encryption_label\")}\n                    onChange={this.onEncryptedChange}\n                    checked={this.state.isEncrypted}\n                    disabled={!this.state.canChangeEncryption}\n                    helpMessage={microcopy}\n                />\n            );\n        }\n\n        let e2eeStateSection: JSX.Element | undefined;\n        if (\n            SettingsStore.getValue(\"feature_msc4362_encrypted_state_events\", null, false) &&\n            this.state.joinRule !== JoinRule.Public\n        ) {\n            let microcopy: string;\n            if (!this.state.canChangeEncryption) {\n                microcopy = _t(\"create_room|encryption_forced\");\n            } else {\n                microcopy = _t(\"create_room|state_encrypted_warning\");\n            }\n            e2eeStateSection = (\n                <SettingsToggleInput\n                    name=\"state-encryption-toggle\"\n                    label={_t(\"create_room|state_encryption_label\")}\n                    onChange={this.onStateEncryptedChange}\n                    checked={this.state.isStateEncrypted}\n                    disabled={!this.state.canChangeEncryption}\n                    helpMessage={microcopy}\n                />\n            );\n        }\n\n        let federateLabel = _t(\"create_room|unfederated_label_default_off\");\n        if (SdkConfig.get().default_federate === false) {\n            // We only change the label if the default setting is different to avoid jarring text changes to the\n            // user. They will have read the implications of turning this off/on, so no need to rephrase for them.\n            federateLabel = _t(\"create_room|unfederated_label_default_on\");\n        }\n\n        let title: string;\n        if (isVideoRoom) {\n            title = _t(\"create_room|title_video_room\");\n        } else if (this.props.parentSpace || this.state.joinRule === JoinRule.Knock) {\n            title = _t(\"action|create_a_room\");\n        } else {\n            title =\n                this.state.joinRule === JoinRule.Public\n                    ? _t(\"create_room|title_public_room\")\n                    : _t(\"create_room|title_private_room\");\n        }\n\n        return (\n            <BaseDialog\n                className=\"mx_CreateRoomDialog\"\n                onFinished={this.props.onFinished}\n                title={title}\n                screenName=\"CreateRoom\"\n            >\n                <div className=\"mx_Dialog_content\">\n                    <Form.Root onSubmit={this.onOk} onKeyDown={this.onKeyDown}>\n                        <Field\n                            ref={this.nameField}\n                            label={_t(\"common|name\")}\n                            onChange={this.onNameChange}\n                            onValidate={this.onNameValidate}\n                            value={this.state.name}\n                            className=\"mx_CreateRoomDialog_name\"\n                        />\n                        <Field\n                            label={_t(\"create_room|topic_label\")}\n                            onChange={this.onTopicChange}\n                            value={this.state.topic}\n                            className=\"mx_CreateRoomDialog_topic\"\n                        />\n\n                        <div>\n                            <JoinRuleDropdown\n                                label={_t(\"create_room|room_visibility_label\")}\n                                labelInvite={_t(\"create_room|join_rule_invite\")}\n                                labelKnock={\n                                    this.askToJoinEnabled ? _t(\"room_settings|security|join_rule_knock\") : undefined\n                                }\n                                labelPublic={this.allowCreatingPublicRooms ? _t(\"common|public_room\") : undefined}\n                                labelRestricted={\n                                    this.supportsRestricted ? _t(\"create_room|join_rule_restricted\") : undefined\n                                }\n                                value={this.state.joinRule}\n                                onChange={this.onJoinRuleChange}\n                            />\n\n                            {publicPrivateLabel}\n                        </div>\n\n                        {visibilitySection}\n                        {e2eeSection}\n                        {e2eeStateSection}\n                        {aliasField}\n                        {this.advancedSettingsEnabled && (\n                            <details onToggle={this.onDetailsToggled} className=\"mx_CreateRoomDialog_details\">\n                                <summary className=\"mx_CreateRoomDialog_details_summary\">\n                                    {this.state.detailsOpen ? _t(\"action|hide_advanced\") : _t(\"action|show_advanced\")}\n                                </summary>\n                                <SettingsToggleInput\n                                    name=\"unfederated\"\n                                    label={_t(\"create_room|unfederated\", {\n                                        serverName: MatrixClientPeg.safeGet().getDomain(),\n                                    })}\n                                    onChange={this.onNoFederateChange}\n                                    checked={this.state.noFederate}\n                                    helpMessage={federateLabel}\n                                />\n                            </details>\n                        )}\n                    </Form.Root>\n                </div>\n                <DialogButtons\n                    primaryButton={\n                        isVideoRoom ? _t(\"create_room|action_create_video_room\") : _t(\"create_room|action_create_room\")\n                    }\n                    onPrimaryButtonClick={this.onOk}\n                    onCancel={this.onCancel}\n                />\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\nCopyright 2022 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useContext, useMemo } from \"react\";\nimport { EventType } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport BaseTool, { DevtoolsContext, type IDevtoolsProps } from \"./BaseTool\";\nimport { _t } from \"../../../../languageHandler\";\n\nconst ServersInRoom: React.FC<IDevtoolsProps> = ({ onBack }) => {\n    const context = useContext(DevtoolsContext);\n\n    const servers = useMemo<Record<string, number>>(() => {\n        const servers: Record<string, number> = {};\n        context.room.currentState.getStateEvents(EventType.RoomMember).forEach((ev) => {\n            if (ev.getContent().membership !== KnownMembership.Join) return; // only count joined users\n            const server = ev.getSender()!.split(\":\")[1];\n            servers[server] = (servers[server] ?? 0) + 1;\n        });\n        return servers;\n    }, [context.room]);\n\n    return (\n        <BaseTool onBack={onBack}>\n            <table>\n                <thead>\n                    <tr>\n                        <th>{_t(\"common|server\")}</th>\n                        <th>{_t(\"devtools|number_of_users\")}</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    {Object.entries(servers).map(([server, numUsers]) => (\n                        <tr key={server}>\n                            <td>{server}</td>\n                            <td>{numUsers}</td>\n                        </tr>\n                    ))}\n                </tbody>\n            </table>\n        </BaseTool>\n    );\n};\n\nexport default ServersInRoom;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2018-2023 The Matrix.org Foundation C.I.C.\nCopyright 2022 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent, useContext, useMemo, useState } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { _t, _td } from \"../../../../languageHandler\";\nimport BaseTool, { DevtoolsContext, type IDevtoolsProps } from \"./BaseTool\";\nimport AccessibleButton from \"../../elements/AccessibleButton\";\nimport SettingsStore, { LEVEL_ORDER } from \"../../../../settings/SettingsStore\";\nimport { type SettingLevel } from \"../../../../settings/SettingLevel\";\nimport { type SettingKey, SETTINGS, type SettingValueType } from \"../../../../settings/Settings\";\nimport Field from \"../../elements/Field\";\n\nconst SettingExplorer: React.FC<IDevtoolsProps> = ({ onBack }) => {\n    const [setting, setSetting] = useState<SettingKey | null>(null);\n    const [editing, setEditing] = useState(false);\n\n    if (setting && editing) {\n        const onBack = (): void => {\n            setEditing(false);\n        };\n        return <EditSetting setting={setting} onBack={onBack} />;\n    } else if (setting) {\n        const onBack = (): void => {\n            setSetting(null);\n        };\n        const onEdit = async (): Promise<void> => {\n            setEditing(true);\n        };\n        return <ViewSetting setting={setting} onBack={onBack} onEdit={onEdit} />;\n    } else {\n        const onView = (setting: SettingKey): void => {\n            setSetting(setting);\n        };\n        const onEdit = (setting: SettingKey): void => {\n            setSetting(setting);\n            setEditing(true);\n        };\n        return <SettingsList onBack={onBack} onView={onView} onEdit={onEdit} />;\n    }\n};\n\nexport default SettingExplorer;\n\ninterface ICanEditLevelFieldProps {\n    setting: SettingKey;\n    level: SettingLevel;\n    roomId?: string;\n}\n\nconst CanEditLevelField: React.FC<ICanEditLevelFieldProps> = ({ setting, roomId, level }) => {\n    const canEdit = SettingsStore.canSetValue(setting, roomId ?? null, level);\n    const className = canEdit ? \"mx_DevTools_SettingsExplorer_mutable\" : \"mx_DevTools_SettingsExplorer_immutable\";\n    return (\n        <td className={className}>\n            <code>{canEdit.toString()}</code>\n        </td>\n    );\n};\n\nfunction renderExplicitSettingValues(setting: SettingKey, roomId?: string): string {\n    const vals: Record<string, SettingValueType> = {};\n    for (const level of LEVEL_ORDER) {\n        try {\n            vals[level] = SettingsStore.getValueAt(level, setting, roomId, true, true);\n            if (vals[level] === undefined) {\n                vals[level] = null;\n            }\n        } catch (e) {\n            logger.warn(e);\n        }\n    }\n    return JSON.stringify(vals, null, 4);\n}\n\ninterface IEditSettingProps extends Pick<IDevtoolsProps, \"onBack\"> {\n    setting: SettingKey;\n}\n\nconst EditSetting: React.FC<IEditSettingProps> = ({ setting, onBack }) => {\n    const context = useContext(DevtoolsContext);\n    const [explicitValue, setExplicitValue] = useState(renderExplicitSettingValues(setting));\n    const [explicitRoomValue, setExplicitRoomValue] = useState(\n        renderExplicitSettingValues(setting, context.room.roomId),\n    );\n\n    const onSave = async (): Promise<string | undefined> => {\n        try {\n            const parsedExplicit = JSON.parse(explicitValue);\n            const parsedExplicitRoom = JSON.parse(explicitRoomValue);\n            for (const level of Object.keys(parsedExplicit)) {\n                logger.log(`[Devtools] Setting value of ${setting} at ${level} from user input`);\n                try {\n                    const val = parsedExplicit[level];\n                    await SettingsStore.setValue(setting, null, level as SettingLevel, val);\n                } catch (e) {\n                    logger.warn(e);\n                }\n            }\n\n            const roomId = context.room.roomId;\n            for (const level of Object.keys(parsedExplicit)) {\n                logger.log(`[Devtools] Setting value of ${setting} at ${level} in ${roomId} from user input`);\n                try {\n                    const val = parsedExplicitRoom[level];\n                    await SettingsStore.setValue(setting, roomId, level as SettingLevel, val);\n                } catch (e) {\n                    logger.warn(e);\n                }\n            }\n            onBack();\n        } catch (e) {\n            return _t(\"devtools|failed_to_save\") + (e instanceof Error ? ` (${e.message})` : \"\");\n        }\n    };\n\n    return (\n        <BaseTool onBack={onBack} actionLabel={_td(\"devtools|save_setting_values\")} onAction={onSave}>\n            <h3>\n                {_t(\"devtools|setting_colon\")} <code>{setting}</code>\n            </h3>\n\n            <div className=\"mx_DevTools_SettingsExplorer_warning\">\n                <strong>{_t(\"devtools|caution_colon\")}</strong> {_t(\"devtools|use_at_own_risk\")}\n            </div>\n\n            <div>\n                {_t(\"devtools|setting_definition\")}\n                <pre>\n                    <code>{JSON.stringify(SETTINGS[setting], null, 4)}</code>\n                </pre>\n            </div>\n\n            <div>\n                <table>\n                    <thead>\n                        <tr>\n                            <th>{_t(\"devtools|level\")}</th>\n                            <th>{_t(\"devtools|settable_global\")}</th>\n                            <th>{_t(\"devtools|settable_room\")}</th>\n                        </tr>\n                    </thead>\n                    <tbody>\n                        {LEVEL_ORDER.map((lvl) => (\n                            <tr key={lvl}>\n                                <td>\n                                    <code>{lvl}</code>\n                                </td>\n                                <CanEditLevelField setting={setting} level={lvl} />\n                                <CanEditLevelField setting={setting} roomId={context.room.roomId} level={lvl} />\n                            </tr>\n                        ))}\n                    </tbody>\n                </table>\n            </div>\n\n            <div>\n                <Field\n                    id=\"valExpl\"\n                    label={_t(\"devtools|values_explicit\")}\n                    type=\"text\"\n                    className=\"mx_DevTools_textarea\"\n                    element=\"textarea\"\n                    autoComplete=\"off\"\n                    value={explicitValue}\n                    onChange={(e) => setExplicitValue(e.target.value)}\n                />\n            </div>\n\n            <div>\n                <Field\n                    id=\"valExpl\"\n                    label={_t(\"devtools|values_explicit_room\")}\n                    type=\"text\"\n                    className=\"mx_DevTools_textarea\"\n                    element=\"textarea\"\n                    autoComplete=\"off\"\n                    value={explicitRoomValue}\n                    onChange={(e) => setExplicitRoomValue(e.target.value)}\n                />\n            </div>\n        </BaseTool>\n    );\n};\n\ninterface IViewSettingProps extends Pick<IDevtoolsProps, \"onBack\"> {\n    setting: SettingKey;\n    onEdit(this: void): Promise<void>;\n}\n\nconst ViewSetting: React.FC<IViewSettingProps> = ({ setting, onEdit, onBack }) => {\n    const context = useContext(DevtoolsContext);\n\n    return (\n        <BaseTool onBack={onBack} actionLabel={_td(\"devtools|edit_values\")} onAction={onEdit}>\n            <h3>\n                {_t(\"devtools|setting_colon\")} <code>{setting}</code>\n            </h3>\n\n            <div>\n                {_t(\"devtools|setting_definition\")}\n                <pre>\n                    <code>{JSON.stringify(SETTINGS[setting], null, 4)}</code>\n                </pre>\n            </div>\n\n            <div>\n                {_t(\"devtools|value_colon\")}&nbsp;\n                <code>{renderSettingValue(SettingsStore.getValue(setting))}</code>\n            </div>\n\n            <div>\n                {_t(\"devtools|value_this_room_colon\")}&nbsp;\n                <code>{renderSettingValue(SettingsStore.getValue(setting, context.room.roomId))}</code>\n            </div>\n\n            <div>\n                {_t(\"devtools|values_explicit_colon\")}\n                <pre>\n                    <code>{renderExplicitSettingValues(setting)}</code>\n                </pre>\n            </div>\n\n            <div>\n                {_t(\"devtools|values_explicit_this_room_colon\")}\n                <pre>\n                    <code>{renderExplicitSettingValues(setting, context.room.roomId)}</code>\n                </pre>\n            </div>\n        </BaseTool>\n    );\n};\n\nfunction renderSettingValue(val: any): string {\n    // Note: we don't .toString() a string because we want JSON.stringify to inject quotes for us\n    const toStringTypes = [\"boolean\", \"number\"];\n    if (toStringTypes.includes(typeof val)) {\n        return val.toString();\n    } else {\n        return JSON.stringify(val);\n    }\n}\n\ninterface ISettingsListProps extends Pick<IDevtoolsProps, \"onBack\"> {\n    onView(this: void, setting: string): void;\n    onEdit(this: void, setting: string): void;\n}\n\nconst SettingsList: React.FC<ISettingsListProps> = ({ onBack, onView, onEdit }) => {\n    const context = useContext(DevtoolsContext);\n    const [query, setQuery] = useState(\"\");\n\n    const allSettings = useMemo(() => {\n        let allSettings = Object.keys(SETTINGS) as SettingKey[];\n        if (query) {\n            const lcQuery = query.toLowerCase();\n            allSettings = allSettings.filter((setting) => setting.toLowerCase().includes(lcQuery));\n        }\n        return allSettings;\n    }, [query]);\n\n    return (\n        <BaseTool onBack={onBack} className=\"mx_DevTools_SettingsExplorer\">\n            <Field\n                label={_t(\"common|filter_results\")}\n                autoFocus={true}\n                size={64}\n                type=\"text\"\n                autoComplete=\"off\"\n                value={query}\n                onChange={(ev: ChangeEvent<HTMLInputElement>) => setQuery(ev.target.value)}\n                className=\"mx_TextInputDialog_input mx_DevTools_RoomStateExplorer_query\"\n            />\n            <table>\n                <thead>\n                    <tr>\n                        <th>{_t(\"devtools|setting_id\")}</th>\n                        <th>{_t(\"devtools|value\")}</th>\n                        <th>{_t(\"devtools|value_in_this_room\")}</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    {allSettings.map((i) => (\n                        <tr key={i}>\n                            <td>\n                                <AccessibleButton\n                                    kind=\"link_inline\"\n                                    className=\"mx_DevTools_SettingsExplorer_setting\"\n                                    onClick={() => onView(i)}\n                                >\n                                    <code>{i}</code>\n                                </AccessibleButton>\n                                <AccessibleButton\n                                    title={_t(\"devtools|edit_setting\")}\n                                    onClick={() => onEdit(i)}\n                                    className=\"mx_DevTools_SettingsExplorer_edit\"\n                                >\n                                    ✏\n                                </AccessibleButton>\n                            </td>\n                            <td>\n                                <code>{renderSettingValue(SettingsStore.getValue(i))}</code>\n                            </td>\n                            <td>\n                                <code>{renderSettingValue(SettingsStore.getValue(i, context.room.roomId))}</code>\n                            </td>\n                        </tr>\n                    ))}\n                </tbody>\n            </table>\n        </BaseTool>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\nCopyright 2022 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useContext, useState } from \"react\";\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport { useEventEmitterState } from \"../../../../hooks/useEventEmitter\";\nimport { _t } from \"../../../../languageHandler\";\nimport BaseTool, { DevtoolsContext, type IDevtoolsProps } from \"./BaseTool\";\nimport WidgetStore, { type IApp } from \"../../../../stores/WidgetStore\";\nimport { UPDATE_EVENT } from \"../../../../stores/AsyncStore\";\nimport FilteredList from \"./FilteredList\";\nimport { StateEventEditor } from \"./RoomState\";\n\nconst WidgetExplorer: React.FC<IDevtoolsProps> = ({ onBack }) => {\n    const context = useContext(DevtoolsContext);\n    const [query, setQuery] = useState(\"\");\n    const [widget, setWidget] = useState<IApp | null>(null);\n\n    const widgets = useEventEmitterState(WidgetStore.instance, UPDATE_EVENT, () => {\n        return WidgetStore.instance.getApps(context.room.roomId);\n    });\n\n    if (widget && widgets.includes(widget)) {\n        const onBack = (): void => {\n            setWidget(null);\n        };\n\n        const allState = Array.from(\n            Array.from(context.room.currentState.events.values()).map((e: Map<string, MatrixEvent>) => {\n                return e.values();\n            }),\n        ).reduce((p, c) => {\n            p.push(...c);\n            return p;\n        }, [] as MatrixEvent[]);\n        const event = allState.find((ev) => ev.getId() === widget.eventId);\n        if (!event) {\n            // \"should never happen\"\n            return <BaseTool onBack={onBack}>{_t(\"devtools|failed_to_find_widget\")}</BaseTool>;\n        }\n\n        return <StateEventEditor mxEvent={event} onBack={onBack} />;\n    }\n\n    return (\n        <BaseTool onBack={onBack}>\n            <FilteredList query={query} onChange={setQuery}>\n                {widgets.map((w) => (\n                    <button className=\"mx_DevTools_button\" key={w.url + w.eventId} onClick={() => setWidget(w)}>\n                        {w.url}\n                    </button>\n                ))}\n            </FilteredList>\n        </BaseTool>\n    );\n};\n\nexport default WidgetExplorer;\n","/*\n * Copyright 2025 New Vector Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\n/**\n * @file Devtool for viewing room members and their devices.\n */\n\nimport React, { type JSX, useContext, useState } from \"react\";\nimport { type Device, type RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { type CryptoApi } from \"matrix-js-sdk/src/crypto-api\";\nimport { Form, SettingsToggleInput } from \"@vector-im/compound-web\";\n\nimport { _t } from \"../../../../languageHandler\";\nimport BaseTool, { DevtoolsContext, type IDevtoolsProps } from \"./BaseTool\";\nimport FilteredList from \"./FilteredList\";\nimport { useAsyncMemo } from \"../../../../hooks/useAsyncMemo\";\nimport CopyableText from \"../../elements/CopyableText\";\nimport E2EIcon from \"../../rooms/E2EIcon\";\nimport { E2EStatus } from \"../../../../utils/ShieldUtils\";\nimport SyntaxHighlight from \"../../elements/SyntaxHighlight.tsx\";\nimport { stringify } from \"./Event.tsx\";\n\n/**\n * Replacement function for `<i>` tags in translation strings.\n */\nfunction i(sub: string): JSX.Element {\n    return <i>{sub}</i>;\n}\n\n/**\n * Shows a list of users in the room, and allows selecting a user to view.\n *\n * Initially, filters to only show joined users, but offers the user an option to show all users.\n *\n * Once the user chooses a specific member, delegates to {@link UserView} to view a single user.\n */\nexport const UserList: React.FC<Pick<IDevtoolsProps, \"onBack\">> = ({ onBack }) => {\n    const context = useContext(DevtoolsContext);\n    const [query, setQuery] = useState(\"\");\n    // Show only joined users or all users with member events?\n    const [showOnlyJoined, setShowOnlyJoined] = useState(true);\n    // The `RoomMember` for the selected user (if any)\n    const [member, setMember] = useState<RoomMember | null>(null);\n\n    if (member) {\n        return <UserView member={member} onBack={() => setMember(null)} />;\n    }\n\n    const members = showOnlyJoined ? context.room.getJoinedMembers() : context.room.getMembers();\n\n    return (\n        <BaseTool onBack={onBack}>\n            <FilteredList query={query} onChange={setQuery}>\n                {members.map((member) => (\n                    <UserButton key={member.userId} member={member} onClick={() => setMember(member)} />\n                ))}\n            </FilteredList>\n            <Form.Root\n                onSubmit={(evt) => {\n                    evt.preventDefault();\n                    evt.stopPropagation();\n                }}\n            >\n                <SettingsToggleInput\n                    name=\"only_joined_members\"\n                    label={_t(\"devtools|only_joined_members\")}\n                    onChange={(e) => {\n                        setShowOnlyJoined(e.target.checked);\n                    }}\n                    checked={showOnlyJoined}\n                />\n            </Form.Root>\n        </BaseTool>\n    );\n};\n\ninterface UserButtonProps {\n    member: RoomMember;\n    onClick(this: void): void;\n}\n\n/**\n * Button to select a user to view.\n */\nconst UserButton: React.FC<UserButtonProps> = ({ member, onClick }) => {\n    return (\n        <button className=\"mx_DevTools_button\" onClick={onClick}>\n            {member.userId}\n        </button>\n    );\n};\n\ninterface UserProps extends Pick<IDevtoolsProps, \"onBack\"> {\n    member: RoomMember;\n}\n\n/**\n * Shows a single user to view, and allows selecting a device to view.\n *\n * Once the user chooses a specific device, delegates to {@link DeviceView} to show a single device.\n */\nconst UserView: React.FC<UserProps> = ({ member, onBack }) => {\n    const context = useContext(DevtoolsContext);\n    const crypto = context.room.client.getCrypto();\n    // An element to show the verification status of the device (unknown,\n    // unverified, verified by cross signing, signed by owner).  The element\n    // will show text as well as an icon.  If crypto is not available, the value\n    // will be `null`.\n    const verificationStatus = useAsyncMemo(\n        async () => {\n            if (!crypto) {\n                return null;\n            }\n            const status = await crypto.getUserVerificationStatus(member.userId);\n            if (status.isCrossSigningVerified()) {\n                const e2eIcon = (): JSX.Element => (\n                    <E2EIcon\n                        isUser={true}\n                        hideTooltip={true}\n                        status={E2EStatus.Verified}\n                        className=\"mx_E2EIcon_inline\"\n                    />\n                );\n                return _t(\"devtools|user_verification_status|verified\", {}, { E2EIcon: e2eIcon });\n            } else if (status.wasCrossSigningVerified()) {\n                const e2eIcon = (): JSX.Element => (\n                    <E2EIcon\n                        isUser={true}\n                        hideTooltip={true}\n                        status={E2EStatus.Warning}\n                        className=\"mx_E2EIcon_inline\"\n                    />\n                );\n                return _t(\"devtools|user_verification_status|was_verified\", {}, { E2EIcon: e2eIcon });\n            } else if (status.needsUserApproval) {\n                const e2eIcon = (): JSX.Element => (\n                    <E2EIcon\n                        isUser={true}\n                        hideTooltip={true}\n                        status={E2EStatus.Warning}\n                        className=\"mx_E2EIcon_inline\"\n                    />\n                );\n                return _t(\"devtools|user_verification_status|identity_changed\", {}, { E2EIcon: e2eIcon });\n            } else {\n                const e2eIcon = (): JSX.Element => (\n                    <E2EIcon isUser={true} hideTooltip={true} status={E2EStatus.Normal} className=\"mx_E2EIcon_inline\" />\n                );\n                return _t(\"devtools|user_verification_status|unverified\", {}, { E2EIcon: e2eIcon });\n            }\n        },\n        [context, member],\n        _t(\"common|loading\"),\n    );\n    // The user's devices, as a Map from device ID to device information (see\n    // the `Device` type in `matrix-js-sdk/src/models/device.ts`).\n    const devices = useAsyncMemo(\n        async () => {\n            const devices = await crypto?.getUserDeviceInfo([member.userId]);\n            return devices?.get(member.userId) ?? new Map();\n        },\n        [context, member],\n        new Map(),\n    );\n\n    const userIdentity = useAsyncMemo(\n        async () => {\n            const identity = await crypto?.getUserCrossSigningKeys(member.userId);\n            if (!identity) return null;\n            return <SyntaxHighlight language=\"json\">{stringify(identity)}</SyntaxHighlight>;\n        },\n        [context, member],\n        null,\n    );\n\n    // The device to show, if any.\n    const [device, setDevice] = useState<Device | null>(null);\n\n    if (device) {\n        return <DeviceView crypto={crypto!} device={device} onBack={() => setDevice(null)} />;\n    }\n\n    const avatarUrl = member.getMxcAvatarUrl();\n    const memberEventContent = member.events.member?.getContent();\n\n    return (\n        <BaseTool onBack={onBack}>\n            <ul>\n                <li>\n                    <CopyableText getTextToCopy={() => member.userId} border={false}>\n                        {_t(\"devtools|user_id\", { userId: member.userId })}\n                    </CopyableText>\n                </li>\n                <li>{_t(\"devtools|user_room_membership\", { membership: member.membership ?? \"leave\" })}</li>\n                <li>\n                    {memberEventContent && \"displayname\" in memberEventContent\n                        ? _t(\"devtools|user_displayname\", { displayname: member.rawDisplayName })\n                        : _t(\"devtools|user_no_displayname\", {}, { i })}\n                </li>\n                <li>\n                    {avatarUrl !== undefined ? (\n                        <CopyableText getTextToCopy={() => avatarUrl} border={false}>\n                            {_t(\"devtools|user_avatar\", { avatar: avatarUrl })}\n                        </CopyableText>\n                    ) : (\n                        _t(\"devtools|user_no_avatar\", {}, { i })\n                    )}\n                </li>\n                <li>{verificationStatus}</li>\n            </ul>\n            <section>\n                <h2>{_t(\"devtools|devices\", { count: devices.size })}</h2>\n                <ul>\n                    {Array.from(devices.values()).map((device) => (\n                        <li key={device.deviceId}>\n                            <DeviceButton crypto={crypto!} device={device} onClick={() => setDevice(device)} />\n                        </li>\n                    ))}\n                </ul>\n            </section>\n            <section>\n                <h2>{_t(\"devtools|user_identity\")}</h2>\n                {userIdentity ?? <i>{_t(\"devtools|user_identity_unknown\")}</i>}\n            </section>\n        </BaseTool>\n    );\n};\n\ninterface DeviceButtonProps {\n    crypto: CryptoApi;\n    device: Device;\n    onClick(this: void): void;\n}\n\n/**\n * Button to select a user to view.\n */\nconst DeviceButton: React.FC<DeviceButtonProps> = ({ crypto, device, onClick }) => {\n    const verificationIcon = useAsyncMemo(\n        async () => {\n            const status = await crypto.getDeviceVerificationStatus(device.userId, device.deviceId);\n            if (!status) {\n                return;\n            } else if (status.crossSigningVerified) {\n                return (\n                    <E2EIcon\n                        isUser={true}\n                        hideTooltip={true}\n                        status={E2EStatus.Verified}\n                        className=\"mx_E2EIcon_inline\"\n                    />\n                );\n            } else if (status.signedByOwner) {\n                return (\n                    <E2EIcon isUser={true} hideTooltip={true} status={E2EStatus.Normal} className=\"mx_E2EIcon_inline\" />\n                );\n            } else {\n                return (\n                    <E2EIcon\n                        isUser={true}\n                        hideTooltip={true}\n                        status={E2EStatus.Warning}\n                        className=\"mx_E2EIcon_inline\"\n                    />\n                );\n            }\n        },\n        [crypto, device],\n        null,\n    );\n    return (\n        <button className=\"mx_DevTools_button\" onClick={onClick}>\n            {verificationIcon}\n            {device.deviceId}\n        </button>\n    );\n};\n\ninterface DeviceProps extends Pick<IDevtoolsProps, \"onBack\"> {\n    crypto: CryptoApi;\n    device: Device;\n}\n\n/**\n * Show a single device to view.\n */\nconst DeviceView: React.FC<DeviceProps> = ({ crypto, device, onBack }) => {\n    // An element to show the verification status of the device (unknown,\n    // unverified, verified by cross signing, signed by owner).  The element\n    // will show text as well as an icon if applicable.\n    const verificationStatus = useAsyncMemo(\n        async () => {\n            const status = await crypto.getDeviceVerificationStatus(device.userId, device.deviceId);\n            if (!status) {\n                // `status` will be `null` if the device is unknown or if the\n                // device doesn't have device keys.  In either case, it's not a\n                // security issue since we won't be sending it decryption keys.\n                return _t(\"devtools|device_verification_status|unknown\");\n            } else if (status.crossSigningVerified) {\n                const e2eIcon = (): JSX.Element => (\n                    <E2EIcon\n                        isUser={true}\n                        hideTooltip={true}\n                        status={E2EStatus.Verified}\n                        className=\"mx_E2EIcon_inline\"\n                    />\n                );\n                return _t(\"devtools|device_verification_status|verified\", {}, { E2EIcon: e2eIcon });\n            } else if (status.signedByOwner) {\n                const e2eIcon = (): JSX.Element => (\n                    <E2EIcon isUser={true} hideTooltip={true} status={E2EStatus.Normal} className=\"mx_E2EIcon_inline\" />\n                );\n                return _t(\"devtools|device_verification_status|signed_by_owner\", {}, { E2EIcon: e2eIcon });\n            } else {\n                const e2eIcon = (): JSX.Element => (\n                    <E2EIcon\n                        isUser={true}\n                        hideTooltip={true}\n                        status={E2EStatus.Warning}\n                        className=\"mx_E2EIcon_inline\"\n                    />\n                );\n                return _t(\"devtools|device_verification_status|unverified\", {}, { E2EIcon: e2eIcon });\n            }\n        },\n        [crypto, device],\n        _t(\"common|loading\"),\n    );\n\n    const keyIdSuffix = \":\" + device.deviceId;\n    const deviceKeys = (\n        <ul>\n            {Array.from(device.keys.entries()).map(([keyId, key]) => {\n                if (keyId.endsWith(keyIdSuffix)) {\n                    return (\n                        <li key={keyId}>\n                            <CopyableText getTextToCopy={() => key} border={false}>\n                                {keyId.slice(0, -keyIdSuffix.length)}: {key}\n                            </CopyableText>\n                        </li>\n                    );\n                } else {\n                    return (\n                        <li key={keyId}>\n                            <i>{_t(\"devtools|invalid_device_key_id\")}</i>: {keyId}: {key}\n                        </li>\n                    );\n                }\n            })}\n        </ul>\n    );\n\n    return (\n        <BaseTool onBack={onBack}>\n            <ul>\n                <li>\n                    <CopyableText getTextToCopy={() => device.userId} border={false}>\n                        {_t(\"devtools|user_id\", { userId: device.userId })}\n                    </CopyableText>\n                </li>\n                <li>\n                    <CopyableText getTextToCopy={() => device.deviceId} border={false}>\n                        {_t(\"devtools|device_id\", { deviceId: device.deviceId })}\n                    </CopyableText>\n                </li>\n                <li>\n                    {\"displayName\" in device\n                        ? _t(\"devtools|user_displayname\", { displayname: device.displayName })\n                        : _t(\"devtools|user_no_displayname\", {}, { i })}\n                </li>\n                <li>{verificationStatus}</li>\n                <li>\n                    {device.dehydrated ? _t(\"devtools|device_dehydrated_yes\") : _t(\"devtools|device_dehydrated_no\")}\n                </li>\n                <li>\n                    {_t(\"devtools|device_keys\")}\n                    {deviceKeys}\n                </li>\n            </ul>\n        </BaseTool>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\nCopyright 2022 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useContext, useMemo, useState } from \"react\";\nimport {\n    type AccountDataEvents,\n    type IContent,\n    type MatrixEvent,\n    type RoomAccountDataEvents,\n} from \"matrix-js-sdk/src/matrix\";\n\nimport BaseTool, { DevtoolsContext, type IDevtoolsProps } from \"./BaseTool\";\nimport MatrixClientContext from \"../../../../contexts/MatrixClientContext\";\nimport { EventEditor, EventViewer, eventTypeField, type IEditorProps, stringify } from \"./Event\";\nimport FilteredList from \"./FilteredList\";\nimport { _td } from \"../../../../languageHandler\";\n\nexport const AccountDataEventEditor: React.FC<IEditorProps> = ({ mxEvent, onBack }) => {\n    const cli = useContext(MatrixClientContext);\n\n    const fields = useMemo(() => [eventTypeField(mxEvent?.getType())], [mxEvent]);\n\n    const onSend = async ([eventType]: Array<keyof AccountDataEvents>, content?: IContent): Promise<void> => {\n        await cli.setAccountData(eventType, content || {});\n    };\n\n    const defaultContent = mxEvent ? stringify(mxEvent.getContent()) : undefined;\n    return <EventEditor fieldDefs={fields} defaultContent={defaultContent} onSend={onSend} onBack={onBack} />;\n};\n\nexport const RoomAccountDataEventEditor: React.FC<IEditorProps> = ({ mxEvent, onBack }) => {\n    const context = useContext(DevtoolsContext);\n    const cli = useContext(MatrixClientContext);\n\n    const fields = useMemo(() => [eventTypeField(mxEvent?.getType())], [mxEvent]);\n\n    const onSend = async ([eventType]: Array<keyof RoomAccountDataEvents>, content?: IContent): Promise<void> => {\n        await cli.setRoomAccountData(context.room.roomId, eventType, content || {});\n    };\n\n    const defaultContent = mxEvent ? stringify(mxEvent.getContent()) : undefined;\n    return <EventEditor fieldDefs={fields} defaultContent={defaultContent} onSend={onSend} onBack={onBack} />;\n};\n\ninterface IProps extends IDevtoolsProps {\n    events: Map<string, MatrixEvent>;\n    Editor: React.FC<IEditorProps>;\n    actionLabel: TranslationKey;\n}\n\nconst BaseAccountDataExplorer: React.FC<IProps> = ({ events, Editor, actionLabel, onBack, setTool }) => {\n    const [query, setQuery] = useState(\"\");\n    const [event, setEvent] = useState<MatrixEvent | null>(null);\n\n    if (event) {\n        const onBack = (): void => {\n            setEvent(null);\n        };\n        return <EventViewer mxEvent={event} onBack={onBack} Editor={Editor} />;\n    }\n\n    const onAction = async (): Promise<void> => {\n        setTool(actionLabel, Editor);\n    };\n\n    return (\n        <BaseTool onBack={onBack} actionLabel={actionLabel} onAction={onAction}>\n            <FilteredList query={query} onChange={setQuery}>\n                {Array.from(events.entries()).map(([eventType, ev]) => {\n                    const onClick = (): void => {\n                        setEvent(ev);\n                    };\n\n                    return (\n                        <button className=\"mx_DevTools_button\" key={eventType} onClick={onClick}>\n                            {eventType}\n                        </button>\n                    );\n                })}\n            </FilteredList>\n        </BaseTool>\n    );\n};\n\nexport const AccountDataExplorer: React.FC<IDevtoolsProps> = ({ onBack, setTool }) => {\n    const cli = useContext(MatrixClientContext);\n\n    return (\n        <BaseAccountDataExplorer\n            events={cli.store.accountData}\n            Editor={AccountDataEventEditor}\n            actionLabel={_td(\"devtools|send_custom_account_data_event\")}\n            onBack={onBack}\n            setTool={setTool}\n        />\n    );\n};\n\nexport const RoomAccountDataExplorer: React.FC<IDevtoolsProps> = ({ onBack, setTool }) => {\n    const context = useContext(DevtoolsContext);\n\n    return (\n        <BaseAccountDataExplorer\n            events={context.room.accountData}\n            Editor={RoomAccountDataEventEditor}\n            actionLabel={_td(\"devtools|send_custom_room_account_data_event\")}\n            onBack={onBack}\n            setTool={setTool}\n        />\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { NotificationCountType, type Room, type Thread, ReceiptType } from \"matrix-js-sdk/src/matrix\";\nimport React, { type JSX, useContext } from \"react\";\nimport { type ReadReceipt } from \"matrix-js-sdk/src/models/read-receipt\";\n\nimport MatrixClientContext from \"../../../../contexts/MatrixClientContext\";\nimport { useNotificationState } from \"../../../../hooks/useRoomNotificationState\";\nimport { _t, _td } from \"../../../../languageHandler\";\nimport { determineUnreadState } from \"../../../../RoomNotifs\";\nimport { humanReadableNotificationLevel } from \"../../../../stores/notifications/NotificationLevel\";\nimport { doesRoomOrThreadHaveUnreadMessages } from \"../../../../Unread\";\nimport BaseTool, { DevtoolsContext, type IDevtoolsProps } from \"./BaseTool\";\nimport { useIsEncrypted } from \"../../../../hooks/useIsEncrypted.ts\";\n\nfunction UserReadUpTo({ target }: { target: ReadReceipt<any, any> }): JSX.Element {\n    const cli = useContext(MatrixClientContext);\n    const userId = cli.getSafeUserId();\n    const hasPrivate = !!target.getReadReceiptForUserId(userId, false, ReceiptType.ReadPrivate);\n    return (\n        <>\n            <li>\n                {_t(\"devtools|user_read_up_to\")}\n                <strong>{target.getReadReceiptForUserId(userId)?.eventId ?? _t(\"devtools|no_receipt_found\")}</strong>\n            </li>\n            <li>\n                {_t(\"devtools|user_read_up_to_ignore_synthetic\")}\n                <strong>\n                    {target.getReadReceiptForUserId(userId, true)?.eventId ?? _t(\"devtools|no_receipt_found\")}\n                </strong>\n            </li>\n            {hasPrivate && (\n                <>\n                    <li>\n                        {_t(\"devtools|user_read_up_to_private\")}\n                        <strong>\n                            {target.getReadReceiptForUserId(userId, false, ReceiptType.ReadPrivate)?.eventId ??\n                                _t(\"devtools|no_receipt_found\")}\n                        </strong>\n                    </li>\n                    <li>\n                        {_t(\"devtools|user_read_up_to_private_ignore_synthetic\")}\n                        <strong>\n                            {target.getReadReceiptForUserId(userId, true, ReceiptType.ReadPrivate)?.eventId ??\n                                _t(\"devtools|no_receipt_found\")}\n                        </strong>\n                    </li>\n                </>\n            )}\n        </>\n    );\n}\n\nexport default function RoomNotifications({ onBack }: IDevtoolsProps): JSX.Element {\n    const { room } = useContext(DevtoolsContext);\n    const cli = useContext(MatrixClientContext);\n    const isRoomEncrypted = useIsEncrypted(cli, room);\n\n    const { level, count } = determineUnreadState(room, undefined, false);\n    const [notificationState] = useNotificationState(room);\n\n    return (\n        <BaseTool onBack={onBack}>\n            <section>\n                <h2>{_t(\"devtools|room_status\")}</h2>\n                <ul>\n                    <li>\n                        {_t(\n                            \"devtools|room_unread_status_count\",\n                            {\n                                status: humanReadableNotificationLevel(level),\n                                count,\n                            },\n                            {\n                                strong: (sub) => <strong>{sub}</strong>,\n                            },\n                        )}\n                    </li>\n                    <li>\n                        {_t(\n                            \"devtools|notification_state\",\n                            {\n                                notificationState,\n                            },\n                            {\n                                strong: (sub) => <strong>{sub}</strong>,\n                            },\n                        )}\n                    </li>\n                    <li>\n                        {_t(\n                            isRoomEncrypted ? _td(\"devtools|room_encrypted\") : _td(\"devtools|room_not_encrypted\"),\n                            {},\n                            {\n                                strong: (sub) => <strong>{sub}</strong>,\n                            },\n                        )}\n                    </li>\n                </ul>\n            </section>\n\n            <section>\n                <h2>{_t(\"devtools|main_timeline\")}</h2>\n\n                <ul>\n                    <li>\n                        {_t(\"devtools|room_notifications_total\")}{\" \"}\n                        {room.getRoomUnreadNotificationCount(NotificationCountType.Total)}\n                    </li>\n                    <li>\n                        {_t(\"devtools|room_notifications_highlight\")}{\" \"}\n                        {room.getRoomUnreadNotificationCount(NotificationCountType.Highlight)}\n                    </li>\n                    <li>\n                        {_t(\"devtools|room_notifications_dot\")} {doesRoomOrThreadHaveUnreadMessages(room) + \"\"}\n                    </li>\n                    {roomHasUnread(room) && (\n                        <>\n                            <UserReadUpTo target={room} />\n                            <li>\n                                {_t(\"devtools|room_notifications_last_event\")}\n                                <ul>\n                                    <li>\n                                        {_t(\"devtools|id\")}{\" \"}\n                                        <strong>{room.timeline[room.timeline.length - 1].getId()}</strong>\n                                    </li>\n                                    <li>\n                                        {_t(\"devtools|room_notifications_type\")}{\" \"}\n                                        <strong>{room.timeline[room.timeline.length - 1].getType()}</strong>\n                                    </li>\n                                    <li>\n                                        {_t(\"devtools|room_notifications_sender\")}{\" \"}\n                                        <strong>{room.timeline[room.timeline.length - 1].getSender()}</strong>\n                                    </li>\n                                </ul>\n                            </li>\n                        </>\n                    )}\n                </ul>\n            </section>\n\n            <section>\n                <h2>{_t(\"devtools|threads_timeline\")}</h2>\n                <ul>\n                    {room\n                        .getThreads()\n                        .filter((thread) => threadHasUnread(thread))\n                        .map((thread) => (\n                            <li key={thread.id}>\n                                {_t(\"devtools|room_notifications_thread_id\")} {thread.id}\n                                <ul>\n                                    <li>\n                                        {_t(\"devtools|room_notifications_total\")}\n                                        <strong>\n                                            {room.getThreadUnreadNotificationCount(\n                                                thread.id,\n                                                NotificationCountType.Total,\n                                            )}\n                                        </strong>\n                                    </li>\n                                    <li>\n                                        {_t(\"devtools|room_notifications_highlight\")}\n                                        <strong>\n                                            {room.getThreadUnreadNotificationCount(\n                                                thread.id,\n                                                NotificationCountType.Highlight,\n                                            )}\n                                        </strong>\n                                    </li>\n                                    <li>\n                                        {_t(\"devtools|room_notifications_dot\")}{\" \"}\n                                        <strong>{doesRoomOrThreadHaveUnreadMessages(thread) + \"\"}</strong>\n                                    </li>\n                                    <UserReadUpTo target={thread} />\n                                    <li>\n                                        {_t(\"devtools|room_notifications_last_event\")}\n                                        <ul>\n                                            <li>\n                                                {_t(\"devtools|id\")} <strong>{thread.lastReply()?.getId()}</strong>\n                                            </li>\n                                            <li>\n                                                {_t(\"devtools|room_notifications_type\")}{\" \"}\n                                                <strong>{thread.lastReply()?.getType()}</strong>\n                                            </li>\n                                            <li>\n                                                {_t(\"devtools|room_notifications_sender\")}{\" \"}\n                                                <strong>{thread.lastReply()?.getSender()}</strong>\n                                            </li>\n                                        </ul>\n                                    </li>\n                                </ul>\n                            </li>\n                        ))}\n                </ul>\n            </section>\n        </BaseTool>\n    );\n}\n\nfunction threadHasUnread(thread: Thread): boolean {\n    const total = thread.room.getThreadUnreadNotificationCount(thread.id, NotificationCountType.Total);\n    const highlight = thread.room.getThreadUnreadNotificationCount(thread.id, NotificationCountType.Highlight);\n    const dot = doesRoomOrThreadHaveUnreadMessages(thread);\n\n    return total > 0 || highlight > 0 || dot;\n}\n\nfunction roomHasUnread(room: Room): boolean {\n    const total = room.getRoomUnreadNotificationCount(NotificationCountType.Total);\n    const highlight = room.getRoomUnreadNotificationCount(NotificationCountType.Highlight);\n    const dot = doesRoomOrThreadHaveUnreadMessages(room);\n\n    return total > 0 || highlight > 0 || dot;\n}\n","/*\n * Copyright 2025 New Vector Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport React, { type JSX } from \"react\";\nimport { InlineSpinner } from \"@vector-im/compound-web\";\n\nimport { useMatrixClientContext } from \"../../../../contexts/MatrixClientContext\";\nimport BaseTool from \"./BaseTool\";\nimport { useAsyncMemo } from \"../../../../hooks/useAsyncMemo\";\nimport { _t } from \"../../../../languageHandler\";\nimport Modal from \"../../../../Modal\";\nimport { ManualDeviceKeyVerificationDialog } from \"../ManualDeviceKeyVerificationDialog\";\nimport RestoreKeyBackupDialog from \"../../dialogs/security/RestoreKeyBackupDialog\";\n\ninterface KeyBackupProps {\n    /**\n     * Callback to invoke when the back button is clicked.\n     */\n    onBack(this: void): void;\n}\n\n/**\n * A component that displays information about the key storage and cross-signing.\n */\nexport function Crypto({ onBack }: KeyBackupProps): JSX.Element {\n    const matrixClient = useMatrixClientContext();\n    return (\n        <BaseTool onBack={onBack} className=\"mx_Crypto\">\n            {matrixClient.getCrypto() ? (\n                <>\n                    <KeyStorage />\n                    <CrossSigning />\n                    <Session />\n\n                    <button\n                        type=\"button\"\n                        onClick={() => {\n                            Modal.createDialog(ManualDeviceKeyVerificationDialog);\n                        }}\n                    >\n                        {_t(\"devtools|manual_device_verification\")}\n                    </button>\n                    <button\n                        type=\"button\"\n                        onClick={() => {\n                            Modal.createDialog(\n                                RestoreKeyBackupDialog,\n                                undefined,\n                                undefined,\n                                /* priority = */ true,\n                                /* static = */ true,\n                            );\n                        }}\n                    >\n                        {_t(\"devtools|restore_from_backup\")}\n                    </button>\n                </>\n            ) : (\n                <span>{_t(\"devtools|crypto|crypto_not_available\")}</span>\n            )}\n        </BaseTool>\n    );\n}\n\n/**\n * A component that displays information about the key storage.\n */\nfunction KeyStorage(): JSX.Element {\n    const matrixClient = useMatrixClientContext();\n    const keyStorageData = useAsyncMemo(async () => {\n        const crypto = matrixClient.getCrypto()!;\n\n        // Get all the key storage data that we will display\n        const backupInfo = await crypto.getKeyBackupInfo();\n        const backupKeyStored = Boolean(await matrixClient.isKeyBackupKeyStored());\n        const backupKeyFromCache = await crypto.getSessionBackupPrivateKey();\n        const backupKeyCached = Boolean(backupKeyFromCache);\n        const backupKeyWellFormed = backupKeyFromCache instanceof Uint8Array;\n        const activeBackupVersion = await crypto.getActiveSessionBackupVersion();\n        const secretStorageKeyInAccount = await matrixClient.secretStorage.hasKey();\n        const secretStorageReady = await crypto.isSecretStorageReady();\n\n        return {\n            backupInfo,\n            backupKeyStored,\n            backupKeyCached,\n            backupKeyWellFormed,\n            activeBackupVersion,\n            secretStorageKeyInAccount,\n            secretStorageReady,\n        };\n    }, [matrixClient]);\n\n    // Show a spinner while loading\n    if (keyStorageData === undefined) return <InlineSpinner aria-label={_t(\"common|loading\")} />;\n\n    const {\n        backupInfo,\n        backupKeyStored,\n        backupKeyCached,\n        backupKeyWellFormed,\n        activeBackupVersion,\n        secretStorageKeyInAccount,\n        secretStorageReady,\n    } = keyStorageData;\n\n    return (\n        <table aria-label={_t(\"devtools|crypto|key_storage\")}>\n            <thead>\n                <tr>\n                    <th colSpan={2}>{_t(\"devtools|crypto|key_storage\")}</th>\n                </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|key_backup_latest_version\")}</th>\n                    <td>\n                        {backupInfo\n                            ? `${backupInfo.version} (${_t(\"settings|security|key_backup_algorithm\")} ${backupInfo.algorithm})`\n                            : _t(\"devtools|crypto|key_backup_inactive_warning\")}\n                    </td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|backup_key_stored_status\")}</th>\n                    <td>\n                        {backupKeyStored\n                            ? _t(\"devtools|crypto|backup_key_stored\")\n                            : _t(\"devtools|crypto|backup_key_not_stored\")}\n                    </td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|key_backup_active_version\")}</th>\n                    <td>\n                        {activeBackupVersion === null\n                            ? _t(\"devtools|crypto|key_backup_active_version_none\")\n                            : activeBackupVersion}\n                    </td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|backup_key_cached_status\")}</th>\n                    <td>\n                        {`${\n                            backupKeyCached\n                                ? _t(\"devtools|crypto|backup_key_cached\")\n                                : _t(\"devtools|crypto|not_found_locally\")\n                        }, ${\n                            backupKeyWellFormed\n                                ? _t(\"devtools|crypto|backup_key_well_formed\")\n                                : _t(\"devtools|crypto|backup_key_unexpected_type\")\n                        }`}\n                    </td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|4s_public_key_status\")}</th>\n                    <td>\n                        {secretStorageKeyInAccount\n                            ? _t(\"devtools|crypto|4s_public_key_in_account_data\")\n                            : _t(\"devtools|crypto|4s_public_key_not_in_account_data\")}\n                    </td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|secret_storage_status\")}</th>\n                    <td>\n                        {secretStorageReady\n                            ? _t(\"devtools|crypto|secret_storage_ready\")\n                            : _t(\"devtools|crypto|secret_storage_not_ready\")}\n                    </td>\n                </tr>\n            </tbody>\n        </table>\n    );\n}\n\n/**\n * A component that displays information about cross-signing.\n */\nfunction CrossSigning(): JSX.Element {\n    const matrixClient = useMatrixClientContext();\n    const crossSigningData = useAsyncMemo(async () => {\n        const crypto = matrixClient.getCrypto()!;\n\n        // Get all the cross-signing data that we will display\n        const crossSigningStatus = await crypto.getCrossSigningStatus();\n        const crossSigningPublicKeysOnDevice = crossSigningStatus.publicKeysOnDevice;\n        const crossSigningPrivateKeysInStorage = crossSigningStatus.privateKeysInSecretStorage;\n        const masterPrivateKeyCached = crossSigningStatus.privateKeysCachedLocally.masterKey;\n        const selfSigningPrivateKeyCached = crossSigningStatus.privateKeysCachedLocally.selfSigningKey;\n        const userSigningPrivateKeyCached = crossSigningStatus.privateKeysCachedLocally.userSigningKey;\n        const crossSigningReady = await crypto.isCrossSigningReady();\n\n        return {\n            crossSigningPublicKeysOnDevice,\n            crossSigningPrivateKeysInStorage,\n            masterPrivateKeyCached,\n            selfSigningPrivateKeyCached,\n            userSigningPrivateKeyCached,\n            crossSigningReady,\n        };\n    }, [matrixClient]);\n\n    // Show a spinner while loading\n    if (crossSigningData === undefined) return <InlineSpinner aria-label={_t(\"common|loading\")} />;\n\n    const {\n        crossSigningPublicKeysOnDevice,\n        crossSigningPrivateKeysInStorage,\n        masterPrivateKeyCached,\n        selfSigningPrivateKeyCached,\n        userSigningPrivateKeyCached,\n        crossSigningReady,\n    } = crossSigningData;\n\n    return (\n        <table aria-label={_t(\"devtools|crypto|cross_signing\")}>\n            <thead>\n                <tr>\n                    <th colSpan={2}>{_t(\"devtools|crypto|cross_signing\")}</th>\n                </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|cross_signing_status\")}</th>\n                    <td>{getCrossSigningStatus(crossSigningReady, crossSigningPrivateKeysInStorage)}</td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|cross_signing_public_keys_on_device_status\")}</th>\n                    <td>\n                        {crossSigningPublicKeysOnDevice\n                            ? _t(\"devtools|crypto|cross_signing_public_keys_on_device\")\n                            : _t(\"devtools|crypto|not_found\")}\n                    </td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|cross_signing_private_keys_in_storage_status\")}</th>\n                    <td>\n                        {crossSigningPrivateKeysInStorage\n                            ? _t(\"devtools|crypto|cross_signing_private_keys_in_storage\")\n                            : _t(\"devtools|crypto|cross_signing_private_keys_not_in_storage\")}\n                    </td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|master_private_key_cached_status\")}</th>\n                    <td>\n                        {masterPrivateKeyCached\n                            ? _t(\"devtools|crypto|cross_signing_cached\")\n                            : _t(\"devtools|crypto|not_found_locally\")}\n                    </td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|self_signing_private_key_cached_status\")}</th>\n                    <td>\n                        {selfSigningPrivateKeyCached\n                            ? _t(\"devtools|crypto|cross_signing_cached\")\n                            : _t(\"devtools|crypto|not_found_locally\")}\n                    </td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|user_signing_private_key_cached_status\")}</th>\n                    <td>\n                        {userSigningPrivateKeyCached\n                            ? _t(\"devtools|crypto|cross_signing_cached\")\n                            : _t(\"devtools|crypto|not_found_locally\")}\n                    </td>\n                </tr>\n            </tbody>\n        </table>\n    );\n}\n\n/**\n * Get the cross-signing status.\n * @param crossSigningReady Whether cross-signing is ready.\n * @param crossSigningPrivateKeysInStorage Whether cross-signing private keys are in secret storage.\n */\nfunction getCrossSigningStatus(crossSigningReady: boolean, crossSigningPrivateKeysInStorage: boolean): string {\n    if (crossSigningReady) {\n        return crossSigningPrivateKeysInStorage\n            ? _t(\"devtools|crypto|cross_signing_ready\")\n            : _t(\"devtools|crypto|cross_signing_untrusted\");\n    }\n\n    if (crossSigningPrivateKeysInStorage) {\n        return _t(\"devtools|crypto|cross_signing_not_ready\");\n    }\n\n    return _t(\"devtools|crypto|cross_signing_not_ready\");\n}\n\n/**\n * A component that displays information about the current session.\n */\nfunction Session(): JSX.Element {\n    const matrixClient = useMatrixClientContext();\n    const sessionData = useAsyncMemo(async () => {\n        const crypto = matrixClient.getCrypto()!;\n        const keys = await crypto.getOwnDeviceKeys();\n        return {\n            fingerprint: keys.ed25519,\n            deviceId: matrixClient.deviceId,\n        };\n    }, [matrixClient]);\n\n    // Show a spinner while loading\n    if (sessionData === undefined) {\n        return <InlineSpinner aria-label={_t(\"common|loading\")} />;\n    }\n\n    return (\n        <table aria-label={_t(\"devtools|crypto|session\")}>\n            <thead>\n                <tr>\n                    <th colSpan={2}>{_t(\"devtools|crypto|session\")}</th>\n                </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|device_id\")}</th>\n                    <td>{sessionData.deviceId}</td>\n                </tr>\n                <tr>\n                    <th scope=\"row\">{_t(\"devtools|crypto|session_fingerprint\")}</th>\n                    <td>{sessionData.fingerprint}</td>\n                </tr>\n            </tbody>\n        </table>\n    );\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent, type JSX, useCallback, useState } from \"react\";\nimport { EditInPlace } from \"@vector-im/compound-web\";\n\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { _t } from \"../../../languageHandler\";\nimport { type SettingLevel } from \"../../../settings/SettingLevel\";\nimport { type StringSettingKey } from \"../../../settings/Settings\";\n\ninterface Props {\n    settingKey: StringSettingKey;\n    level: SettingLevel;\n    roomId?: string; // for per-room settings\n    label?: string;\n    isExplicit?: boolean;\n    onChange?(this: void, value: string): void;\n}\n\nconst SettingsField = ({ settingKey, level, roomId, isExplicit, label, onChange: _onSave }: Props): JSX.Element => {\n    const settingsValue = SettingsStore.getValueAt(level, settingKey, roomId, isExplicit);\n    const [value, setValue] = useState(settingsValue);\n    const [busy, setBusy] = useState(false);\n\n    const onChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n        setValue(e.target.value);\n    }, []);\n    const onCancel = useCallback(() => {\n        setValue(settingsValue);\n    }, [settingsValue]);\n    const onSave = useCallback(async () => {\n        setBusy(true);\n        await SettingsStore.setValue(settingKey, roomId ?? null, level, value);\n        setBusy(false);\n        _onSave?.(value);\n    }, [level, roomId, settingKey, value, _onSave]);\n\n    return (\n        <EditInPlace\n            label={label ?? SettingsStore.getDisplayName(settingKey, level) ?? \"\"}\n            value={value}\n            saveButtonLabel={_t(\"common|save\")}\n            cancelButtonLabel={_t(\"common|cancel\")}\n            savedLabel={_t(\"common|saved\")}\n            savingLabel={_t(\"common|updating\")}\n            onChange={onChange}\n            onCancel={onCancel}\n            onSave={onSave}\n            disabled={busy}\n        />\n    );\n};\n\nexport default SettingsField;\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport React, { type ChangeEvent, useContext, useEffect, useMemo, useState } from \"react\";\nimport { Pill } from \"@element-hq/web-shared-components\";\nimport { MatrixEvent, type IContent, RoomStickyEventsEvent } from \"matrix-js-sdk/src/matrix\";\nimport { Alert, Form, SettingsToggleInput } from \"@vector-im/compound-web\";\n\nimport BaseTool, { DevtoolsContext, type IDevtoolsProps } from \"./BaseTool.tsx\";\nimport { _t, _td, UserFriendlyError } from \"../../../../languageHandler.tsx\";\nimport {\n    EventEditor,\n    eventTypeField,\n    EventViewer,\n    type IEditorProps,\n    stickyDurationField,\n    stringify,\n} from \"./Event.tsx\";\nimport Field from \"../../elements/Field.tsx\";\nimport MatrixClientContext from \"../../../../contexts/MatrixClientContext.tsx\";\nimport InlineSpinner from \"../../elements/InlineSpinner.tsx\";\nimport { Key } from \"../../../../Keyboard.ts\";\nimport { useAsyncMemo } from \"../../../../hooks/useAsyncMemo.ts\";\nimport { useTypedEventEmitterState } from \"../../../../hooks/useEventEmitter.ts\";\n\n/**\n * Devtool to explore sticky events in the current room.\n * It allows you to see all sticky events, filter them by type, and view their content.\n * @param onBack - handle back navigation in devtools\n * @param setTool - callback to switch to a different devtool (StickyEventEditor) when the user wants to send a new sticky event\n */\nexport const StickyStateExplorer: React.FC<IDevtoolsProps> = ({ onBack, setTool }) => {\n    const context = useContext(DevtoolsContext);\n    const [eventType, setEventType] = useState<string>();\n    const [event, setEvent] = useState<MatrixEvent>();\n\n    const cli = useContext(MatrixClientContext);\n    // Check if the server supports sticky events and show a message if it doesn't.\n    // undefined means we are still checking, true/false means we have the result.\n    const stickyEventsSupported = useAsyncMemo(() => {\n        return cli.doesServerSupportUnstableFeature(\"org.matrix.msc4354\");\n    }, [cli]);\n\n    // Listen for updates to the sticky events and refresh the list when they change\n    const events = useTypedEventEmitterState(context.room, RoomStickyEventsEvent.Update, () => {\n        return [...context.room._unstable_getStickyEvents()];\n    });\n\n    if (stickyEventsSupported === false) {\n        return (\n            <p>\n                <Alert\n                    type=\"critical\"\n                    title={_t(\"common|error\")}\n                    actions={<button onClick={onBack}>{_t(\"action|back\")}</button>}\n                >\n                    {_t(\"devtools|sticky_events_not_supported\")}\n                </Alert>\n            </p>\n        );\n    } else if (stickyEventsSupported === undefined) {\n        return (\n            <BaseTool onBack={onBack} onAction={async () => {}} actionLabel={_td(\"devtools|send_custom_sticky_event\")}>\n                <p>\n                    <InlineSpinner />\n                    {_t(\"devtools|checking_sticky_events_support\")}\n                </p>\n            </BaseTool>\n        );\n    }\n\n    // If an event is selected, show the single event view, which allows viewing the content of the event\n    // and sending a new one with the same sticky key.\n    if (event) {\n        return renderSingleEvent(setEvent, event);\n    }\n\n    // If an event type is selected, show the list of events of that type,\n    // with a filter and the option to show/hide \"empty\" events (empty sticky event is a way to clear state).\n    if (eventType !== undefined /* event type can be empty string */) {\n        return (\n            <StickyEventListPerType\n                eventType={eventType.length > 0 ? eventType : _t(\"devtools|empty_string\")}\n                setTool={setTool}\n                events={events.filter((ev) => ev.getType() === eventType)}\n                onBack={() => setEventType(undefined)}\n                setEvent={setEvent}\n            />\n        );\n    }\n\n    // Get the list of different types.\n    const uniqueEventTypes = Array.from(new Set(events.map((event) => event.getType())));\n\n    if (uniqueEventTypes.length === 0) {\n        return <p>{_t(\"devtools|no_sticky_events\")}</p>;\n    }\n\n    const onAction = async (): Promise<void> => {\n        setTool(_td(\"devtools|send_custom_sticky_event\"), StickyEventEditor);\n    };\n    return (\n        <BaseTool onBack={onBack} actionLabel={_td(\"devtools|send_custom_sticky_event\")} onAction={onAction}>\n            <p>\n                {uniqueEventTypes.map((eventType) => (\n                    <button key={eventType} className=\"mx_DevTools_button\" onClick={() => setEventType(eventType)}>\n                        {eventType.length > 0 ? eventType : _t(\"devtools|empty_string\")}\n                    </button>\n                ))}\n            </p>\n        </BaseTool>\n    );\n};\n\ninterface StateEventButtonProps {\n    userId: string;\n    stickyKey?: string;\n    expiresAt: number;\n    onClick(this: void): void;\n}\n\n/**\n * A single row in the sticky event list, showing the userId, sticky key and time until expiration for a sticky event.\n * @param userId - the sender of the sticky event\n * @param stickyKey - the sticky key of the event\n * @param expiresAt - the timestamp when the sticky event will expire\n * @param onClick - callback to show the event details when the row is clicked\n */\nconst StickyEventTableLine: React.FC<StateEventButtonProps> = ({ userId, stickyKey, expiresAt, onClick }) => {\n    const [timeRemainingFormatted, setTimeRemainingFormatted] = useState<string>(\"\");\n\n    useEffect(() => {\n        const updateCountdown = (): void => {\n            const now = Date.now();\n            const remaining = expiresAt - now;\n\n            if (remaining <= 0) {\n                setTimeRemainingFormatted(_t(\"devtools|expired\"));\n                return;\n            }\n\n            // Calculate time remaining\n            const totalSeconds = Math.floor(remaining / 1000);\n            const days = Math.floor(totalSeconds / 86400);\n            const hours = Math.floor((totalSeconds % 86400) / 3600);\n            const minutes = Math.floor((totalSeconds % 3600) / 60);\n            const seconds = totalSeconds % 60;\n\n            // Format the display\n            if (days > 0) {\n                setTimeRemainingFormatted(`${days}d ${hours}h ${minutes}m`);\n            } else if (hours > 0) {\n                setTimeRemainingFormatted(`${hours}h ${minutes}m ${seconds}s`);\n            } else if (minutes > 0) {\n                setTimeRemainingFormatted(`${minutes}m ${seconds}s`);\n            } else {\n                setTimeRemainingFormatted(`${seconds}s`);\n            }\n        };\n\n        updateCountdown();\n        const interval = setInterval(updateCountdown, 1000);\n        return () => clearInterval(interval);\n    }, [expiresAt]);\n\n    return (\n        <tr\n            onClick={onClick}\n            onKeyDown={(e) => {\n                // Activate on Enter or Space for keyboard users\n                if (e.key === Key.ENTER || e.key === Key.SPACE) {\n                    onClick();\n                }\n            }}\n            tabIndex={0}\n            role=\"button\"\n        >\n            <td>{userId}</td>\n            <td>{stickyKey ?? <i>unkeyed</i>}</td>\n            <td className=\"remaining_time_column\">{timeRemainingFormatted}</td>\n        </tr>\n    );\n};\n\ninterface StickyEventListPerTypeProps {\n    eventType: string;\n    events: MatrixEvent[];\n    onBack: () => void;\n    setEvent: (event: MatrixEvent | undefined) => void;\n    setTool: IDevtoolsProps[\"setTool\"];\n}\n\nconst StickyEventListPerType: React.FC<StickyEventListPerTypeProps> = ({\n    eventType,\n    events,\n    onBack,\n    setEvent,\n    setTool,\n}) => {\n    const onAction = async (): Promise<void> => {\n        setTool(_td(\"devtools|send_custom_sticky_event\"), StickyEventEditor);\n    };\n\n    const [query, setQuery] = useState(\"\");\n    const [showEmptyState, setShowEmptyState] = useState(true);\n\n    return (\n        <BaseTool\n            className=\"mx_DevTools_sticky_explorer\"\n            onBack={onBack}\n            actionLabel={_td(\"devtools|send_custom_sticky_event\")}\n            onAction={onAction}\n        >\n            <p>\n                <Pill label={eventType} />\n            </p>\n\n            <Field\n                label={_t(\"common|filter_results\")}\n                autoFocus={true}\n                size={64}\n                type=\"text\"\n                autoComplete=\"off\"\n                value={query}\n                onChange={(ev: ChangeEvent<HTMLInputElement>) => setQuery(ev.target.value)}\n                className=\"mx_TextInputDialog_input mx_DevTools_RoomStateExplorer_query\"\n            />\n\n            <Form.Root\n                onSubmit={(evt) => {\n                    evt.preventDefault();\n                    evt.stopPropagation();\n                }}\n            >\n                <SettingsToggleInput\n                    name=\"decrypted_toggle\"\n                    label={_t(\"devtools|show_empty_content_events\")}\n                    onChange={(e) => setShowEmptyState(e.target.checked)}\n                    checked={showEmptyState}\n                />\n            </Form.Root>\n\n            <table className=\"mx_DevTools_event_table\">\n                <thead>\n                    <tr>\n                        <th id=\"user_header\">{_t(\"devtools|users\")}</th>\n                        <th id=\"sticky_key_header\">{_t(\"devtools|sticky_key\")}</th>\n                        <th id=\"expires_in_header\">{_t(\"devtools|expires_in\")}</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    {events\n                        .filter((eventType) => {\n                            if (showEmptyState) return true;\n\n                            // An empty sticky event has a single content key \"msc4354_sticky_key\" and no other keys, as the sticky key is required but content can otherwise be empty\n                            const contentKeys = Object.keys(eventType.getContent());\n                            const isEmpty = contentKeys.length === 1 && contentKeys[0] === \"msc4354_sticky_key\";\n                            return !isEmpty;\n                        })\n                        .filter((ev) => {\n                            // No filtering, return all events\n                            if (!query) return true;\n                            // Filter by sender or sticky key\n                            if (ev.getSender()!.includes(query)) {\n                                return true;\n                            }\n                            const matchesStickyKey = ev.getContent().msc4354_sticky_key?.includes(query);\n                            return !!matchesStickyKey;\n                        })\n                        .sort((a, b) => {\n                            return (a.unstableStickyExpiresAt ?? 0) - (b.unstableStickyExpiresAt ?? 0);\n                        })\n                        .map((ev) => (\n                            <StickyEventTableLine\n                                key={ev.getId()}\n                                userId={ev.getSender()!}\n                                stickyKey={ev.getContent().msc4354_sticky_key}\n                                expiresAt={ev.unstableStickyExpiresAt!}\n                                onClick={() => setEvent(ev)}\n                            />\n                        ))}\n                </tbody>\n            </table>\n        </BaseTool>\n    );\n};\n\nfunction renderSingleEvent(setEvent: (value: MatrixEvent | undefined) => void, event: MatrixEvent): React.JSX.Element {\n    const _onBack = (): void => {\n        setEvent(undefined);\n    };\n\n    // If the event is encrypted, getEffectiveEvent will return the event\n    // as it would appear if it was unencrypted.\n    const effectiveEvent = event.getEffectiveEvent();\n    const clear = new MatrixEvent(effectiveEvent);\n\n    return <EventViewer mxEvent={clear} onBack={_onBack} Editor={StickyEventEditor} />;\n}\n\nexport const StickyEventEditor: React.FC<IEditorProps> = ({ mxEvent, onBack }) => {\n    const context = useContext(DevtoolsContext);\n    const cli = useContext(MatrixClientContext);\n\n    const fields = useMemo(\n        () => [eventTypeField(mxEvent?.getType()), stickyDurationField(3600000 /* 1 hour in ms */)],\n        [mxEvent],\n    );\n\n    const onSend = async ([eventType, stickyDuration]: string[], content: IContent): Promise<void> => {\n        // Parse and validate stickyDuration. It must be an integer number of milliseconds\n        // between 0 and 3,600,000 (inclusive) — 1-hour max.\n        const parsed = Number.parseInt(String(stickyDuration), 10);\n        if (Number.isNaN(parsed)) {\n            throw new UserFriendlyError(\"devtools|error_sticky_duration_must_be_a_number\");\n        }\n        if (parsed < 0 || parsed > 3600000) {\n            throw new UserFriendlyError(\"devtools|error_sticky_duration_out_of_range\");\n        }\n\n        await cli._unstable_sendStickyEvent(context.room.roomId, parsed, null, eventType as any, content);\n    };\n\n    const defaultContent = mxEvent\n        ? stringify(mxEvent.getContent())\n        : stringify({\n              msc4354_sticky_key: window.crypto.randomUUID(),\n          });\n    return <EventEditor fieldDefs={fields} defaultContent={defaultContent} onSend={onSend} onBack={onBack} />;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2018-2023 The Matrix.org Foundation C.I.C.\nCopyright 2022 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, useState } from \"react\";\nimport { Form } from \"@vector-im/compound-web\";\n\nimport { _t, _td } from \"../../../languageHandler\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport BaseDialog from \"./BaseDialog\";\nimport { TimelineEventEditor } from \"./devtools/Event\";\nimport ServersInRoom from \"./devtools/ServersInRoom\";\nimport SettingExplorer from \"./devtools/SettingExplorer\";\nimport { RoomStateExplorer } from \"./devtools/RoomState\";\nimport BaseTool, { DevtoolsContext, type IDevtoolsProps } from \"./devtools/BaseTool\";\nimport WidgetExplorer from \"./devtools/WidgetExplorer\";\nimport { UserList } from \"./devtools/Users\";\nimport { AccountDataExplorer, RoomAccountDataExplorer } from \"./devtools/AccountData\";\nimport SettingsFlag from \"../elements/SettingsFlag\";\nimport { SettingLevel } from \"../../../settings/SettingLevel\";\nimport ServerInfo from \"./devtools/ServerInfo\";\nimport CopyableText from \"../elements/CopyableText\";\nimport RoomNotifications from \"./devtools/RoomNotifications\";\nimport { Crypto } from \"./devtools/Crypto\";\nimport SettingsField from \"../elements/SettingsField.tsx\";\nimport { StickyStateExplorer } from \"./devtools/StickyEventState.tsx\";\n\nenum Category {\n    Room,\n    Other,\n}\n\nconst categoryLabels: Record<Category, TranslationKey> = {\n    [Category.Room]: _td(\"devtools|category_room\"),\n    [Category.Other]: _td(\"devtools|category_other\"),\n};\n\nexport type Tool = React.FC<IDevtoolsProps> | ((props: IDevtoolsProps) => JSX.Element);\nconst Tools: Record<Category, [label: TranslationKey, tool: Tool][]> = {\n    [Category.Room]: [\n        [_td(\"devtools|send_custom_timeline_event\"), TimelineEventEditor],\n        [_td(\"devtools|explore_room_state\"), RoomStateExplorer],\n        [_td(\"devtools|explore_room_account_data\"), RoomAccountDataExplorer],\n        [_td(\"devtools|view_servers_in_room\"), ServersInRoom],\n        [_td(\"devtools|notifications_debug\"), RoomNotifications],\n        [_td(\"devtools|active_widgets\"), WidgetExplorer],\n        [_td(\"devtools|users\"), UserList],\n        [_td(\"devtools|explore_sticky_state\"), StickyStateExplorer],\n    ],\n    [Category.Other]: [\n        [_td(\"devtools|explore_account_data\"), AccountDataExplorer],\n        [_td(\"devtools|settings_explorer\"), SettingExplorer],\n        [_td(\"devtools|server_info\"), ServerInfo],\n        [_td(\"devtools|crypto|title\"), Crypto],\n    ],\n};\n\ninterface IProps {\n    roomId: string;\n    threadRootId?: string | null;\n    onFinished(this: void, finished?: boolean): void;\n}\n\ntype ToolInfo = [label: TranslationKey, tool: Tool];\n\nconst DevtoolsDialog: React.FC<IProps> = ({ roomId, threadRootId, onFinished }) => {\n    const [tool, setTool] = useState<ToolInfo | null>(null);\n\n    let body: JSX.Element;\n    let onBack: () => void;\n\n    if (tool) {\n        onBack = () => {\n            setTool(null);\n        };\n\n        const Tool = tool[1];\n        body = <Tool onBack={onBack} setTool={(label, tool) => setTool([label, tool])} />;\n    } else {\n        const onBack = (): void => {\n            onFinished(false);\n        };\n        body = (\n            <BaseTool onBack={onBack}>\n                {Object.entries(Tools).map(([category, tools]) => (\n                    <div key={category}>\n                        <h2 className=\"mx_DevTools_toolHeading\">\n                            {_t(categoryLabels[category as unknown as Category])}\n                        </h2>\n                        {tools.map(([label, tool]) => {\n                            const onClick = (): void => {\n                                setTool([label, tool]);\n                            };\n                            return (\n                                <button className=\"mx_DevTools_button\" key={label} onClick={onClick}>\n                                    {_t(label)}\n                                </button>\n                            );\n                        })}\n                    </div>\n                ))}\n                <Form.Root\n                    onSubmit={(evt) => {\n                        evt.preventDefault();\n                        evt.stopPropagation();\n                    }}\n                    className=\"mx_DevTools_toggleForm\"\n                >\n                    <h2 className=\"mx_DevTools_toolHeading\">{_t(\"common|options\")}</h2>\n                    <SettingsFlag name=\"developerMode\" level={SettingLevel.ACCOUNT} />\n                    <SettingsFlag name=\"showHiddenEventsInTimeline\" level={SettingLevel.DEVICE} />\n                    <SettingsFlag name=\"enableWidgetScreenshots\" level={SettingLevel.ACCOUNT} />\n                    <SettingsFlag name=\"lowBandwidth\" level={SettingLevel.DEVICE} />\n                </Form.Root>\n                {/* The settings field needs to be outside `Form.Root` because `SettingsField` will have a inner Form,\n                    Otherwise we end up with a nester `Form` and that prohibits `preventDefault` so setting the value\n                    will reload the page.\n                 */}\n                <SettingsField\n                    settingKey=\"Developer.elementCallUrl\"\n                    level={SettingLevel.DEVICE}\n                    aria-label=\"elementCallUrl\"\n                />\n            </BaseTool>\n        );\n    }\n\n    const label = tool ? _t(tool[0]) : _t(\"devtools|toolbox\");\n    return (\n        <BaseDialog className=\"mx_QuestionDialog\" onFinished={onFinished} title={_t(\"devtools|developer_tools\")}>\n            <MatrixClientContext.Consumer>\n                {(cli) => (\n                    <>\n                        <div className=\"mx_DevTools_label_left\">{label}</div>\n                        <CopyableText className=\"mx_DevTools_label_right\" getTextToCopy={() => roomId} border={false}>\n                            {_t(\"devtools|room_id\", { roomId })}\n                        </CopyableText>\n                        {!threadRootId ? null : (\n                            <CopyableText\n                                className=\"mx_DevTools_label_right\"\n                                getTextToCopy={() => threadRootId}\n                                border={false}\n                            >\n                                {_t(\"devtools|thread_root_id\", { threadRootId })}\n                            </CopyableText>\n                        )}\n                        <div className=\"mx_DevTools_label_bottom\" />\n                        {cli.getRoom(roomId) && (\n                            // oxlint-disable-next-line react/jsx-no-constructed-context-values\n                            <DevtoolsContext.Provider value={{ room: cli.getRoom(roomId)!, threadRootId }}>\n                                {body}\n                            </DevtoolsContext.Provider>\n                        )}\n                    </>\n                )}\n            </MatrixClientContext.Consumer>\n        </BaseDialog>\n    );\n};\n\nexport default DevtoolsDialog;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2017 Vector Creations Ltd\nCopyright 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { type AuthType } from \"matrix-js-sdk/src/interactive-auth\";\nimport { LinkedText } from \"@element-hq/web-shared-components\";\n\nimport { _t } from \"../../../languageHandler\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport InteractiveAuth, {\n    ERROR_USER_CANCELLED,\n    type InteractiveAuthCallback,\n    type InteractiveAuthProps,\n} from \"../../structures/InteractiveAuth\";\nimport { type ContinueKind, SSOAuthEntry } from \"../auth/InteractiveAuthEntryComponents\";\nimport BaseDialog from \"./BaseDialog\";\n\ntype DialogAesthetics = Partial<{\n    [x in AuthType]: {\n        [x: number]: {\n            title: string;\n            body: string;\n            continueText: string;\n            continueKind: ContinueKind;\n        };\n    };\n}>;\n\nexport interface InteractiveAuthDialogProps<T = unknown> extends Pick<\n    InteractiveAuthProps<T>,\n    \"makeRequest\" | \"authData\"\n> {\n    // matrix client to use for UI auth requests\n    matrixClient: MatrixClient;\n\n    // Optional title and body to show when not showing a particular stage\n    title?: string;\n    body?: string;\n\n    // Optional title and body pairs for particular stages and phases within\n    // those stages. Object structure/example is:\n    // {\n    //     \"org.example.stage_type\": {\n    //         1: {\n    //             \"body\": \"This is a body for phase 1\" of org.example.stage_type,\n    //             \"title\": \"Title for phase 1 of org.example.stage_type\"\n    //         },\n    //         2: {\n    //             \"body\": \"This is a body for phase 2 of org.example.stage_type\",\n    //             \"title\": \"Title for phase 2 of org.example.stage_type\"\n    //             \"continueText\": \"Confirm identity with Example Auth\",\n    //             \"continueKind\": \"danger\"\n    //         }\n    //     }\n    // }\n    //\n    // Default is defined in _getDefaultDialogAesthetics()\n    aestheticsForStagePhases?: DialogAesthetics;\n\n    onFinished(success?: boolean, result?: T | Error | null): void;\n}\n\ninterface IState {\n    authError: Error | null;\n\n    // See _onUpdateStagePhase()\n    uiaStage: AuthType | null;\n    uiaStagePhase: number | null;\n}\n\nexport default class InteractiveAuthDialog<T> extends React.Component<InteractiveAuthDialogProps<T>, IState> {\n    public constructor(props: InteractiveAuthDialogProps<T>) {\n        super(props);\n\n        this.state = {\n            authError: null,\n\n            // See _onUpdateStagePhase()\n            uiaStage: null,\n            uiaStagePhase: null,\n        };\n    }\n\n    private getDefaultDialogAesthetics(): DialogAesthetics {\n        const ssoAesthetics = {\n            [SSOAuthEntry.PHASE_PREAUTH]: {\n                title: _t(\"auth|uia|sso_title\"),\n                body: _t(\"auth|uia|sso_preauth_body\"),\n                continueText: _t(\"auth|sso\"),\n                continueKind: \"primary\",\n            },\n            [SSOAuthEntry.PHASE_POSTAUTH]: {\n                title: _t(\"auth|uia|sso_postauth_title\"),\n                body: _t(\"auth|uia|sso_postauth_body\"),\n                continueText: _t(\"action|confirm\"),\n                continueKind: \"primary\",\n            },\n        };\n\n        return {\n            [SSOAuthEntry.LOGIN_TYPE]: ssoAesthetics,\n            [SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: ssoAesthetics,\n        };\n    }\n\n    private onAuthFinished: InteractiveAuthCallback<T> = async (success, result): Promise<void> => {\n        if (success) {\n            this.props.onFinished(true, result as T);\n        } else {\n            if (result === ERROR_USER_CANCELLED) {\n                this.props.onFinished(false, null);\n            } else {\n                this.setState({\n                    authError: result as Error,\n                });\n            }\n        }\n    };\n\n    private onUpdateStagePhase = (newStage: AuthType, newPhase: number): void => {\n        // We copy the stage and stage phase params into state for title selection in render()\n        this.setState({ uiaStage: newStage, uiaStagePhase: newPhase });\n    };\n\n    private onDismissClick = (): void => {\n        this.props.onFinished(false);\n    };\n\n    public render(): React.ReactNode {\n        // Let's pick a title, body, and other params text that we'll show to the user. The order\n        // is most specific first, so stagePhase > our props > defaults.\n\n        let title = this.state.authError ? \"Error\" : (this.props.title ?? _t(\"common|authentication\"));\n        let body = this.state.authError ? null : this.props.body;\n        let continueText: string | undefined;\n        let continueKind: ContinueKind | undefined;\n        const dialogAesthetics = this.props.aestheticsForStagePhases || this.getDefaultDialogAesthetics();\n        if (!this.state.authError && dialogAesthetics) {\n            if (\n                this.state.uiaStage !== null &&\n                this.state.uiaStagePhase !== null &&\n                dialogAesthetics[this.state.uiaStage]\n            ) {\n                const aesthetics = dialogAesthetics[this.state.uiaStage]![this.state.uiaStagePhase];\n                if (aesthetics) {\n                    if (aesthetics.title) title = aesthetics.title;\n                    if (aesthetics.body) body = aesthetics.body;\n                    if (aesthetics.continueText) continueText = aesthetics.continueText;\n                    if (aesthetics.continueKind) continueKind = aesthetics.continueKind;\n                }\n            }\n        }\n\n        let content: JSX.Element;\n        if (this.state.authError) {\n            content = (\n                <div id=\"mx_Dialog_content\">\n                    <LinkedText role=\"alert\">\n                        {this.state.authError.message || this.state.authError.toString()}\n                    </LinkedText>\n                    <br />\n                    <AccessibleButton onClick={this.onDismissClick} className=\"mx_GeneralButton\" autoFocus={true}>\n                        {_t(\"action|dismiss\")}\n                    </AccessibleButton>\n                </div>\n            );\n        } else {\n            content = (\n                <div id=\"mx_Dialog_content\">\n                    {body}\n                    <InteractiveAuth\n                        matrixClient={this.props.matrixClient}\n                        authData={this.props.authData}\n                        makeRequest={this.props.makeRequest}\n                        onAuthFinished={this.onAuthFinished}\n                        onStagePhaseChange={this.onUpdateStagePhase}\n                        continueText={continueText}\n                        continueKind={continueKind}\n                    />\n                </div>\n            );\n        }\n\n        return (\n            <BaseDialog\n                className=\"mx_InteractiveAuthDialog\"\n                onFinished={this.props.onFinished}\n                title={title}\n                contentId=\"mx_Dialog_content\"\n            >\n                {content}\n            </BaseDialog>\n        );\n    }\n}\n","/*\n Copyright 2026 Element Creations Ltd.\n\n SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n Please see LICENSE files in the repository root for full details.\n */\n\nimport React from \"react\";\nimport { RichItem } from \"@element-hq/web-shared-components\";\n\nimport { type Member, type ThreepidMember } from \"../../../../utils/direct-messages.ts\";\nimport type { ButtonEvent } from \"../../elements/AccessibleButton.tsx\";\nimport BaseAvatar from \"../../avatars/BaseAvatar.tsx\";\nimport { mediaFromMxc } from \"../../../../customisations/Media.ts\";\nimport UserIdentifierCustomisations from \"../../../../customisations/UserIdentifier.ts\";\nimport { _t } from \"../../../../languageHandler.tsx\";\nimport { Icon as EmailPillAvatarIcon } from \"../../../../../res/img/icon-email-pill-avatar.svg\";\n\ninterface IDMRoomTileProps {\n    member: Member;\n    lastActiveTs?: number;\n    onToggle?(member: Member): void;\n    isSelected?: boolean;\n}\n\n/** A tile representing a single user in the \"suggestions\"/\"recents\" section of the invite dialog. */\nexport class DMRoomTile extends React.PureComponent<IDMRoomTileProps> {\n    private onClick = (e: ButtonEvent): void => {\n        // Stop the browser from highlighting text\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.props.onToggle?.(this.props.member);\n    };\n\n    public render(): React.ReactNode {\n        const avatarSize = \"32px\";\n        const avatar = (this.props.member as ThreepidMember).isEmail ? (\n            <EmailPillAvatarIcon width={avatarSize} height={avatarSize} />\n        ) : (\n            <BaseAvatar\n                url={\n                    this.props.member.getMxcAvatarUrl()\n                        ? mediaFromMxc(this.props.member.getMxcAvatarUrl()!).getSquareThumbnailHttp(\n                              parseInt(avatarSize, 10),\n                          )\n                        : null\n                }\n                name={this.props.member.name}\n                idName={this.props.member.userId}\n                size={avatarSize}\n            />\n        );\n\n        const userIdentifier = UserIdentifierCustomisations.getDisplayUserIdentifier(this.props.member.userId, {\n            withDisplayName: true,\n        });\n\n        const caption = (this.props.member as ThreepidMember).isEmail\n            ? _t(\"invite|email_caption\")\n            : userIdentifier || this.props.member.userId;\n\n        return (\n            <RichItem\n                avatar={avatar}\n                title={this.props.member.name}\n                description={caption}\n                timestamp={this.props.lastActiveTs}\n                onClick={this.onClick}\n                selected={this.props.isSelected}\n            />\n        );\n    }\n}\n","/*\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport classnames from \"classnames\";\nimport React, {\n  forwardRef,\n  type ComponentType,\n  type PropsWithChildren,\n  type ReactNode,\n  type SVGAttributes,\n} from \"react\";\nimport styles from \"./PageHeader.module.css\";\nimport { BigIcon } from \"../Icon/BigIcon\";\nimport { Heading } from \"../Typography/Heading\";\n\ntype PageHeaderProps = {\n  Icon: ComponentType<SVGAttributes<SVGElement>>;\n  /**\n   * The heading text.\n   */\n  heading: string;\n  /**\n   * The t-shirt size of the header.\n   * @default \"lg\"\n   */\n  size?: \"md\" | \"lg\";\n  /**\n   * The contents of the header. At a minimum, this should include a description\n   * wrapped in a `<p>` element.\n   */\n  children: ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nexport const PageHeader = forwardRef<HTMLDivElement, PageHeaderProps>(\n  function PageHeader(\n    {\n      children,\n      className,\n      Icon,\n      heading,\n      size = \"lg\",\n      ...props\n    }: PropsWithChildren<PageHeaderProps>,\n    ref,\n  ) {\n    return (\n      <div\n        {...props}\n        className={classnames(styles.header, className)}\n        ref={ref}\n        data-size={size}\n      >\n        <BigIcon size={size} className={styles.icon}>\n          <Icon aria-hidden />\n        </BigIcon>\n        <Heading as=\"h1\" weight=\"semibold\" size={size === \"lg\" ? \"md\" : \"sm\"}>\n          {heading}\n        </Heading>\n        {children}\n      </div>\n    );\n  },\n);\n","/*\n Copyright 2026 Element Creations Ltd.\n\n SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n Please see LICENSE files in the repository root for full details.\n */\n\nimport React, { type JSX, useCallback } from \"react\";\nimport { CheckIcon, CloseIcon, UserAddSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\nimport { Button, PageHeader } from \"@vector-im/compound-web\";\n\nimport { InviteKind } from \"../InviteDialogTypes.ts\";\nimport { type Member } from \"../../../../utils/direct-messages.ts\";\nimport BaseDialog from \"../BaseDialog.tsx\";\nimport { type ScreenName } from \"../../../../PosthogTrackers.ts\";\nimport { DMRoomTile } from \"./DMRoomTile.tsx\";\nimport { _t } from \"../../../../languageHandler.tsx\";\n\ninterface Props {\n    /** Callback that will be called when the 'Continue' or 'Invite' button is clicked. */\n    onContinue: () => void;\n\n    /** Callback that will be called when the 'Cancel' button is clicked. Unused unless {@link kind} is {@link InviteKind.Dm}. */\n    onCancel: () => void;\n\n    /** Callback that will be called when the 'Remove' button is clicked. Unused unless {@link kind} is {@link InviteKind.Invite}. */\n    onRemove: () => void;\n\n    /** Optional Posthog ScreenName to supply during the lifetime of this dialog. */\n    screenName: ScreenName | undefined;\n\n    /** The type of invite dialog: whether we are starting a new DM, or inviting users to an existing room */\n    kind: InviteKind.Dm | InviteKind.Invite;\n\n    /** The users whose identities we don't know */\n    users: Member[];\n}\n\n/**\n * Part of the invite dialog: a screen that appears if there are any users whose cryptographic identity we don't know,\n * to confirm that they are the right users.\n *\n * Figma: https://www.figma.com/design/chAcaQAluTuRg6BsG4Npc0/-3163--Inviting-Unknown-People?node-id=150-17719&t=ISAikbnj97LM4NwT-0\n */\nconst UnknownIdentityUsersWarningDialog: React.FC<Props> = (props) => {\n    const userListItem = useCallback((u: Member) => <DMRoomTile member={u} key={u.userId} />, []);\n\n    let title: string;\n    let headerText: string;\n    let buttons: JSX.Element;\n\n    switch (props.kind) {\n        case InviteKind.Invite:\n            title = _t(\"invite|confirm_unknown_users|invite_title\");\n            headerText = _t(\"invite|confirm_unknown_users|invite_subtitle\");\n            buttons = <InviteButtons onInvite={props.onContinue} onRemove={props.onRemove} />;\n            break;\n\n        case InviteKind.Dm:\n            title =\n                props.users.length == 1\n                    ? _t(\"invite|confirm_unknown_users|start_chat_title_one_user\")\n                    : _t(\"invite|confirm_unknown_users|start_chat_title_multiple_users\");\n\n            headerText =\n                props.users.length == 1\n                    ? _t(\"invite|confirm_unknown_users|start_chat_subtitle_one_user\")\n                    : _t(\"invite|confirm_unknown_users|start_chat_subtitle_multiple_users\");\n\n            buttons = <DmButtons onCancel={props.onCancel} onContinue={props.onContinue} />;\n            break;\n    }\n\n    return (\n        <BaseDialog\n            onFinished={props.onCancel}\n            className=\"mx_UnknownIdentityUsersWarningDialog\"\n            screenName={props.screenName}\n        >\n            <div className=\"mx_UnknownIdentityUsersWarningDialog_headerContainer\">\n                <PageHeader Icon={UserAddSolidIcon} heading={title}>\n                    <p>{headerText}</p>\n                </PageHeader>\n            </div>\n\n            <ul className=\"mx_UnknownIdentityUsersWarningDialog_userList\" data-testid=\"userlist\">\n                {props.users.map(userListItem)}\n            </ul>\n\n            <div className=\"mx_UnknownIdentityUsersWarningDialog_buttons\">{buttons}</div>\n        </BaseDialog>\n    );\n};\n\nconst DmButtons: React.FC<{ onContinue: () => void; onCancel: () => void }> = (props) => {\n    return (\n        <>\n            <Button size=\"lg\" kind=\"secondary\" onClick={props.onCancel}>\n                {_t(\"action|cancel\")}\n            </Button>\n            <Button size=\"lg\" kind=\"primary\" onClick={props.onContinue}>\n                {_t(\"action|continue\")}\n            </Button>\n        </>\n    );\n};\n\nconst InviteButtons: React.FC<{ onInvite: () => void; onRemove: () => void }> = (props) => {\n    return (\n        <>\n            <Button size=\"lg\" kind=\"secondary\" onClick={props.onRemove} Icon={CloseIcon}>\n                {_t(\"action|remove\")}\n            </Button>\n            <Button size=\"lg\" kind=\"primary\" onClick={props.onInvite} Icon={CheckIcon}>\n                {_t(\"action|invite\")}\n            </Button>\n        </>\n    );\n};\n\nexport default UnknownIdentityUsersWarningDialog;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createRef, type JSX, type ReactNode, type SyntheticEvent } from \"react\";\nimport { EventType, type Room, RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\nimport { type MatrixCall } from \"matrix-js-sdk/src/webrtc/call\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { uniqBy } from \"lodash\";\nimport { Pill, PillInput, RichList } from \"@element-hq/web-shared-components\";\nimport { DialPadIcon, UserProfileSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t, _td } from \"../../../languageHandler\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport { makeRoomPermalink, makeUserPermalink } from \"../../../utils/permalinks/Permalinks\";\nimport DMRoomMap from \"../../../utils/DMRoomMap\";\nimport * as Email from \"../../../email\";\nimport { getDefaultIdentityServerUrl, setToDefaultIdentityServer } from \"../../../utils/IdentityServerUtils\";\nimport { buildActivityScores, buildMemberScores, compareMembers } from \"../../../utils/SortMembers\";\nimport { abbreviateUrl } from \"../../../utils/UrlUtils\";\nimport IdentityAuthClient from \"../../../IdentityAuthClient\";\nimport { showAnyInviteErrors } from \"../../../RoomInvite\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport RoomListStoreV3 from \"../../../stores/room-list-v3/RoomListStoreV3\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { UIFeature } from \"../../../settings/UIFeature\";\nimport { SearchResultAvatar } from \"../avatars/SearchResultAvatar\";\nimport AccessibleButton, { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport { selectText } from \"../../../utils/strings\";\nimport Field from \"../elements/Field\";\nimport TabbedView, { Tab, TabLocation } from \"../../structures/TabbedView\";\nimport Dialpad from \"../voip/DialPad\";\nimport QuestionDialog from \"./QuestionDialog\";\nimport BaseDialog from \"./BaseDialog\";\nimport DialPadBackspaceButton from \"../elements/DialPadBackspaceButton\";\nimport CopyableText from \"../elements/CopyableText\";\nimport { type ScreenName } from \"../../../PosthogTrackers\";\nimport { KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport {\n    DirectoryMember,\n    type IDMUserTileProps,\n    type Member,\n    startDmOnFirstMessage,\n    ThreepidMember,\n} from \"../../../utils/direct-messages\";\nimport { InviteKind } from \"./InviteDialogTypes\";\nimport Modal from \"../../../Modal\";\nimport dis from \"../../../dispatcher/dispatcher\";\nimport { privateShouldBeEncrypted } from \"../../../utils/rooms\";\nimport { type NonEmptyArray } from \"../../../@types/common\";\nimport { SDKContextClass } from \"../../../contexts/SDKContextClass\";\nimport { type UserProfilesStore } from \"../../../stores/UserProfilesStore\";\nimport InviteProgressBody from \"./InviteProgressBody.tsx\";\nimport MultiInviter, { type CompletionStates as MultiInviterCompletionStates } from \"../../../utils/MultiInviter.ts\";\nimport { DMRoomTile } from \"./invite/DMRoomTile.tsx\";\nimport { logErrorAndShowErrorDialog } from \"../../../utils/ErrorUtils.tsx\";\nimport UnknownIdentityUsersWarningDialog from \"./invite/UnknownIdentityUsersWarningDialog.tsx\";\nimport { AddressType, getAddressType } from \"../../../UserAddress.ts\";\n\ninterface Result {\n    userId: string;\n    user: Member;\n    lastActive?: number;\n}\n\nconst INITIAL_ROOMS_SHOWN = 3; // Number of rooms to show at first\nconst INCREMENT_ROOMS_SHOWN = 5; // Number of rooms to add when 'show more' is clicked\n\nenum TabId {\n    UserDirectory = \"users\",\n    DialPad = \"dialpad\",\n}\n\nclass DMUserTile extends React.PureComponent<IDMUserTileProps> {\n    private onRemove = (e: ButtonEvent): void => {\n        // Stop the browser from highlighting text\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.props.onRemove!(this.props.member);\n    };\n\n    public render(): React.ReactNode {\n        const avatarSize = \"20px\";\n        const avatar = <SearchResultAvatar user={this.props.member} size={avatarSize} />;\n\n        return (\n            <Pill label={this.props.member.name} onClick={this.onRemove}>\n                {avatar}\n            </Pill>\n        );\n    }\n}\n\n/**\n * Converts a RoomMember to a Member.\n * Returns the Member if it is already a Member.\n */\nconst toMember = (member: RoomMember | Member): Member => {\n    return member instanceof RoomMember\n        ? new DirectoryMember({\n              user_id: member.userId,\n              display_name: member.name,\n              avatar_url: member.getMxcAvatarUrl(),\n          })\n        : member;\n};\n\ninterface BaseProps {\n    // Takes a boolean which is true if a user / users were invited /\n    // a call transfer was initiated or false if the dialog was cancelled\n    // with no action taken.\n    onFinished: (success?: boolean) => void;\n\n    // Initial value to populate the filter with\n    initialText?: string;\n}\n\ninterface InviteDMProps extends BaseProps {\n    // The kind of invite being performed. Assumed to be InviteKind.Dm if not provided.\n    kind?: InviteKind.Dm;\n}\n\ninterface InviteRoomProps extends BaseProps {\n    kind: InviteKind.Invite;\n\n    // The room ID this dialog is for. Only required for InviteKind.Invite.\n    roomId: string;\n}\n\nfunction isRoomInvite(props: Props): props is InviteRoomProps {\n    return props.kind === InviteKind.Invite;\n}\n\ninterface InviteCallProps extends BaseProps {\n    kind: InviteKind.CallTransfer;\n\n    // The call to transfer. Only required for InviteKind.CallTransfer.\n    call: MatrixCall;\n}\n\ntype Props = InviteDMProps | InviteRoomProps | InviteCallProps;\n\ninterface IInviteDialogState {\n    targets: Member[]; // array of Member objects (see interface above)\n    filterText: string;\n    recents: Result[];\n    numRecentsShown: number;\n    suggestions: Result[];\n    numSuggestionsShown: number;\n    serverResultsMixin: Result[];\n    threepidResultsMixin: Result[];\n    canUseIdentityServer: boolean;\n    tryingIdentityServer: boolean;\n    consultFirst: boolean;\n    dialPadValue: string;\n    currentTabId: TabId;\n\n    /**\n     * If we tried to invite some users whose identity we don't know, we will show a warning.\n     * This is the list of users. (If it is `null`, we are not showing that warning.)\n     *\n     * Will never be the empty list.\n     */\n    unknownIdentityUsers: Member[] | null;\n\n    /**\n     * True if we are sending the invites.\n     *\n     * We will grey out the action button, hide the suggestions, and display a spinner.\n     */\n    busy: boolean;\n\n    /** Error from the last attempt to send invites. */\n    errorText?: string;\n}\n\nexport default class InviteDialog extends React.PureComponent<Props, IInviteDialogState> {\n    public static defaultProps: Partial<Props> = {\n        kind: InviteKind.Dm,\n        initialText: \"\",\n    };\n\n    private debounceTimer: number | null = null; // actually number because we're in the browser\n    private editorRef = createRef<HTMLInputElement>();\n    private numberEntryFieldRef = createRef<Field>();\n    private unmounted = false;\n    private encryptionByDefault = false;\n    private profilesStore: UserProfilesStore;\n\n    public constructor(props: Props) {\n        super(props);\n\n        if (props.kind === InviteKind.Invite && !props.roomId) {\n            throw new Error(\"When using InviteKind.Invite a roomId is required for an InviteDialog\");\n        } else if (props.kind === InviteKind.CallTransfer && !props.call) {\n            throw new Error(\"When using InviteKind.CallTransfer a call is required for an InviteDialog\");\n        }\n\n        this.profilesStore = SDKContextClass.instance.userProfilesStore;\n        const cli = MatrixClientPeg.safeGet();\n\n        const excludedIds = new Set([cli.getSafeUserId()]);\n        if (isRoomInvite(props)) {\n            const room = cli.getRoom(props.roomId);\n            if (!room) throw new Error(\"Room ID given to InviteDialog does not look like a room\");\n            const isFederated = room?.currentState.getStateEvents(EventType.RoomCreate, \"\")?.getContent()[\"m.federate\"];\n            room.getMembersWithMembership(KnownMembership.Invite).forEach((m) => excludedIds.add(m.userId));\n            room.getMembersWithMembership(KnownMembership.Join).forEach((m) => excludedIds.add(m.userId));\n            // add banned users, so we don't try to invite them\n            room.getMembersWithMembership(KnownMembership.Ban).forEach((m) => excludedIds.add(m.userId));\n            const ourHomeserver = cli.getDomain();\n            if (isFederated === false && ourHomeserver) {\n                // If this room isn't federated, we must be on the same server.\n                // exclude users from external servers\n                this.excludeExternals(ourHomeserver, excludedIds);\n            }\n        }\n\n        this.state = {\n            targets: [], // array of Member objects (see interface above)\n            filterText: this.props.initialText || \"\",\n            // Mutates alreadyInvited set so that buildSuggestions doesn't duplicate any users\n            recents: InviteDialog.buildRecents(excludedIds),\n            numRecentsShown: INITIAL_ROOMS_SHOWN,\n            suggestions: this.buildSuggestions(excludedIds),\n            numSuggestionsShown: INITIAL_ROOMS_SHOWN,\n            serverResultsMixin: [],\n            threepidResultsMixin: [],\n            canUseIdentityServer: !!cli.getIdentityServerUrl(),\n            tryingIdentityServer: false,\n            consultFirst: false,\n            dialPadValue: \"\",\n            currentTabId: TabId.UserDirectory,\n\n            unknownIdentityUsers: null,\n\n            busy: false,\n        };\n    }\n\n    public componentDidMount(): void {\n        this.unmounted = false;\n        this.encryptionByDefault = privateShouldBeEncrypted(MatrixClientPeg.safeGet());\n\n        if (this.props.initialText) {\n            this.updateSuggestions(this.props.initialText);\n        }\n    }\n\n    public componentWillUnmount(): void {\n        this.unmounted = true;\n    }\n\n    private onConsultFirstChange = (ev: React.ChangeEvent<HTMLInputElement>): void => {\n        this.setState({ consultFirst: ev.target.checked });\n    };\n\n    private excludeExternals(homeserver: string, excludedTargetIds: Set<string>): void {\n        const client = MatrixClientPeg.safeGet();\n        // users with room membership\n        const members = Object.values(buildMemberScores(client)).map(({ member }) => member.userId);\n        // users with dm membership\n        const roomMembers = Object.keys(DMRoomMap.shared().getUniqueRoomsWithIndividuals());\n        roomMembers.forEach((id) => members.push(id));\n        // filter duplicates and user IDs from external servers\n        const externals = new Set(members.filter((id) => !id.includes(homeserver)));\n        externals.forEach((id) => excludedTargetIds.add(id));\n    }\n\n    public static buildRecents(excludedTargetIds: Set<string>): Result[] {\n        const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals(); // map of userId => js-sdk Room\n\n        // Also pull in all the rooms that the room list tags as DMs so we don't miss anything: sometimes\n        // a room is absent from getUniqueRoomsWithIndividuals() above but is still tagged as a DM.\n        const dmTaggedRooms = RoomListStoreV3.instance.getDmRooms();\n        const myUserId = MatrixClientPeg.safeGet().getUserId();\n        for (const dmRoom of dmTaggedRooms) {\n            const otherMembers = dmRoom.getJoinedMembers().filter((u) => u.userId !== myUserId);\n            for (const member of otherMembers) {\n                if (rooms[member.userId]) continue; // already have a room\n\n                logger.warn(`Adding DM room for ${member.userId} as ${dmRoom.roomId} from tag, not DM map`);\n                rooms[member.userId] = dmRoom;\n            }\n        }\n\n        const recents: {\n            userId: string;\n            user: Member;\n            lastActive: number;\n        }[] = [];\n\n        for (const userId in rooms) {\n            // Filter out user IDs that are already in the room / should be excluded\n            if (excludedTargetIds.has(userId)) {\n                logger.warn(`[Invite:Recents] Excluding ${userId} from recents`);\n                continue;\n            }\n\n            const room = rooms[userId];\n            const roomMember = room.getMember(userId);\n            if (!roomMember) {\n                // just skip people who don't have memberships for some reason\n                logger.warn(`[Invite:Recents] ${userId} is missing a member object in their own DM (${room.roomId})`);\n                continue;\n            }\n\n            // Find the last timestamp for a message event\n            const searchTypes = [\"m.room.message\", \"m.room.encrypted\", \"m.sticker\"];\n            const maxSearchEvents = 20; // to prevent traversing history\n            let lastEventTs = 0;\n            if (room.timeline && room.timeline.length) {\n                for (let i = room.timeline.length - 1; i >= 0; i--) {\n                    const ev = room.timeline[i];\n                    if (searchTypes.includes(ev.getType())) {\n                        lastEventTs = ev.getTs();\n                        break;\n                    }\n                    if (room.timeline.length - i > maxSearchEvents) break;\n                }\n            }\n            if (!lastEventTs) {\n                // something weird is going on with this room\n                logger.warn(`[Invite:Recents] ${userId} (${room.roomId}) has a weird last timestamp: ${lastEventTs}`);\n                continue;\n            }\n\n            recents.push({ userId, user: toMember(roomMember), lastActive: lastEventTs });\n            // We mutate the given set so that any later callers avoid duplicating these users\n            excludedTargetIds.add(userId);\n        }\n        if (recents.length === 0) logger.warn(\"[Invite:Recents] No recents to suggest!\");\n\n        // Sort the recents by last active to save us time later\n        recents.sort((a, b) => b.lastActive - a.lastActive);\n\n        return recents;\n    }\n\n    private buildSuggestions(excludedTargetIds: Set<string>): { userId: string; user: Member }[] {\n        const cli = MatrixClientPeg.safeGet();\n        const activityScores = buildActivityScores(cli);\n        const memberScores = buildMemberScores(cli);\n\n        const memberComparator = compareMembers(activityScores, memberScores);\n\n        return Object.values(memberScores)\n            .map(({ member }) => member)\n            .filter((member) => !excludedTargetIds.has(member.userId))\n            .sort(memberComparator)\n            .map((member) => ({ userId: member.userId, user: toMember(member) }));\n    }\n\n    private shouldAbortAfterInviteError(\n        states: MultiInviterCompletionStates,\n        inviter: MultiInviter,\n        room: Room,\n    ): boolean {\n        this.setState({ busy: false });\n        const userMap = new Map<string, Member>(this.state.targets.map((member) => [member.userId, member]));\n        return !showAnyInviteErrors(states, room, inviter, userMap);\n    }\n\n    private convertFilter(): Member[] {\n        // Check to see if there's anything to convert first\n        if (!this.state.filterText || !this.state.filterText.includes(\"@\")) return this.state.targets || [];\n\n        if (!this.canInviteMore()) {\n            // There should only be one third-party invite → do not allow more targets\n            return this.state.targets;\n        }\n\n        let newMember: Member | undefined;\n        if (this.state.filterText.startsWith(\"@\")) {\n            // Assume mxid\n            newMember = new DirectoryMember({ user_id: this.state.filterText });\n        } else if (SettingsStore.getValue(UIFeature.IdentityServer)) {\n            // Assume email\n            if (this.canInviteThirdParty()) {\n                newMember = new ThreepidMember(this.state.filterText);\n            }\n        }\n        if (!newMember) return this.state.targets;\n\n        const newTargets = [...(this.state.targets || []), newMember];\n        this.setState({ targets: newTargets, filterText: \"\" });\n        return newTargets;\n    }\n\n    private startDm = async (): Promise<void> => {\n        this.setBusy(true);\n\n        try {\n            const cli = MatrixClientPeg.safeGet();\n            const targets = this.convertFilter();\n            await startDmOnFirstMessage(cli, targets);\n            this.props.onFinished(true);\n        } catch (err) {\n            logger.error(err);\n            this.setState({\n                busy: false,\n                errorText: _t(\"invite|error_dm\"),\n            });\n        }\n    };\n\n    private setBusy(busy: boolean): void {\n        this.setState({\n            busy,\n        });\n    }\n\n    private inviteUsers = async (): Promise<void> => {\n        if (this.props.kind !== InviteKind.Invite) return;\n        this.setState({ busy: true });\n        this.convertFilter();\n        const targets = this.convertFilter();\n        const targetIds = targets.map((t) => t.userId);\n\n        const cli = MatrixClientPeg.safeGet();\n        const room = cli.getRoom(this.props.roomId);\n        if (!room) {\n            logger.error(\"Failed to find the room to invite users to\");\n            this.setState({\n                busy: false,\n                errorText: _t(\"invite|error_find_room\"),\n            });\n            return;\n        }\n\n        try {\n            const inviter = new MultiInviter(cli, this.props.roomId, {\n                // We show our own progress body, so don't pop up a separate dialog.\n                inhibitProgressDialog: true,\n            });\n            const states = await inviter.invite(targetIds);\n            if (!this.shouldAbortAfterInviteError(states, inviter, room)) {\n                // handles setting error message too\n                this.props.onFinished(true);\n            }\n        } catch (err) {\n            logger.error(err);\n            this.setState({\n                busy: false,\n                errorText: _t(\"invite|error_invite\"),\n            });\n        }\n    };\n\n    /**\n     * Start the process of actually sending invites or creating a DM.\n     *\n     * Called once we have shown the user all the necessary warnings.\n     */\n    private async startDmOrSendInvites(): Promise<void> {\n        if (this.props.kind === InviteKind.Dm) {\n            await this.startDm();\n        } else if (this.props.kind === InviteKind.Invite) {\n            await this.inviteUsers();\n        } else {\n            throw new Error(\"Unknown InviteKind: \" + this.props.kind);\n        }\n    }\n\n    private transferCall = async (): Promise<void> => {\n        if (this.props.kind !== InviteKind.CallTransfer) return;\n        if (this.state.currentTabId == TabId.UserDirectory) {\n            this.convertFilter();\n            const targets = this.convertFilter();\n            const targetIds = targets.map((t) => t.userId);\n            if (targetIds.length > 1) {\n                this.setState({\n                    errorText: _t(\"invite|error_transfer_multiple_target\"),\n                });\n                return;\n            }\n\n            SDKContextClass.instance.legacyCallHandler.startTransferToMatrixID(\n                this.props.call,\n                targetIds[0],\n                this.state.consultFirst,\n            );\n        } else {\n            SDKContextClass.instance.legacyCallHandler.startTransferToPhoneNumber(\n                this.props.call,\n                this.state.dialPadValue,\n                this.state.consultFirst,\n            );\n        }\n        this.props.onFinished(true);\n    };\n\n    private onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>): void => {\n        if (this.state.busy) return;\n\n        let handled = false;\n        const value = e.currentTarget.value.trim();\n        const action = getKeyBindingsManager().getAccessibilityAction(e);\n\n        switch (action) {\n            case KeyBindingAction.Space:\n                if (!value || !value.includes(\"@\") || value.includes(\" \")) break;\n\n                // when the user hits space and their input looks like an e-mail/MXID then try to convert it\n                this.convertFilter();\n                handled = true;\n                break;\n            case KeyBindingAction.Enter:\n                if (!value) break;\n\n                // when the user hits enter with something in their field try to convert it\n                this.convertFilter();\n                handled = true;\n                break;\n        }\n\n        if (handled) {\n            e.preventDefault();\n        }\n    };\n\n    private onCancel = (): void => {\n        this.props.onFinished(false);\n    };\n\n    private updateSuggestions = async (term: string): Promise<void> => {\n        MatrixClientPeg.safeGet()\n            .searchUserDirectory({ term })\n            .then(async (r): Promise<void> => {\n                if (term !== this.state.filterText) {\n                    // Discard the results - we were probably too slow on the server-side to make\n                    // these results useful. This is a race we want to avoid because we could overwrite\n                    // more accurate results.\n                    return;\n                }\n\n                if (!r.results) r.results = [];\n\n                // While we're here, try and autocomplete a search result for the mxid itself\n                // if there's no matches (and the input looks like a mxid).\n                if (term[0] === \"@\" && term.indexOf(\":\") > 1) {\n                    try {\n                        const profile = await this.profilesStore.getOrFetchProfile(term, { shouldThrow: true });\n\n                        if (profile) {\n                            // If we have a profile, we have enough information to assume that\n                            // the mxid can be invited - add it to the list. We stick it at the\n                            // top so it is most obviously presented to the user.\n                            r.results.splice(0, 0, {\n                                user_id: term,\n                                display_name: profile[\"displayname\"],\n                                avatar_url: profile[\"avatar_url\"],\n                            });\n                        }\n                    } catch (e) {\n                        logger.warn(\"Non-fatal error trying to make an invite for a user ID\", e);\n                    }\n                }\n\n                this.setState({\n                    serverResultsMixin: r.results.map((u) => ({\n                        userId: u.user_id,\n                        user: new DirectoryMember(u),\n                    })),\n                });\n            })\n            .catch((e) => {\n                logger.error(\"Error searching user directory:\");\n                logger.error(e);\n                this.setState({ serverResultsMixin: [] }); // clear results because it's moderately fatal\n            });\n\n        // Whenever we search the directory, also try to search the identity server. It's\n        // all debounced the same anyways.\n        if (!this.state.canUseIdentityServer) {\n            // The user doesn't have an identity server set - warn them of that.\n            this.setState({ tryingIdentityServer: true });\n            return;\n        }\n        if (Email.looksValid(term) && this.canInviteThirdParty() && SettingsStore.getValue(UIFeature.IdentityServer)) {\n            // Start off by suggesting the plain email while we try and resolve it\n            // to a real account.\n            this.setState({\n                // per above: the userId is a lie here - it's just a regular identifier\n                threepidResultsMixin: [{ user: new ThreepidMember(term), userId: term }],\n            });\n            try {\n                const authClient = new IdentityAuthClient();\n                const token = await authClient.getAccessToken();\n                // No token → unable to try a lookup\n                if (!token) return;\n\n                if (term !== this.state.filterText) return; // abandon hope\n\n                const lookup = await MatrixClientPeg.safeGet().lookupThreePid(\"email\", term, token);\n                if (term !== this.state.filterText) return; // abandon hope\n\n                if (!lookup || !(\"mxid\" in lookup)) {\n                    // We weren't able to find anyone - we're already suggesting the plain email\n                    // as an alternative, so do nothing.\n                    return;\n                }\n\n                // We append the user suggestion to give the user an option to click\n                // the email anyways, and so we don't cause things to jump around. In\n                // theory, the user would see the user pop up and think \"ah yes, that\n                // person!\"\n                const profile = await this.profilesStore.getOrFetchProfile(lookup.mxid);\n                if (term !== this.state.filterText || !profile) return; // abandon hope\n                this.setState({\n                    threepidResultsMixin: [\n                        ...this.state.threepidResultsMixin,\n                        {\n                            user: new DirectoryMember({\n                                user_id: lookup.mxid,\n                                display_name: profile.displayname,\n                                avatar_url: profile.avatar_url,\n                            }),\n                            // Use the search term as identifier, so that it shows up in suggestions.\n                            userId: term,\n                        },\n                    ],\n                });\n            } catch (e) {\n                logger.error(\"Error searching identity server:\");\n                logger.error(e);\n                this.setState({ threepidResultsMixin: [] }); // clear results because it's moderately fatal\n            }\n        }\n    };\n\n    private updateFilter = (e: React.ChangeEvent<HTMLInputElement>): void => {\n        const term = e.target.value;\n        this.setState({ filterText: term });\n\n        // Debounce server lookups to reduce spam. We don't clear the existing server\n        // results because they might still be vaguely accurate, likewise for races which\n        // could happen here.\n        if (this.debounceTimer) {\n            clearTimeout(this.debounceTimer);\n        }\n        this.debounceTimer = window.setTimeout(() => {\n            this.updateSuggestions(term);\n        }, 150); // 150ms debounce (human reaction time + some)\n    };\n\n    private showMoreRecents = (): void => {\n        this.setState({ numRecentsShown: this.state.numRecentsShown + INCREMENT_ROOMS_SHOWN });\n    };\n\n    private showMoreSuggestions = (): void => {\n        this.setState({ numSuggestionsShown: this.state.numSuggestionsShown + INCREMENT_ROOMS_SHOWN });\n    };\n\n    private toggleMember = (member: Member): void => {\n        if (!this.state.busy) {\n            let filterText = this.state.filterText;\n            let targets = this.state.targets.map((t) => t); // cheap clone for mutation\n            const idx = targets.findIndex((m) => m.userId === member.userId);\n            if (idx >= 0) {\n                targets.splice(idx, 1);\n            } else {\n                if (this.props.kind === InviteKind.CallTransfer && targets.length > 0) {\n                    targets = [];\n                }\n                targets.push(member);\n                filterText = \"\"; // clear the filter when the user accepts a suggestion\n            }\n            this.setState({ targets, filterText });\n\n            if (this.editorRef && this.editorRef.current) {\n                this.editorRef.current.focus();\n            }\n        }\n    };\n\n    private removeMember = (member: Member): void => {\n        const targets = this.state.targets.map((t) => t); // cheap clone for mutation\n        const idx = targets.indexOf(member);\n        if (idx >= 0) {\n            targets.splice(idx, 1);\n            this.setState({ targets });\n        }\n\n        if (this.editorRef && this.editorRef.current) {\n            this.editorRef.current.focus();\n        }\n    };\n\n    private parseFilter(filter: string): string[] {\n        return filter\n            .split(/[\\s,]+/)\n            .map((p) => p.trim())\n            .filter((p) => !!p); // filter empty strings\n    }\n\n    private onPaste = async (e: React.ClipboardEvent): Promise<void> => {\n        if (this.state.filterText) {\n            // if the user has already typed something, just let them\n            // paste normally.\n            return;\n        }\n\n        const text = e.clipboardData.getData(\"text\");\n        const potentialAddresses = this.parseFilter(text);\n        // one search term which is not a mxid or email address\n        if (potentialAddresses.length === 1 && !potentialAddresses[0].includes(\"@\")) {\n            return;\n        }\n\n        // Prevent the text being pasted into the input\n        e.preventDefault();\n\n        // Process it as a list of addresses to add instead\n        const possibleMembers = [\n            // If we can avoid hitting the profile endpoint, we should.\n            ...this.state.recents,\n            ...this.state.suggestions,\n            ...this.state.serverResultsMixin,\n            ...this.state.threepidResultsMixin,\n        ];\n        const toAdd: Member[] = [];\n        const failed: string[] = [];\n\n        // Addresses that could not be added.\n        // Will be displayed as filter text to provide feedback.\n        const unableToAddMore: string[] = [];\n\n        for (const address of potentialAddresses) {\n            const member = possibleMembers.find((m) => m.userId === address);\n            if (member) {\n                if (this.canInviteMore([...this.state.targets, ...toAdd])) {\n                    toAdd.push(member.user);\n                } else {\n                    // Invite not possible for current targets and pasted targets.\n                    unableToAddMore.push(address);\n                }\n                continue;\n            }\n\n            if (Email.looksValid(address)) {\n                if (this.canInviteThirdParty([...this.state.targets, ...toAdd])) {\n                    toAdd.push(new ThreepidMember(address));\n                } else {\n                    // Third-party invite not possible for current targets and pasted targets.\n                    unableToAddMore.push(address);\n                }\n                continue;\n            }\n\n            if (address[0] !== \"@\") {\n                failed.push(address); // not a user ID\n                continue;\n            }\n\n            try {\n                const profile = await this.profilesStore.getOrFetchProfile(address);\n                toAdd.push(\n                    new DirectoryMember({\n                        user_id: address,\n                        display_name: profile?.displayname,\n                        avatar_url: profile?.avatar_url,\n                    }),\n                );\n            } catch (e) {\n                logger.error(\"Error looking up profile for \" + address);\n                logger.error(e);\n                failed.push(address);\n            }\n        }\n        if (this.unmounted) return;\n\n        if (failed.length > 0) {\n            Modal.createDialog(QuestionDialog, {\n                title: _t(\"invite|error_find_user_title\"),\n                description: _t(\"invite|error_find_user_description\", { csvNames: failed.join(\", \") }),\n                button: _t(\"action|ok\"),\n            });\n        }\n\n        if (unableToAddMore) {\n            this.setState({\n                filterText: unableToAddMore.join(\" \"),\n                targets: uniqBy([...this.state.targets, ...toAdd], (t) => t.userId),\n            });\n        } else {\n            this.setState({\n                targets: uniqBy([...this.state.targets, ...toAdd], (t) => t.userId),\n            });\n        }\n    };\n\n    private onUseDefaultIdentityServerClick = (e: ButtonEvent): void => {\n        e.preventDefault();\n\n        // Update the IS in account data. Actually using it may trigger terms.\n        // eslint-disable-next-line react-hooks/rules-of-hooks\n        setToDefaultIdentityServer(MatrixClientPeg.safeGet());\n        this.setState({ canUseIdentityServer: true, tryingIdentityServer: false });\n    };\n\n    private onManageSettingsClick = (e: ButtonEvent): void => {\n        e.preventDefault();\n        dis.fire(Action.ViewUserSettings);\n        this.props.onFinished(false);\n    };\n\n    private renderSection(kind: \"recents\" | \"suggestions\"): ReactNode {\n        let sourceMembers = kind === \"recents\" ? this.state.recents : this.state.suggestions;\n        let showNum = kind === \"recents\" ? this.state.numRecentsShown : this.state.numSuggestionsShown;\n        const showMoreFn = kind === \"recents\" ? this.showMoreRecents.bind(this) : this.showMoreSuggestions.bind(this);\n        const lastActive = (m: Result): number | undefined => (kind === \"recents\" ? m.lastActive : undefined);\n        let sectionName = kind === \"recents\" ? _t(\"invite|recents_section\") : _t(\"common|suggestions\");\n\n        if (this.props.kind === InviteKind.Invite) {\n            sectionName = kind === \"recents\" ? _t(\"invite|suggestions_section\") : _t(\"common|suggestions\");\n        }\n\n        // Mix in the server results if we have any, but only if we're searching. We track the additional\n        // members separately because we want to filter sourceMembers but trust the mixin arrays to have\n        // the right members in them.\n        let priorityAdditionalMembers: Result[] = []; // Shows up before our own suggestions, higher quality\n        let otherAdditionalMembers: Result[] = []; // Shows up after our own suggestions, lower quality\n        const hasMixins = this.state.serverResultsMixin || this.state.threepidResultsMixin;\n        if (this.state.filterText && hasMixins && kind === \"suggestions\") {\n            // We don't want to duplicate members though, so just exclude anyone we've already seen.\n            // The type of u is a pain to define but members of both mixins have the 'userId' property\n            const notAlreadyExists = (u: any): boolean => {\n                return (\n                    !this.state.recents.some((m) => m.userId === u.userId) &&\n                    !sourceMembers.some((m) => m.userId === u.userId) &&\n                    !priorityAdditionalMembers.some((m) => m.userId === u.userId) &&\n                    !otherAdditionalMembers.some((m) => m.userId === u.userId)\n                );\n            };\n\n            otherAdditionalMembers = this.state.serverResultsMixin.filter(notAlreadyExists);\n            priorityAdditionalMembers = this.state.threepidResultsMixin.filter(notAlreadyExists);\n        }\n        const hasAdditionalMembers = priorityAdditionalMembers.length > 0 || otherAdditionalMembers.length > 0;\n\n        // Hide the section if there's nothing to filter by\n        if (sourceMembers.length === 0 && !hasAdditionalMembers) return null;\n\n        if (!this.canInviteThirdParty()) {\n            // It is currently not allowed to add more third-party invites. Filter them out.\n            priorityAdditionalMembers = priorityAdditionalMembers.filter((s) => s instanceof ThreepidMember);\n        }\n\n        // Do some simple filtering on the input before going much further. If we get no results, say so.\n        if (this.state.filterText) {\n            const filterBy = this.state.filterText.toLowerCase();\n            sourceMembers = sourceMembers.filter(\n                (m) => m.user.name.toLowerCase().includes(filterBy) || m.userId.toLowerCase().includes(filterBy),\n            );\n\n            if (sourceMembers.length === 0 && !hasAdditionalMembers) {\n                return (\n                    <div className=\"mx_InviteDialog_section\">\n                        <RichList\n                            title={sectionName}\n                            titleAttributes={{ \"role\": \"heading\", \"aria-level\": 3 }}\n                            isEmpty={true}\n                        >\n                            {_t(\"common|no_results\")}\n                        </RichList>\n                    </div>\n                );\n            }\n        }\n\n        // Now we mix in the additional members. Again, we presume these have already been filtered. We\n        // also assume they are more relevant than our suggestions and prepend them to the list.\n        sourceMembers = [...priorityAdditionalMembers, ...sourceMembers, ...otherAdditionalMembers];\n\n        // If we're going to hide one member behind 'show more', just use up the space of the button\n        // with the member's tile instead.\n        if (showNum === sourceMembers.length - 1) showNum++;\n\n        // .slice() will return an incomplete array but won't error on us if we go too far\n        const toRender = sourceMembers.slice(0, showNum);\n        const hasMore = toRender.length < sourceMembers.length;\n\n        let showMore: JSX.Element | undefined;\n        if (hasMore) {\n            showMore = (\n                <div className=\"mx_InviteDialog_section_showMore\">\n                    <AccessibleButton onClick={showMoreFn} kind=\"link\">\n                        {_t(\"common|show_more\")}\n                    </AccessibleButton>\n                </div>\n            );\n        }\n\n        const tiles = toRender.map((r) => (\n            <DMRoomTile\n                member={r.user}\n                lastActiveTs={lastActive(r)}\n                key={r.user.userId}\n                onToggle={this.toggleMember}\n                isSelected={this.state.targets.some((t) => t.userId === r.userId)}\n            />\n        ));\n\n        return (\n            <div className=\"mx_InviteDialog_section\">\n                <RichList title={sectionName} titleAttributes={{ \"role\": \"heading\", \"aria-level\": 3 }}>\n                    {tiles}\n                </RichList>\n                {showMore}\n            </div>\n        );\n    }\n\n    private renderEditor(): JSX.Element {\n        const targets = this.state.targets.map((t) => (\n            <DMUserTile member={t} onRemove={this.state.busy ? undefined : this.removeMember} key={t.userId} />\n        ));\n\n        return (\n            <PillInput\n                data-testid=\"invite-dialog-input-wrapper\"\n                className=\"mx_InviteDialog_editor\"\n                inputProps={{\n                    \"ref\": this.editorRef,\n                    \"value\": this.state.filterText,\n                    \"onKeyDown\": this.onKeyDown,\n                    \"onChange\": this.updateFilter,\n                    \"onPaste\": this.onPaste,\n                    \"placeholder\": _t(\"action|search\"),\n                    \"autoFocus\": true,\n                    \"disabled\":\n                        this.state.busy ||\n                        (this.props.kind == InviteKind.CallTransfer && this.state.targets.length > 0),\n                    \"data-testid\": \"invite-dialog-input\",\n                }}\n                onRemoveChildren={() =>\n                    !this.state.busy && this.removeMember(this.state.targets[this.state.targets.length - 1])\n                }\n            >\n                {targets}\n            </PillInput>\n        );\n    }\n\n    private renderIdentityServerWarning(): ReactNode {\n        if (\n            !this.state.tryingIdentityServer ||\n            this.state.canUseIdentityServer ||\n            !SettingsStore.getValue(UIFeature.IdentityServer)\n        ) {\n            return null;\n        }\n\n        const defaultIdentityServerUrl = getDefaultIdentityServerUrl();\n        if (defaultIdentityServerUrl) {\n            return (\n                <div className=\"mx_InviteDialog_identityServer\">\n                    {_t(\n                        \"invite|email_use_default_is\",\n                        {\n                            defaultIdentityServerName: abbreviateUrl(defaultIdentityServerUrl),\n                        },\n                        {\n                            default: (sub) => (\n                                <AccessibleButton kind=\"link_inline\" onClick={this.onUseDefaultIdentityServerClick}>\n                                    {sub}\n                                </AccessibleButton>\n                            ),\n                            settings: (sub) => (\n                                <AccessibleButton kind=\"link_inline\" onClick={this.onManageSettingsClick}>\n                                    {sub}\n                                </AccessibleButton>\n                            ),\n                        },\n                    )}\n                </div>\n            );\n        } else {\n            return (\n                <div className=\"mx_InviteDialog_identityServer\">\n                    {_t(\n                        \"invite|email_use_is\",\n                        {},\n                        {\n                            settings: (sub) => (\n                                <AccessibleButton kind=\"link_inline\" onClick={this.onManageSettingsClick}>\n                                    {sub}\n                                </AccessibleButton>\n                            ),\n                        },\n                    )}\n                </div>\n            );\n        }\n    }\n\n    private onDialFormSubmit = (ev: SyntheticEvent): void => {\n        ev.preventDefault();\n        this.transferCall();\n    };\n\n    private onDialChange = (ev: React.ChangeEvent<HTMLInputElement>): void => {\n        this.setState({ dialPadValue: ev.currentTarget.value });\n    };\n\n    private onDigitPress = (digit: string, ev: ButtonEvent): void => {\n        this.setState({ dialPadValue: this.state.dialPadValue + digit });\n\n        // Keep the number field focused so that keyboard entry is still available\n        // However, don't focus if this wasn't the result of directly clicking on the button,\n        // i.e someone using keyboard navigation.\n        if (ev.type === \"click\") {\n            this.numberEntryFieldRef.current?.focus();\n        }\n    };\n\n    private onDeletePress = (ev: ButtonEvent): void => {\n        if (this.state.dialPadValue.length === 0) return;\n        this.setState({ dialPadValue: this.state.dialPadValue.slice(0, -1) });\n\n        // Keep the number field focused so that keyboard entry is still available\n        // However, don't focus if this wasn't the result of directly clicking on the button,\n        // i.e someone using keyboard navigation.\n        if (ev.type === \"click\") {\n            this.numberEntryFieldRef.current?.focus();\n        }\n    };\n\n    private onTabChange = (tabId: TabId): void => {\n        this.setState({ currentTabId: tabId });\n    };\n\n    private async onLinkClick(this: void, e: React.MouseEvent<HTMLAnchorElement>): Promise<void> {\n        e.preventDefault();\n        selectText(e.currentTarget);\n    }\n\n    private get screenName(): ScreenName | undefined {\n        switch (this.props.kind) {\n            case InviteKind.Dm:\n                return \"StartChat\";\n            default:\n                return undefined;\n        }\n    }\n\n    /**\n     * If encryption by default is enabled, third-party invites should be encrypted as well.\n     * For encryption to work, the other side requires a device.\n     * To achieve this Element implements a waiting room until all have joined.\n     * Waiting for many users degrades the UX → only one email invite is allowed at a time.\n     *\n     * @param targets - Optional member list to check. Uses targets from state if not provided.\n     */\n    private canInviteMore(targets?: (Member | RoomMember)[]): boolean {\n        targets = targets || this.state.targets;\n        return this.canInviteThirdParty(targets) || !targets.some((t) => t instanceof ThreepidMember);\n    }\n\n    /**\n     * A third-party invite is possible if\n     * - this is a non-DM dialog or\n     * - there are no invites yet or\n     * - encryption by default is not enabled\n     *\n     * Also see {@link InviteDialog#canInviteMore}.\n     *\n     * @param targets - Optional member list to check. Uses targets from state if not provided.\n     */\n    private canInviteThirdParty(targets?: (Member | RoomMember)[]): boolean {\n        targets = targets || this.state.targets;\n        return this.props.kind !== InviteKind.Dm || targets.length === 0 || !this.encryptionByDefault;\n    }\n\n    private hasFilterAtLeastOneEmail(): boolean {\n        if (!this.state.filterText) return false;\n\n        return this.parseFilter(this.state.filterText).some((address: string) => {\n            return Email.looksValid(address);\n        });\n    }\n\n    private hasSelection(): boolean {\n        return this.state.targets.length > 0 || (!!this.state.filterText && this.state.filterText.includes(\"@\"));\n    }\n\n    /**\n     * Render the \"suggestions\" section, which shows a list of people you might want to invite, together with any\n     * errors from the previous iteration.\n     */\n    private renderSuggestions(): JSX.Element {\n        // If we're starting a DM, add a footer which showing our matrix.to link, for copying & pasting.\n        let footer;\n        if (this.props.kind === InviteKind.Dm) {\n            const link = makeUserPermalink(MatrixClientPeg.safeGet().getSafeUserId());\n            footer = (\n                <div className=\"mx_InviteDialog_footer\">\n                    <h3>{_t(\"invite|send_link_prompt\")}</h3>\n                    <CopyableText getTextToCopy={() => makeUserPermalink(MatrixClientPeg.safeGet().getSafeUserId())}>\n                        <a className=\"mx_InviteDialog_footer_link\" href={link} onClick={this.onLinkClick}>\n                            {link}\n                        </a>\n                    </CopyableText>\n                </div>\n            );\n        }\n\n        let results: React.ReactNode | null = null;\n        let onlyOneThreepidNote: React.ReactNode | null = null;\n\n        if (!this.canInviteMore() || (this.hasFilterAtLeastOneEmail() && !this.canInviteThirdParty())) {\n            // We are in DM case here, because of the checks in canInviteMore() / canInviteThirdParty().\n            // Show a note saying \"Invites by email can only be sent one at a time\".\n            onlyOneThreepidNote = <div className=\"mx_InviteDialog_oneThreepid\">{_t(\"invite|email_limit_one\")}</div>;\n        } else {\n            let extraSection;\n            if (this.props.kind === InviteKind.Dm) {\n                // Some extra words saying \"Some suggestions may be hidden for privacy\"\n                extraSection = (\n                    <div className=\"mx_InviteDialog_section_hidden_suggestions_disclaimer\">\n                        <span>{_t(\"invite|suggestions_disclaimer\")}</span>\n                        <p>{_t(\"invite|suggestions_disclaimer_prompt\")}</p>\n                    </div>\n                );\n            }\n\n            results = (\n                <div className=\"mx_InviteDialog_userSections\">\n                    {this.renderSection(\"recents\")}\n                    {this.renderSection(\"suggestions\")}\n                    {extraSection}\n                </div>\n            );\n        }\n\n        return (\n            <React.Fragment>\n                {this.renderIdentityServerWarning()}\n                <div className=\"error\">{this.state.errorText}</div>\n                {onlyOneThreepidNote}\n                {results}\n                {footer}\n            </React.Fragment>\n        );\n    }\n\n    /**\n     * Handle the user pressing the Go/Invite button in the \"Start Chat\" or \"Invite users\" view.\n     *\n     * We check if any of the users lack a known cryptographic identity, and show a warning if so.\n     */\n    private async onGoButtonPressed(): Promise<void> {\n        this.setBusy(true);\n\n        const targets = this.convertFilter();\n        const unknownIdentityUsers: Member[] = [];\n        const cli = MatrixClientPeg.safeGet();\n        const crypto = cli.getCrypto();\n        if (crypto) {\n            for (const t of targets) {\n                const addressType = getAddressType(t.userId);\n                if (\n                    addressType !== AddressType.MatrixUserId ||\n                    !(await crypto.getUserVerificationStatus(t.userId)).known\n                ) {\n                    unknownIdentityUsers.push(t);\n                }\n            }\n        }\n\n        // If we have some users with unknown identities, show the warning page.\n        if (unknownIdentityUsers.length > 0) {\n            logger.debug(\n                \"InviteDialog: Warning about users with unknown identities:\",\n                unknownIdentityUsers.map((u) => u.userId),\n            );\n            this.setState({ unknownIdentityUsers: unknownIdentityUsers, busy: false });\n        } else {\n            // Otherwise, transition directly to sending the relevant invites.\n            await this.startDmOrSendInvites();\n        }\n    }\n\n    /**\n     * Render content of the \"users\" that is used for both invites and \"start chat\".\n     */\n    private renderMainTab(): JSX.Element {\n        let helpText;\n        let buttonText;\n        const identityServersEnabled = SettingsStore.getValue(UIFeature.IdentityServer);\n\n        const cli = MatrixClientPeg.safeGet();\n        const userId = cli.getUserId()!;\n        if (this.props.kind === InviteKind.Dm) {\n            if (identityServersEnabled) {\n                helpText = _t(\n                    \"invite|start_conversation_name_email_mxid_prompt\",\n                    {},\n                    {\n                        userId: () => {\n                            return (\n                                <a href={makeUserPermalink(userId)} rel=\"noreferrer noopener\" target=\"_blank\">\n                                    {userId}\n                                </a>\n                            );\n                        },\n                    },\n                );\n            } else {\n                helpText = _t(\n                    \"invite|start_conversation_name_mxid_prompt\",\n                    {},\n                    {\n                        userId: () => {\n                            return (\n                                <a href={makeUserPermalink(userId)} rel=\"noreferrer noopener\" target=\"_blank\">\n                                    {userId}\n                                </a>\n                            );\n                        },\n                    },\n                );\n            }\n\n            buttonText = _t(\"action|go\");\n        } else if (this.props.kind === InviteKind.Invite) {\n            const roomId = this.props.roomId;\n            const room = MatrixClientPeg.get()?.getRoom(roomId);\n            const isSpace = room?.isSpaceRoom();\n\n            let helpTextUntranslated;\n            if (isSpace) {\n                if (identityServersEnabled) {\n                    helpTextUntranslated = _td(\"invite|name_email_mxid_share_space\");\n                } else {\n                    helpTextUntranslated = _td(\"invite|name_mxid_share_space\");\n                }\n            } else {\n                if (identityServersEnabled) {\n                    helpTextUntranslated = _td(\"invite|name_email_mxid_share_room\");\n                } else {\n                    helpTextUntranslated = _td(\"invite|name_mxid_share_room\");\n                }\n            }\n\n            helpText = _t(\n                helpTextUntranslated,\n                {},\n                {\n                    userId: () => (\n                        <a\n                            className=\"mx_InviteDialog_helpText_userId\"\n                            href={makeUserPermalink(userId)}\n                            rel=\"noreferrer noopener\"\n                            target=\"_blank\"\n                        >\n                            {userId}\n                        </a>\n                    ),\n                    a: (sub) => (\n                        <a href={makeRoomPermalink(cli, roomId)} rel=\"noreferrer noopener\" target=\"_blank\">\n                            {sub}\n                        </a>\n                    ),\n                },\n            );\n\n            buttonText = _t(\"action|invite\");\n        } else {\n            throw new Error(\"Unknown InviteDialog kind: \" + this.props.kind);\n        }\n\n        const onGoButtonPressed = (): void => {\n            this.onGoButtonPressed().catch((e) => logErrorAndShowErrorDialog(\"Error processing invites\", e));\n        };\n\n        return (\n            <React.Fragment>\n                <p className=\"mx_InviteDialog_helpText\">{helpText}</p>\n                <div className=\"mx_InviteDialog_addressBar\">\n                    {this.renderEditor()}\n                    <AccessibleButton\n                        kind=\"primary\"\n                        onClick={onGoButtonPressed}\n                        className=\"mx_InviteDialog_goButton\"\n                        disabled={this.state.busy || !this.hasSelection()}\n                    >\n                        {buttonText}\n                    </AccessibleButton>\n                </div>\n                {this.state.busy ? <InviteProgressBody /> : this.renderSuggestions()}\n            </React.Fragment>\n        );\n    }\n\n    /** Callback function, which handles the user clicking \"Remove\" on the {@link UnknwownIdentityUsersWarningDialog}. */\n    private onRemoveUnknownIdentityUsersClicked = (): void => {\n        // Remove the unknown identity users, then return to the previous screen\n        const newTargets: Member[] = [];\n        for (const target of this.state.targets) {\n            if (!this.state.unknownIdentityUsers?.find((m) => m.userId == target.userId)) {\n                newTargets.push(target);\n            }\n        }\n        this.setState({\n            targets: newTargets,\n            unknownIdentityUsers: null,\n        });\n    };\n\n    /**\n     * Render the complete dialog, given this is not a call transfer dialog.\n     *\n     * See also: {@link renderCallTransferDialog}.\n     */\n    private renderRegularDialog(): React.ReactNode {\n        if (this.props.kind !== InviteKind.Dm && this.props.kind !== InviteKind.Invite) {\n            throw new Error(\"Unsupported InviteDialog kind: \" + this.props.kind);\n        }\n\n        if (this.state.unknownIdentityUsers !== null) {\n            return (\n                <UnknownIdentityUsersWarningDialog\n                    onCancel={this.props.onFinished}\n                    onContinue={() => {\n                        this.setState({ unknownIdentityUsers: null });\n                        this.startDmOrSendInvites().catch((e) =>\n                            logErrorAndShowErrorDialog(\"Error processing invites\", e),\n                        );\n                    }}\n                    onRemove={this.onRemoveUnknownIdentityUsersClicked}\n                    screenName={this.screenName}\n                    kind={this.props.kind}\n                    users={this.state.unknownIdentityUsers}\n                />\n            );\n        }\n\n        let title;\n        if (this.props.kind === InviteKind.Dm) {\n            title = _t(\"space|add_existing_room_space|dm_heading\");\n        } else if (this.props.kind === InviteKind.Invite) {\n            const roomId = this.props.roomId;\n            const room = MatrixClientPeg.get()?.getRoom(roomId);\n            const isSpace = room?.isSpaceRoom();\n            title = isSpace\n                ? _t(\"invite|to_space\", {\n                      spaceName: room?.name || _t(\"common|unnamed_space\"),\n                  })\n                : _t(\"invite|to_room\", {\n                      roomName: room?.name || _t(\"common|unnamed_room\"),\n                  });\n        }\n\n        return (\n            <BaseDialog\n                className=\"mx_InviteDialog_other\"\n                hasCancel={true}\n                onFinished={this.props.onFinished}\n                title={title}\n                screenName={this.screenName}\n            >\n                <div className=\"mx_InviteDialog_content\">{this.renderMainTab()}</div>\n            </BaseDialog>\n        );\n    }\n\n    /**\n     * Render the complete call transfer dialog.\n     *\n     * See also: {@link renderRegularDialog}.\n     */\n    private renderCallTransferDialog(): React.ReactNode {\n        const usersSection = (\n            <React.Fragment>\n                <div className=\"mx_InviteDialog_addressBar\">{this.renderEditor()}</div>\n                {this.state.busy ? <InviteProgressBody /> : this.renderSuggestions()}\n            </React.Fragment>\n        );\n\n        const tabs: NonEmptyArray<Tab<TabId>> = [\n            new Tab(\n                TabId.UserDirectory,\n                _td(\"invite|transfer_user_directory_tab\"),\n                <UserProfileSolidIcon key={TabId.UserDirectory} />,\n                usersSection,\n            ),\n        ];\n\n        const backspaceButton = <DialPadBackspaceButton onBackspacePress={this.onDeletePress} />;\n\n        // Only show the backspace button if the field has content\n        let dialPadField;\n        if (this.state.dialPadValue.length !== 0) {\n            dialPadField = (\n                <Field\n                    ref={this.numberEntryFieldRef}\n                    className=\"mx_InviteDialog_dialPadField\"\n                    id=\"dialpad_number\"\n                    value={this.state.dialPadValue}\n                    autoFocus={true}\n                    onChange={this.onDialChange}\n                    postfixComponent={backspaceButton}\n                />\n            );\n        } else {\n            dialPadField = (\n                <Field\n                    ref={this.numberEntryFieldRef}\n                    className=\"mx_InviteDialog_dialPadField\"\n                    id=\"dialpad_number\"\n                    value={this.state.dialPadValue}\n                    autoFocus={true}\n                    onChange={this.onDialChange}\n                />\n            );\n        }\n\n        const dialPadSection = (\n            <div className=\"mx_InviteDialog_dialPad\">\n                <form onSubmit={this.onDialFormSubmit}>{dialPadField}</form>\n                <Dialpad hasDial={false} onDigitPress={this.onDigitPress} onDeletePress={this.onDeletePress} />\n            </div>\n        );\n        tabs.push(new Tab(TabId.DialPad, _td(\"invite|transfer_dial_pad_tab\"), <DialPadIcon />, dialPadSection));\n\n        const consultConnectSection = (\n            <div className=\"mx_InviteDialog_transferConsultConnect\">\n                <label>\n                    <input type=\"checkbox\" checked={this.state.consultFirst} onChange={this.onConsultFirstChange} />\n                    {_t(\"voip|transfer_consult_first_label\")}\n                </label>\n                <AccessibleButton\n                    kind=\"secondary\"\n                    onClick={this.onCancel}\n                    className=\"mx_InviteDialog_transferConsultConnect_pushRight\"\n                >\n                    {_t(\"action|cancel\")}\n                </AccessibleButton>\n                <AccessibleButton\n                    kind=\"primary\"\n                    onClick={this.transferCall}\n                    disabled={!this.hasSelection() && this.state.dialPadValue === \"\"}\n                >\n                    {_t(\"action|transfer\")}\n                </AccessibleButton>\n            </div>\n        );\n\n        const dialogContent = (\n            <React.Fragment>\n                <TabbedView<TabId>\n                    tabs={tabs}\n                    activeTabId={this.state.currentTabId}\n                    tabLocation={TabLocation.TOP}\n                    onChange={this.onTabChange}\n                />\n                {consultConnectSection}\n            </React.Fragment>\n        );\n\n        return (\n            <BaseDialog\n                className=\"mx_InviteDialog_transfer\"\n                hasCancel={true}\n                onFinished={this.props.onFinished}\n                title={_t(\"action|transfer\")}\n                screenName={this.screenName}\n            >\n                <div className=\"mx_InviteDialog_content\">{dialogContent}</div>\n            </BaseDialog>\n        );\n    }\n\n    public render(): React.ReactNode {\n        if (this.props.kind === InviteKind.CallTransfer) {\n            return this.renderCallTransferDialog();\n        } else {\n            return this.renderRegularDialog();\n        }\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport enum InviteKind {\n    Dm = \"dm\",\n    Invite = \"invite\",\n    // NB. This dialog needs the 'mx_InviteDialog_transferWrapper' wrapper class to have the correct\n    // padding on the bottom (because all modals have 24px padding on all sides), so this needs to\n    // be passed when creating the modal\n    CallTransfer = \"call_transfer\",\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport InlineSpinner from \"../elements/InlineSpinner\";\nimport { _t } from \"../../../languageHandler\";\n\n/** The common body of components that show the progress of sending room invites. */\nconst InviteProgressBody: React.FC = () => {\n    return (\n        <div className=\"mx_InviteProgressBody\">\n            <InlineSpinner size={32} />\n            <h1>{_t(\"invite|progress|preparing\")}</h1>\n            {_t(\"invite|progress|dont_close\")}\n        </div>\n    );\n};\n\nexport default InviteProgressBody;\n","/*\nCopyright 2024-2025 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 New Vector Ltd\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2017 Vector Creations Ltd\nCopyright 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent, type JSX, useCallback, useState } from \"react\";\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { _t, UserFriendlyError } from \"../../../languageHandler\";\nimport { getDeviceCryptoInfo } from \"../../../utils/crypto/deviceInfo\";\nimport QuestionDialog from \"./QuestionDialog\";\nimport Modal from \"../../../Modal\";\nimport InfoDialog from \"./InfoDialog\";\nimport Field from \"../elements/Field\";\nimport ErrorDialog from \"./ErrorDialog\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\n\ninterface Props {\n    onFinished(confirm?: boolean): void;\n}\n\n/**\n * A dialog to allow us to verify devices logged in with clients that can't do\n * the verification themselves. Intended for use as a dev tool.\n *\n * Requires entering the fingerprint (\"session key\") of the device in an attempt\n * to prevent users being tricked into verifying a malicious device.\n */\nexport function ManualDeviceKeyVerificationDialog({ onFinished }: Readonly<Props>): JSX.Element {\n    const [deviceId, setDeviceId] = useState(\"\");\n    const [fingerprint, setFingerprint] = useState(\"\");\n\n    const client = MatrixClientPeg.safeGet();\n\n    const onDialogFinished = useCallback(\n        async (confirm: boolean) => {\n            if (confirm) {\n                await manuallyVerifyDevice(client, deviceId, fingerprint);\n            }\n            onFinished(confirm);\n        },\n        [client, deviceId, fingerprint, onFinished],\n    );\n\n    const onDeviceIdChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n        setDeviceId(e.target.value);\n    }, []);\n\n    const onFingerprintChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n        setFingerprint(e.target.value);\n    }, []);\n\n    const body = (\n        <div>\n            <p>{_t(\"encryption|verification|manual|text\")}</p>\n            <div className=\"mx_DeviceVerifyDialog_cryptoSection\">\n                <Field\n                    className=\"mx_TextInputDialog_input\"\n                    type=\"text\"\n                    label={_t(\"encryption|verification|manual|device_id\")}\n                    value={deviceId}\n                    onChange={onDeviceIdChange}\n                />\n                <Field\n                    className=\"mx_TextInputDialog_input\"\n                    type=\"text\"\n                    label={_t(\"encryption|verification|manual|fingerprint\")}\n                    value={fingerprint}\n                    onChange={onFingerprintChange}\n                />\n            </div>\n        </div>\n    );\n\n    return (\n        <QuestionDialog\n            title={_t(\"settings|sessions|verify_session\")}\n            description={body}\n            button={_t(\"settings|sessions|verify_session\")}\n            onFinished={onDialogFinished}\n        />\n    );\n}\n\n/**\n * Check the supplied fingerprint matches the fingerprint (\"session key\") of the\n * device with the supplied device ID, and if so, mark the device as verified.\n */\nexport async function manuallyVerifyDevice(client: MatrixClient, deviceId: string, fingerprint: string): Promise<void> {\n    try {\n        await doManuallyVerifyDevice(client, deviceId, fingerprint);\n\n        // Tell the user we verified everything\n        Modal.createDialog(InfoDialog, {\n            title: _t(\"encryption|verification|manual|success_title\"),\n            description: (\n                <div>\n                    <p>{_t(\"encryption|verification|manual|success_description\", { deviceId })}</p>\n                </div>\n            ),\n        });\n    } catch (e: any) {\n        // Display an error\n        const error = e instanceof UserFriendlyError ? e.translatedMessage : e.toString();\n        Modal.createDialog(ErrorDialog, {\n            title: _t(\"encryption|verification|manual|failure_title\"),\n            description: (\n                <div>\n                    <p>{_t(\"encryption|verification|manual|failure_description\", { deviceId, error })}</p>\n                </div>\n            ),\n        });\n    }\n}\n\nasync function doManuallyVerifyDevice(client: MatrixClient, deviceId: string, fingerprint: string): Promise<void> {\n    const userId = client.getUserId();\n    if (!userId) {\n        throw new UserFriendlyError(\"encryption|verification|manual|no_userid\", {\n            cause: undefined,\n        });\n    }\n\n    const crypto = client.getCrypto();\n    if (!crypto) {\n        throw new UserFriendlyError(\"encryption|verification|manual|no_crypto\");\n    }\n\n    const device = await getDeviceCryptoInfo(client, userId, deviceId);\n    if (!device) {\n        throw new UserFriendlyError(\"encryption|verification|manual|no_device\", {\n            deviceId,\n            cause: undefined,\n        });\n    }\n    const deviceTrust = await crypto.getDeviceVerificationStatus(userId, deviceId);\n\n    if (deviceTrust?.isVerified()) {\n        if (device.getFingerprint() === fingerprint) {\n            throw new UserFriendlyError(\"encryption|verification|manual|already_verified\", {\n                deviceId,\n                cause: undefined,\n            });\n        } else {\n            throw new UserFriendlyError(\"encryption|verification|manual|already_verified_and_wrong_fingerprint\", {\n                deviceId,\n                cause: undefined,\n            });\n        }\n    }\n\n    if (device.getFingerprint() !== fingerprint) {\n        const fprint = device.getFingerprint();\n        throw new UserFriendlyError(\"encryption|verification|manual|wrong_fingerprint\", {\n            fprint,\n            deviceId,\n            fingerprint,\n            cause: undefined,\n        });\n    }\n\n    // We've passed all the checks - do the device verification\n    await crypto.crossSignDevice(deviceId);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\nCopyright 2019 New Vector Ltd\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport const enum RoomSettingsTab {\n    General = \"ROOM_GENERAL_TAB\",\n    People = \"ROOM_PEOPLE_TAB\",\n    Voip = \"ROOM_VOIP_TAB\",\n    Security = \"ROOM_SECURITY_TAB\",\n    Roles = \"ROOM_ROLES_TAB\",\n    Notifications = \"ROOM_NOTIFICATIONS_TAB\",\n    Bridges = \"ROOM_BRIDGES_TAB\",\n    Advanced = \"ROOM_ADVANCED_TAB\",\n    PollHistory = \"ROOM_POLL_HISTORY_TAB\",\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEventHandler, type JSX, type ReactNode, type SyntheticEvent } from \"react\";\nimport { EventType, JoinRule } from \"matrix-js-sdk/src/matrix\";\nimport { Form, SettingsToggleInput } from \"@vector-im/compound-web\";\n\nimport { _t } from \"../../../languageHandler\";\nimport SdkConfig from \"../../../SdkConfig\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport Modal from \"../../../Modal\";\nimport BugReportDialog from \"./BugReportDialog\";\nimport BaseDialog from \"./BaseDialog\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport ProgressBar from \"../elements/ProgressBar\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\n\nexport interface IFinishedOpts {\n    continue: boolean;\n    invite: boolean;\n}\n\ninterface IProps {\n    roomId: string;\n    targetVersion: string;\n    description?: ReactNode;\n    doUpgrade?(opts: IFinishedOpts, fn: (progressText: string, progress: number, total: number) => void): Promise<void>;\n    onFinished(opts?: IFinishedOpts): void;\n}\n\ninterface Progress {\n    text: string;\n    progress: number;\n    total: number;\n}\n\ninterface IState {\n    inviteUsersToNewRoom: boolean;\n    progress?: Progress;\n}\n\nexport default class RoomUpgradeWarningDialog extends React.Component<IProps, IState> {\n    private readonly joinRule: JoinRule;\n    private readonly isInviteOrKnockRoom: boolean;\n    private readonly currentVersion?: string;\n\n    public constructor(props: IProps) {\n        super(props);\n\n        const room = MatrixClientPeg.safeGet().getRoom(this.props.roomId);\n        const joinRules = room?.currentState.getStateEvents(EventType.RoomJoinRules, \"\");\n        this.joinRule = joinRules?.getContent()[\"join_rule\"] ?? JoinRule.Invite;\n        this.isInviteOrKnockRoom = [JoinRule.Invite, JoinRule.Knock].includes(this.joinRule);\n        this.currentVersion = room?.getVersion();\n\n        this.state = {\n            inviteUsersToNewRoom: true,\n        };\n    }\n\n    private onProgressCallback = (text: string, progress: number, total: number): void => {\n        this.setState({\n            progress: {\n                text,\n                progress,\n                total,\n            },\n        });\n    };\n\n    private onContinue = async (): Promise<void> => {\n        const opts = {\n            continue: true,\n            invite: this.isInviteOrKnockRoom && this.state.inviteUsersToNewRoom,\n        };\n\n        await this.props.doUpgrade?.(opts, this.onProgressCallback);\n        this.props.onFinished(opts);\n    };\n\n    private onCancel = (): void => {\n        this.props.onFinished({ continue: false, invite: false });\n    };\n\n    private onInviteUsersToggle: ChangeEventHandler<HTMLInputElement> = (evt): void => {\n        this.setState({ inviteUsersToNewRoom: evt.target.checked });\n    };\n\n    private openBugReportDialog = (e: SyntheticEvent): void => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        Modal.createDialog(BugReportDialog, {});\n    };\n\n    public render(): React.ReactNode {\n        const brand = SdkConfig.get().brand;\n\n        let inviteToggle: JSX.Element | undefined;\n        if (this.isInviteOrKnockRoom) {\n            inviteToggle = (\n                <Form.Root\n                    onSubmit={(evt) => {\n                        evt.preventDefault();\n                        evt.stopPropagation();\n                    }}\n                >\n                    <SettingsToggleInput\n                        name=\"room-upgrade-warning\"\n                        checked={this.state.inviteUsersToNewRoom}\n                        onChange={this.onInviteUsersToggle}\n                        label={_t(\"room_settings|advanced|upgrade_warning_dialog_invite_label\")}\n                    />\n                </Form.Root>\n            );\n        }\n\n        let title: string;\n        switch (this.joinRule) {\n            case JoinRule.Invite:\n                title = _t(\"room_settings|advanced|upgrade_warning_dialog_title_private\");\n                break;\n            case JoinRule.Public:\n                title = _t(\"room_settings|advanced|upgrade_dwarning_ialog_title_public\");\n                break;\n            default:\n                title = _t(\"room_settings|advanced|upgrade_warning_dialog_title\");\n        }\n\n        let bugReports = <p>{_t(\"room_settings|advanced|upgrade_warning_dialog_report_bug_prompt\", { brand })}</p>;\n        if (SdkConfig.get().bug_report_endpoint_url) {\n            bugReports = (\n                <p>\n                    {_t(\n                        \"room_settings|advanced|upgrade_warning_dialog_report_bug_prompt_link\",\n                        {\n                            brand,\n                        },\n                        {\n                            a: (sub) => {\n                                return (\n                                    <AccessibleButton kind=\"link_inline\" onClick={this.openBugReportDialog}>\n                                        {sub}\n                                    </AccessibleButton>\n                                );\n                            },\n                        },\n                    )}\n                </p>\n            );\n        }\n\n        let footer: JSX.Element;\n        if (this.state.progress) {\n            footer = (\n                <span className=\"mx_RoomUpgradeWarningDialog_progress\">\n                    <ProgressBar value={this.state.progress.progress} max={this.state.progress.total} />\n                    <div className=\"mx_RoomUpgradeWarningDialog_progressText\">{this.state.progress.text}</div>\n                </span>\n            );\n        } else {\n            footer = (\n                <DialogButtons\n                    primaryButton={_t(\"action|upgrade\")}\n                    onPrimaryButtonClick={this.onContinue}\n                    cancelButton={_t(\"action|cancel\")}\n                    onCancel={this.onCancel}\n                />\n            );\n        }\n\n        return (\n            <BaseDialog\n                className=\"mx_RoomUpgradeWarningDialog\"\n                hasCancel={true}\n                fixedWidth={false}\n                onFinished={this.props.onFinished}\n                title={title}\n            >\n                <div>\n                    <p>{this.props.description || _t(\"room_settings|advanced|upgrade_warning_dialog_description\")}</p>\n                    <p>\n                        {_t(\n                            \"room_settings|advanced|upgrade_warning_dialog_explainer\",\n                            {},\n                            {\n                                b: (sub) => <strong>{sub}</strong>,\n                            },\n                        )}\n                    </p>\n                    {bugReports}\n                    <p>\n                        {_t(\n                            \"room_settings|advanced|upgrade_warning_dialog_footer\",\n                            {},\n                            {\n                                oldVersion: () => <code>{this.currentVersion}</code>,\n                                newVersion: () => <code>{this.props.targetVersion}</code>,\n                            },\n                        )}\n                    </p>\n                    {inviteToggle}\n                </div>\n                {footer}\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2018 New Vector Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, useMemo, useRef, useState } from \"react\";\nimport { Room, RoomMember, MatrixEvent, User } from \"matrix-js-sdk/src/matrix\";\nimport { Checkbox, Button } from \"@vector-im/compound-web\";\nimport LinkIcon from \"@vector-im/compound-design-tokens/assets/web/icons/link\";\nimport CheckIcon from \"@vector-im/compound-design-tokens/assets/web/icons/check\";\n\nimport { _t } from \"../../../languageHandler\";\nimport QRCode from \"../elements/QRCode\";\nimport { RoomPermalinkCreator, makeUserPermalink } from \"../../../utils/permalinks/Permalinks\";\nimport { copyPlaintext } from \"../../../utils/strings\";\nimport { UIFeature } from \"../../../settings/UIFeature\";\nimport BaseDialog from \"./BaseDialog\";\nimport { type XOR } from \"../../../@types/common\";\nimport { useSettingValue } from \"../../../hooks/useSettings.ts\";\nimport FacebookIcon from \"../../../../res/img/social/facebook.png\";\nimport TwitterIcon from \"../../../../res/img/social/twitter-2.png\";\nimport LinkedInIcon from \"../../../../res/img/social/linkedin.png\";\nimport RedditIcon from \"../../../../res/img/social/reddit.png\";\nimport EmailIcon from \"../../../../res/img/social/email-1.png\";\n\nconst SOCIALS = [\n    {\n        name: \"Facebook\",\n        img: FacebookIcon,\n        url: (url: string) => `https://www.facebook.com/sharer/sharer.php?u=${url}`,\n    },\n    {\n        name: \"Twitter\",\n        img: TwitterIcon,\n        url: (url: string) => `https://twitter.com/home?status=${url}`,\n    },\n    {\n        name: \"LinkedIn\",\n        img: LinkedInIcon,\n        url: (url: string) => `https://www.linkedin.com/shareArticle?mini=true&url=${url}`,\n    },\n    {\n        name: \"Reddit\",\n        img: RedditIcon,\n        url: (url: string) => `https://www.reddit.com/submit?url=${url}`,\n    },\n    {\n        name: \"email\",\n        img: EmailIcon,\n        url: (url: string) => `mailto:?body=${url}`,\n    },\n];\n\ninterface BaseProps {\n    /**\n     * A function that is called when the dialog is dismissed\n     */\n    onFinished(this: void): void;\n    /**\n     * An optional string to use as the dialog title.\n     * If not provided, an appropriate title for the target type will be used.\n     */\n    customTitle?: string;\n    /**\n     * An optional string to use as the dialog subtitle\n     */\n    subtitle?: string;\n}\n\ninterface Props extends BaseProps {\n    /**\n     * The target to link to.\n     * This can be a Room, User, RoomMember, or MatrixEvent or an already computed URL.\n     * A <u>matrix.to</u> link will be generated out of it if it's not already a url.\n     */\n    target: Room | User | RoomMember | URL;\n    /**\n     * Optional when the target is a Room, User, RoomMember or a URL.\n     * Mandatory when the target is a MatrixEvent.\n     */\n    permalinkCreator?: RoomPermalinkCreator;\n}\n\ninterface EventProps extends BaseProps {\n    /**\n     * The target to link to.\n     */\n    target: MatrixEvent;\n    /**\n     * Optional when the target is a Room, User, RoomMember or a URL.\n     * Mandatory when the target is a MatrixEvent.\n     */\n    permalinkCreator: RoomPermalinkCreator;\n}\n\ntype ShareDialogProps = XOR<Props, EventProps>;\n\n/**\n * A dialog to share a link to a room, user, room member or a matrix event.\n */\nexport function ShareDialog({ target, customTitle, onFinished, permalinkCreator }: ShareDialogProps): JSX.Element {\n    const showQrCode = useSettingValue(UIFeature.ShareQRCode);\n    const showSocials = useSettingValue(UIFeature.ShareSocial);\n\n    const timeoutIdRef = useRef<number>(undefined);\n    const [isCopied, setIsCopied] = useState(false);\n\n    const [linkToSpecificEvent, setLinkToSpecificEvent] = useState(target instanceof MatrixEvent);\n    const { title, url, checkboxLabel } = useTargetValues(target, linkToSpecificEvent, permalinkCreator);\n    const newTitle = customTitle ?? title;\n\n    return (\n        <BaseDialog\n            title={newTitle}\n            className=\"mx_ShareDialog\"\n            contentId=\"mx_Dialog_content\"\n            onFinished={onFinished}\n            fixedWidth={false}\n        >\n            <div className=\"mx_ShareDialog_content\">\n                <div className=\"mx_ShareDialog_top\">\n                    {showQrCode && <QRCode data={url} width={200} />}\n                    <span>{url}</span>\n                </div>\n                {checkboxLabel && (\n                    <label>\n                        <Checkbox\n                            defaultChecked={linkToSpecificEvent}\n                            onChange={(evt) => setLinkToSpecificEvent(evt.target.checked)}\n                        />\n                        {checkboxLabel}\n                    </label>\n                )}\n                <Button\n                    Icon={isCopied ? CheckIcon : LinkIcon}\n                    onClick={async () => {\n                        clearTimeout(timeoutIdRef.current);\n                        await copyPlaintext(url);\n                        setIsCopied(true);\n                        timeoutIdRef.current = setTimeout(() => setIsCopied(false), 2000);\n                    }}\n                >\n                    {isCopied ? _t(\"share|link_copied\") : _t(\"action|copy_link\")}\n                </Button>\n                {showSocials && <SocialLinks url={url} />}\n            </div>\n        </BaseDialog>\n    );\n}\n\n/**\n * Social links to share the link on different platforms.\n */\ninterface SocialLinksProps {\n    /**\n     * The URL to share.\n     */\n    url: string;\n}\n\n/**\n * The socials to share the link on.\n */\nfunction SocialLinks({ url }: SocialLinksProps): JSX.Element {\n    return (\n        <div className=\"mx_ShareDialog_social\">\n            {SOCIALS.map((social) => (\n                <a\n                    key={social.name}\n                    href={social.url(url)}\n                    target=\"_blank\"\n                    rel=\"noreferrer noopener\"\n                    title={social.name}\n                >\n                    <img src={social.img} alt={social.name} />\n                </a>\n            ))}\n        </div>\n    );\n}\n\n/**\n * Get the title, url and checkbox label for the dialog based on the target.\n * @param target\n * @param linkToSpecificEvent\n * @param permalinkCreator\n */\nfunction useTargetValues(\n    target: ShareDialogProps[\"target\"],\n    linkToSpecificEvent: boolean,\n    permalinkCreator?: RoomPermalinkCreator,\n): { title: string; url: string; checkboxLabel?: string } {\n    return useMemo(() => {\n        if (target instanceof URL) return { title: _t(\"share|title_link\"), url: target.toString() };\n        if (target instanceof User || target instanceof RoomMember)\n            return {\n                title: _t(\"share|title_user\"),\n                url: makeUserPermalink(target.userId),\n            };\n\n        if (target instanceof Room) {\n            const title = _t(\"share|title_room\");\n            const newPermalinkCreator = new RoomPermalinkCreator(target);\n            newPermalinkCreator.load();\n\n            const events = target.getLiveTimeline().getEvents();\n            return {\n                title,\n                url: linkToSpecificEvent\n                    ? newPermalinkCreator.forEvent(events[events.length - 1].getId()!)\n                    : newPermalinkCreator.forShareableRoom(),\n                ...(events.length > 0 && { checkboxLabel: _t(\"share|permalink_most_recent\") }),\n            };\n        }\n\n        // MatrixEvent is remaining and should have a permalinkCreator\n        const url = linkToSpecificEvent\n            ? permalinkCreator!.forEvent(target.getId()!)\n            : permalinkCreator!.forShareableRoom();\n        return {\n            title: _t(\"share|title_message\"),\n            url,\n            checkboxLabel: _t(\"share|permalink_message\"),\n        };\n    }, [target, linkToSpecificEvent, permalinkCreator]);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent, createRef } from \"react\";\n\nimport Field from \"../elements/Field\";\nimport { _t, _td } from \"../../../languageHandler\";\nimport { type IFieldState, type IValidationResult } from \"../elements/Validation\";\nimport BaseDialog from \"./BaseDialog\";\nimport DialogButtons from \"../elements/DialogButtons\";\n\ninterface IProps {\n    title: string;\n    description: React.ReactNode;\n    value: string;\n    placeholder?: string;\n    button?: string;\n    busyMessage: TranslationKey;\n    focus: boolean;\n    hasCancel: boolean;\n    validator?: (fieldState: IFieldState) => Promise<IValidationResult>; // result of withValidation\n    fixedWidth?: boolean;\n    onFinished(ok?: false, text?: void): void;\n    onFinished(ok: true, text: string): void;\n}\n\ninterface IState {\n    value: string;\n    busy: boolean;\n    valid: boolean;\n}\n\nexport default class TextInputDialog extends React.Component<IProps, IState> {\n    private field = createRef<Field>();\n\n    public static defaultProps: Partial<IProps> = {\n        title: \"\",\n        value: \"\",\n        description: \"\",\n        busyMessage: _td(\"common|loading\"),\n        focus: true,\n        hasCancel: true,\n    };\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            value: this.props.value,\n            busy: false,\n            valid: false,\n        };\n    }\n\n    public componentDidMount(): void {\n        if (this.props.focus) {\n            // Set the cursor at the end of the text input\n            // this._field.current.value = this.props.value;\n            this.field.current?.focus();\n        }\n    }\n\n    private onOk = async (ev: React.FormEvent): Promise<void> => {\n        ev.preventDefault();\n        if (!this.field.current) return;\n        if (this.props.validator) {\n            this.setState({ busy: true });\n            await this.field.current.validate({ allowEmpty: false });\n\n            if (!this.field.current.state.valid) {\n                this.field.current.focus();\n                this.field.current.validate({ allowEmpty: false, focused: true });\n                this.setState({ busy: false });\n                return;\n            }\n        }\n        this.props.onFinished(true, this.state.value);\n    };\n\n    private onCancel = (): void => {\n        this.props.onFinished(false);\n    };\n\n    private onChange = (ev: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({\n            value: ev.target.value,\n        });\n    };\n\n    private onValidate = async (fieldState: IFieldState): Promise<IValidationResult> => {\n        const result = await this.props.validator!(fieldState);\n        this.setState({\n            valid: !!result.valid,\n        });\n        return result;\n    };\n\n    public render(): React.ReactNode {\n        return (\n            <BaseDialog\n                className=\"mx_TextInputDialog\"\n                onFinished={this.props.onFinished}\n                title={this.props.title}\n                fixedWidth={this.props.fixedWidth}\n            >\n                <form onSubmit={this.onOk}>\n                    <div className=\"mx_Dialog_content\">\n                        <div className=\"mx_TextInputDialog_label\">\n                            <label htmlFor=\"textinput\"> {this.props.description} </label>\n                        </div>\n                        <div>\n                            <Field\n                                className=\"mx_TextInputDialog_input\"\n                                ref={this.field}\n                                type=\"text\"\n                                label={this.props.placeholder}\n                                value={this.state.value}\n                                onChange={this.onChange}\n                                onValidate={this.props.validator ? this.onValidate : undefined}\n                            />\n                        </div>\n                    </div>\n                </form>\n                <DialogButtons\n                    primaryButton={this.state.busy ? _t(this.props.busyMessage) : this.props.button}\n                    disabled={this.state.busy}\n                    onPrimaryButtonClick={this.onOk}\n                    onCancel={this.onCancel}\n                    hasCancel={this.props.hasCancel}\n                />\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2021 The Matrix.org Foundation C.I.C.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport { FilesIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport BaseDialog from \"./BaseDialog\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport { fileSize } from \"../../../utils/FileUtils\";\n\ninterface IProps {\n    file: File;\n    currentIndex: number;\n    totalFiles: number;\n    onFinished: (uploadConfirmed: boolean, uploadAll?: boolean) => void;\n}\n\ninterface IState {\n    objectUrl?: string;\n}\n\nexport default class UploadConfirmDialog extends React.Component<IProps, IState> {\n    public static defaultProps: Partial<IProps> = {\n        totalFiles: 1,\n        currentIndex: 0,\n    };\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {};\n    }\n\n    public componentDidMount(): void {\n        if (this.props.file.type.startsWith(\"image/\") || this.props.file.type.startsWith(\"video/\")) {\n            this.setState({\n                // We do not filter the mimetype using getBlobSafeMimeType here as if the user is uploading the file\n                // themselves they should be trusting it enough to open/load it, and it will be rendered into a hidden\n                // canvas for thumbnail generation anyway\n                objectUrl: URL.createObjectURL(this.props.file),\n            });\n        }\n    }\n\n    public componentWillUnmount(): void {\n        if (this.state.objectUrl) URL.revokeObjectURL(this.state.objectUrl);\n    }\n\n    private onCancelClick = (): void => {\n        this.props.onFinished(false);\n    };\n\n    private onUploadClick = (): void => {\n        this.props.onFinished(true);\n    };\n\n    private onUploadAllClick = (): void => {\n        this.props.onFinished(true, true);\n    };\n\n    public render(): React.ReactNode {\n        let title: string;\n        if (this.props.totalFiles > 1 && this.props.currentIndex !== undefined) {\n            title = _t(\"upload_file|title_progress\", {\n                current: this.props.currentIndex + 1,\n                total: this.props.totalFiles,\n            });\n        } else {\n            title = _t(\"upload_file|title\");\n        }\n\n        const fileId = `mx-uploadconfirmdialog-${this.props.file.name}`;\n        const mimeType = this.props.file.type;\n\n        let preview: JSX.Element | undefined;\n        let placeholder: JSX.Element | undefined;\n        if (mimeType.startsWith(\"image/\")) {\n            preview = (\n                <img\n                    className=\"mx_UploadConfirmDialog_imagePreview\"\n                    src={this.state.objectUrl}\n                    aria-labelledby={fileId}\n                />\n            );\n        } else if (mimeType.startsWith(\"video/\")) {\n            preview = (\n                <video\n                    className=\"mx_UploadConfirmDialog_imagePreview\"\n                    src={this.state.objectUrl}\n                    playsInline\n                    controls={false}\n                />\n            );\n        } else {\n            placeholder = <FilesIcon className=\"mx_UploadConfirmDialog_fileIcon\" height=\"18px\" width=\"18px\" />;\n        }\n\n        let uploadAllButton: JSX.Element | undefined;\n        if (this.props.currentIndex + 1 < this.props.totalFiles) {\n            uploadAllButton = <button onClick={this.onUploadAllClick}>{_t(\"upload_file|upload_all_button\")}</button>;\n        }\n\n        return (\n            <BaseDialog\n                className=\"mx_UploadConfirmDialog\"\n                fixedWidth={false}\n                onFinished={this.onCancelClick}\n                title={title}\n                contentId=\"mx_Dialog_content\"\n            >\n                <div id=\"mx_Dialog_content\">\n                    <div className=\"mx_UploadConfirmDialog_previewOuter\">\n                        <div className=\"mx_UploadConfirmDialog_previewInner\">\n                            {preview && <div>{preview}</div>}\n                            <div id={fileId}>\n                                {placeholder}\n                                {this.props.file.name} ({fileSize(this.props.file.size)})\n                            </div>\n                        </div>\n                    </div>\n                </div>\n\n                <DialogButtons\n                    primaryButton={_t(\"action|upload\")}\n                    hasCancel={false}\n                    onPrimaryButtonClick={this.onUploadClick}\n                    focus={true}\n                >\n                    {uploadAllButton}\n                </DialogButtons>\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\nCopyright 2022 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent, type ReactNode, useContext, useMemo, useRef, useState } from \"react\";\nimport { type IContent, type MatrixEvent, type TimelineEvents } from \"matrix-js-sdk/src/matrix\";\n\nimport { _t, _td } from \"../../../../languageHandler\";\nimport Field from \"../../elements/Field\";\nimport BaseTool, { DevtoolsContext, type IDevtoolsProps } from \"./BaseTool\";\nimport MatrixClientContext from \"../../../../contexts/MatrixClientContext\";\nimport withValidation from \"../../elements/Validation\";\nimport SyntaxHighlight from \"../../elements/SyntaxHighlight\";\n\nexport const stringify = (object: object): string => {\n    return JSON.stringify(object, null, 2);\n};\n\ninterface IEventEditorProps extends Pick<IDevtoolsProps, \"onBack\"> {\n    fieldDefs: IFieldDef[]; // immutable\n    defaultContent?: string;\n    onSend(this: void, fields: string[], content: IContent): Promise<unknown>;\n}\n\ninterface IFieldDef {\n    id: string;\n    label: TranslationKey;\n    default?: string;\n}\n\nexport const eventTypeField = (defaultValue?: string): IFieldDef => ({\n    id: \"eventType\",\n    label: _td(\"devtools|event_type\"),\n    default: defaultValue,\n});\n\nexport const stateKeyField = (defaultValue?: string): IFieldDef => ({\n    id: \"stateKey\",\n    label: _td(\"devtools|state_key\"),\n    default: defaultValue,\n});\n\nexport const stickyDurationField = (defaultValue?: number): IFieldDef => ({\n    id: \"sticky_duration\",\n    label: _td(\"devtools|sticky_duration\"),\n    default: `${defaultValue ?? 360000}`,\n});\n\nconst validateEventContent = withValidation<any, Error | undefined>({\n    async deriveData({ value }) {\n        try {\n            JSON.parse(value!);\n        } catch (e) {\n            return e as Error;\n        }\n        return undefined;\n    },\n    rules: [\n        {\n            key: \"validJson\",\n            test: ({ value }, error) => {\n                if (!value) return true;\n                return !error;\n            },\n            invalid: (error) => _t(\"devtools|invalid_json\") + \" \" + error,\n        },\n    ],\n});\n\nexport const EventEditor: React.FC<IEventEditorProps> = ({ fieldDefs, defaultContent = \"{\\n\\n}\", onSend, onBack }) => {\n    const [fieldData, setFieldData] = useState<string[]>(fieldDefs.map((def) => def.default ?? \"\"));\n    const [content, setContent] = useState<string>(defaultContent);\n    const contentField = useRef<Field>(null);\n\n    const fields = fieldDefs.map((def, i) => (\n        <Field\n            key={def.id}\n            id={def.id}\n            label={_t(def.label)}\n            size={42}\n            autoFocus={defaultContent === undefined && i === 0}\n            type=\"text\"\n            autoComplete=\"on\"\n            value={fieldData[i]}\n            onChange={(ev: ChangeEvent<HTMLInputElement>) =>\n                setFieldData((data) => {\n                    data[i] = ev.target.value;\n                    return [...data];\n                })\n            }\n        />\n    ));\n\n    const onAction = async (): Promise<string | undefined> => {\n        const valid = contentField.current ? await contentField.current.validate({}) : false;\n\n        if (!valid) {\n            contentField.current?.focus();\n            contentField.current?.validate({ focused: true });\n            return;\n        }\n\n        try {\n            const json = JSON.parse(content);\n            await onSend(fieldData, json);\n        } catch (e) {\n            return _t(\"devtools|failed_to_send\") + (e instanceof Error ? ` (${e.message})` : \"\");\n        }\n        return _t(\"devtools|event_sent\");\n    };\n\n    return (\n        <BaseTool actionLabel={_td(\"forward|send_label\")} onAction={onAction} onBack={onBack}>\n            <div className=\"mx_DevTools_eventTypeStateKeyGroup\">{fields}</div>\n\n            <Field\n                id=\"evContent\"\n                label={_t(\"devtools|event_content\")}\n                type=\"text\"\n                className=\"mx_DevTools_textarea\"\n                autoComplete=\"off\"\n                value={content}\n                onChange={(ev) => setContent(ev.target.value)}\n                element=\"textarea\"\n                onValidate={validateEventContent}\n                ref={contentField}\n                autoFocus={!!defaultContent}\n            />\n        </BaseTool>\n    );\n};\n\nexport interface IEditorProps extends Pick<IDevtoolsProps, \"onBack\"> {\n    mxEvent?: MatrixEvent;\n}\n\ninterface IViewerProps extends Required<IEditorProps> {\n    Editor: React.FC<IEditorProps>;\n    extraButton?: ReactNode;\n}\n\nexport const EventViewer: React.FC<IViewerProps> = ({ mxEvent, onBack, Editor, extraButton }) => {\n    const [editing, setEditing] = useState(false);\n\n    if (editing) {\n        const onBack = (): void => {\n            setEditing(false);\n        };\n        return <Editor mxEvent={mxEvent} onBack={onBack} />;\n    }\n\n    const onAction = async (): Promise<void> => {\n        setEditing(true);\n    };\n\n    return (\n        <BaseTool onBack={onBack} actionLabel={_td(\"action|edit\")} onAction={onAction} extraButton={extraButton}>\n            <SyntaxHighlight language=\"json\">{stringify(mxEvent.event)}</SyntaxHighlight>\n        </BaseTool>\n    );\n};\n\n// returns the id of the initial message, not the id of the previous edit\nconst getBaseEventId = (baseEvent: MatrixEvent): string => {\n    // show the replacing event, not the original, if it is an edit\n    const mxEvent = baseEvent.replacingEvent() ?? baseEvent;\n    return mxEvent.getWireContent()[\"m.relates_to\"]?.event_id ?? baseEvent.getId()!;\n};\n\nexport const TimelineEventEditor: React.FC<IEditorProps> = ({ mxEvent, onBack }) => {\n    const context = useContext(DevtoolsContext);\n    const cli = useContext(MatrixClientContext);\n\n    const fields = useMemo(() => [eventTypeField(mxEvent?.getType())], [mxEvent]);\n\n    const onSend = ([eventType]: string[], content: TimelineEvents[keyof TimelineEvents]): Promise<unknown> => {\n        return cli.sendEvent(context.room.roomId, eventType as keyof TimelineEvents, content);\n    };\n\n    let defaultContent: string | undefined;\n\n    if (mxEvent) {\n        const originalContent = mxEvent.getContent();\n        // prefill an edit-message event, keep only the `body` and `msgtype` fields of originalContent\n        const bodyToStartFrom = originalContent[\"m.new_content\"]?.body ?? originalContent.body; // prefill the last edit body, to start editing from there\n        const newContent = {\n            \"body\": ` * ${bodyToStartFrom}`,\n            \"msgtype\": originalContent.msgtype,\n            \"m.new_content\": {\n                body: bodyToStartFrom,\n                msgtype: originalContent.msgtype,\n            },\n            \"m.relates_to\": {\n                rel_type: \"m.replace\",\n                event_id: getBaseEventId(mxEvent),\n            },\n        };\n\n        defaultContent = stringify(newContent);\n    } else if (context.threadRootId) {\n        defaultContent = stringify({\n            \"m.relates_to\": {\n                rel_type: \"m.thread\",\n                event_id: context.threadRootId,\n            },\n        });\n    }\n\n    return <EventEditor fieldDefs={fields} defaultContent={defaultContent} onSend={onSend} onBack={onBack} />;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\nCopyright 2022 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ChangeEvent, useEffect, useState } from \"react\";\n\nimport { _t } from \"../../../../languageHandler\";\nimport Field from \"../../elements/Field\";\nimport TruncatedList from \"../../elements/TruncatedList\";\n\nconst INITIAL_LOAD_TILES = 20;\nconst LOAD_TILES_STEP_SIZE = 50;\n\ninterface IProps {\n    children: React.ReactElement[];\n    query: string;\n    onChange(this: void, value: string): void;\n}\n\nconst FilteredList: React.FC<IProps> = ({ children, query, onChange }) => {\n    const [truncateAt, setTruncateAt] = useState<number>(INITIAL_LOAD_TILES);\n    const [filteredChildren, setFilteredChildren] = useState<React.ReactElement[]>(children);\n\n    useEffect(() => {\n        let filteredChildren = children;\n        if (query) {\n            const lcQuery = query.toLowerCase();\n            filteredChildren = children.filter((child) => child.key?.toString().toLowerCase().includes(lcQuery));\n        }\n        setFilteredChildren(filteredChildren);\n        setTruncateAt(INITIAL_LOAD_TILES);\n    }, [children, query]);\n\n    const getChildren = (start: number, end: number): React.ReactElement[] => {\n        return filteredChildren.slice(start, end);\n    };\n\n    const getChildCount = (): number => {\n        return filteredChildren.length;\n    };\n\n    const createOverflowElement = (overflowCount: number, totalCount: number): JSX.Element => {\n        const showMore = (): void => {\n            setTruncateAt((num) => num + LOAD_TILES_STEP_SIZE);\n        };\n\n        return (\n            <button className=\"mx_DevTools_button\" onClick={showMore}>\n                {_t(\"common|and_n_others\", { count: overflowCount })}\n            </button>\n        );\n    };\n\n    return (\n        <>\n            <Field\n                label={_t(\"common|filter_results\")}\n                autoFocus={true}\n                size={64}\n                type=\"text\"\n                autoComplete=\"off\"\n                value={query}\n                onChange={(ev: ChangeEvent<HTMLInputElement>) => onChange(ev.target.value)}\n                className=\"mx_TextInputDialog_input mx_DevTools_RoomStateExplorer_query\"\n                // force re-render so that autoFocus is applied when this component is re-used\n                key={children?.[0]?.key ?? \"\"}\n            />\n\n            {filteredChildren.length < 1 ? (\n                _t(\"common|no_results_found\")\n            ) : (\n                <TruncatedList\n                    getChildren={getChildren}\n                    getChildCount={getChildCount}\n                    truncateAt={truncateAt}\n                    createOverflowElement={createOverflowElement}\n                />\n            )}\n        </>\n    );\n};\n\nexport default FilteredList;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\nCopyright 2022 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEventHandler, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport { type IContent, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport classNames from \"classnames\";\nimport { Form, SettingsToggleInput } from \"@vector-im/compound-web\";\n\nimport { _t, _td } from \"../../../../languageHandler\";\nimport BaseTool, { DevtoolsContext, type IDevtoolsProps } from \"./BaseTool\";\nimport MatrixClientContext from \"../../../../contexts/MatrixClientContext\";\nimport { EventEditor, EventViewer, eventTypeField, stateKeyField, type IEditorProps, stringify } from \"./Event\";\nimport FilteredList from \"./FilteredList\";\nimport Spinner from \"../../elements/Spinner\";\nimport SyntaxHighlight from \"../../elements/SyntaxHighlight\";\nimport { useAsyncMemo } from \"../../../../hooks/useAsyncMemo\";\n\nexport const StateEventEditor: React.FC<IEditorProps> = ({ mxEvent, onBack }) => {\n    const context = useContext(DevtoolsContext);\n    const cli = useContext(MatrixClientContext);\n\n    const fields = useMemo(\n        () => [eventTypeField(mxEvent?.getType()), stateKeyField(mxEvent?.getStateKey())],\n        [mxEvent],\n    );\n\n    const onSend = async ([eventType, stateKey]: string[], content: IContent): Promise<void> => {\n        await cli.sendStateEvent(context.room.roomId, eventType as any, content, stateKey);\n    };\n\n    const defaultContent = mxEvent ? stringify(mxEvent.getContent()) : undefined;\n    return <EventEditor fieldDefs={fields} defaultContent={defaultContent} onSend={onSend} onBack={onBack} />;\n};\n\ninterface StateEventButtonProps {\n    label: string;\n    onClick(this: void): void;\n}\n\nconst RoomStateHistory: React.FC<{\n    mxEvent: MatrixEvent;\n    onBack(this: void): void;\n}> = ({ mxEvent, onBack }) => {\n    const cli = useContext(MatrixClientContext);\n    const events = useAsyncMemo(\n        async () => {\n            const events = [mxEvent.event];\n            while (!!events[0].unsigned?.replaces_state) {\n                try {\n                    events.unshift(await cli.fetchRoomEvent(mxEvent.getRoomId()!, events[0].unsigned.replaces_state));\n                } catch (e) {\n                    events.unshift({\n                        event_id: events[0].unsigned.replaces_state,\n                        unsigned: {\n                            error: e instanceof Error ? e.message : String(e),\n                        },\n                    });\n                }\n            }\n            return events;\n        },\n        [cli, mxEvent],\n        null,\n    );\n\n    let body = <Spinner />;\n    if (events !== null) {\n        body = (\n            <>\n                {events.map((ev) => (\n                    <SyntaxHighlight language=\"json\" key={ev.event_id}>\n                        {stringify(ev)}\n                    </SyntaxHighlight>\n                ))}\n            </>\n        );\n    }\n\n    return <BaseTool onBack={onBack}>{body}</BaseTool>;\n};\n\nconst StateEventButton: React.FC<StateEventButtonProps> = ({ label, onClick }) => {\n    const trimmed = label.trim();\n\n    let content = label;\n    if (!trimmed) {\n        content = label.length > 0 ? _t(\"devtools|spaces\", { count: label.length }) : _t(\"devtools|empty_string\");\n    }\n\n    return (\n        <button\n            className={classNames(\"mx_DevTools_button\", {\n                mx_DevTools_RoomStateExplorer_button_hasSpaces: trimmed.length !== label.length,\n                mx_DevTools_RoomStateExplorer_button_emptyString: !trimmed,\n            })}\n            onClick={onClick}\n        >\n            {content}\n        </button>\n    );\n};\n\ninterface IEventTypeProps extends Pick<IDevtoolsProps, \"onBack\"> {\n    eventType: string;\n}\n\nconst RoomStateExplorerEventType: React.FC<IEventTypeProps> = ({ eventType, onBack }) => {\n    const context = useContext(DevtoolsContext);\n    const [query, setQuery] = useState(\"\");\n    const [event, setEvent] = useState<MatrixEvent | null>(null);\n    const [history, setHistory] = useState(false);\n    const [showEmptyState, setShowEmptyState] = useState(true);\n    const onEmptyStateToggled = useCallback<ChangeEventHandler<HTMLInputElement>>(\n        (e) => setShowEmptyState(e.target.checked),\n        [setShowEmptyState],\n    );\n\n    const events = context.room.currentState.events.get(eventType)!;\n\n    useEffect(() => {\n        if (events.size === 1 && events.has(\"\")) {\n            setEvent(events.get(\"\")!);\n        } else {\n            setEvent(null);\n        }\n    }, [events]);\n\n    if (event && history) {\n        const _onBack = (): void => {\n            setHistory(false);\n        };\n        return <RoomStateHistory mxEvent={event} onBack={_onBack} />;\n    }\n    if (event) {\n        const _onBack = (): void => {\n            if (events?.size === 1 && events.has(\"\")) {\n                onBack();\n            } else {\n                setEvent(null);\n            }\n        };\n        const onHistoryClick = (): void => {\n            setHistory(true);\n        };\n        const extraButton = <button onClick={onHistoryClick}>{_t(\"devtools|see_history\")}</button>;\n        return <EventViewer mxEvent={event} onBack={_onBack} Editor={StateEventEditor} extraButton={extraButton} />;\n    }\n\n    return (\n        <BaseTool onBack={onBack}>\n            <FilteredList query={query} onChange={setQuery}>\n                {Array.from(events.entries())\n                    .filter(([_, ev]) => showEmptyState || Object.keys(ev.getContent()).length > 0)\n                    .map(([stateKey, ev]) => (\n                        <StateEventButton key={stateKey} label={stateKey} onClick={() => setEvent(ev)} />\n                    ))}\n            </FilteredList>\n            <Form.Root\n                onSubmit={(evt) => {\n                    evt.preventDefault();\n                    evt.stopPropagation();\n                }}\n            >\n                <SettingsToggleInput\n                    name=\"empty_state_toggle\"\n                    label={_t(\"devtools|show_empty_content_events\")}\n                    onChange={onEmptyStateToggled}\n                    checked={showEmptyState}\n                />\n            </Form.Root>\n        </BaseTool>\n    );\n};\n\nexport const RoomStateExplorer: React.FC<IDevtoolsProps> = ({ onBack, setTool }) => {\n    const context = useContext(DevtoolsContext);\n    const [query, setQuery] = useState(\"\");\n    const [eventType, setEventType] = useState<string | null>(null);\n\n    const events = context.room.currentState.events;\n\n    if (eventType !== null) {\n        const onBack = (): void => {\n            setEventType(null);\n        };\n        return <RoomStateExplorerEventType eventType={eventType} onBack={onBack} />;\n    }\n\n    const onAction = async (): Promise<void> => {\n        setTool(_td(\"devtools|send_custom_state_event\"), StateEventEditor);\n    };\n\n    return (\n        <BaseTool onBack={onBack} actionLabel={_td(\"devtools|send_custom_state_event\")} onAction={onAction}>\n            <FilteredList query={query} onChange={setQuery}>\n                {Array.from(events.keys()).map((eventType) => (\n                    <StateEventButton key={eventType} label={eventType} onClick={() => setEventType(eventType)} />\n                ))}\n            </FilteredList>\n        </BaseTool>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2018, 2019 New Vector Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent } from \"react\";\nimport { MatrixClient, MatrixError } from \"matrix-js-sdk/src/matrix\";\nimport { decodeRecoveryKey, type KeyBackupInfo, type KeyBackupRestoreResult } from \"matrix-js-sdk/src/crypto-api\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { MatrixClientPeg } from \"../../../../MatrixClientPeg\";\nimport { _t } from \"../../../../languageHandler\";\nimport { accessSecretStorage } from \"../../../../SecurityManager\";\nimport Spinner from \"../../elements/Spinner\";\nimport DialogButtons from \"../../elements/DialogButtons\";\nimport AccessibleButton from \"../../elements/AccessibleButton\";\nimport BaseDialog from \"../BaseDialog\";\n\nenum RestoreType {\n    Passphrase = \"passphrase\",\n    RecoveryKey = \"recovery_key\",\n    SecretStorage = \"secret_storage\",\n}\n\nenum ProgressState {\n    PreFetch = \"prefetch\",\n    Fetch = \"fetch\",\n    LoadKeys = \"load_keys\",\n}\n\ninterface IProps {\n    // if false, will close the dialog as soon as the restore completes successfully\n    // default: true\n    showSummary?: boolean;\n    onFinished(done?: boolean): void;\n}\n\ninterface IState {\n    backupInfo: KeyBackupInfo | null;\n    loading: boolean;\n    loadError: boolean | null;\n    restoreError: unknown | null;\n    recoveryKey: string;\n    recoverInfo: KeyBackupRestoreResult | null;\n    recoveryKeyValid: boolean;\n    forceRecoveryKey: boolean;\n    passPhrase: string;\n    restoreType: RestoreType | null;\n    progress: {\n        stage: ProgressState | string;\n        total?: number;\n        successes?: number;\n        failures?: number;\n    };\n}\n\n/*\n * Dialog for restoring e2e keys from a backup and the user's recovery key\n */\nexport default class RestoreKeyBackupDialog extends React.PureComponent<IProps, IState> {\n    public static defaultProps: Partial<IProps> = {\n        showSummary: true,\n    };\n\n    public constructor(props: IProps) {\n        super(props);\n        this.state = {\n            backupInfo: null,\n            loading: false,\n            loadError: null,\n            restoreError: null,\n            recoveryKey: \"\",\n            recoverInfo: null,\n            recoveryKeyValid: false,\n            forceRecoveryKey: false,\n            passPhrase: \"\",\n            restoreType: null,\n            progress: { stage: ProgressState.PreFetch },\n        };\n    }\n\n    public componentDidMount(): void {\n        this.loadBackupStatus();\n    }\n\n    private onCancel = (): void => {\n        this.props.onFinished(false);\n    };\n\n    private onDone = (): void => {\n        this.props.onFinished(true);\n    };\n\n    private onUseRecoveryKeyClick = (): void => {\n        this.setState({\n            forceRecoveryKey: true,\n        });\n    };\n\n    private progressCallback = (data: IState[\"progress\"]): void => {\n        this.setState({\n            progress: data,\n        });\n    };\n\n    private onResetRecoveryClick = (): void => {\n        this.props.onFinished(false);\n        accessSecretStorage(async (): Promise<void> => {}, { forceReset: true });\n    };\n\n    /**\n     * Check if the recovery key is valid\n     * @param recoveryKey\n     * @private\n     */\n    private isValidRecoveryKey(recoveryKey: string): boolean {\n        try {\n            decodeRecoveryKey(recoveryKey);\n            return true;\n        } catch {\n            return false;\n        }\n    }\n\n    private onRecoveryKeyChange = (e: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({\n            recoveryKey: e.target.value,\n            recoveryKeyValid: this.isValidRecoveryKey(e.target.value),\n        });\n    };\n\n    private onPassPhraseNext = async (): Promise<void> => {\n        const crypto = MatrixClientPeg.safeGet().getCrypto();\n        if (!crypto) return;\n        this.setState({\n            loading: true,\n            restoreError: null,\n            restoreType: RestoreType.Passphrase,\n        });\n        try {\n            // We do still restore the key backup: we must ensure that the key backup key\n            // is the right one and restoring it is currently the only way we can do this.\n            const recoverInfo = await crypto.restoreKeyBackupWithPassphrase(this.state.passPhrase, {\n                progressCallback: this.progressCallback,\n            });\n\n            if (!this.props.showSummary) {\n                this.props.onFinished(true);\n                return;\n            }\n            this.setState({\n                loading: false,\n                recoverInfo,\n            });\n        } catch (e) {\n            logger.log(\"Error restoring backup\", e);\n            this.setState({\n                loading: false,\n                restoreError: e,\n            });\n        }\n    };\n\n    private onRecoveryKeyNext = async (): Promise<void> => {\n        const crypto = MatrixClientPeg.safeGet().getCrypto();\n        if (!this.state.recoveryKeyValid || !this.state.backupInfo?.version || !crypto) return;\n\n        this.setState({\n            loading: true,\n            restoreError: null,\n            restoreType: RestoreType.RecoveryKey,\n        });\n        try {\n            await crypto.storeSessionBackupPrivateKey(\n                decodeRecoveryKey(this.state.recoveryKey),\n                this.state.backupInfo.version,\n            );\n            const recoverInfo = await crypto.restoreKeyBackup({\n                progressCallback: this.progressCallback,\n            });\n\n            if (!this.props.showSummary) {\n                this.props.onFinished(true);\n                return;\n            }\n            this.setState({\n                loading: false,\n                recoverInfo,\n            });\n        } catch (e) {\n            logger.log(\"Error restoring backup\", e);\n            this.setState({\n                loading: false,\n                restoreError: e,\n            });\n        }\n    };\n\n    private onPassPhraseChange = (e: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({\n            passPhrase: e.target.value,\n        });\n    };\n\n    private async restoreWithSecretStorage(): Promise<boolean> {\n        const crypto = MatrixClientPeg.safeGet().getCrypto();\n        if (!crypto) return false;\n\n        this.setState({\n            restoreError: null,\n            restoreType: RestoreType.SecretStorage,\n        });\n        try {\n            let recoverInfo: KeyBackupRestoreResult | null = null;\n            // `accessSecretStorage` may prompt for storage access as needed.\n            await accessSecretStorage(async (): Promise<void> => {\n                await crypto.loadSessionBackupPrivateKeyFromSecretStorage();\n                recoverInfo = await crypto.restoreKeyBackup({ progressCallback: this.progressCallback });\n            });\n            this.setState({\n                loading: false,\n                recoverInfo,\n            });\n            return true;\n        } catch (e) {\n            logger.log(\"restoreWithSecretStorage failed:\", e);\n            this.setState({\n                restoreError: e,\n                loading: false,\n            });\n            return false;\n        }\n    }\n\n    private async restoreWithCachedKey(backupInfo: KeyBackupInfo | null): Promise<boolean> {\n        const crypto = MatrixClientPeg.safeGet().getCrypto();\n        if (!crypto) return false;\n        try {\n            const recoverInfo = await crypto.restoreKeyBackup({ progressCallback: this.progressCallback });\n            this.setState({\n                recoverInfo,\n            });\n            return true;\n        } catch (e) {\n            logger.log(\"restoreWithCachedKey failed:\", e);\n            return false;\n        }\n    }\n\n    private async loadBackupStatus(): Promise<void> {\n        this.setState({\n            loading: true,\n            loadError: null,\n        });\n        try {\n            const cli = MatrixClientPeg.safeGet();\n            const backupInfo = (await cli.getCrypto()?.getKeyBackupInfo()) ?? null;\n            const has4S = await cli.secretStorage.hasKey();\n            const backupKeyStored = has4S ? await cli.isKeyBackupKeyStored() : null;\n            this.setState({\n                backupInfo,\n            });\n\n            const gotCache = await this.restoreWithCachedKey(backupInfo);\n            if (gotCache) {\n                logger.log(\"RestoreKeyBackupDialog: found cached backup key\");\n                this.setState({\n                    loading: false,\n                });\n                return;\n            }\n\n            const hasBackupFromSS = backupKeyStored && (await this.restoreWithSecretStorage());\n            if (hasBackupFromSS) {\n                logger.log(\"RestoreKeyBackupDialog: found backup key in secret storage\");\n                this.setState({\n                    loading: false,\n                });\n                return;\n            }\n\n            this.setState({\n                loadError: null,\n                loading: false,\n            });\n        } catch (e) {\n            logger.log(\"Error loading backup status\", e);\n            this.setState({\n                loadError: true,\n                loading: false,\n            });\n        }\n    }\n\n    public render(): React.ReactNode {\n        const backupHasPassphrase =\n            this.state.backupInfo &&\n            this.state.backupInfo.auth_data &&\n            this.state.backupInfo.auth_data.private_key_salt &&\n            this.state.backupInfo.auth_data.private_key_iterations;\n\n        let content;\n        let title;\n        if (this.state.loading) {\n            title = _t(\"encryption|access_secret_storage_dialog|restoring\");\n            let details;\n            if (this.state.progress.stage === ProgressState.Fetch) {\n                details = _t(\"restore_key_backup_dialog|key_fetch_in_progress\");\n            } else if (this.state.progress.stage === ProgressState.LoadKeys) {\n                const { total, successes, failures } = this.state.progress;\n                details = _t(\"restore_key_backup_dialog|load_keys_progress\", {\n                    total,\n                    completed: (successes ?? 0) + (failures ?? 0),\n                });\n            } else if (this.state.progress.stage === ProgressState.PreFetch) {\n                details = _t(\"restore_key_backup_dialog|key_fetch_in_progress\");\n            }\n            content = (\n                <div>\n                    <div>{details}</div>\n                    <Spinner />\n                </div>\n            );\n        } else if (this.state.loadError) {\n            title = _t(\"common|error\");\n            content = _t(\"restore_key_backup_dialog|load_error_content\");\n        } else if (this.state.restoreError) {\n            if (\n                this.state.restoreError instanceof MatrixError &&\n                this.state.restoreError.errcode === MatrixClient.RESTORE_BACKUP_ERROR_BAD_KEY\n            ) {\n                if (this.state.restoreType === RestoreType.RecoveryKey) {\n                    title = _t(\"restore_key_backup_dialog|recovery_key_mismatch_title\");\n                    content = (\n                        <div>\n                            <p>{_t(\"restore_key_backup_dialog|recovery_key_mismatch_description\")}</p>\n                        </div>\n                    );\n                } else {\n                    title = _t(\"restore_key_backup_dialog|incorrect_security_phrase_title\");\n                    content = (\n                        <div>\n                            <p>{_t(\"restore_key_backup_dialog|incorrect_security_phrase_dialog\")}</p>\n                        </div>\n                    );\n                }\n            } else {\n                title = _t(\"common|error\");\n                content = _t(\"restore_key_backup_dialog|restore_failed_error\");\n            }\n        } else if (this.state.backupInfo === null) {\n            title = _t(\"common|error\");\n            content = _t(\"restore_key_backup_dialog|no_backup_error\");\n        } else if (this.state.recoverInfo) {\n            title = _t(\"restore_key_backup_dialog|keys_restored_title\");\n            let failedToDecrypt;\n            if (this.state.recoverInfo.total > this.state.recoverInfo.imported) {\n                failedToDecrypt = (\n                    <p>\n                        {_t(\"restore_key_backup_dialog|count_of_decryption_failures\", {\n                            failedCount: this.state.recoverInfo.total - this.state.recoverInfo.imported,\n                        })}\n                    </p>\n                );\n            }\n            content = (\n                <div>\n                    <p>\n                        {_t(\"restore_key_backup_dialog|count_of_successfully_restored_keys\", {\n                            sessionCount: this.state.recoverInfo.imported,\n                        })}\n                    </p>\n                    {failedToDecrypt}\n                    <DialogButtons\n                        primaryButton={_t(\"action|ok\")}\n                        onPrimaryButtonClick={this.onDone}\n                        hasCancel={false}\n                        focus={true}\n                    />\n                </div>\n            );\n        } else if (backupHasPassphrase && !this.state.forceRecoveryKey) {\n            title = _t(\"restore_key_backup_dialog|enter_phrase_title\");\n            content = (\n                <div>\n                    <p>\n                        {_t(\"restore_key_backup_dialog|key_backup_warning\", {}, { b: (sub) => <strong>{sub}</strong> })}\n                    </p>\n                    <p>{_t(\"restore_key_backup_dialog|enter_phrase_description\")}</p>\n\n                    <form className=\"mx_RestoreKeyBackupDialog_primaryContainer\">\n                        <input\n                            data-testid=\"passphraseInput\"\n                            type=\"password\"\n                            className=\"mx_RestoreKeyBackupDialog_passPhraseInput\"\n                            onChange={this.onPassPhraseChange}\n                            value={this.state.passPhrase}\n                            autoFocus={true}\n                        />\n                        <DialogButtons\n                            primaryButton={_t(\"action|next\")}\n                            onPrimaryButtonClick={this.onPassPhraseNext}\n                            primaryIsSubmit={true}\n                            hasCancel={true}\n                            onCancel={this.onCancel}\n                            focus={false}\n                        />\n                    </form>\n                    {_t(\n                        \"restore_key_backup_dialog|phrase_forgotten_text\",\n                        {},\n                        {\n                            button1: (s) => (\n                                <AccessibleButton kind=\"link_inline\" onClick={this.onUseRecoveryKeyClick}>\n                                    {s}\n                                </AccessibleButton>\n                            ),\n                            button2: (s) => (\n                                <AccessibleButton kind=\"link_inline\" onClick={this.onResetRecoveryClick}>\n                                    {s}\n                                </AccessibleButton>\n                            ),\n                        },\n                    )}\n                </div>\n            );\n        } else {\n            title = _t(\"restore_key_backup_dialog|enter_key_title\");\n\n            let keyStatus;\n            if (this.state.recoveryKey.length === 0) {\n                keyStatus = <div className=\"mx_RestoreKeyBackupDialog_keyStatus\" />;\n            } else if (this.state.recoveryKeyValid) {\n                keyStatus = (\n                    <div className=\"mx_RestoreKeyBackupDialog_keyStatus\">\n                        {\"\\uD83D\\uDC4D \"}\n                        {_t(\"restore_key_backup_dialog|key_is_valid\")}\n                    </div>\n                );\n            } else {\n                keyStatus = (\n                    <div className=\"mx_RestoreKeyBackupDialog_keyStatus\">\n                        {\"\\uD83D\\uDC4E \"}\n                        {_t(\"restore_key_backup_dialog|key_is_invalid\")}\n                    </div>\n                );\n            }\n\n            content = (\n                <div>\n                    <p>\n                        {_t(\"restore_key_backup_dialog|key_backup_warning\", {}, { b: (sub) => <strong>{sub}</strong> })}\n                    </p>\n                    <p>{_t(\"restore_key_backup_dialog|enter_key_description\")}</p>\n\n                    <div className=\"mx_RestoreKeyBackupDialog_primaryContainer\">\n                        <input\n                            className=\"mx_RestoreKeyBackupDialog_recoveryKeyInput\"\n                            onChange={this.onRecoveryKeyChange}\n                            value={this.state.recoveryKey}\n                            autoFocus={true}\n                        />\n                        {keyStatus}\n                        <DialogButtons\n                            primaryButton={_t(\"action|next\")}\n                            onPrimaryButtonClick={this.onRecoveryKeyNext}\n                            hasCancel={true}\n                            onCancel={this.onCancel}\n                            focus={false}\n                            primaryDisabled={!this.state.recoveryKeyValid}\n                        />\n                    </div>\n                    {_t(\n                        \"restore_key_backup_dialog|key_forgotten_text\",\n                        {},\n                        {\n                            button: (s) => (\n                                <AccessibleButton kind=\"link_inline\" onClick={this.onResetRecoveryClick}>\n                                    {s}\n                                </AccessibleButton>\n                            ),\n                        },\n                    )}\n                </div>\n            );\n        }\n\n        return (\n            <BaseDialog className=\"mx_RestoreKeyBackupDialog\" onFinished={this.props.onFinished} title={title}>\n                <div className=\"mx_RestoreKeyBackupDialog_content\">{content}</div>\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021-2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport enum Filter {\n    People,\n    PublicRooms,\n    PublicSpaces,\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 Šimon Brandner <simon.bra.ag@gmail.com>\nCopyright 2019-2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useState } from \"react\";\nimport classNames from \"classnames\";\nimport { CopyIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { copyPlaintext } from \"../../../utils/strings\";\nimport AccessibleButton, { type ButtonEvent } from \"./AccessibleButton\";\n\ninterface IProps extends React.HTMLAttributes<HTMLDivElement> {\n    children?: React.ReactNode;\n    getTextToCopy: () => string | null;\n    border?: boolean;\n    className?: string;\n}\n\nexport const CopyTextButton: React.FC<Pick<IProps, \"getTextToCopy\" | \"className\" | \"children\">> = ({\n    getTextToCopy,\n    className,\n    children,\n}) => {\n    const [tooltip, setTooltip] = useState<string | undefined>(undefined);\n\n    const onCopyClickInternal = async (e: ButtonEvent): Promise<void> => {\n        e.preventDefault();\n        const text = getTextToCopy();\n        const successful = !!text && (await copyPlaintext(text));\n        setTooltip(successful ? _t(\"common|copied\") : _t(\"error|failed_copy\"));\n    };\n\n    const onHideTooltip = (): void => {\n        if (tooltip) {\n            setTooltip(undefined);\n        }\n    };\n\n    return (\n        <AccessibleButton\n            element=\"button\"\n            title={tooltip ?? _t(\"action|copy\")}\n            onClick={onCopyClickInternal}\n            className={className}\n            onTooltipOpenChange={(open) => {\n                if (!open) onHideTooltip();\n            }}\n        >\n            {children}\n        </AccessibleButton>\n    );\n};\n\nconst CopyableText: React.FC<IProps> = ({ children, getTextToCopy, border = true, className, ...props }) => {\n    const combinedClassName = classNames(\"mx_CopyableText\", className, {\n        mx_CopyableText_border: border,\n    });\n\n    return (\n        <span className={combinedClassName} {...props}>\n            {children}\n            <CopyTextButton getTextToCopy={getTextToCopy} className=\"mx_CopyableText_copyButton\">\n                <CopyIcon />\n            </CopyTextButton>\n        </span>\n    );\n};\n\nexport default CopyableText;\n","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction BackspaceSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      fillRule: \"evenodd\",\n      d: \"M20 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H7.33a2 2 0 0 1-1.673-.902l-3.937-6a2 2 0 0 1 0-2.196l3.937-6A2 2 0 0 1 7.33 4zm-3.543 4.457a1 1 0 0 0-1.414 0L13 10.5l-2.043-2.043a1 1 0 0 0-1.414 1.414l2.043 2.043-2.129 2.129a1 1 0 0 0 1.414 1.414l2.13-2.129 2.128 2.129a1 1 0 0 0 1.414-1.414l-2.129-2.129 2.043-2.043a1 1 0 0 0 0-1.414\",\n      clipRule: \"evenodd\"\n    })\n  });\n}\n;\nBackspaceSolidIcon.displayName = \"BackspaceSolidIcon\";\nexport default forwardRef(BackspaceSolidIcon);","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { BackspaceSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport AccessibleButton, { type ButtonEvent } from \"./AccessibleButton\";\n\ninterface IProps {\n    // Callback for when the button is pressed\n    onBackspacePress: (ev: ButtonEvent) => void;\n}\n\nexport default class DialPadBackspaceButton extends React.PureComponent<IProps> {\n    public render(): React.ReactNode {\n        return (\n            <div className=\"mx_DialPadBackspaceButtonWrapper\">\n                <AccessibleButton\n                    className=\"mx_DialPadBackspaceButton\"\n                    onClick={this.props.onBackspacePress}\n                    aria-label={_t(\"keyboard|backspace\")}\n                >\n                    <BackspaceSolidIcon />\n                </AccessibleButton>\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017-2021 The Matrix.org Foundation C.I.C.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, {\n    type JSX,\n    type ChangeEvent,\n    createRef,\n    type CSSProperties,\n    type ReactElement,\n    type ReactNode,\n    type Ref,\n} from \"react\";\nimport classnames from \"classnames\";\nimport { ChevronDownIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport AccessibleButton, { type ButtonEvent } from \"./AccessibleButton\";\nimport { _t } from \"../../../languageHandler\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport { KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\nimport { objectHasDiff } from \"../../../utils/objects\";\nimport { type NonEmptyArray } from \"../../../@types/common\";\n\ninterface IMenuOptionProps {\n    children: ReactElement;\n    highlighted?: boolean;\n    dropdownKey: string;\n    id?: string;\n    inputRef?: Ref<HTMLLIElement>;\n    onClick(dropdownKey: string): void;\n    onMouseEnter(dropdownKey: string): void;\n}\n\nclass MenuOption extends React.Component<IMenuOptionProps> {\n    private onMouseEnter = (): void => {\n        this.props.onMouseEnter(this.props.dropdownKey);\n    };\n\n    private onClick = (e: React.MouseEvent): void => {\n        e.preventDefault();\n        e.stopPropagation();\n        this.props.onClick(this.props.dropdownKey);\n    };\n\n    public render(): React.ReactNode {\n        const optClasses = classnames({\n            mx_Dropdown_option: true,\n            mx_Dropdown_option_highlight: this.props.highlighted,\n        });\n\n        return (\n            <li\n                id={this.props.id}\n                className={optClasses}\n                onClick={this.onClick}\n                onMouseEnter={this.onMouseEnter}\n                role=\"option\"\n                aria-selected={this.props.highlighted}\n                ref={this.props.inputRef}\n                tabIndex={-1}\n            >\n                {this.props.children}\n            </li>\n        );\n    }\n}\n\nexport interface DropdownProps {\n    id: string;\n    // ARIA label\n    label: string;\n    value?: string;\n    className?: string;\n    autoComplete?: string;\n    children: NonEmptyArray<ReactElement & { key: string }>;\n    // negative for consistency with HTML\n    disabled?: boolean;\n    // The width that the dropdown should be. If specified,\n    // the dropped-down part of the menu will be set to this\n    // width.\n    menuWidth?: number;\n    searchEnabled?: boolean;\n    // Placeholder to show when no value is selected\n    placeholder?: string;\n    // Called when the selected option changes\n    onOptionChange(dropdownKey: string): void;\n    // Called when the value of the search field changes\n    onSearchChange?(query: string): void;\n    // Function that, given the key of an option, returns\n    // a node representing that option to be displayed in the\n    // box itself as the currently-selected option (ie. as\n    // opposed to in the actual dropped-down part). If\n    // unspecified, the appropriate child element is used as\n    // in the dropped-down menu.\n    getShortOption?(value: string): ReactNode;\n}\n\ninterface IState {\n    expanded: boolean;\n    highlightedOption: string;\n    searchQuery: string;\n}\n\n/*\n * Reusable dropdown select control, akin to react-select,\n * but somewhat simpler as react-select is 79KB of minified\n * javascript.\n */\nexport default class Dropdown extends React.Component<DropdownProps, IState> {\n    private readonly buttonRef = createRef<HTMLDivElement>();\n    private dropdownRootElement: HTMLDivElement | null = null;\n    private ignoreEvent: MouseEvent | null = null;\n    private childrenByKey: Record<string, ReactNode> = {};\n\n    public constructor(props: DropdownProps) {\n        super(props);\n\n        this.reindexChildren(this.props.children);\n\n        const firstChild = props.children[0];\n\n        this.state = {\n            // True if the menu is dropped-down\n            expanded: false,\n            // The key of the highlighted option\n            // (the option that would become selected if you pressed enter)\n            highlightedOption: firstChild.key,\n            // the current search query\n            searchQuery: \"\",\n        };\n    }\n\n    public componentDidMount(): void {\n        // Listen for all clicks on the document so we can close the\n        // menu when the user clicks somewhere else\n        document.addEventListener(\"click\", this.onDocumentClick, false);\n    }\n\n    public componentDidUpdate(prevProps: Readonly<DropdownProps>): void {\n        if (objectHasDiff(this.props, prevProps) && this.props.children?.length) {\n            this.reindexChildren(this.props.children);\n            const firstChild = this.props.children[0];\n            this.setState({\n                highlightedOption: firstChild.key,\n            });\n        }\n    }\n\n    public componentWillUnmount(): void {\n        document.removeEventListener(\"click\", this.onDocumentClick, false);\n    }\n\n    private reindexChildren(children: ReactElement[]): void {\n        this.childrenByKey = {};\n        React.Children.forEach(children, (child) => {\n            this.childrenByKey[(child as DropdownProps[\"children\"][number]).key] = child;\n        });\n    }\n\n    private onDocumentClick = (ev: MouseEvent): void => {\n        // Close the dropdown if the user clicks anywhere that isn't\n        // within our root element\n        if (ev !== this.ignoreEvent) {\n            this.setState({\n                expanded: false,\n            });\n        }\n    };\n\n    private onRootClick = (ev: MouseEvent): void => {\n        // This captures any clicks that happen within our elements,\n        // such that we can then ignore them when they're seen by the\n        // click listener on the document handler, ie. not close the\n        // dropdown immediately after opening it.\n        // NB. We can't just stopPropagation() because then the event\n        // doesn't reach the React onClick().\n        this.ignoreEvent = ev;\n    };\n\n    private onAccessibleButtonClick = (ev: ButtonEvent): void => {\n        if (this.props.disabled) return;\n\n        const action = getKeyBindingsManager().getAccessibilityAction(ev as React.KeyboardEvent);\n\n        if (!this.state.expanded) {\n            this.setState({ expanded: true });\n            ev.preventDefault();\n        } else if (action === KeyBindingAction.Enter) {\n            // the accessible button consumes enter onKeyDown for firing onClick, so handle it here\n            this.props.onOptionChange(this.state.highlightedOption);\n            this.close();\n        } else if (!(ev as React.KeyboardEvent).key) {\n            // collapse on other non-keyboard event activations\n            this.setState({ expanded: false });\n            ev.preventDefault();\n        }\n    };\n\n    private close(): void {\n        this.setState({\n            expanded: false,\n        });\n        // their focus was on the input, its getting unmounted, move it to the button\n        if (this.buttonRef.current) {\n            this.buttonRef.current.focus();\n        }\n    }\n\n    private onMenuOptionClick = (dropdownKey: string): void => {\n        this.close();\n        this.props.onOptionChange(dropdownKey);\n    };\n\n    private onKeyDown = (e: React.KeyboardEvent): void => {\n        let handled = true;\n\n        // These keys don't generate keypress events and so needs to be on keyup\n        const action = getKeyBindingsManager().getAccessibilityAction(e);\n        switch (action) {\n            case KeyBindingAction.Enter:\n                this.props.onOptionChange(this.state.highlightedOption);\n            // fallthrough\n            case KeyBindingAction.Escape:\n                this.close();\n                break;\n            case KeyBindingAction.ArrowDown:\n                if (this.state.expanded) {\n                    const nextKey = this.nextOption(this.state.highlightedOption);\n                    this.setState({\n                        highlightedOption: nextKey,\n                    });\n\n                    (\n                        this.dropdownRootElement?.querySelector(`#${this.props.id}__${nextKey}`) as HTMLLIElement\n                    )?.focus();\n                } else {\n                    this.setState({ expanded: true });\n                }\n                break;\n            case KeyBindingAction.ArrowUp:\n                if (this.state.expanded) {\n                    const prevKey = this.prevOption(this.state.highlightedOption);\n                    this.setState({\n                        highlightedOption: prevKey,\n                    });\n                    (\n                        this.dropdownRootElement?.querySelector(`#${this.props.id}__${prevKey}`) as HTMLLIElement\n                    )?.focus();\n                } else {\n                    this.setState({ expanded: true });\n                }\n                break;\n            default:\n                handled = false;\n        }\n\n        if (handled) {\n            e.preventDefault();\n            e.stopPropagation();\n        }\n    };\n\n    private onInputChange = (e: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({\n            searchQuery: e.currentTarget.value,\n        });\n        if (this.props.onSearchChange) {\n            this.props.onSearchChange(e.currentTarget.value);\n        }\n    };\n\n    private collectRoot = (e: HTMLDivElement): void => {\n        if (this.dropdownRootElement) {\n            this.dropdownRootElement.removeEventListener(\"click\", this.onRootClick, false);\n        }\n        if (e) {\n            e.addEventListener(\"click\", this.onRootClick, false);\n        }\n        this.dropdownRootElement = e;\n    };\n\n    private setHighlightedOption = (optionKey: string): void => {\n        this.setState({\n            highlightedOption: optionKey,\n        });\n    };\n\n    private nextOption(optionKey: string): string {\n        const keys = Object.keys(this.childrenByKey);\n        const index = keys.indexOf(optionKey);\n        return keys[(index + 1) % keys.length];\n    }\n\n    private prevOption(optionKey: string): string {\n        const keys = Object.keys(this.childrenByKey);\n        const index = keys.indexOf(optionKey);\n        return keys[index <= 0 ? keys.length - 1 : (index - 1) % keys.length];\n    }\n\n    private scrollIntoView(this: void, node: Element | null): void {\n        node?.scrollIntoView({\n            block: \"nearest\",\n            behavior: \"auto\",\n        });\n    }\n\n    private getMenuOptions(): JSX.Element[] {\n        const options = React.Children.map(this.props.children, (child: ReactElement) => {\n            const highlighted = this.state.highlightedOption === child.key;\n            return (\n                <MenuOption\n                    id={`${this.props.id}__${child.key}`}\n                    key={child.key}\n                    dropdownKey={child.key as string}\n                    highlighted={highlighted}\n                    onMouseEnter={this.setHighlightedOption}\n                    onClick={this.onMenuOptionClick}\n                    inputRef={highlighted ? this.scrollIntoView : undefined}\n                >\n                    {child}\n                </MenuOption>\n            );\n        });\n        if (!options?.length) {\n            return [\n                <li key=\"0\" className=\"mx_Dropdown_option\" role=\"option\" aria-selected={false}>\n                    {_t(\"common|no_results\")}\n                </li>,\n            ];\n        }\n        return options;\n    }\n\n    public render(): React.ReactNode {\n        let currentValue: JSX.Element | undefined;\n\n        const menuStyle: CSSProperties = {};\n        if (this.props.menuWidth) menuStyle.width = this.props.menuWidth;\n\n        let menu: JSX.Element | undefined;\n        if (this.state.expanded) {\n            if (this.props.searchEnabled) {\n                currentValue = (\n                    <input\n                        id={`${this.props.id}_input`}\n                        type=\"text\"\n                        autoFocus={true}\n                        autoComplete={this.props.autoComplete}\n                        className=\"mx_Dropdown_option\"\n                        onChange={this.onInputChange}\n                        value={this.state.searchQuery}\n                        role=\"combobox\"\n                        aria-autocomplete=\"list\"\n                        aria-activedescendant={`${this.props.id}__${this.state.highlightedOption}`}\n                        aria-expanded={this.state.expanded}\n                        aria-controls={`${this.props.id}_listbox`}\n                        aria-disabled={this.props.disabled}\n                        aria-label={this.props.label}\n                        onKeyDown={this.onKeyDown}\n                    />\n                );\n            }\n            menu = (\n                <ul className=\"mx_Dropdown_menu\" style={menuStyle} role=\"listbox\" id={`${this.props.id}_listbox`}>\n                    {this.getMenuOptions()}\n                </ul>\n            );\n        }\n\n        if (!currentValue) {\n            let selectedChild: ReactNode | undefined;\n            if (this.props.value) {\n                selectedChild = this.props.getShortOption\n                    ? this.props.getShortOption(this.props.value)\n                    : this.childrenByKey[this.props.value];\n            }\n\n            currentValue = (\n                <div className=\"mx_Dropdown_option\" id={`${this.props.id}_value`}>\n                    {selectedChild || this.props.placeholder}\n                </div>\n            );\n        }\n\n        const dropdownClasses = classnames(\"mx_Dropdown\", this.props.className, {\n            mx_Dropdown_disabled: !!this.props.disabled,\n        });\n\n        // Note the menu sits inside the AccessibleButton div so it's anchored\n        // to the input, but overflows below it. The root contains both.\n        return (\n            <div className={dropdownClasses} ref={this.collectRoot}>\n                <AccessibleButton\n                    className=\"mx_Dropdown_input mx_no_textinput\"\n                    onClick={this.onAccessibleButtonClick}\n                    aria-haspopup=\"listbox\"\n                    aria-expanded={this.state.expanded}\n                    disabled={this.props.disabled}\n                    ref={this.buttonRef}\n                    aria-label={this.props.label}\n                    aria-describedby={`${this.props.id}_value`}\n                    aria-owns={`${this.props.id}_input`}\n                    onKeyDown={this.onKeyDown}\n                >\n                    {currentValue}\n                    <ChevronDownIcon className=\"mx_Dropdown_arrow\" />\n                    {menu}\n                </AccessibleButton>\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type FC, type HTMLAttributes, type ReactNode } from \"react\";\nimport { type RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { AvatarStack, Tooltip } from \"@vector-im/compound-web\";\nimport classNames from \"classnames\";\nimport { OverflowHorizontalIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport MemberAvatar from \"../avatars/MemberAvatar\";\nimport AccessibleButton, { type ButtonEvent } from \"./AccessibleButton\";\nimport { useToggled } from \"../rooms/RoomHeader/toggle/useToggled\";\nimport { RightPanelPhases } from \"../../../stores/right-panel/RightPanelStorePhases\";\n\ninterface IProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n    members: RoomMember[];\n    size: string;\n    overflow: boolean;\n    tooltipLabel?: string;\n    tooltipShortcut?: string;\n    children?: ReactNode;\n    viewUserOnClick?: boolean;\n    onClick?: (e: ButtonEvent) => void | Promise<void>;\n}\n\n/**\n * A component which displays a list of avatars in a row, with a tooltip showing the names of the users.\n *\n * Any additional props, not named explicitly here, are passed to the underlying {@link AccessibleButton}.\n */\nconst FacePile: FC<IProps> = ({\n    members,\n    size,\n    overflow,\n    tooltipLabel,\n    tooltipShortcut,\n    children,\n    viewUserOnClick = true,\n    onClick,\n    ...props\n}) => {\n    const faces = members.map(\n        tooltipLabel\n            ? (m) => <MemberAvatar key={m.userId} member={m} size={size} hideTitle />\n            : (m) => (\n                  <Tooltip key={m.userId} label={m.name} caption={tooltipShortcut}>\n                      <MemberAvatar member={m} size={size} viewUserOnClick={!onClick && viewUserOnClick} hideTitle />\n                  </Tooltip>\n              ),\n    );\n\n    const pileContents = (\n        <>\n            {faces}\n            {overflow ? <OverflowHorizontalIcon className=\"mx_FacePile_more\" /> : null}\n        </>\n    );\n\n    const toggled = useToggled(RightPanelPhases.MemberList);\n    const classes = classNames({\n        mx_FacePile: true,\n        mx_FacePile_toggled: toggled,\n    });\n\n    const content = (\n        <AccessibleButton {...props} className={classes} onClick={onClick ?? null}>\n            <AvatarStack>{pileContents}</AvatarStack>\n            {children}\n        </AccessibleButton>\n    );\n\n    return tooltipLabel ? (\n        <Tooltip label={tooltipLabel} caption={tooltipShortcut}>\n            {content}\n        </Tooltip>\n    ) : (\n        content\n    );\n};\n\nexport default FacePile;\n","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction ZoomOutIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M13.5 9.5q.425 0 .713.287.288.288.287.713a.97.97 0 0 1-.287.713.97.97 0 0 1-.713.287h-6a.97.97 0 0 1-.713-.287.97.97 0 0 1-.287-.713q0-.425.287-.713A.97.97 0 0 1 7.5 9.5z\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      fillRule: \"evenodd\",\n      d: \"M10.5 3a7.5 7.5 0 0 1 5.963 12.049l3.244 3.244a1 1 0 1 1-1.414 1.414l-3.244-3.244A7.5 7.5 0 1 1 10.5 3m0 2a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11\",\n      clipRule: \"evenodd\"\n    })]\n  });\n}\n;\nZoomOutIcon.displayName = \"ZoomOutIcon\";\nexport default forwardRef(ZoomOutIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction ZoomInIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsxs(\"g\", {\n      clipPath: \"url(#cpd_ZoomInIcon_a)\",\n      children: [/*#__PURE__*/_jsx(\"path\", {\n        d: \"M10.5 6.5q.425 0 .713.287.288.288.287.713v2h2q.425 0 .713.287.288.288.287.713a.97.97 0 0 1-.287.713.97.97 0 0 1-.713.287h-2v2a.97.97 0 0 1-.287.713.97.97 0 0 1-.713.287.97.97 0 0 1-.713-.287.97.97 0 0 1-.287-.713v-2h-2a.97.97 0 0 1-.713-.287.97.97 0 0 1-.287-.713q0-.425.287-.713A.97.97 0 0 1 7.5 9.5h2v-2q0-.425.287-.713A.97.97 0 0 1 10.5 6.5\"\n      }), /*#__PURE__*/_jsx(\"path\", {\n        fillRule: \"evenodd\",\n        d: \"M10.5 3a7.5 7.5 0 0 1 5.963 12.049l3.244 3.244a1 1 0 1 1-1.414 1.414l-3.244-3.244A7.5 7.5 0 1 1 10.5 3m0 2a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11\",\n        clipRule: \"evenodd\"\n      }), /*#__PURE__*/_jsx(\"path\", {\n        d: \"M15.05 16.463a7.5 7.5 0 1 1 1.414-1.414l3.243 3.244a1 1 0 0 1-1.414 1.414zM16 10.5a5.5 5.5 0 1 0-11 0 5.5 5.5 0 0 0 11 0\"\n      }), /*#__PURE__*/_jsx(\"path\", {\n        d: \"M7.875 11.375h1.75v1.75q0 .372.252.623A.85.85 0 0 0 10.5 14a.85.85 0 0 0 .623-.252.85.85 0 0 0 .252-.623v-1.75h1.75a.85.85 0 0 0 .623-.252A.85.85 0 0 0 14 10.5a.85.85 0 0 0-.252-.623.85.85 0 0 0-.623-.252h-1.75v-1.75a.85.85 0 0 0-.252-.623A.85.85 0 0 0 10.5 7a.85.85 0 0 0-.623.252.85.85 0 0 0-.252.623v1.75h-1.75a.85.85 0 0 0-.623.252A.85.85 0 0 0 7 10.5q0 .372.252.623a.85.85 0 0 0 .623.252\"\n      })]\n    }), /*#__PURE__*/_jsx(\"defs\", {\n      children: /*#__PURE__*/_jsx(\"clipPath\", {\n        id: \"cpd_ZoomInIcon_a\",\n        children: /*#__PURE__*/_jsx(\"path\", {\n          d: \"M0 0h24v24H0z\"\n        })\n      })\n    })]\n  });\n}\n;\nZoomInIcon.displayName = \"ZoomInIcon\";\nexport default forwardRef(ZoomInIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction RotateLeftIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M6.56 7.98C6.1 7.52 5.31 7.6 5 8.17c-.28.51-.5 1.03-.67 1.58-.19.63.31 1.25.96 1.25h.01c.43 0 .82-.28.94-.7q.18-.6.48-1.17c.22-.37.15-.84-.16-1.15M5.31 13h-.02c-.65 0-1.15.62-.96 1.25.16.54.38 1.07.66 1.58.31.57 1.11.66 1.57.2.3-.31.38-.77.17-1.15-.2-.37-.36-.76-.48-1.16a.97.97 0 0 0-.94-.72m2.85 6.02q.765.42 1.59.66c.62.18 1.24-.32 1.24-.96v-.03c0-.43-.28-.82-.7-.94-.4-.12-.78-.28-1.15-.48a.97.97 0 0 0-1.16.17l-.03.03c-.45.45-.36 1.24.21 1.55M13 4.07v-.66c0-.89-1.08-1.34-1.71-.71L9.17 4.83c-.4.4-.4 1.04 0 1.43l2.13 2.08c.63.62 1.7.17 1.7-.72V6.09c2.84.48 5 2.94 5 5.91 0 2.73-1.82 5.02-4.32 5.75a.97.97 0 0 0-.68.94v.02c0 .65.61 1.14 1.23.96A7.976 7.976 0 0 0 20 12c0-4.08-3.05-7.44-7-7.93\"\n    })\n  });\n}\n;\nRotateLeftIcon.displayName = \"RotateLeftIcon\";\nexport default forwardRef(RotateLeftIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction RotateRightIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"g\", {\n      clipPath: \"url(#cpd_RotateRightIcon_a)\",\n      children: /*#__PURE__*/_jsx(\"path\", {\n        d: \"M14.83 4.83 12.7 2.7c-.62-.62-1.7-.18-1.7.71v.66C7.06 4.56 4 7.92 4 12c0 3.64 2.43 6.71 5.77 7.68.62.18 1.23-.32 1.23-.96v-.03a.97.97 0 0 0-.68-.94A5.98 5.98 0 0 1 6 12c0-2.97 2.16-5.43 5-5.91v1.53c0 .89 1.07 1.33 1.7.71l2.13-2.08a.99.99 0 0 0 0-1.42m4.84 4.93q-.24-.825-.66-1.59c-.31-.57-1.1-.66-1.56-.2l-.01.01c-.31.31-.38.78-.17 1.16.2.37.36.76.48 1.16.12.42.51.7.94.7h.02c.65 0 1.15-.62.96-1.24M13 18.68v.02c0 .65.62 1.14 1.24.96q.825-.24 1.59-.66c.57-.31.66-1.1.2-1.56l-.02-.02a.97.97 0 0 0-1.16-.17c-.37.21-.76.37-1.16.49-.41.12-.69.51-.69.94m4.44-2.65c.46.46 1.25.37 1.56-.2.28-.51.5-1.04.67-1.59.18-.62-.31-1.24-.96-1.24h-.02c-.44 0-.82.28-.94.7q-.18.6-.48 1.17c-.21.38-.13.86.17 1.16\"\n      })\n    }), /*#__PURE__*/_jsx(\"defs\", {\n      children: /*#__PURE__*/_jsx(\"clipPath\", {\n        id: \"cpd_RotateRightIcon_a\",\n        children: /*#__PURE__*/_jsx(\"path\", {\n          d: \"M0 0h24v24H0z\"\n        })\n      })\n    })]\n  });\n}\n;\nRotateRightIcon.displayName = \"RotateRightIcon\";\nexport default forwardRef(RotateRightIcon);","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n/**\n * Different browsers use different deltaModes. This causes different behaviour.\n * To avoid that we use this function to convert any event to pixels.\n * @param {WheelEvent} event to normalize\n * @returns {WheelEvent} normalized event event\n */\nexport function normalizeWheelEvent({ deltaMode, deltaX, deltaY, deltaZ, ...event }: WheelEvent): WheelEvent {\n    const LINE_HEIGHT = 18;\n\n    if (deltaMode === 1) {\n        // Units are lines\n        deltaX *= LINE_HEIGHT;\n        deltaY *= LINE_HEIGHT;\n        deltaZ *= LINE_HEIGHT;\n    }\n\n    return new WheelEvent(\"syntheticWheel\", {\n        deltaMode: 0,\n        deltaY,\n        deltaX,\n        deltaZ,\n        ...event,\n    });\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020, 2021 Šimon Brandner <simon.bra.ag@gmail.com>\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, createRef, type CSSProperties, useEffect } from \"react\";\nimport FocusLock from \"react-focus-lock\";\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport {\n    CloseIcon,\n    DownloadIcon,\n    OverflowHorizontalIcon,\n    RotateLeftIcon,\n    RotateRightIcon,\n    ZoomInIcon,\n    ZoomOutIcon,\n} from \"@vector-im/compound-design-tokens/assets/web/icons\";\nimport { useCreateAutoDisposedViewModel, MessageTimestampView } from \"@element-hq/web-shared-components\";\n\nimport { _t } from \"../../../languageHandler\";\nimport MemberAvatar from \"../avatars/MemberAvatar\";\nimport { ContextMenuTooltipButton } from \"../../../accessibility/context_menu/ContextMenuTooltipButton\";\nimport MessageContextMenu from \"../context_menus/MessageContextMenu\";\nimport { aboveLeftOf } from \"../../structures/ContextMenu\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport dis from \"../../../dispatcher/dispatcher\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport { type RoomPermalinkCreator } from \"../../../utils/permalinks/Permalinks\";\nimport { normalizeWheelEvent } from \"../../../utils/Mouse\";\nimport UIStore from \"../../../stores/UIStore\";\nimport { type ViewRoomPayload } from \"../../../dispatcher/payloads/ViewRoomPayload\";\nimport { KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport { presentableTextForFile } from \"../../../utils/FileUtils\";\nimport AccessibleButton from \"./AccessibleButton\";\nimport { useDownloadMedia } from \"../../../hooks/useDownloadMedia.ts\";\nimport {\n    MessageTimestampViewModel,\n    type MessageTimestampViewModelProps,\n} from \"../../../viewmodels/room/timeline/event-tile/timestamp/MessageTimestampViewModel.ts\";\n\n// Max scale to keep gaps around the image\nconst MAX_SCALE = 0.95;\n// This is used for the buttons\nconst ZOOM_STEP = 0.1;\n// This is used for mouse wheel events\nconst ZOOM_COEFFICIENT = 0.0025;\n// If we have moved only this much we can zoom\nconst ZOOM_DISTANCE = 10;\n\n// Height of mx_ImageView_panel\nconst getPanelHeight = (): number => {\n    const value = getComputedStyle(document.documentElement).getPropertyValue(\"--image-view-panel-height\");\n    // Return the value as a number without the unit\n    return parseInt(value.slice(0, value.length - 2));\n};\n\ninterface IProps {\n    src: string; // the source of the image being displayed\n    name?: string; // the main title ('name') for the image\n    link?: string; // the link (if any) applied to the name of the image\n    width?: number; // width of the image src in pixels\n    height?: number; // height of the image src in pixels\n    fileSize?: number; // size of the image src in bytes\n\n    // the event (if any) that the Image is displaying. Used for event-specific stuff like\n    // redactions, senders, timestamps etc.  Other descriptors are taken from the explicit\n    // properties above, which let us use lightboxes to display images which aren't associated\n    // with events.\n    mxEvent?: MatrixEvent;\n    permalinkCreator?: RoomPermalinkCreator;\n\n    thumbnailInfo?: {\n        positionX: number;\n        positionY: number;\n        width: number;\n        height: number;\n    };\n    onFinished(): void;\n}\n\ninterface IState {\n    zoom: number;\n    minZoom: number;\n    maxZoom: number;\n    rotation: number;\n    translationX: number;\n    translationY: number;\n    moving: boolean;\n    contextMenuDisplayed: boolean;\n}\n\nexport default class ImageView extends React.Component<IProps, IState> {\n    public constructor(props: IProps) {\n        super(props);\n\n        const { thumbnailInfo } = this.props;\n\n        let translationX = 0;\n        let translationY = 0;\n        if (thumbnailInfo) {\n            translationX = thumbnailInfo.positionX + thumbnailInfo.width / 2 - UIStore.instance.windowWidth / 2;\n            translationY =\n                thumbnailInfo.positionY +\n                thumbnailInfo.height / 2 -\n                UIStore.instance.windowHeight / 2 -\n                getPanelHeight() / 2;\n        }\n\n        this.state = {\n            zoom: 0, // We default to 0 and override this in imageLoaded once we have naturalSize\n            minZoom: MAX_SCALE,\n            maxZoom: MAX_SCALE,\n            rotation: 0,\n            translationX,\n            translationY,\n            moving: false,\n            contextMenuDisplayed: false,\n        };\n    }\n\n    // XXX: Refs to functional components\n    private contextMenuButton = createRef<any>();\n    private focusLock = createRef<any>();\n    private imageWrapper = createRef<HTMLDivElement>();\n    private image = createRef<HTMLImageElement>();\n\n    private downloadFunction?: () => Promise<void>;\n\n    private initX = 0;\n    private initY = 0;\n    private previousX = 0;\n    private previousY = 0;\n\n    private animatingLoading = false;\n    private imageIsLoaded = false;\n\n    public componentDidMount(): void {\n        // We have to use addEventListener() because the listener\n        // needs to be passive in order to work with Chromium\n        this.focusLock.current.addEventListener(\"wheel\", this.onWheel, { passive: false });\n        // We want to recalculate zoom whenever the window's size changes\n        window.addEventListener(\"resize\", this.recalculateZoom);\n        // After the image loads for the first time we want to calculate the zoom\n        this.image.current?.addEventListener(\"load\", this.imageLoaded);\n    }\n\n    public componentWillUnmount(): void {\n        this.focusLock.current.removeEventListener(\"wheel\", this.onWheel);\n        window.removeEventListener(\"resize\", this.recalculateZoom);\n        this.image.current?.removeEventListener(\"load\", this.imageLoaded);\n    }\n\n    private imageLoaded = (): void => {\n        if (!this.image.current) return;\n        // First, we calculate the zoom, so that the image has the same size as\n        // the thumbnail\n        const { thumbnailInfo } = this.props;\n        if (thumbnailInfo?.width) {\n            this.setState({ zoom: thumbnailInfo.width / this.image.current.naturalWidth });\n        }\n\n        // Once the zoom is set, we the image is considered loaded and we can\n        // start animating it into the center of the screen\n        this.imageIsLoaded = true;\n        this.animatingLoading = true;\n        this.setZoomAndRotation();\n        this.setState({\n            translationX: 0,\n            translationY: 0,\n        });\n\n        // Once the position is set, there is no need to animate anymore\n        this.animatingLoading = false;\n    };\n\n    private recalculateZoom = (): void => {\n        this.setZoomAndRotation();\n    };\n\n    private setZoomAndRotation = (inputRotation?: number): void => {\n        const image = this.image.current;\n        const imageWrapper = this.imageWrapper.current;\n        if (!image || !imageWrapper) return;\n\n        const rotation = inputRotation ?? this.state.rotation;\n\n        const imageIsNotFlipped = rotation % 180 === 0;\n\n        // If the image is rotated take it into account\n        const width = imageIsNotFlipped ? image.naturalWidth : image.naturalHeight;\n        const height = imageIsNotFlipped ? image.naturalHeight : image.naturalWidth;\n\n        const zoomX = imageWrapper.clientWidth / width;\n        const zoomY = imageWrapper.clientHeight / height;\n\n        // If the image is smaller in both dimensions set its the zoom to 1 to\n        // display it in its original size\n        if (zoomX >= 1 && zoomY >= 1) {\n            this.setState({\n                zoom: 1,\n                minZoom: 1,\n                maxZoom: 1,\n                rotation: rotation,\n            });\n            return;\n        }\n        // We set minZoom to the min of the zoomX and zoomY to avoid overflow in\n        // any direction. We also multiply by MAX_SCALE to get a gap around the\n        // image by default\n        const minZoom = Math.min(zoomX, zoomY) * MAX_SCALE;\n\n        // If zoom is smaller than minZoom don't go below that value\n        const zoom = this.state.zoom <= this.state.minZoom ? minZoom : this.state.zoom;\n\n        this.setState({\n            minZoom: minZoom,\n            maxZoom: 1,\n            rotation: rotation,\n            zoom: zoom,\n        });\n    };\n\n    private zoomDelta(delta: number, anchorX?: number, anchorY?: number): void {\n        this.zoom(this.state.zoom + delta, anchorX, anchorY);\n    }\n\n    private zoom(zoomLevel: number, anchorX?: number, anchorY?: number): void {\n        const oldZoom = this.state.zoom;\n        const maxZoom = this.state.maxZoom === this.state.minZoom ? 2 * this.state.maxZoom : this.state.maxZoom;\n        const newZoom = Math.min(zoomLevel, maxZoom);\n        if (newZoom <= this.state.minZoom) {\n            // Zoom out fully\n            this.setState({\n                zoom: this.state.minZoom,\n                translationX: 0,\n                translationY: 0,\n            });\n        } else if (typeof anchorX !== \"number\" || typeof anchorY !== \"number\") {\n            // Zoom relative to the center of the view\n            this.setState({\n                zoom: newZoom,\n                translationX: (this.state.translationX * newZoom) / oldZoom,\n                translationY: (this.state.translationY * newZoom) / oldZoom,\n            });\n        } else if (this.image.current) {\n            // Zoom relative to the given point on the image.\n            // First we need to figure out the offset of the anchor point\n            // relative to the center of the image, accounting for rotation.\n            let offsetX: number;\n            let offsetY: number;\n            // The modulo operator can return negative values for some\n            // rotations, so we have to do some extra work to normalize it\n            const rotation = (((this.state.rotation % 360) + 360) % 360) as 0 | 90 | 180 | 270;\n            switch (rotation) {\n                case 0:\n                    offsetX = this.image.current.clientWidth / 2 - anchorX;\n                    offsetY = this.image.current.clientHeight / 2 - anchorY;\n                    break;\n                case 90:\n                    offsetX = anchorY - this.image.current.clientHeight / 2;\n                    offsetY = this.image.current.clientWidth / 2 - anchorX;\n                    break;\n                case 180:\n                    offsetX = anchorX - this.image.current.clientWidth / 2;\n                    offsetY = anchorY - this.image.current.clientHeight / 2;\n                    break;\n                case 270:\n                    offsetX = this.image.current.clientHeight / 2 - anchorY;\n                    offsetY = anchorX - this.image.current.clientWidth / 2;\n            }\n\n            // Apply the zoom and offset\n            this.setState({\n                zoom: newZoom,\n                translationX: this.state.translationX + (newZoom - oldZoom) * offsetX,\n                translationY: this.state.translationY + (newZoom - oldZoom) * offsetY,\n            });\n        }\n    }\n\n    private onWheel = (ev: WheelEvent): void => {\n        if (ev.target === this.image.current) {\n            ev.stopPropagation();\n            ev.preventDefault();\n\n            const { deltaY } = normalizeWheelEvent(ev);\n            // Zoom in on the point on the image targeted by the cursor\n            this.zoomDelta(-deltaY * ZOOM_COEFFICIENT, ev.offsetX, ev.offsetY);\n        }\n    };\n\n    private onZoomInClick = (): void => {\n        this.zoomDelta(ZOOM_STEP);\n    };\n\n    private onZoomOutClick = (): void => {\n        this.zoomDelta(-ZOOM_STEP);\n    };\n\n    private onKeyDown = (ev: KeyboardEvent): void => {\n        const action = getKeyBindingsManager().getAccessibilityAction(ev);\n        switch (action) {\n            case KeyBindingAction.Escape:\n                ev.stopPropagation();\n                ev.preventDefault();\n                this.props.onFinished();\n                break;\n            case KeyBindingAction.Save:\n                ev.preventDefault();\n                ev.stopPropagation();\n                if (this.downloadFunction) {\n                    this.downloadFunction();\n                }\n                break;\n        }\n    };\n\n    private onRotateCounterClockwiseClick = (): void => {\n        const cur = this.state.rotation;\n        this.setZoomAndRotation(cur - 90);\n    };\n\n    private onRotateClockwiseClick = (): void => {\n        const cur = this.state.rotation;\n        this.setZoomAndRotation(cur + 90);\n    };\n\n    private onOpenContextMenu = (): void => {\n        this.setState({\n            contextMenuDisplayed: true,\n        });\n    };\n\n    private onCloseContextMenu = (): void => {\n        this.setState({\n            contextMenuDisplayed: false,\n        });\n    };\n\n    private onDownloadFunctionReady = (download: () => Promise<void>): void => {\n        this.downloadFunction = download;\n    };\n\n    private onPermalinkClicked = (ev: React.MouseEvent): void => {\n        // This allows the permalink to be opened in a new tab/window or copied as\n        // matrix.to, but also for it to enable routing within Element when clicked.\n        ev.preventDefault();\n        dis.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            event_id: this.props.mxEvent?.getId(),\n            highlighted: true,\n            room_id: this.props.mxEvent?.getRoomId(),\n            metricsTrigger: undefined, // room doesn't change\n        });\n        this.props.onFinished();\n    };\n\n    private onStartMoving = (ev: React.MouseEvent): void => {\n        ev.stopPropagation();\n        ev.preventDefault();\n\n        // Don't do anything if we pressed any\n        // other button than the left one\n        if (ev.button !== 0) return;\n\n        // Zoom in if we are completely zoomed out and increase the zoom factor for images\n        // smaller than the viewport size\n        if (this.state.zoom === this.state.minZoom) {\n            this.zoom(\n                this.state.maxZoom === this.state.minZoom ? 2 * this.state.maxZoom : this.state.maxZoom,\n                ev.nativeEvent.offsetX,\n                ev.nativeEvent.offsetY,\n            );\n            return;\n        }\n\n        this.setState({ moving: true });\n        this.previousX = this.state.translationX;\n        this.previousY = this.state.translationY;\n        this.initX = ev.pageX - this.state.translationX;\n        this.initY = ev.pageY - this.state.translationY;\n    };\n\n    private onMoving = (ev: React.MouseEvent): void => {\n        ev.stopPropagation();\n        ev.preventDefault();\n\n        if (!this.state.moving) return;\n\n        this.setState({\n            translationX: ev.pageX - this.initX,\n            translationY: ev.pageY - this.initY,\n        });\n    };\n\n    private onEndMoving = (): void => {\n        // Zoom out if we haven't moved much\n        if (\n            this.state.moving &&\n            Math.abs(this.state.translationX - this.previousX) < ZOOM_DISTANCE &&\n            Math.abs(this.state.translationY - this.previousY) < ZOOM_DISTANCE\n        ) {\n            this.zoom(this.state.minZoom);\n            this.initX = 0;\n            this.initY = 0;\n        }\n        this.setState({ moving: false });\n    };\n\n    private renderContextMenu(): JSX.Element {\n        let contextMenu: JSX.Element | undefined;\n        if (this.state.contextMenuDisplayed && this.props.mxEvent) {\n            contextMenu = (\n                <MessageContextMenu\n                    {...aboveLeftOf(this.contextMenuButton.current.getBoundingClientRect())}\n                    mxEvent={this.props.mxEvent}\n                    permalinkCreator={this.props.permalinkCreator}\n                    onFinished={this.onCloseContextMenu}\n                    onCloseDialog={this.props.onFinished}\n                />\n            );\n        }\n\n        return <React.Fragment>{contextMenu}</React.Fragment>;\n    }\n\n    public render(): React.ReactNode {\n        const showEventMeta = !!this.props.mxEvent;\n\n        let transitionClassName;\n        if (this.animatingLoading) transitionClassName = \"mx_ImageView_image_animatingLoading\";\n        else if (this.state.moving || !this.imageIsLoaded) transitionClassName = \"\";\n        else transitionClassName = \"mx_ImageView_image_animating\";\n\n        const rotationDegrees = this.state.rotation + \"deg\";\n        const zoom = this.state.zoom;\n        const translatePixelsX = this.state.translationX + \"px\";\n        const translatePixelsY = this.state.translationY + \"px\";\n        // The order of the values is important!\n        // First, we translate and only then we rotate, otherwise\n        // we would apply the translation to an already rotated\n        // image causing it translate in the wrong direction.\n        const style: CSSProperties = {\n            transform: `translateX(${translatePixelsX})\n                        translateY(${translatePixelsY})\n                        scale(${zoom})\n                        rotate(${rotationDegrees})`,\n        };\n\n        if (this.state.moving) style.cursor = \"grabbing\";\n        else if (this.state.zoom === this.state.minZoom) style.cursor = \"zoom-in\";\n        else style.cursor = \"zoom-out\";\n\n        let info: JSX.Element | undefined;\n        if (showEventMeta) {\n            const mxEvent = this.props.mxEvent!;\n            const showTwelveHour = SettingsStore.getValue(\"showTwelveHourTimestamps\");\n            let permalink = \"#\";\n            if (this.props.permalinkCreator) {\n                permalink = this.props.permalinkCreator.forEvent(mxEvent.getId()!);\n            }\n\n            const senderName = mxEvent.sender?.name ?? mxEvent.getSender();\n            const sender = <div className=\"mx_ImageView_info_sender\">{senderName}</div>;\n            const messageTimestamp = (\n                <MessageTimestampWrapper\n                    href={permalink}\n                    onClick={this.onPermalinkClicked}\n                    showFullDate={true}\n                    showTwelveHour={showTwelveHour}\n                    ts={mxEvent.getTs()}\n                    showSeconds={false}\n                    inhibitTooltip\n                />\n            );\n            const avatar = (\n                <MemberAvatar\n                    member={mxEvent.sender}\n                    fallbackUserId={mxEvent.getSender()}\n                    size=\"32px\"\n                    viewUserOnClick={true}\n                    className=\"mx_Dialog_nonDialogButton\"\n                />\n            );\n\n            info = (\n                <div className=\"mx_ImageView_info_wrapper\">\n                    {avatar}\n                    <div className=\"mx_ImageView_info\">\n                        {sender}\n                        {messageTimestamp}\n                    </div>\n                </div>\n            );\n        } else {\n            // If there is no event - we're viewing an avatar, we set\n            // an empty div here, since the panel uses space-between\n            // and we want the same placement of elements\n            info = <div />;\n        }\n\n        let contextMenuButton: JSX.Element | undefined;\n        if (this.props.mxEvent) {\n            contextMenuButton = (\n                <ContextMenuTooltipButton\n                    className=\"mx_ImageView_button mx_ImageView_button_more\"\n                    title={_t(\"common|options\")}\n                    onClick={this.onOpenContextMenu}\n                    ref={this.contextMenuButton}\n                    isExpanded={this.state.contextMenuDisplayed}\n                >\n                    <OverflowHorizontalIcon />\n                </ContextMenuTooltipButton>\n            );\n        }\n\n        let title: JSX.Element | undefined;\n        if (this.props.mxEvent?.getContent()) {\n            title = (\n                <div className=\"mx_ImageView_title\">\n                    {presentableTextForFile(this.props.mxEvent?.getContent(), _t(\"common|image\"), true)}\n                </div>\n            );\n        }\n\n        return (\n            <FocusLock\n                returnFocus={true}\n                lockProps={{\n                    \"onKeyDown\": this.onKeyDown,\n                    \"role\": \"dialog\",\n                    \"aria-label\": _t(\"lightbox|title\"),\n                }}\n                className=\"mx_ImageView\"\n                ref={this.focusLock}\n            >\n                <div className=\"mx_ImageView_panel\">\n                    {info}\n                    {title}\n                    <div className=\"mx_ImageView_toolbar\">\n                        <AccessibleButton\n                            className=\"mx_ImageView_button\"\n                            title={_t(\"action|zoom_out\")}\n                            onClick={this.onZoomOutClick}\n                        >\n                            <ZoomOutIcon />\n                        </AccessibleButton>\n                        <AccessibleButton\n                            className=\"mx_ImageView_button\"\n                            title={_t(\"action|zoom_in\")}\n                            onClick={this.onZoomInClick}\n                        >\n                            <ZoomInIcon />\n                        </AccessibleButton>\n                        <AccessibleButton\n                            className=\"mx_ImageView_button\"\n                            title={_t(\"lightbox|rotate_left\")}\n                            onClick={this.onRotateCounterClockwiseClick}\n                        >\n                            <RotateLeftIcon />\n                        </AccessibleButton>\n                        <AccessibleButton\n                            className=\"mx_ImageView_button\"\n                            title={_t(\"lightbox|rotate_right\")}\n                            onClick={this.onRotateClockwiseClick}\n                        >\n                            <RotateRightIcon />\n                        </AccessibleButton>\n                        <DownloadButton\n                            url={this.props.src}\n                            fileName={this.props.name}\n                            mxEvent={this.props.mxEvent}\n                            onDownloadReady={this.onDownloadFunctionReady}\n                        />\n                        {contextMenuButton}\n                        <AccessibleButton\n                            className=\"mx_ImageView_button mx_ImageView_button_close\"\n                            title={_t(\"action|close\")}\n                            onClick={this.props.onFinished}\n                        >\n                            <CloseIcon />\n                        </AccessibleButton>\n                        {this.renderContextMenu()}\n                    </div>\n                </div>\n                <div\n                    className=\"mx_ImageView_image_wrapper\"\n                    ref={this.imageWrapper}\n                    onMouseDown={this.props.onFinished}\n                    onMouseMove={this.onMoving}\n                    onMouseUp={this.onEndMoving}\n                    onMouseLeave={this.onEndMoving}\n                >\n                    <img\n                        src={this.props.src}\n                        style={style}\n                        alt={this.props.name}\n                        ref={this.image}\n                        className={`mx_ImageView_image ${transitionClassName}`}\n                        draggable={true}\n                        onMouseDown={this.onStartMoving}\n                    />\n                </div>\n            </FocusLock>\n        );\n    }\n}\n\ninterface DownloadButtonProps {\n    url: string;\n    fileName?: string;\n    mxEvent?: MatrixEvent;\n    onDownloadReady?: (download: () => Promise<void>) => void;\n}\n\nexport const DownloadButton: React.FC<DownloadButtonProps> = ({ url, fileName, mxEvent, onDownloadReady }) => {\n    const { download, loading, canDownload } = useDownloadMedia(url, fileName, mxEvent);\n\n    useEffect(() => {\n        if (onDownloadReady) onDownloadReady(download);\n    }, [download, onDownloadReady]);\n\n    if (!canDownload) return null;\n\n    return (\n        <AccessibleButton\n            className=\"mx_ImageView_button\"\n            title={loading ? _t(\"timeline|download_action_downloading\") : _t(\"action|download\")}\n            onClick={download}\n            disabled={loading}\n        >\n            <DownloadIcon />\n        </AccessibleButton>\n    );\n};\n\n/**\n * Wraps MessageTimestampView with a view model synced to the provided props.\n * This wrapper can be removed after ImageView has been changed to a function component.\n */\nfunction MessageTimestampWrapper(props: MessageTimestampViewModelProps): JSX.Element {\n    const vm = useCreateAutoDisposedViewModel(() => new MessageTimestampViewModel(props));\n    useEffect(() => {\n        vm.setProps(props);\n    }, [vm, props]);\n    return <MessageTimestampView vm={vm} className=\"mx_MessageTimestamp\" />;\n}\n","/*\nCopyright 2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { parseErrorResponse } from \"matrix-js-sdk/src/matrix\";\nimport { useRef, useState, useMemo, useEffect } from \"react\";\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport ErrorDialog from \"../components/views/dialogs/ErrorDialog\";\nimport { _t } from \"../languageHandler\";\nimport Modal from \"../Modal\";\nimport { FileDownloader } from \"../utils/FileDownloader\";\nimport { MediaEventHelper } from \"../utils/MediaEventHelper\";\nimport { ModuleApi } from \"../modules/Api\";\n\nexport interface UseDownloadMediaReturn {\n    download: () => Promise<void>;\n    loading: boolean;\n    canDownload: boolean;\n}\n\nexport function useDownloadMedia(url: string, fileName?: string, mxEvent?: MatrixEvent): UseDownloadMediaReturn {\n    const downloader = useRef(new FileDownloader()).current;\n    const blobRef = useRef<Blob>(null);\n    const [loading, setLoading] = useState(false);\n    const [canDownload, setCanDownload] = useState<boolean>(true);\n\n    const mediaEventHelper = useMemo(() => (mxEvent ? new MediaEventHelper(mxEvent) : undefined), [mxEvent]);\n\n    useEffect(() => {\n        if (!mxEvent) return;\n\n        const hints = ModuleApi.instance.customComponents.getHintsForMessage(mxEvent);\n        if (hints?.allowDownloadingMedia) {\n            setCanDownload(false);\n            hints\n                .allowDownloadingMedia()\n                .then(setCanDownload)\n                .catch((err: any) => {\n                    logger.error(`Failed to check media download permission for ${mxEvent.event.event_id}`, err);\n\n                    setCanDownload(false);\n                });\n        } else {\n            setCanDownload(true);\n        }\n    }, [mxEvent]);\n\n    const download = async (): Promise<void> => {\n        if (loading) return;\n        try {\n            setLoading(true);\n\n            if (blobRef.current) {\n                return downloadBlob(blobRef.current);\n            }\n\n            // We must download via the mediaEventHelper if given as the file may need decryption.\n            if (mediaEventHelper) {\n                blobRef.current = await mediaEventHelper.sourceBlob.value;\n            } else {\n                const res = await fetch(url);\n                if (!res.ok) {\n                    throw parseErrorResponse(res, await res.text());\n                }\n\n                blobRef.current = await res.blob();\n            }\n\n            await downloadBlob(blobRef.current);\n        } catch (e) {\n            showError(e);\n        }\n    };\n\n    const downloadBlob = async (blob: Blob): Promise<void> => {\n        await downloader.download({\n            blob,\n            name: mediaEventHelper?.fileName ?? fileName ?? _t(\"common|image\"),\n        });\n        setLoading(false);\n    };\n\n    const showError = (e: unknown): void => {\n        Modal.createDialog(ErrorDialog, {\n            title: _t(\"timeline|download_failed\"),\n            description: `${_t(\"timeline|download_failed_description\")}\\n\\n${String(e)}`,\n        });\n        setLoading(false);\n    };\n\n    return { download, loading, canDownload };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode } from \"react\";\nimport classNames from \"classnames\";\nimport { Tooltip } from \"@vector-im/compound-web\";\nimport { ErrorSolidIcon, InfoIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\n\nexport enum InfoTooltipKind {\n    /** @knipignore */\n    Info = \"info\",\n    Warning = \"warning\",\n}\n\ninterface TooltipProps {\n    tooltip?: string;\n    className?: string;\n    kind?: InfoTooltipKind;\n    children?: ReactNode;\n    tabIndex?: number;\n}\n\nexport default class InfoTooltip extends React.PureComponent<TooltipProps> {\n    public render(): React.ReactNode {\n        const { tooltip, children, className, kind } = this.props;\n        const title = _t(\"info_tooltip_title\");\n\n        // Tooltip are forced on the right for a more natural feel to them on info icons\n        return (\n            <Tooltip description={tooltip || title} placement=\"right\">\n                <div className={classNames(\"mx_InfoTooltip\", className)} tabIndex={this.props.tabIndex ?? 0}>\n                    <span className=\"mx_InfoTooltip_icon\" aria-label={title}>\n                        {kind !== InfoTooltipKind.Warning ? <InfoIcon /> : <ErrorSolidIcon />}\n                    </span>\n                    {children}\n                </div>\n            </Tooltip>\n        );\n    }\n}\n","/*\nCopyright 2017-2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { InlineSpinner as BaseInlineSpinner } from \"@vector-im/compound-web\";\n\nimport { _t } from \"../../../languageHandler\";\n\ninterface IProps {\n    size?: number;\n}\n\nexport default class InlineSpinner extends React.PureComponent<IProps> {\n    public static defaultProps = {\n        size: 16,\n    };\n\n    public render(): React.ReactNode {\n        return (\n            <span className=\"mx_InlineSpinner\">\n                <BaseInlineSpinner\n                    size={this.props.size}\n                    aria-label={_t(\"common|loading\")}\n                    role=\"progressbar\"\n                    data-testid=\"spinner\"\n                />\n            </span>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactElement } from \"react\";\nimport { JoinRule } from \"matrix-js-sdk/src/matrix\";\nimport {\n    GroupIcon,\n    LockSolidIcon,\n    PublicIcon,\n    AskToJoinIcon,\n} from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport Dropdown from \"./Dropdown\";\nimport { type NonEmptyArray } from \"../../../@types/common\";\n\ninterface IProps {\n    value: JoinRule;\n    label: string;\n    width?: number;\n    labelInvite: string;\n    labelKnock?: string;\n    labelPublic?: string;\n    labelRestricted?: string; // if omitted then this option will be hidden, e.g if unsupported\n    onChange(this: void, value: JoinRule): void;\n}\n\nconst JoinRuleDropdown: React.FC<IProps> = ({\n    label,\n    labelInvite,\n    labelKnock,\n    labelPublic,\n    labelRestricted,\n    value,\n    width = 448,\n    onChange,\n}) => {\n    const options = [\n        <div key={JoinRule.Invite} className=\"mx_JoinRuleDropdown_invite\">\n            <LockSolidIcon />\n            {labelInvite}\n        </div>,\n    ] as NonEmptyArray<ReactElement & { key: string }>;\n\n    if (labelPublic) {\n        options.push(\n            (\n                <div key={JoinRule.Public} className=\"mx_JoinRuleDropdown_public\">\n                    <PublicIcon />\n                    {labelPublic}\n                </div>\n            ) as ReactElement & { key: string },\n        );\n    }\n\n    if (labelKnock) {\n        options.unshift(\n            (\n                <div key={JoinRule.Knock} className=\"mx_JoinRuleDropdown_knock\">\n                    <AskToJoinIcon />\n                    {labelKnock}\n                </div>\n            ) as ReactElement & { key: string },\n        );\n    }\n\n    if (labelRestricted) {\n        options.unshift(\n            (\n                <div key={JoinRule.Restricted} className=\"mx_JoinRuleDropdown_restricted\">\n                    <GroupIcon />\n                    {labelRestricted}\n                </div>\n            ) as ReactElement & { key: string },\n        );\n    }\n\n    return (\n        <Dropdown\n            id=\"mx_JoinRuleDropdown\"\n            className=\"mx_JoinRuleDropdown\"\n            onOptionChange={onChange}\n            menuWidth={width}\n            value={value}\n            label={label}\n            disabled={options.length === 1}\n        >\n            {options}\n        </Dropdown>\n    );\n};\n\nexport default JoinRuleDropdown;\n","/*\nCopyright 2019-2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\n\nclass ItemRange {\n    public constructor(\n        public topCount: number,\n        public renderCount: number,\n        public bottomCount: number,\n    ) {}\n\n    public contains(range: ItemRange): boolean {\n        // don't contain empty ranges\n        // as it will prevent clearing the list\n        // once it is scrolled far enough out of view\n        if (!range.renderCount && this.renderCount) {\n            return false;\n        }\n        return (\n            range.topCount >= this.topCount && range.topCount + range.renderCount <= this.topCount + this.renderCount\n        );\n    }\n\n    public expand(amount: number): ItemRange {\n        // don't expand ranges that won't render anything\n        if (this.renderCount === 0) {\n            return this;\n        }\n\n        const topGrow = Math.min(amount, this.topCount);\n        const bottomGrow = Math.min(amount, this.bottomCount);\n        return new ItemRange(\n            this.topCount - topGrow,\n            this.renderCount + topGrow + bottomGrow,\n            this.bottomCount - bottomGrow,\n        );\n    }\n\n    public totalSize(): number {\n        return this.topCount + this.renderCount + this.bottomCount;\n    }\n}\n\ninterface IProps<T> {\n    // height in pixels of the component returned by `renderItem`\n    itemHeight: number;\n    // function to turn an element of `items` into a react component\n    renderItem: (item: T) => JSX.Element;\n    // scrollTop of the viewport (minus the height of any content above this list like other `LazyRenderList`s)\n    scrollTop: number;\n    // the height of the viewport this content is scrolled in\n    height: number;\n    // all items for the list. These should not be react components, see `renderItem`.\n    items?: T[];\n    // the amount of items to scroll before causing a rerender,\n    // should typically be less than `overflowItems` unless applying\n    // margins in the parent component when using multiple LazyRenderList in one viewport.\n    // use 0 to only rerender when items will come into view.\n    overflowMargin: number;\n    // the amount of items to add at the top and bottom to render,\n    // so not every scroll of causes a rerender.\n    overflowItems: number;\n\n    element?: string;\n    className?: string;\n    role?: string;\n}\n\ninterface IState {\n    renderRange: ItemRange;\n}\n\nexport default class LazyRenderList<T = any> extends React.Component<IProps<T>, IState> {\n    public static defaultProps: Partial<IProps<unknown>> = {\n        overflowItems: 20,\n        overflowMargin: 5,\n    };\n\n    public constructor(props: IProps<T>) {\n        super(props);\n\n        this.state = LazyRenderList.getDerivedStateFromProps(props, {} as IState) as IState;\n    }\n\n    public static getDerivedStateFromProps<T>(props: IProps<T>, state: IState): Partial<IState> | null {\n        const range = LazyRenderList.getVisibleRangeFromProps(props);\n        const intersectRange = range.expand(props.overflowMargin);\n        const renderRange = range.expand(props.overflowItems);\n        const listHasChangedSize = !!state.renderRange && renderRange.totalSize() !== state.renderRange.totalSize();\n        // only update render Range if the list has shrunk/grown and we need to adjust padding OR\n        // if the new range + overflowMargin isn't contained by the old anymore\n        if (listHasChangedSize || !state.renderRange || !state.renderRange.contains(intersectRange)) {\n            return { renderRange };\n        }\n        return null;\n    }\n\n    private static getVisibleRangeFromProps<T>(props: IProps<T>): ItemRange {\n        const { items, itemHeight, scrollTop, height } = props;\n        const length = items ? items.length : 0;\n        const topCount = Math.min(Math.max(0, Math.floor(scrollTop / itemHeight)), length);\n        const itemsAfterTop = length - topCount;\n        const visibleItems = height !== 0 ? Math.ceil(height / itemHeight) : 0;\n        const renderCount = Math.min(visibleItems, itemsAfterTop);\n        const bottomCount = itemsAfterTop - renderCount;\n        return new ItemRange(topCount, renderCount, bottomCount);\n    }\n\n    public render(): React.ReactNode {\n        const { itemHeight, items, renderItem } = this.props;\n        const { renderRange } = this.state;\n        const { topCount, renderCount, bottomCount } = renderRange;\n\n        const paddingTop = topCount * itemHeight;\n        const paddingBottom = bottomCount * itemHeight;\n        const renderedItems = (items || []).slice(topCount, topCount + renderCount);\n\n        const element = this.props.element || \"div\";\n        const elementProps = {\n            style: { paddingTop: `${paddingTop}px`, paddingBottom: `${paddingBottom}px` },\n            className: this.props.className,\n            role: this.props.role,\n        };\n        return React.createElement(element, elementProps, renderedItems.map(renderItem));\n    }\n}\n","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction UserSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 12q-1.65 0-2.825-1.175T8 8t1.175-2.825T12 4t2.825 1.175T16 8t-1.175 2.825T12 12m-8 6v-.8q0-.85.438-1.562.437-.713 1.162-1.088a14.8 14.8 0 0 1 3.15-1.163A13.8 13.8 0 0 1 12 13q1.65 0 3.25.387 1.6.388 3.15 1.163.724.375 1.163 1.087Q20 16.35 20 17.2v.8q0 .824-.587 1.413A1.93 1.93 0 0 1 18 20H6q-.824 0-1.412-.587A1.93 1.93 0 0 1 4 18\"\n    })\n  });\n}\n;\nUserSolidIcon.displayName = \"UserSolidIcon\";\nexport default forwardRef(UserSolidIcon);","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\nimport { useEffect, useState } from \"react\";\n\nimport { PillType } from \"../components/views/elements/PillType\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport { type PermalinkParts } from \"../utils/permalinks/PermalinkConstructor\";\n\n/**\n * Tries to determine the initial room.\n * Initial here means it should be possible to load the room without sending API requests.\n * For an @room or a user mention it is the permalinkRoom.\n * If the parse result contains a room Id or alias try to find it with {@link findRoom}.\n * Otherwise returns null.\n *\n * @param type - Pill type\n * @param permalinkRoom - Room in which the permalink is displayed.\n * @param parseResult - Permalink parser result\n * @returns Initial room or null if it cannot be determined.\n */\nconst determineInitialRoom = (\n    type: PillType | null,\n    parseResult: PermalinkParts | null,\n    permalinkRoom: Room | undefined,\n): Room | null => {\n    if (type === PillType.AtRoomMention && permalinkRoom) return permalinkRoom;\n\n    if (type === PillType.UserMention && permalinkRoom) {\n        return permalinkRoom;\n    }\n\n    if (parseResult?.roomIdOrAlias) {\n        const room = findRoom(parseResult.roomIdOrAlias);\n        if (room) return room;\n    }\n\n    return null;\n};\n\n/**\n * Tries to find a room by room Id or searching all rooms for an alias.\n *\n * @param roomIdOrAlias - Id or alias of the room to find.\n * @returns Room if found, else null.\n */\nconst findRoom = (roomIdOrAlias: string): Room | null => {\n    const client = MatrixClientPeg.safeGet();\n\n    return roomIdOrAlias[0] === \"#\"\n        ? (client.getRooms().find((r) => {\n              return r.getCanonicalAlias() === roomIdOrAlias || r.getAltAliases().includes(roomIdOrAlias);\n          }) ?? null)\n        : client.getRoom(roomIdOrAlias);\n};\n\n/**\n * Hook to get the permalink target room:\n *\n * @param type - Permalink type\n * @param parseResult - Permalink parse result\n * @param permalinkRoom - Room in which the permalink is rendered\n * @returns Returns the target room:\n *          - The permalinkRoom for an @room or user mention\n *          - The room of the parse result for a room mention\n *          - The room of the event for an event permalink\n *          - Null in other cases or if the room cannot be found\n */\nexport const usePermalinkTargetRoom = (\n    type: PillType | null,\n    parseResult: PermalinkParts | null,\n    permalinkRoom: Room | undefined,\n): Room | null => {\n    // The listed permalink types require a room.\n    // If it cannot be initially determined, it will be looked up later by a memo hook.\n    const shouldLookUpRoom =\n        type && [PillType.RoomMention, PillType.EventInSameRoom, PillType.EventInOtherRoom, \"space\"].includes(type);\n    const initialRoom = determineInitialRoom(type, parseResult, permalinkRoom);\n    const [targetRoom, setTargetRoom] = useState<Room | null>(initialRoom);\n\n    useEffect(() => {\n        if (shouldLookUpRoom && !targetRoom && parseResult?.roomIdOrAlias) {\n            const newRoom = findRoom(parseResult.roomIdOrAlias);\n            setTargetRoom(newRoom);\n        }\n    }, [parseResult?.roomIdOrAlias, shouldLookUpRoom, targetRoom]);\n\n    return targetRoom;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type IMatrixProfile, type MatrixEvent, type Room, RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { useContext, useEffect, useState } from \"react\";\n\nimport { PillType } from \"../components/views/elements/PillType\";\nimport { SDKContext } from \"../contexts/SDKContext\";\nimport { type SDKContextClass } from \"../contexts/SDKContextClass\";\nimport { type PermalinkParts } from \"../utils/permalinks/PermalinkConstructor\";\n\nconst createMemberFromProfile = (userId: string, profile: IMatrixProfile): RoomMember => {\n    const member = new RoomMember(\"\", userId);\n    member.name = profile.displayname ?? userId;\n    member.rawDisplayName = member.name;\n    member.events.member = {\n        getContent: () => {\n            return { avatar_url: profile.avatar_url };\n        },\n        getDirectionalContent: function () {\n            // eslint-disable-next-line\n            return this.getContent();\n        },\n    } as MatrixEvent;\n    return member;\n};\n\n/**\n * Tries to determine the user Id of a permalink.\n * In case of a user permalink it is the user id.\n * In case of an event permalink it is the sender user Id of the event if that event is available.\n * Otherwise returns null.\n *\n * @param type - pill type\n * @param parseResult - permalink parse result\n * @param event - permalink event, if available\n * @returns permalink user Id. null if the Id cannot be determined.\n */\nconst determineUserId = (\n    type: PillType | null,\n    parseResult: PermalinkParts | null,\n    event: MatrixEvent | null,\n): string | null => {\n    if (type === null) return null;\n\n    if (parseResult?.userId) return parseResult.userId;\n\n    if (event && [PillType.EventInSameRoom, PillType.EventInOtherRoom].includes(type)) {\n        return event.getSender() ?? null;\n    }\n\n    return null;\n};\n\n/**\n * Tries to determine a RoomMember.\n *\n * @param userId - User Id to get the member for\n * @param targetRoom - permalink target room\n * @returns RoomMember of the target room if it exists.\n *          If sharing at least one room with the user, then the result will be the profile fetched via API.\n *          null in all other cases.\n */\nconst determineMember = (userId: string, targetRoom: Room, context: SDKContextClass): RoomMember | null => {\n    const targetRoomMember = targetRoom.getMember(userId);\n\n    if (targetRoomMember) return targetRoomMember;\n\n    const knownProfile = context.userProfilesStore.getOnlyKnownProfile(userId);\n\n    if (knownProfile) {\n        return createMemberFromProfile(userId, knownProfile);\n    }\n\n    return null;\n};\n\n/**\n * Hook to get the permalink member\n *\n * @param type - Permalink type\n * @param parseResult - Permalink parse result\n * @param targetRoom - Permalink target room {@link ./usePermalinkTargetRoom.ts}\n * @param event - Permalink event\n * @returns The permalink member:\n *          - The room member for a user mention\n *          - The sender for a permalink to an event in the same room\n *          - Null in other cases or the user cannot be loaded.\n */\nexport const usePermalinkMember = (\n    type: PillType | null,\n    parseResult: PermalinkParts | null,\n    targetRoom: Room | null,\n    event: MatrixEvent | null,\n): RoomMember | null => {\n    const context = useContext(SDKContext);\n    // User mentions and permalinks to events in the same room require to know the user.\n    // If it cannot be initially determined, it will be looked up later by a memo hook.\n    const shouldLookUpUser = type && [PillType.UserMention, PillType.EventInSameRoom].includes(type);\n    const userId = determineUserId(type, parseResult, event);\n    const userInRoom = shouldLookUpUser && userId && targetRoom ? determineMember(userId, targetRoom, context) : null;\n    const [member, setMember] = useState<RoomMember | null>(userInRoom);\n\n    useEffect(() => {\n        if (!shouldLookUpUser || !userId || member) {\n            // nothing to do here\n            return;\n        }\n\n        const doProfileLookup = async (): Promise<void> => {\n            const fetchedProfile = await context.userProfilesStore.fetchOnlyKnownProfile(userId);\n\n            if (fetchedProfile) {\n                const newMember = createMemberFromProfile(userId, fetchedProfile);\n                setMember(newMember);\n            }\n        };\n\n        doProfileLookup();\n    }, [context, member, shouldLookUpUser, targetRoom, userId]);\n\n    return member;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, type Room, type RoomMember } from \"matrix-js-sdk/src/matrix\";\n\nimport { type ButtonEvent } from \"../components/views/elements/AccessibleButton\";\nimport { PillType } from \"../components/views/elements/PillType\";\nimport { parsePermalink } from \"../utils/permalinks/Permalinks\";\nimport dis from \"../dispatcher/dispatcher\";\nimport { Action } from \"../dispatcher/actions\";\nimport { type PermalinkParts } from \"../utils/permalinks/PermalinkConstructor\";\nimport { _t } from \"../languageHandler\";\nimport { usePermalinkTargetRoom } from \"./usePermalinkTargetRoom\";\nimport { usePermalinkEvent } from \"./usePermalinkEvent\";\nimport { usePermalinkMember } from \"./usePermalinkMember\";\n\ninterface Args {\n    /** Room in which the permalink should be displayed. */\n    room?: Room;\n    /** When set forces the permalink type. */\n    type?: PillType;\n    /** Permalink URL. */\n    url?: string;\n}\n\ninterface HookResult {\n    /**\n     * Room member of a user mention permalink.\n     * null for other links, if the profile was not found or not yet loaded.\n     * This can change, for instance, from null to a RoomMember after the profile lookup completed.\n     */\n    member: RoomMember | null;\n    /**\n     * Displayable text of the permalink resource. Can for instance be a user or room name.\n     * null here means that there is nothing to display. Most likely if the URL was not a permalink.\n     */\n    text: string | null;\n    /**\n     * Should be used for click actions on the permalink.\n     * In case of a user permalink, a view profile action is dispatched.\n     */\n    onClick: (e: ButtonEvent) => void;\n    /**\n     * This can be for instance a user or room Id.\n     * null here means that the resource cannot be detected. Most likely if the URL was not a permalink.\n     */\n    resourceId: string | null;\n    /**\n     * Target room of the permalink:\n     * For an @room mention, this is the room where the permalink should be displayed.\n     * For a room permalink, it is the room from the permalink.\n     * null for other links or if the room cannot be found.\n     */\n    targetRoom: Room | null;\n    /**\n     * Type of the pill plus \"space\" for spaces.\n     * null here means that the type cannot be detected. Most likely if the URL was not a permalink.\n     */\n    type: PillType | \"space\" | null;\n    /**\n     * Target event of the permalink.\n     * Null if unable to load the event.\n     */\n    event: MatrixEvent | null;\n}\n\n/**\n * Tries to determine the pill type.\n *\n * If forcedType is present it will be returned.\n * If the parse result contains a room Id or alias and an event Id:\n * - Type is EventInSameRoom if the permalink room Id or alias equals the parsed room Id or alias\n * - Type is EventInOtherRoom if the permalink room Id or alias not equals the parsed room Id or alias\n * If the parse result contains a primary entity Id it will try to detect the type from it.\n * Otherwise returns null.\n *\n * @param forcedType - Forced pill type. Will be used if present and short-circuits all othe conditions.\n * @param parseResult - Permalink parser result\n * @param permalinkRoom - Room in which the permalink is displayed.\n * @returns Pill type or null if unable to determine.\n */\nconst determineType = (\n    forcedType: PillType | undefined,\n    parseResult: PermalinkParts | null,\n    permalinkRoom: Room | undefined,\n): PillType | null => {\n    if (forcedType) return forcedType;\n\n    if (parseResult?.roomIdOrAlias && parseResult?.eventId) {\n        if (parseResult.roomIdOrAlias === permalinkRoom?.roomId) {\n            return PillType.EventInSameRoom;\n        }\n\n        return PillType.EventInOtherRoom;\n    }\n\n    if (parseResult?.primaryEntityId) {\n        const prefix = parseResult.primaryEntityId[0] || \"\";\n        return (\n            {\n                \"@\": PillType.UserMention,\n                \"#\": PillType.RoomMention,\n                \"!\": PillType.RoomMention,\n            }[prefix] || null\n        );\n    }\n\n    return null;\n};\n\n/**\n * Can be used to retrieve all information needed to display a permalink.\n */\nexport const usePermalink: (args: Args) => HookResult = ({\n    room: permalinkRoom,\n    type: forcedType,\n    url,\n}): HookResult => {\n    let resourceId: string | null = null;\n    let parseResult: PermalinkParts | null = null;\n\n    if (url) {\n        parseResult = parsePermalink(url);\n\n        if (parseResult?.primaryEntityId) {\n            resourceId = parseResult.primaryEntityId;\n        }\n    }\n\n    const type = determineType(forcedType, parseResult, permalinkRoom);\n    const targetRoom = usePermalinkTargetRoom(type, parseResult, permalinkRoom);\n    const event = usePermalinkEvent(type, parseResult, targetRoom);\n    const member = usePermalinkMember(type, parseResult, targetRoom, event);\n\n    let onClick: (e: ButtonEvent) => void = () => {};\n    let text = resourceId;\n\n    if (type === PillType.AtRoomMention && permalinkRoom) {\n        text = \"@room\";\n    } else if (type === PillType.UserMention && member) {\n        text = member.name || resourceId;\n        onClick = (e: ButtonEvent): void => {\n            e.preventDefault();\n            e.stopPropagation();\n            dis.dispatch({\n                action: Action.ViewUser,\n                member: member,\n            });\n        };\n    } else if (type === PillType.RoomMention) {\n        if (targetRoom) {\n            text = targetRoom.name || resourceId;\n        }\n    } else if (type === PillType.EventInSameRoom) {\n        text = member?.name || _t(\"common|user\");\n    } else if (type === PillType.EventInOtherRoom) {\n        text = targetRoom?.name || _t(\"common|room\");\n    }\n\n    return {\n        event,\n        member,\n        onClick,\n        resourceId,\n        targetRoom,\n        text,\n        type,\n    };\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { MatrixEvent, type Room } from \"matrix-js-sdk/src/matrix\";\nimport { useEffect, useState } from \"react\";\n\nimport { PillType } from \"../components/views/elements/PillType\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport { type PermalinkParts } from \"../utils/permalinks/PermalinkConstructor\";\n\n/**\n * Tries to find the initial event.\n * If the event should not be looked up or there is no target room it returns null.\n * Otherwise it tries to get the event from the target room.\n *\n * @param shouldLookUpEvent - whether the parmalink event should be looked up\n * @param Room | null targetRoom - target room of the permalink\n * @param parseResult - permalink parse result\n * @returns The event if found or null if it should not be looked up or was not found.\n */\nconst determineInitialEvent = (\n    shouldLookUpEvent: boolean,\n    targetRoom: Room | null,\n    parseResult: PermalinkParts | null,\n): MatrixEvent | null => {\n    if (!shouldLookUpEvent || !targetRoom || !parseResult?.eventId) return null;\n\n    return targetRoom.findEventById(parseResult.eventId) || null;\n};\n\n/**\n * Hook to get a permalink target event\n *\n * @param type - Permalink type\n * @param parseResult - Permalink parse result\n * @param targetRoom - Target room of the permalink {@link ./usePermalinkTargetRoom.ts}\n * @returns The permalink event if it targets an event and it can be loaded.\n *          Else null.\n */\nexport const usePermalinkEvent = (\n    type: PillType | null,\n    parseResult: PermalinkParts | null,\n    targetRoom: Room | null,\n): MatrixEvent | null => {\n    // Event permalinks require to know the event.\n    // If it cannot be initially determined, it will be looked up later by a memo hook.\n    const shouldLookUpEvent =\n        !!type &&\n        !!parseResult?.roomIdOrAlias &&\n        !!parseResult?.eventId &&\n        [PillType.EventInSameRoom, PillType.EventInOtherRoom].includes(type);\n    const eventId = parseResult?.eventId;\n    const eventInRoom = determineInitialEvent(shouldLookUpEvent, targetRoom, parseResult);\n    const [event, setEvent] = useState<MatrixEvent | null>(eventInRoom);\n\n    useEffect(() => {\n        if (!shouldLookUpEvent || !eventId || event || !parseResult?.roomIdOrAlias || !parseResult.eventId) {\n            // nothing to do here\n            return;\n        }\n\n        const fetchRoomEvent = async (): Promise<void> => {\n            try {\n                const eventData = await MatrixClientPeg.safeGet().fetchRoomEvent(\n                    parseResult.roomIdOrAlias!,\n                    parseResult.eventId!,\n                );\n                setEvent(new MatrixEvent(eventData));\n            } catch {}\n        };\n\n        fetchRoomEvent();\n    }, [event, eventId, parseResult?.eventId, parseResult?.roomIdOrAlias, shouldLookUpEvent]);\n\n    return event;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017-2019 , 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactElement, useContext } from \"react\";\nimport classNames from \"classnames\";\nimport { type Room, type RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { Tooltip } from \"@vector-im/compound-web\";\nimport { LinkIcon, UserSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { usePermalink } from \"../../../hooks/usePermalink\";\nimport RoomAvatar from \"../avatars/RoomAvatar\";\nimport MemberAvatar from \"../avatars/MemberAvatar\";\nimport { _t } from \"../../../languageHandler\";\nimport { PillType } from \"./PillType\";\n\nconst linkIcon = <LinkIcon className=\"mx_Pill_LinkIcon mx_BaseAvatar\" />;\n\nconst PillRoomAvatar: React.FC<{\n    shouldShowPillAvatar: boolean;\n    room: Room | null;\n}> = ({ shouldShowPillAvatar, room }) => {\n    if (!shouldShowPillAvatar) {\n        return null;\n    }\n\n    if (room) {\n        return <RoomAvatar room={room} size=\"16px\" aria-hidden=\"true\" />;\n    }\n    return linkIcon;\n};\n\nconst PillMemberAvatar: React.FC<{\n    shouldShowPillAvatar: boolean;\n    member: RoomMember | null;\n}> = ({ shouldShowPillAvatar, member }) => {\n    if (!shouldShowPillAvatar) {\n        return null;\n    }\n\n    if (member) {\n        return <MemberAvatar member={member} size=\"16px\" aria-hidden=\"true\" hideTitle />;\n    }\n    return <UserSolidIcon className=\"mx_Pill_UserIcon mx_BaseAvatar\" />;\n};\n\nexport interface PillProps {\n    // The Type of this Pill. If url is given, this is auto-detected.\n    type?: PillType;\n    // The URL to pillify (no validation is done)\n    url?: string;\n    /** Whether the pill is in a message. It will act as a link then. */\n    inMessage?: boolean;\n    // The room in which this pill is being rendered\n    room?: Room;\n    // Whether to include an avatar in the pill\n    shouldShowPillAvatar?: boolean;\n    // Explicitly-provided text to display in the pill\n    text?: string;\n}\n\nexport const Pill: React.FC<PillProps> = ({\n    type: propType,\n    url,\n    inMessage,\n    room,\n    shouldShowPillAvatar = true,\n    text: customPillText,\n}) => {\n    const cli = useContext(MatrixClientContext);\n    const {\n        event,\n        member,\n        onClick,\n        resourceId,\n        targetRoom,\n        text: linkText,\n        type,\n    } = usePermalink({\n        room,\n        type: propType,\n        url,\n    });\n    const text = customPillText ?? linkText;\n\n    if (!type || !text) {\n        return null;\n    }\n\n    const classes = classNames(\"mx_Pill\", {\n        mx_AtRoomPill: type === PillType.AtRoomMention,\n        mx_RoomPill: type === PillType.RoomMention,\n        mx_SpacePill: type === \"space\" || targetRoom?.isSpaceRoom(),\n        mx_UserPill: type === PillType.UserMention,\n        mx_UserPill_me: resourceId === cli.getUserId(),\n        mx_EventPill: type === PillType.EventInOtherRoom || type === PillType.EventInSameRoom,\n        mx_KeywordPill: type === PillType.Keyword,\n    });\n\n    let avatar: ReactElement | null = null;\n    let pillText: string | null = text;\n\n    switch (type) {\n        case PillType.EventInOtherRoom:\n            {\n                avatar = <PillRoomAvatar shouldShowPillAvatar={shouldShowPillAvatar} room={targetRoom} />;\n                pillText = _t(\"pill|permalink_other_room\", {\n                    room: text,\n                });\n            }\n            break;\n        case PillType.EventInSameRoom:\n            {\n                if (event) {\n                    avatar = <PillMemberAvatar shouldShowPillAvatar={shouldShowPillAvatar} member={member} />;\n                    pillText = _t(\"pill|permalink_this_room\", {\n                        user: text,\n                    });\n                } else {\n                    avatar = linkIcon;\n                    pillText = _t(\"common|message\");\n                }\n            }\n            break;\n        case PillType.AtRoomMention:\n        case PillType.RoomMention:\n        case \"space\":\n            avatar = <PillRoomAvatar shouldShowPillAvatar={shouldShowPillAvatar} room={targetRoom} />;\n            break;\n        case PillType.UserMention:\n            avatar = <PillMemberAvatar shouldShowPillAvatar={shouldShowPillAvatar} member={member} />;\n            break;\n        case PillType.Keyword:\n            break;\n        default:\n            return null;\n    }\n\n    const isAnchor = !!inMessage && !!url;\n    return (\n        <bdi>\n            <Tooltip\n                description={resourceId ?? \"\"}\n                open={resourceId ? undefined : false}\n                placement=\"right\"\n                isTriggerInteractive={isAnchor}\n            >\n                {isAnchor ? (\n                    <a className={classes} href={url} onClick={onClick}>\n                        {avatar}\n                        <span className=\"mx_Pill_text\">{pillText}</span>\n                    </a>\n                ) : (\n                    <span className={classes}>\n                        {avatar}\n                        <span className=\"mx_Pill_text\">{pillText}</span>\n                    </span>\n                )}\n            </Tooltip>\n        </bdi>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017-2019 , 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport enum PillType {\n    UserMention = \"TYPE_USER_MENTION\",\n    RoomMention = \"TYPE_ROOM_MENTION\",\n    AtRoomMention = \"TYPE_AT_ROOM_MENTION\", // '@room' mention\n    EventInSameRoom = \"TYPE_EVENT_IN_SAME_ROOM\",\n    EventInOtherRoom = \"TYPE_EVENT_IN_OTHER_ROOM\",\n    Keyword = \"TYPE_KEYWORD\", // Used to highlight keywords that triggered a notification rule\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021, 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent, createRef } from \"react\";\nimport {\n    type Room,\n    type MatrixEvent,\n    type KnownPollKind,\n    M_POLL_KIND_DISCLOSED,\n    M_POLL_KIND_UNDISCLOSED,\n    M_POLL_START,\n    type IPartialEvent,\n    type TimelineEvents,\n} from \"matrix-js-sdk/src/matrix\";\nimport { PollStartEvent } from \"matrix-js-sdk/src/extensible_events_v1/PollStartEvent\";\nimport { CloseIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport ScrollableBaseModal, { type IScrollableBaseState } from \"../dialogs/ScrollableBaseModal\";\nimport QuestionDialog from \"../dialogs/QuestionDialog\";\nimport Modal from \"../../../Modal\";\nimport { _t } from \"../../../languageHandler\";\nimport { arrayFastClone, arraySeed } from \"../../../utils/arrays\";\nimport Field from \"./Field\";\nimport AccessibleButton from \"./AccessibleButton\";\nimport Spinner from \"./Spinner\";\nimport { doMaybeLocalRoomAction } from \"../../../utils/local-room\";\n\ninterface IProps {\n    room: Room;\n    threadId?: string;\n    editingMxEvent?: MatrixEvent; // Truthy if we are editing an existing poll\n    onFinished(pollCreated?: boolean): void;\n}\n\nenum FocusTarget {\n    Topic,\n    NewOption,\n}\ninterface IState extends IScrollableBaseState {\n    question: string;\n    options: string[];\n    busy: boolean;\n    kind: KnownPollKind;\n    autoFocusTarget: FocusTarget;\n}\n\nconst MIN_OPTIONS = 2;\nconst MAX_OPTIONS = 20;\nconst DEFAULT_NUM_OPTIONS = 2;\nconst MAX_QUESTION_LENGTH = 340;\nconst MAX_OPTION_LENGTH = 340;\n\nfunction creatingInitialState(): IState {\n    return {\n        title: _t(\"poll|create_poll_title\"),\n        actionLabel: _t(\"poll|create_poll_action\"),\n        canSubmit: false, // need to add a question and at least one option first\n        question: \"\",\n        options: arraySeed(\"\", DEFAULT_NUM_OPTIONS),\n        busy: false,\n        kind: M_POLL_KIND_DISCLOSED,\n        autoFocusTarget: FocusTarget.Topic,\n    };\n}\n\nfunction editingInitialState(editingMxEvent: MatrixEvent): IState {\n    const poll = editingMxEvent.unstableExtensibleEvent as PollStartEvent;\n    if (!poll?.isEquivalentTo(M_POLL_START)) return creatingInitialState();\n\n    return {\n        title: _t(\"poll|edit_poll_title\"),\n        actionLabel: _t(\"action|done\"),\n        canSubmit: true,\n        question: poll.question.text,\n        options: poll.answers.map((ans) => ans.text),\n        busy: false,\n        kind: poll.kind,\n        autoFocusTarget: FocusTarget.Topic,\n    };\n}\n\nexport default class PollCreateDialog extends ScrollableBaseModal<IProps, IState> {\n    private addOptionRef = createRef<HTMLDivElement>();\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = props.editingMxEvent ? editingInitialState(props.editingMxEvent) : creatingInitialState();\n    }\n\n    private checkCanSubmit(): void {\n        this.setState({\n            canSubmit:\n                !this.state.busy &&\n                this.state.question.trim().length > 0 &&\n                this.state.options.filter((op) => op.trim().length > 0).length >= MIN_OPTIONS,\n        });\n    }\n\n    private onQuestionChange = (e: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({ question: e.target.value }, () => this.checkCanSubmit());\n    };\n\n    private onOptionChange = (i: number, e: ChangeEvent<HTMLInputElement>): void => {\n        const newOptions = arrayFastClone(this.state.options);\n        newOptions[i] = e.target.value;\n        this.setState({ options: newOptions }, () => this.checkCanSubmit());\n    };\n\n    private onOptionRemove = (i: number): void => {\n        const newOptions = arrayFastClone(this.state.options);\n        newOptions.splice(i, 1);\n        this.setState({ options: newOptions }, () => this.checkCanSubmit());\n    };\n\n    private onOptionAdd = (): void => {\n        const newOptions = arrayFastClone(this.state.options);\n        newOptions.push(\"\");\n        this.setState({ options: newOptions, autoFocusTarget: FocusTarget.NewOption }, () => {\n            // Scroll the button into view after the state update to ensure we don't experience\n            // a pop-in effect, and to avoid the button getting cut off due to a mid-scroll render.\n            this.addOptionRef.current?.scrollIntoView?.();\n        });\n    };\n\n    private createEvent(): IPartialEvent<object> {\n        const pollStart = PollStartEvent.from(\n            this.state.question.trim(),\n            this.state.options.map((a) => a.trim()).filter((a) => !!a),\n            this.state.kind.name,\n        ).serialize();\n\n        if (!this.props.editingMxEvent) {\n            return pollStart;\n        } else {\n            return {\n                content: {\n                    \"m.new_content\": pollStart.content,\n                    \"m.relates_to\": {\n                        rel_type: \"m.replace\",\n                        event_id: this.props.editingMxEvent.getId(),\n                    },\n                },\n                type: pollStart.type,\n            };\n        }\n    }\n\n    protected submit(): void {\n        this.setState({ busy: true, canSubmit: false });\n        const pollEvent = this.createEvent();\n        doMaybeLocalRoomAction(\n            this.props.room.roomId,\n            (actualRoomId: string) =>\n                this.matrixClient.sendEvent(\n                    actualRoomId,\n                    this.props.threadId ?? null,\n                    pollEvent.type as keyof TimelineEvents,\n                    pollEvent.content as TimelineEvents[keyof TimelineEvents],\n                ),\n            this.matrixClient,\n        )\n            .then(() => this.props.onFinished(true))\n            .catch((e) => {\n                console.error(\"Failed to post poll:\", e);\n                const { finished } = Modal.createDialog(QuestionDialog, {\n                    title: _t(\"poll|failed_send_poll_title\"),\n                    description: _t(\"poll|failed_send_poll_description\"),\n                    button: _t(\"action|try_again\"),\n                    cancelButton: _t(\"action|cancel\"),\n                });\n                finished.then(([tryAgain]) => {\n                    if (!tryAgain) {\n                        this.cancel();\n                    } else {\n                        this.setState({ busy: false, canSubmit: true });\n                    }\n                });\n            });\n    }\n\n    protected cancel(): void {\n        this.props.onFinished(false);\n    }\n\n    protected renderContent(): React.ReactNode {\n        return (\n            <div className=\"mx_PollCreateDialog\">\n                <h2>{_t(\"poll|type_heading\")}</h2>\n                <Field element=\"select\" value={this.state.kind.name} onChange={this.onPollTypeChange}>\n                    <option key={M_POLL_KIND_DISCLOSED.name} value={M_POLL_KIND_DISCLOSED.name}>\n                        {_t(\"poll|type_open\")}\n                    </option>\n                    <option key={M_POLL_KIND_UNDISCLOSED.name} value={M_POLL_KIND_UNDISCLOSED.name}>\n                        {_t(\"poll|type_closed\")}\n                    </option>\n                </Field>\n                <p>{pollTypeNotes(this.state.kind)}</p>\n                <h2>{_t(\"poll|topic_heading\")}</h2>\n                <Field\n                    id=\"poll-topic-input\"\n                    value={this.state.question}\n                    maxLength={MAX_QUESTION_LENGTH}\n                    label={_t(\"poll|topic_label\")}\n                    placeholder={_t(\"poll|topic_placeholder\")}\n                    onChange={this.onQuestionChange}\n                    usePlaceholderAsHint={true}\n                    disabled={this.state.busy}\n                    autoFocus={this.state.autoFocusTarget === FocusTarget.Topic}\n                />\n                <h2>{_t(\"poll|options_heading\")}</h2>\n                {this.state.options.map((op, i) => (\n                    <div key={`option_${i}`} className=\"mx_PollCreateDialog_option\">\n                        <Field\n                            id={`pollcreate_option_${i}`}\n                            value={op}\n                            maxLength={MAX_OPTION_LENGTH}\n                            label={_t(\"poll|options_label\", { number: i + 1 })}\n                            placeholder={_t(\"poll|options_placeholder\")}\n                            onChange={(e: ChangeEvent<HTMLInputElement>) => this.onOptionChange(i, e)}\n                            usePlaceholderAsHint={true}\n                            disabled={this.state.busy}\n                            autoFocus={\n                                this.state.autoFocusTarget === FocusTarget.NewOption &&\n                                i === this.state.options.length - 1\n                            }\n                        />\n                        <AccessibleButton\n                            onClick={() => this.onOptionRemove(i)}\n                            className=\"mx_PollCreateDialog_removeOption\"\n                            disabled={this.state.busy}\n                        >\n                            <CloseIcon />\n                        </AccessibleButton>\n                    </div>\n                ))}\n                <AccessibleButton\n                    onClick={this.onOptionAdd}\n                    disabled={this.state.busy || this.state.options.length >= MAX_OPTIONS}\n                    kind=\"secondary\"\n                    className=\"mx_PollCreateDialog_addOption\"\n                    ref={this.addOptionRef}\n                >\n                    {_t(\"poll|options_add_button\")}\n                </AccessibleButton>\n                {this.state.busy && (\n                    <div className=\"mx_PollCreateDialog_busy\">\n                        <Spinner />\n                    </div>\n                )}\n            </div>\n        );\n    }\n\n    public onPollTypeChange = (e: ChangeEvent<HTMLSelectElement>): void => {\n        this.setState({\n            kind: M_POLL_KIND_DISCLOSED.matches(e.target.value) ? M_POLL_KIND_DISCLOSED : M_POLL_KIND_UNDISCLOSED,\n        });\n    };\n}\n\nfunction pollTypeNotes(kind: KnownPollKind): string {\n    if (M_POLL_KIND_DISCLOSED.matches(kind.name)) {\n        return _t(\"poll|disclosed_notes\");\n    } else {\n        return _t(\"poll|notes\");\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport * as Roles from \"../../../Roles\";\nimport { _t } from \"../../../languageHandler\";\nimport Field from \"./Field\";\nimport { KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport { objectHasDiff } from \"../../../utils/objects\";\nimport { arrayHasDiff } from \"../../../utils/arrays.ts\";\n\nconst CUSTOM_VALUE = \"SELECT_VALUE_CUSTOM\";\n\ninterface Props<K extends undefined | string> {\n    value: number;\n    // The maximum value that can be set with the power selector\n    maxValue: number;\n\n    // Default user power level for the room\n    usersDefault: number;\n\n    // should the user be able to change the value? false by default.\n    disabled?: boolean;\n\n    // The name to annotate the selector with\n    label?: string;\n\n    onChange(value: number, powerLevelKey: K extends undefined ? void : K): void | Promise<void>;\n\n    // Optional key to pass as the second argument to `onChange`\n    powerLevelKey: K extends undefined ? void : K;\n}\n\ninterface IState {\n    // List of power levels to show in the drop-down\n    options: number[];\n\n    customValue: number;\n    selectValue: number | string;\n    custom?: boolean;\n}\n\nexport default class PowerSelector<K extends undefined | string> extends React.PureComponent<Props<K>, IState> {\n    public static defaultProps: Partial<Props<any>> = {\n        maxValue: Infinity,\n        usersDefault: 0,\n    };\n    private unmounted = false;\n\n    public constructor(props: Props<K>) {\n        super(props);\n\n        this.state = {\n            // List of power levels to show in the drop-down\n            options: [],\n\n            customValue: this.props.value,\n            selectValue: 0,\n        };\n    }\n\n    public componentDidMount(): void {\n        this.unmounted = false;\n        this.initStateFromProps();\n    }\n\n    public componentDidUpdate(prevProps: Readonly<Props<K>>): void {\n        if (objectHasDiff(this.props, prevProps)) {\n            this.initStateFromProps();\n        }\n    }\n\n    public componentWillUnmount(): void {\n        this.unmounted = true;\n    }\n\n    private initStateFromProps(): void {\n        // This needs to be done now because levelRoleMap has translated strings\n        const levelRoleMap = Roles.levelRoleMap(this.props.usersDefault);\n\n        const options = Object.keys(levelRoleMap)\n            .filter((level) => {\n                return (\n                    level === undefined || parseInt(level) <= this.props.maxValue || parseInt(level) == this.props.value\n                );\n            })\n            .map((level) => parseInt(level));\n\n        if (arrayHasDiff(options, this.state.options)) {\n            this.setState({ options });\n        }\n\n        const isCustom = levelRoleMap[this.props.value] === undefined;\n\n        this.setState({\n            custom: isCustom,\n            customValue: this.props.value,\n            selectValue: isCustom ? CUSTOM_VALUE : this.props.value,\n        });\n    }\n\n    private onSelectChange = async (event: React.ChangeEvent<HTMLSelectElement>): Promise<void> => {\n        const isCustom = event.target.value === CUSTOM_VALUE;\n        if (isCustom) {\n            this.setState({ custom: true });\n        } else {\n            const powerLevel = parseInt(event.target.value);\n            this.setState({ selectValue: powerLevel });\n            try {\n                await this.props.onChange(powerLevel, this.props.powerLevelKey);\n            } catch {\n                if (this.unmounted) return;\n                // If the request failed, roll back the state of the selector.\n                this.initStateFromProps();\n            }\n        }\n    };\n\n    private onCustomChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n        this.setState({ customValue: parseInt(event.target.value) });\n    };\n\n    private onCustomBlur = async (event: React.FocusEvent): Promise<void> => {\n        event.preventDefault();\n        event.stopPropagation();\n\n        if (Number.isFinite(this.state.customValue)) {\n            try {\n                await this.props.onChange(this.state.customValue, this.props.powerLevelKey);\n            } catch {\n                if (this.unmounted) return;\n                // If the request failed, roll back the state of the selector.\n                this.initStateFromProps();\n            }\n        } else {\n            this.initStateFromProps(); // reset, invalid input\n        }\n    };\n\n    private onCustomKeyDown = (event: React.KeyboardEvent<HTMLInputElement>): void => {\n        const action = getKeyBindingsManager().getAccessibilityAction(event);\n        switch (action) {\n            case KeyBindingAction.Enter:\n                event.preventDefault();\n                event.stopPropagation();\n\n                // Do not call the onChange handler directly here - it can cause an infinite loop.\n                // Long story short, a user hits Enter to submit the value which onChange handles as\n                // raising a dialog which causes a blur which causes a dialog which causes a blur and\n                // so on. By not causing the onChange to be called here, we avoid the loop because we\n                // handle the onBlur safely.\n                (event.target as HTMLInputElement).blur();\n                break;\n        }\n    };\n\n    public render(): React.ReactNode {\n        let picker;\n        const label = typeof this.props.label === \"undefined\" ? _t(\"power_level|label\") : this.props.label;\n        if (this.state.custom) {\n            picker = (\n                <Field\n                    type=\"number\"\n                    label={label}\n                    max={this.props.maxValue}\n                    onBlur={this.onCustomBlur}\n                    onKeyDown={this.onCustomKeyDown}\n                    onChange={this.onCustomChange}\n                    value={String(this.state.customValue)}\n                    disabled={this.props.disabled}\n                />\n            );\n        } else {\n            // Each level must have a definition in this.state.levelRoleMap\n            const options = this.state.options.map((level) => {\n                return {\n                    value: String(level),\n                    text: Roles.textualPowerLevel(level, this.props.usersDefault),\n                };\n            });\n            options.push({ value: CUSTOM_VALUE, text: _t(\"power_level|custom_level\") });\n            const optionsElements = options.map((op) => {\n                return (\n                    <option value={op.value} key={op.value} data-testid={`power-level-option-${op.value}`}>\n                        {op.text}\n                    </option>\n                );\n            });\n\n            picker = (\n                <Field\n                    element=\"select\"\n                    label={label}\n                    onChange={this.onSelectChange}\n                    value={String(this.state.selectValue)}\n                    disabled={this.props.disabled}\n                    data-testid=\"power-level-select-element\"\n                >\n                    {optionsElements}\n                </Field>\n            );\n        }\n\n        return <div className=\"mx_PowerSelector\">{picker}</div>;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport SettingsStore from \"../settings/SettingsStore\";\n\nconst debuglog = (...args: any[]): void => {\n    if (SettingsStore.getValue(\"debug_animation\")) {\n        logger.log.call(console, \"Animation debuglog:\", ...args);\n    }\n};\n\nexport function useAnimation(enabled: boolean, callback: (timestamp: DOMHighResTimeStamp) => boolean): void {\n    const handle = useRef<number | null>(null);\n\n    const handler = useCallback(\n        (timestamp: DOMHighResTimeStamp) => {\n            if (callback(timestamp)) {\n                handle.current = requestAnimationFrame(handler);\n            } else {\n                debuglog(\"Finished animation!\");\n            }\n        },\n        [callback],\n    );\n\n    useEffect(() => {\n        debuglog(\"Started animation!\");\n        if (enabled) {\n            handle.current = requestAnimationFrame(handler);\n        }\n        return () => {\n            if (handle.current) {\n                debuglog(\"Aborted animation!\");\n                cancelAnimationFrame(handle.current);\n                handle.current = null;\n            }\n        };\n    }, [enabled, handler]);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { useAnimation } from \"./useAnimation\";\n\nconst debuglog = (...args: any[]): void => {\n    if (SettingsStore.getValue(\"debug_animation\")) {\n        logger.log.call(console, \"Animation debuglog:\", ...args);\n    }\n};\n\n/**\n * Utility function to smoothly animate to a certain target value\n * @param initialValue Initial value to be used as initial starting point\n * @param targetValue Desired value to animate to (can be changed repeatedly to whatever is current at that time)\n * @param duration Duration that each animation should take, specify 0 to skip animating\n */\nexport function useSmoothAnimation(initialValue: number, targetValue: number, duration: number): number {\n    const state = useRef<{ timestamp: DOMHighResTimeStamp | null; value: number }>({\n        timestamp: null,\n        value: initialValue,\n    });\n    const [currentValue, setCurrentValue] = useState<number>(initialValue);\n    const [currentStepSize, setCurrentStepSize] = useState<number>(0);\n\n    useEffect(() => {\n        const totalDelta = targetValue - state.current.value;\n        setCurrentStepSize(totalDelta / duration);\n        state.current = { ...state.current, timestamp: null };\n    }, [duration, targetValue]);\n\n    const update = useCallback(\n        (timestamp: DOMHighResTimeStamp): boolean => {\n            if (!state.current.timestamp) {\n                state.current = { ...state.current, timestamp };\n                return true;\n            }\n\n            if (Math.abs(currentStepSize) < Number.EPSILON) {\n                return false;\n            }\n\n            const timeDelta = timestamp - state.current.timestamp;\n            const valueDelta = currentStepSize * timeDelta;\n            const maxValueDelta = targetValue - state.current.value;\n            const clampedValueDelta = Math.sign(valueDelta) * Math.min(Math.abs(maxValueDelta), Math.abs(valueDelta));\n            const value = state.current.value + clampedValueDelta;\n\n            debuglog(`Animating to ${targetValue} at ${value} timeDelta=${timeDelta}, valueDelta=${valueDelta}`);\n\n            setCurrentValue(value);\n            state.current = { value, timestamp };\n\n            return Math.abs(maxValueDelta) > Number.EPSILON;\n        },\n        [currentStepSize, targetValue],\n    );\n\n    useAnimation(duration > 0, update);\n\n    return duration > 0 ? currentValue : targetValue;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020-2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport { useSmoothAnimation } from \"../../../hooks/useSmoothAnimation\";\n\ninterface IProps {\n    value: number;\n    max: number;\n    animated?: boolean;\n}\n\nconst PROGRESS_BAR_ANIMATION_DURATION = 300;\nconst ProgressBar: React.FC<IProps> = ({ value, max, animated = true }) => {\n    // Animating progress bars via CSS transition isn’t possible in all of our supported browsers yet.\n    // As workaround, we’re using animations through JS requestAnimationFrame\n    const currentValue = useSmoothAnimation(0, value, animated ? PROGRESS_BAR_ANIMATION_DURATION : 0);\n    return <progress className=\"mx_ProgressBar\" max={max} value={currentValue} />;\n};\n\nexport default ProgressBar;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { toDataURL, type QRCodeSegment, type QRCodeToDataURLOptions, type QRCodeRenderersOptions } from \"qrcode\";\nimport classNames from \"classnames\";\n\nimport { _t } from \"../../../languageHandler\";\nimport Spinner from \"./Spinner\";\n\ninterface IProps extends QRCodeRenderersOptions {\n    /** The data for the QR code. If `null`, a spinner is shown. */\n    data: null | string | QRCodeSegment[];\n    className?: string;\n}\n\nconst defaultOptions: QRCodeToDataURLOptions = {\n    errorCorrectionLevel: \"L\", // we want it as trivial-looking as possible\n};\n\nconst QRCode: React.FC<IProps> = ({ data, className, ...options }) => {\n    const [dataUri, setUri] = React.useState<string | null>(null);\n    React.useEffect(() => {\n        if (data === null) {\n            setUri(null);\n            return;\n        }\n        let cancelled = false;\n        toDataURL(data, { ...defaultOptions, ...options }).then((uri) => {\n            if (cancelled) return;\n            setUri(uri);\n        });\n        return () => {\n            cancelled = true;\n        };\n    }, [JSON.stringify(data), options]); // eslint-disable-line react-hooks/exhaustive-deps\n\n    return (\n        <div className={classNames(\"mx_QRCode\", className)}>\n            {dataUri ? <img src={dataUri} className=\"mx_VerificationQRCode\" alt={_t(\"common|qr_code\")} /> : <Spinner />}\n        </div>\n    );\n};\n\nexport default QRCode;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, createRef, type KeyboardEventHandler } from \"react\";\nimport { MatrixError } from \"matrix-js-sdk/src/matrix\";\n\nimport { _t } from \"../../../languageHandler\";\nimport withValidation, { type IFieldState, type IValidationResult } from \"./Validation\";\nimport Field, { type IValidateOpts } from \"./Field\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\n\ninterface IProps {\n    domain?: string;\n    value: string;\n    label?: string;\n    placeholder?: string;\n    disabled?: boolean;\n    // if roomId is passed then the entered alias is checked to point to this roomId, else must be unassigned\n    roomId?: string;\n    onKeyDown?: KeyboardEventHandler;\n    onChange?(value: string): void;\n}\n\ninterface IState {\n    isValid: boolean;\n}\n\n// Controlled form component wrapping Field for inputting a room alias scoped to a given domain\nexport default class RoomAliasField extends React.PureComponent<IProps, IState> {\n    public static contextType = MatrixClientContext;\n    declare public context: React.ContextType<typeof MatrixClientContext>;\n\n    private fieldRef = createRef<Field>();\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            isValid: true,\n        };\n    }\n\n    private asFullAlias(localpart: string): string {\n        const hashAlias = `#${localpart}`;\n        if (this.props.domain) {\n            return `${hashAlias}:${this.props.domain}`;\n        }\n        return hashAlias;\n    }\n\n    private get domainProps(): {\n        prefix: JSX.Element;\n        postfix: JSX.Element;\n        value: string;\n        maxlength: number;\n    } {\n        const { domain } = this.props;\n        const prefix = <span>#</span>;\n        const postfix = domain ? <span title={`:${domain}`}>{`:${domain}`}</span> : <span />;\n        const maxlength = domain ? 255 - domain.length - 2 : 255 - 1; // 2 for # and :\n        const value = domain\n            ? this.props.value.substring(1, this.props.value.length - domain.length - 1)\n            : this.props.value.substring(1);\n\n        return { prefix, postfix, value, maxlength };\n    }\n\n    public render(): React.ReactNode {\n        const { prefix, postfix, value, maxlength } = this.domainProps;\n        return (\n            <Field\n                label={this.props.label || _t(\"room_settings|general|alias_heading\")}\n                className=\"mx_RoomAliasField\"\n                prefixComponent={prefix}\n                postfixComponent={postfix}\n                ref={this.fieldRef}\n                onValidate={this.onValidate}\n                placeholder={this.props.placeholder || _t(\"room_settings|general|alias_field_placeholder_default\")}\n                onChange={this.onChange}\n                value={value}\n                maxLength={maxlength}\n                disabled={this.props.disabled}\n                autoComplete=\"off\"\n                onKeyDown={this.props.onKeyDown}\n            />\n        );\n    }\n\n    private onChange = (ev: React.ChangeEvent<HTMLInputElement>): void => {\n        this.props.onChange?.(this.asFullAlias(ev.target.value));\n    };\n\n    private onValidate = async (fieldState: IFieldState): Promise<IValidationResult> => {\n        const result = await this.validationRules(fieldState);\n        this.setState({ isValid: !!result.valid });\n        return result;\n    };\n\n    private validationRules = withValidation({\n        rules: [\n            {\n                key: \"hasDomain\",\n                test: async ({ value }): Promise<boolean> => {\n                    // Ignore if we have passed domain\n                    if (!value || this.props.domain) {\n                        return true;\n                    }\n\n                    if (value.split(\":\").length < 2) {\n                        return false;\n                    }\n                    return true;\n                },\n                invalid: () => _t(\"room_settings|general|alias_field_has_domain_invalid\"),\n            },\n            {\n                key: \"hasLocalpart\",\n                test: async ({ value }): Promise<boolean> => {\n                    if (!value || this.props.domain) {\n                        return true;\n                    }\n\n                    const split = value.split(\":\");\n                    if (split.length < 2) {\n                        return true; // hasDomain check will fail here instead\n                    }\n\n                    // Define the value invalid if there's no first part (roomname)\n                    if (split[0].length < 1) {\n                        return false;\n                    }\n                    return true;\n                },\n                invalid: () => _t(\"room_settings|general|alias_field_has_localpart_invalid\"),\n            },\n            {\n                key: \"safeLocalpart\",\n                test: async ({ value }): Promise<boolean> => {\n                    if (!value) {\n                        return true;\n                    }\n                    if (!this.props.domain) {\n                        return true;\n                    } else {\n                        const fullAlias = this.asFullAlias(value);\n                        const hasColon = this.props.domain ? !value.includes(\":\") : true;\n                        // XXX: FIXME https://github.com/matrix-org/matrix-doc/issues/668\n                        // NOTE: We could probably use linkifyjs to parse those aliases here?\n                        return (\n                            !value.includes(\"#\") &&\n                            hasColon &&\n                            !value.includes(\",\") &&\n                            encodeURI(fullAlias) === fullAlias\n                        );\n                    }\n                },\n                invalid: () => _t(\"room_settings|general|alias_field_safe_localpart_invalid\"),\n            },\n            {\n                key: \"required\",\n                test: async ({ value, allowEmpty }) => allowEmpty || !!value,\n                invalid: () => _t(\"room_settings|general|alias_field_required_invalid\"),\n            },\n            this.props.roomId\n                ? {\n                      key: \"matches\",\n                      final: true,\n                      test: async ({ value }): Promise<boolean> => {\n                          if (!value) {\n                              return true;\n                          }\n                          const client = this.context;\n                          try {\n                              const result = await client.getRoomIdForAlias(this.asFullAlias(value));\n                              return result.room_id === this.props.roomId;\n                          } catch (err) {\n                              console.log(err);\n                              return false;\n                          }\n                      },\n                      invalid: () => _t(\"room_settings|general|alias_field_matches_invalid\"),\n                  }\n                : {\n                      key: \"taken\",\n                      final: true,\n                      test: async ({ value }): Promise<boolean> => {\n                          if (!value) {\n                              return true;\n                          }\n                          const client = this.context;\n                          try {\n                              await client.getRoomIdForAlias(this.asFullAlias(value));\n                              // we got a room id, so the alias is taken\n                              return false;\n                          } catch (err) {\n                              console.log(err);\n                              // any server error code will do,\n                              // either it M_NOT_FOUND or the alias is invalid somehow,\n                              // in which case we don't want to show the invalid message\n                              return err instanceof MatrixError;\n                          }\n                      },\n                      valid: () => _t(\"room_settings|general|alias_field_taken_valid\"),\n                      invalid: () =>\n                          this.props.domain\n                              ? _t(\"room_settings|general|alias_field_taken_invalid_domain\")\n                              : _t(\"room_settings|general|alias_field_taken_invalid\"),\n                  },\n        ],\n    });\n\n    public get isValid(): boolean {\n        return this.state.isValid;\n    }\n\n    public async validate(options: IValidateOpts): Promise<boolean> {\n        const val = await this.fieldRef.current?.validate(options);\n        return val ?? false;\n    }\n\n    public focus(): void {\n        this.fieldRef.current?.focus();\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\nCopyright 2017 Travis Ralston\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent } from \"react\";\nimport { secureRandomString } from \"matrix-js-sdk/src/randomstring\";\nimport { SettingsToggleInput } from \"@vector-im/compound-web\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { _t } from \"../../../languageHandler\";\nimport { type SettingLevel } from \"../../../settings/SettingLevel\";\nimport { type NullableBooleanSettingKey, defaultWatchManager } from \"../../../settings/Settings\";\n\ninterface IProps {\n    // The setting must be a boolean\n    name: NullableBooleanSettingKey;\n    level: SettingLevel;\n    roomId?: string; // for per-room settings\n    label?: string;\n    isExplicit?: boolean;\n    hideIfCannotSet?: boolean;\n    requires?: NullableBooleanSettingKey[];\n    onChange?(checked: boolean): void;\n}\n\ninterface IState {\n    value: boolean;\n}\n\nexport default class SettingsFlag extends React.Component<IProps, IState> {\n    private readonly id = `mx_SettingsFlag_${secureRandomString(12)}`;\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            value: this.getSettingValue(),\n        };\n    }\n\n    public componentDidMount(): void {\n        defaultWatchManager.watchSetting(this.props.name, this.props.roomId ?? null, this.onSettingChange);\n        if (this.props.requires) {\n            // If we have any dependencies for this feature, also watch those features to ensure we catch the disabled state.\n            for (const flag of this.props.requires) {\n                defaultWatchManager.watchSetting(flag, this.props.roomId ?? null, this.onSettingChange);\n            }\n        }\n    }\n\n    public componentWillUnmount(): void {\n        defaultWatchManager.unwatchSetting(this.onSettingChange);\n    }\n\n    private getSettingValue(): boolean {\n        // If a level defined in props is overridden by a level at a high precedence,\n        // or the setting lacks support for the desired level, it gets disabled and we should show the overriding value.\n        if (\n            !SettingsStore.doesSettingSupportLevel(this.props.name, this.props.level) ||\n            SettingsStore.settingIsOveriddenAtConfigLevel(this.props.name, this.props.roomId ?? null, this.props.level)\n        ) {\n            return !!SettingsStore.getValue(this.props.name);\n        }\n        return !!SettingsStore.getValueAt(\n            this.props.level,\n            this.props.name,\n            this.props.roomId ?? null,\n            this.props.isExplicit,\n        );\n    }\n    private onSettingChange = (): void => {\n        this.setState({\n            value: this.getSettingValue(),\n        });\n    };\n\n    private onChange = async (evt: ChangeEvent<HTMLInputElement>): Promise<void> => {\n        const newValue = evt.target.checked;\n        try {\n            await this.save(newValue);\n        } catch (ex) {\n            logger.info(`Failed to save setting ${this.props.name}`, ex);\n            return;\n        }\n        this.setState({ value: newValue });\n        this.props.onChange?.(newValue);\n    };\n\n    private save = async (val?: boolean): Promise<void> => {\n        await SettingsStore.setValue(\n            this.props.name,\n            this.props.roomId ?? null,\n            this.props.level,\n            val !== undefined ? val : this.state.value,\n        );\n    };\n\n    public render(): React.ReactNode {\n        const disabled = !SettingsStore.canSetValue(this.props.name, this.props.roomId ?? null, this.props.level);\n\n        if (disabled && this.props.hideIfCannotSet) return null;\n\n        const label = this.props.label ?? SettingsStore.getDisplayName(this.props.name, this.props.level);\n        const description = SettingsStore.getDescription(this.props.name);\n        const shouldWarn = SettingsStore.shouldHaveWarning(this.props.name);\n        const helpMessage = shouldWarn\n            ? _t(\n                  \"settings|warning\",\n                  {},\n                  {\n                      w: (sub) => <span className=\"mx_SettingsTab_microcopy_warning\">{sub}</span>,\n                      description,\n                  },\n              )\n            : description;\n        const disabledMessage = SettingsStore.disabledMessage(this.props.name);\n        return (\n            <SettingsToggleInput\n                id={this.id}\n                checked={this.state.value}\n                onChange={disabledMessage ? undefined : this.onChange}\n                name={this.props.name}\n                disabled={disabled}\n                label={label ?? this.props.name}\n                helpMessage={helpMessage as string}\n                disabledMessage={disabledMessage}\n            />\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 Sorunome\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n */\n\nimport React, { type ReactNode } from \"react\";\n\ninterface IProps {\n    reason?: string;\n    children: ReactNode;\n}\n\ninterface IState {\n    visible: boolean;\n}\n\nexport default class Spoiler extends React.Component<IProps, IState> {\n    public constructor(props: IProps) {\n        super(props);\n        this.state = {\n            visible: false,\n        };\n    }\n\n    private toggleVisible = (e: React.MouseEvent): void => {\n        if (!this.state.visible) {\n            // we are un-blurring, we don't want this click to propagate to potential child pills\n            e.preventDefault();\n            e.stopPropagation();\n        }\n        this.setState({ visible: !this.state.visible });\n    };\n\n    public render(): React.ReactNode {\n        const reason = this.props.reason ? (\n            <span className=\"mx_EventTile_spoiler_reason\">{\"(\" + this.props.reason + \")\"}</span>\n        ) : null;\n        return (\n            <button\n                className={\"mx_EventTile_spoiler\" + (this.state.visible ? \" visible\" : \"\")}\n                onClick={this.toggleVisible}\n            >\n                {reason}\n                &nbsp;\n                <span className=\"mx_EventTile_spoiler_content\">{this.props.children}</span>\n            </button>\n        );\n    }\n}\n","/*\nCopyright 2024,2025 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useId, type ReactNode, type Ref } from \"react\";\nimport { secureRandomString } from \"matrix-js-sdk/src/randomstring\";\nimport { CheckboxInput, Form, HelpMessage, InlineField, Label } from \"@vector-im/compound-web\";\n\ninterface IProps extends React.InputHTMLAttributes<HTMLInputElement> {\n    inputRef?: Ref<HTMLInputElement>;\n    id?: string;\n    description?: ReactNode;\n    formWrap?: boolean;\n}\n\nconst StyledCheckbox: React.FC<IProps> = ({\n    id: initialId,\n    children: label,\n    className,\n    inputRef,\n    description,\n    formWrap = true,\n    ...otherProps\n}) => {\n    const id = initialId || \"checkbox_\" + secureRandomString(10);\n    const name = useId();\n    const descriptionId = useId();\n\n    const field = (\n        <InlineField\n            className={className}\n            name={name}\n            control={\n                <CheckboxInput\n                    ref={inputRef}\n                    aria-describedby={description ? descriptionId : undefined}\n                    id={id}\n                    {...otherProps}\n                />\n            }\n        >\n            {label && <Label htmlFor={id}>{label}</Label>}\n            {description && <HelpMessage id={descriptionId}>{description}</HelpMessage>}\n        </InlineField>\n    );\n\n    if (formWrap) {\n        return <Form.Root>{field}</Form.Root>;\n    }\n\n    return field;\n};\n\nexport default StyledCheckbox;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type Ref } from \"react\";\nimport classnames from \"classnames\";\n\ninterface IProps extends React.InputHTMLAttributes<HTMLInputElement> {\n    inputRef?: Ref<HTMLInputElement>;\n    outlined?: boolean;\n    // If true (default), the children will be contained within a <label> element\n    // If false, they'll be in a div. Putting interactive components that have labels\n    // themselves in labels can cause strange bugs like https://github.com/vector-im/element-web/issues/18031\n    childrenInLabel?: boolean;\n\n    /**\n     * If provided will override the default dot icon drawn for checked state\n     */\n    icon?: JSX.Element;\n}\n\nexport default class StyledRadioButton extends React.PureComponent<IProps> {\n    public static readonly defaultProps = {\n        className: \"\",\n        childrenInLabel: true,\n    };\n\n    public render(): React.ReactNode {\n        const { children, className, disabled, outlined, childrenInLabel, inputRef, icon, ...otherProps } = this.props;\n        const _className = classnames(\"mx_StyledRadioButton\", className, {\n            mx_StyledRadioButton_disabled: disabled,\n            mx_StyledRadioButton_enabled: !disabled,\n            mx_StyledRadioButton_checked: this.props.checked,\n            mx_StyledRadioButton_outlined: outlined,\n        });\n\n        const radioButton = (\n            <React.Fragment>\n                <input\n                    // Pass through the ref - used for keyboard shortcut access to some buttons\n                    ref={inputRef}\n                    type=\"radio\"\n                    disabled={disabled}\n                    {...otherProps}\n                />\n                <div>\n                    {/* Empty div is used to render the radio button circle */}\n                    <div>{icon}</div>\n                </div>\n            </React.Fragment>\n        );\n\n        if (childrenInLabel) {\n            return (\n                <label className={_className}>\n                    {radioButton}\n                    <div className=\"mx_StyledRadioButton_content\">{children}</div>\n                    <div className=\"mx_StyledRadioButton_spacer\" />\n                </label>\n            );\n        } else {\n            return (\n                <div className={_className}>\n                    <label className=\"mx_StyledRadioButton_innerLabel\">{radioButton}</label>\n                    <div className=\"mx_StyledRadioButton_content\">{children}</div>\n                    <div className=\"mx_StyledRadioButton_spacer\" />\n                </div>\n            );\n        }\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ChangeEvent, type ReactNode } from \"react\";\nimport classNames from \"classnames\";\n\nimport StyledRadioButton from \"./StyledRadioButton\";\n\nexport interface IDefinition<T extends string> {\n    value: T;\n    className?: string;\n    disabled?: boolean;\n    label: ReactNode;\n    description?: ReactNode;\n    checked?: boolean; // If provided it will override the value comparison done in the group\n}\n\ninterface IProps<T extends string> {\n    name: string;\n    className?: string;\n    definitions: IDefinition<T>[];\n    value?: T; // if not provided no options will be selected\n    outlined?: boolean;\n    disabled?: boolean;\n    onChange(this: void, newValue: T): void;\n}\n\nfunction StyledRadioGroup<T extends string>({\n    name,\n    definitions,\n    value,\n    className,\n    outlined,\n    disabled,\n    onChange,\n}: IProps<T>): JSX.Element {\n    const _onChange = (e: ChangeEvent<HTMLInputElement>): void => {\n        onChange(e.target.value as T);\n    };\n\n    return (\n        <React.Fragment>\n            {definitions.map((d) => {\n                const id = `${name}-${d.value}`;\n                return (\n                    <React.Fragment key={d.value}>\n                        <StyledRadioButton\n                            id={id}\n                            className={classNames(className, d.className)}\n                            onChange={_onChange}\n                            checked={d.checked !== undefined ? d.checked : d.value === value}\n                            name={name}\n                            value={d.value}\n                            disabled={d.disabled ?? disabled}\n                            outlined={outlined}\n                            aria-describedby={d.description ? `${id}-description` : undefined}\n                        >\n                            {d.label}\n                        </StyledRadioButton>\n                        {d.description ? <span id={`${id}-description`}>{d.description}</span> : null}\n                    </React.Fragment>\n                );\n            })}\n        </React.Fragment>\n    );\n}\n\nexport default StyledRadioGroup;\n","/*\nCopyright 2019-2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n */\n\nimport React, { type HTMLAttributes } from \"react\";\nimport { Tooltip } from \"@vector-im/compound-web\";\n\ninterface IProps extends HTMLAttributes<HTMLSpanElement> {\n    tooltip: string;\n    tooltipProps?: {\n        tabIndex?: number;\n    };\n}\n\nexport default class TextWithTooltip extends React.Component<IProps> {\n    public render(): React.ReactNode {\n        const { className, children, tooltip, tooltipProps } = this.props;\n\n        return (\n            <Tooltip label={tooltip} placement=\"right\">\n                <span className={className} tabIndex={tooltipProps?.tabIndex ?? 0}>\n                    {children}\n                </span>\n            </Tooltip>\n        );\n    }\n}\n","/*\nCopyright 2017-2024 New Vector Ltd.\nCopyright 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode } from \"react\";\n\nimport { _t } from \"../../../languageHandler\";\n\ninterface IProps {\n    // The number of elements to show before truncating. If negative, no truncation is done.\n    truncateAt: number;\n    // The className to apply to the wrapping div\n    className?: string;\n    // A function that returns the children to be rendered into the element.\n    // The start element is included, the end is not (as in `slice`).\n    // If omitted, the React child elements will be used. This parameter can be used\n    // to avoid creating unnecessary React elements.\n    getChildren?: (start: number, end: number) => Array<React.ReactNode>;\n    // A function that should return the total number of child element available.\n    // Required if getChildren is supplied.\n    getChildCount?: () => number;\n    // A function which will be invoked when an overflow element is required.\n    // This will be inserted after the children.\n    createOverflowElement: (overflowCount: number, totalCount: number) => React.ReactNode;\n    children?: ReactNode;\n    id?: string;\n}\n\nexport default class TruncatedList extends React.Component<IProps> {\n    public static defaultProps = {\n        truncateAt: 2,\n        createOverflowElement(overflowCount: number, totalCount: number) {\n            return <div>{_t(\"truncated_list_n_more\", { count: overflowCount })}</div>;\n        },\n    };\n\n    private getChildren(start: number, end: number): Array<React.ReactNode> {\n        if (this.props.getChildren && this.props.getChildCount) {\n            return this.props.getChildren(start, end);\n        } else {\n            // XXX: I'm not sure why anything would pass null into this, it seems\n            // like a bizarre case to handle, but I'm preserving the behaviour.\n            // (see commit 38d5c7d5c5d5a34dc16ef5d46278315f5c57f542)\n            return React.Children.toArray(this.props.children)\n                .filter((c) => {\n                    return c != null;\n                })\n                .slice(start, end);\n        }\n    }\n\n    private getChildCount(): number {\n        if (this.props.getChildren && this.props.getChildCount) {\n            return this.props.getChildCount();\n        } else {\n            return React.Children.toArray(this.props.children).filter((c) => {\n                return c != null;\n            }).length;\n        }\n    }\n\n    public render(): ReactNode {\n        let overflowNode: ReactNode | undefined;\n\n        const totalChildren = this.getChildCount();\n        let upperBound = totalChildren;\n        if (this.props.truncateAt >= 0) {\n            const overflowCount = totalChildren - this.props.truncateAt;\n            if (overflowCount > 1) {\n                overflowNode = this.props.createOverflowElement(overflowCount, totalChildren);\n                upperBound = this.props.truncateAt;\n            }\n        }\n        const childNodes = this.getChildren(0, upperBound);\n\n        return (\n            <div className={this.props.className} role=\"list\" id={this.props.id}>\n                {childNodes}\n                {overflowNode}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 New Vector Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ReactNode } from \"react\";\nimport classNames from \"classnames\";\nimport memoizeOne from \"memoize-one\";\nimport { CheckIcon, CloseIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\ntype Data = Pick<IFieldState, \"value\" | \"allowEmpty\">;\n\ninterface IResult {\n    key: string;\n    valid: boolean;\n    text: string;\n}\n\ninterface IRule<T, D = undefined> {\n    key: string;\n    final?: boolean;\n    skip?(this: T, data: Data, derivedData: D): boolean;\n    test(this: T, data: Data, derivedData: D): boolean | Promise<boolean>;\n    valid?(this: T, derivedData: D): string | null;\n    invalid?(this: T, derivedData: D): string | null;\n}\n\ninterface IArgs<T, D = void> {\n    rules: IRule<T, D>[];\n    description?(this: T, derivedData: D, results: IResult[]): ReactNode;\n    hideDescriptionIfValid?: boolean;\n    deriveData?(this: T, data: Data): Promise<D>;\n    memoize?: boolean;\n}\n\nexport interface IFieldState {\n    value: string | null;\n    focused: boolean;\n    allowEmpty?: boolean;\n}\n\nexport interface IValidationResult {\n    valid?: boolean;\n    feedback?: JSX.Element | string;\n}\n\n/**\n * Creates a validation function from a set of rules describing what to validate.\n * Generic T is the \"this\" type passed to the rule methods\n *\n * @param {Function} description\n *     Function that returns a string summary of the kind of value that will\n *     meet the validation rules. Shown at the top of the validation feedback.\n * @param {boolean} hideDescriptionIfValid\n *     If true, don't show the description if the validation passes validation.\n * @param {Function} deriveData\n *     Optional function that returns a Promise to an object of generic type D.\n *     The result of this Promise is passed to rule methods `skip`, `test`, `valid`, and `invalid`.\n *     Useful for doing calculations per-value update once rather than in each of the above rule methods.\n * @param {Object} rules\n *     An array of rules describing how to check to input value. Each rule in an object\n *     and may have the following properties:\n *     - `key`: A unique ID for the rule. Required.\n *     - `skip`: A function used to determine whether the rule should even be evaluated.\n *     - `test`: A function used to determine the rule's current validity. Required.\n *     - `valid`: Function returning text to show when the rule is valid. Only shown if set.\n *     - `invalid`: Function returning text to show when the rule is invalid. Only shown if set.\n *     - `final`: A Boolean if true states that this rule will only be considered if all rules before it returned valid.\n * @param {boolean?} memoize\n *     If true, will use memoization to avoid calling deriveData & rules unless the value or allowEmpty change.\n *     Be careful to not use this if your validation is not pure and depends on other fields, such as \"repeat password\".\n * @returns {Function}\n *     A validation function that takes in the current input value and returns\n *     the overall validity and a feedback UI that can be rendered for more detail.\n */\nexport default function withValidation<T = void, D = void>({\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    description,\n    hideDescriptionIfValid,\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    deriveData,\n    rules,\n    memoize,\n}: IArgs<T, D>): (fieldState: IFieldState) => Promise<IValidationResult> {\n    let checkRules = async function (\n        this: T,\n        data: Data,\n        derivedData: D,\n    ): Promise<[valid: boolean, results: IResult[]]> {\n        const results: IResult[] = [];\n        let valid = true;\n        for (const rule of rules) {\n            if (!rule.key || !rule.test) {\n                continue;\n            }\n\n            if (!valid && rule.final) {\n                continue;\n            }\n\n            if (rule.skip?.call(this, data, derivedData)) {\n                continue;\n            }\n\n            // We're setting `this` to whichever component holds the validation\n            // function. That allows rules to access the state of the component.\n            const ruleValid: boolean = await rule.test.call(this, data, derivedData);\n            valid = valid && ruleValid;\n            if (ruleValid && rule.valid) {\n                // If the rule's result is valid and has text to show for\n                // the valid state, show it.\n                const text = rule.valid.call(this, derivedData);\n                if (!text) {\n                    continue;\n                }\n                results.push({\n                    key: rule.key,\n                    valid: true,\n                    text,\n                });\n            } else if (!ruleValid && rule.invalid) {\n                // If the rule's result is invalid and has text to show for\n                // the invalid state, show it.\n                const text = rule.invalid.call(this, derivedData);\n                if (!text) {\n                    continue;\n                }\n                results.push({\n                    key: rule.key,\n                    valid: false,\n                    text,\n                });\n            }\n        }\n\n        return [valid, results];\n    };\n\n    // We have to memoize it in chunks as `focused` can change frequently, but it isn't passed to these methods\n    if (memoize) {\n        if (deriveData) deriveData = memoizeOne(deriveData, isDataEqual);\n        checkRules = memoizeOne(checkRules, isDerivedDataEqual);\n    }\n\n    return async function onValidate(\n        this: T,\n        { value, focused, allowEmpty = true }: IFieldState,\n    ): Promise<IValidationResult> {\n        if (!value && allowEmpty) {\n            return {};\n        }\n\n        const data = { value, allowEmpty };\n        // We know that if deriveData is set then D will not be undefined\n        const derivedData = (await deriveData?.call(this, data)) as D;\n        const [valid, results] = await checkRules.call(this, data, derivedData);\n\n        // Hide feedback when not focused\n        if (!focused) {\n            return { valid };\n        }\n\n        let details: ReactNode | undefined;\n        if (results && results.length) {\n            details = (\n                <ul className=\"mx_Validation_details\">\n                    {results.map((result) => {\n                        const classes = classNames({\n                            mx_Validation_detail: true,\n                            mx_Validation_valid: result.valid,\n                            mx_Validation_invalid: !result.valid,\n                        });\n                        return (\n                            <li key={result.key} className={classes}>\n                                {result.valid ? <CheckIcon /> : <CloseIcon />}\n                                {result.text}\n                            </li>\n                        );\n                    })}\n                </ul>\n            );\n        }\n\n        let summary: ReactNode | undefined;\n        if (description && (details || !hideDescriptionIfValid)) {\n            // We're setting `this` to whichever component holds the validation\n            // function. That allows rules to access the state of the component.\n            const content = description.call(this, derivedData, results);\n            summary = content ? <div className=\"mx_Validation_description\">{content}</div> : undefined;\n        }\n\n        let feedback: JSX.Element | undefined;\n        if (summary || details) {\n            feedback = (\n                <div className=\"mx_Validation\">\n                    {summary}\n                    {details}\n                </div>\n            );\n        }\n\n        return {\n            valid,\n            feedback,\n        };\n    };\n}\n\nfunction isDataEqual([a]: [Data], [b]: [Data]): boolean {\n    return a.value === b.value && a.allowEmpty === b.allowEmpty;\n}\n\nfunction isDerivedDataEqual([a1, a2]: [Data, any], [b1, b2]: [Data, any]): boolean {\n    return a2 === b2 && isDataEqual([a1], [b1]);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Tulir Asokan <tulir@maunium.net>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport classNames from \"classnames\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { type CategoryKey, type ICategory } from \"./Category\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport { KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\n\ninterface IProps {\n    categories: ICategory[];\n    onAnchorClick(id: CategoryKey): void;\n}\n\nclass Header extends React.PureComponent<IProps> {\n    private findNearestEnabled(index: number, delta: number): number | undefined {\n        index += this.props.categories.length;\n        const cats = [...this.props.categories, ...this.props.categories, ...this.props.categories];\n\n        while (index < cats.length && index >= 0) {\n            if (cats[index].enabled) return index % this.props.categories.length;\n            index += delta > 0 ? 1 : -1;\n        }\n    }\n\n    private changeCategoryRelative(delta: number): void {\n        // Move to the next/previous category using the first visible as the current.\n        const current = this.props.categories.findIndex((c) => c.visible);\n        this.changeCategoryAbsolute(current + delta, delta);\n    }\n\n    private changeCategoryAbsolute(index: number, delta = 1): void {\n        const category = this.props.categories[this.findNearestEnabled(index, delta)!];\n        if (category) {\n            this.props.onAnchorClick(category.id);\n            category.ref.current?.focus();\n        }\n    }\n\n    // Implements ARIA Tabs with Automatic Activation pattern\n    // https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-1/tabs.html\n    private onKeyDown = (ev: React.KeyboardEvent): void => {\n        let handled = true;\n\n        const action = getKeyBindingsManager().getAccessibilityAction(ev);\n        switch (action) {\n            case KeyBindingAction.ArrowLeft:\n                this.changeCategoryRelative(-1);\n                break;\n            case KeyBindingAction.ArrowRight:\n                this.changeCategoryRelative(1);\n                break;\n\n            case KeyBindingAction.Home:\n                this.changeCategoryAbsolute(0);\n                break;\n            case KeyBindingAction.End:\n                this.changeCategoryAbsolute(this.props.categories.length - 1, -1);\n                break;\n            default:\n                handled = false;\n        }\n\n        if (handled) {\n            ev.preventDefault();\n            ev.stopPropagation();\n        }\n    };\n\n    public render(): React.ReactNode {\n        return (\n            <nav\n                className=\"mx_EmojiPicker_header\"\n                role=\"tablist\"\n                aria-label={_t(\"emoji|categories\")}\n                onKeyDown={this.onKeyDown}\n            >\n                {this.props.categories.map((category) => {\n                    const classes = classNames(\"mx_EmojiPicker_anchor\", {\n                        mx_EmojiPicker_anchor_visible: category.visible,\n                    });\n                    // Properties of this button are also modified by EmojiPicker's updateVisibility in DOM.\n                    return (\n                        <button\n                            disabled={!category.enabled}\n                            key={category.id}\n                            ref={category.ref}\n                            className={classes}\n                            onClick={() => this.props.onAnchorClick(category.id)}\n                            title={category.name}\n                            role=\"tab\"\n                            tabIndex={category.firstVisible ? 0 : -1} // roving\n                            aria-selected={category.visible}\n                            aria-controls={`mx_EmojiPicker_category_${category.id}`}\n                        >\n                            {category.emoji}\n                        </button>\n                    );\n                })}\n            </nav>\n        );\n    }\n}\n\nexport default Header;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Tulir Asokan <tulir@maunium.net>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport { CloseIcon, SearchIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport { RovingTabIndexContext } from \"../../../accessibility/RovingTabIndex\";\n\ninterface IProps {\n    query: string;\n    onChange(value: string): void;\n    onEnter(): void;\n    onKeyDown(event: React.KeyboardEvent): void;\n}\n\nclass Search extends React.PureComponent<IProps> {\n    public static contextType = RovingTabIndexContext;\n    declare public context: React.ContextType<typeof RovingTabIndexContext>;\n\n    private inputRef = React.createRef<HTMLInputElement>();\n\n    public componentDidMount(): void {\n        // For some reason, neither the autoFocus nor just calling focus() here worked, so here's a window.setTimeout\n        window.setTimeout(() => this.inputRef.current?.focus(), 0);\n    }\n\n    private onKeyDown = (ev: React.KeyboardEvent): void => {\n        const action = getKeyBindingsManager().getAccessibilityAction(ev);\n        switch (action) {\n            case KeyBindingAction.Enter:\n                this.props.onEnter();\n                ev.stopPropagation();\n                ev.preventDefault();\n                break;\n\n            default:\n                this.props.onKeyDown(ev);\n        }\n    };\n\n    public render(): React.ReactNode {\n        let rightButton: JSX.Element;\n        if (this.props.query) {\n            rightButton = (\n                <button\n                    onClick={() => this.props.onChange(\"\")}\n                    className=\"mx_EmojiPicker_search_clear\"\n                    title={_t(\"emoji_picker|cancel_search_label\")}\n                >\n                    <CloseIcon />\n                </button>\n            );\n        } else {\n            rightButton = (\n                <span className=\"mx_EmojiPicker_search_icon\">\n                    <SearchIcon />\n                </span>\n            );\n        }\n\n        return (\n            <div className=\"mx_EmojiPicker_search\">\n                <input\n                    autoFocus\n                    type=\"text\"\n                    placeholder={_t(\"action|search\")}\n                    aria-label={_t(\"action|search\")}\n                    value={this.props.query}\n                    onChange={(ev) => this.props.onChange(ev.target.value)}\n                    onKeyDown={this.onKeyDown}\n                    ref={this.inputRef}\n                    // Setting aria-activedescendant on the input allows screen readers to identify the active emoji.\n                    // Setting it when there is not a query causes screen readers to read out the first emoji when focusing the input, and it continually tells you you are in the table vs the input.\n                    aria-activedescendant={this.props.query ? this.context.state.activeNode?.id : undefined}\n                    aria-controls=\"mx_EmojiPicker_body\"\n                    aria-haspopup=\"grid\"\n                    aria-autocomplete=\"list\"\n                />\n                {rightButton}\n            </div>\n        );\n    }\n}\n\nexport default Search;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Tulir Asokan <tulir@maunium.net>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type Emoji } from \"@matrix-org/emojibase-bindings\";\n\ninterface IProps {\n    emoji: Emoji;\n}\n\nclass Preview extends React.PureComponent<IProps> {\n    public render(): React.ReactNode {\n        const {\n            unicode,\n            label,\n            shortcodes: [shortcode],\n        } = this.props.emoji;\n\n        return (\n            <div className=\"mx_EmojiPicker_footer mx_EmojiPicker_preview\">\n                <div className=\"mx_EmojiPicker_preview_emoji\">{unicode}</div>\n                <div className=\"mx_EmojiPicker_preview_text\">\n                    <div className=\"mx_EmojiPicker_name mx_EmojiPicker_preview_name\">{label}</div>\n                    <div className=\"mx_EmojiPicker_shortcode\">{shortcode}</div>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default Preview;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Tulir Asokan <tulir@maunium.net>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type Emoji as IEmoji } from \"@matrix-org/emojibase-bindings\";\n\nimport { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport { RovingAccessibleButton } from \"../../../accessibility/RovingTabIndex\";\n\ninterface IProps {\n    emoji: IEmoji;\n    /**\n     * Set of which emojis are already selected and should be decorated as such.\n     * If specified, emoji will use a checkbox role with aria-checked set appropriately.\n     */\n    selectedEmojis?: Set<string>;\n    onClick(ev: ButtonEvent, emoji: IEmoji): void;\n    onMouseEnter(emoji: IEmoji): void;\n    onMouseLeave(emoji: IEmoji): void;\n    disabled?: boolean;\n    id?: string;\n    className?: string;\n}\n\nclass Emoji extends React.PureComponent<IProps> {\n    public render(): React.ReactNode {\n        const { onClick, onMouseEnter, onMouseLeave, emoji, selectedEmojis } = this.props;\n        const isSelected = selectedEmojis?.has(emoji.unicode);\n        return (\n            <RovingAccessibleButton\n                id={this.props.id}\n                onClick={(ev: ButtonEvent) => onClick(ev, emoji)}\n                onMouseEnter={() => onMouseEnter(emoji)}\n                onMouseLeave={() => onMouseLeave(emoji)}\n                className={this.props.className}\n                disabled={this.props.disabled || undefined}\n                role={selectedEmojis ? \"checkbox\" : undefined}\n                aria-checked={this.props.disabled ? undefined : isSelected}\n                focusOnMouseOver\n            >\n                <div className={`mx_EmojiPicker_item ${isSelected ? \"mx_EmojiPicker_item_selected\" : \"\"}`}>\n                    {emoji.unicode}\n                </div>\n            </RovingAccessibleButton>\n        );\n    }\n}\n\nexport default Emoji;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Tulir Asokan <tulir@maunium.net>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { getEmojiFromUnicode, type Emoji as IEmoji } from \"@matrix-org/emojibase-bindings\";\n\nimport { _t } from \"../../../languageHandler\";\nimport Emoji from \"./Emoji\";\nimport { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport Toolbar from \"../../../accessibility/Toolbar\";\n\n// We use the variation-selector Heart in Quick Reactions for some reason\nconst QUICK_REACTIONS = [\"👍\", \"👎\", \"😄\", \"🎉\", \"😕\", \"❤️\", \"🚀\", \"👀\"].map((emoji) => {\n    const data = getEmojiFromUnicode(emoji);\n    if (!data) {\n        throw new Error(`Emoji ${emoji} doesn't exist in emojibase`);\n    }\n    return data;\n});\n\ninterface IProps {\n    selectedEmojis?: Set<string>;\n    onClick(ev: ButtonEvent, emoji: IEmoji): void;\n}\n\ninterface IState {\n    hover?: IEmoji;\n}\n\nclass QuickReactions extends React.Component<IProps, IState> {\n    public constructor(props: IProps) {\n        super(props);\n        this.state = {};\n    }\n\n    private onMouseEnter = (emoji: IEmoji): void => {\n        this.setState({\n            hover: emoji,\n        });\n    };\n\n    private onMouseLeave = (): void => {\n        this.setState({\n            hover: undefined,\n        });\n    };\n\n    public render(): React.ReactNode {\n        return (\n            <section className=\"mx_EmojiPicker_footer mx_EmojiPicker_quick mx_EmojiPicker_category\">\n                <h2 className=\"mx_EmojiPicker_quick_header mx_EmojiPicker_category_label\">\n                    {!this.state.hover ? (\n                        _t(\"emoji|quick_reactions\")\n                    ) : (\n                        <React.Fragment>\n                            <span className=\"mx_EmojiPicker_name\">{this.state.hover.label}</span>\n                            <span className=\"mx_EmojiPicker_shortcode\">{this.state.hover.shortcodes[0]}</span>\n                        </React.Fragment>\n                    )}\n                </h2>\n                <Toolbar className=\"mx_EmojiPicker_list\" aria-label={_t(\"emoji|quick_reactions\")}>\n                    {QUICK_REACTIONS.map((emoji) => (\n                        <Emoji\n                            key={emoji.hexcode}\n                            emoji={emoji}\n                            onClick={this.props.onClick}\n                            onMouseEnter={this.onMouseEnter}\n                            onMouseLeave={this.onMouseLeave}\n                            selectedEmojis={this.props.selectedEmojis}\n                            className=\"mx_EmojiPicker_item_wrapper\"\n                        />\n                    ))}\n                </Toolbar>\n            </section>\n        );\n    }\n}\n\nexport default QuickReactions;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Tulir Asokan <tulir@maunium.net>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type RefObject } from \"react\";\nimport { type DATA_BY_CATEGORY, type Emoji as IEmoji } from \"@matrix-org/emojibase-bindings\";\n\nimport { CATEGORY_HEADER_HEIGHT, EMOJI_HEIGHT, EMOJIS_PER_ROW } from \"./config\";\nimport LazyRenderList from \"../elements/LazyRenderList\";\nimport Emoji from \"./Emoji\";\nimport { type ButtonEvent } from \"../elements/AccessibleButton\";\n\nconst OVERFLOW_ROWS = 3;\n\nexport type CategoryKey = keyof typeof DATA_BY_CATEGORY | \"recent\";\n\nexport interface ICategory {\n    id: CategoryKey;\n    name: string;\n    // Emoji to show in the header for this category\n    emoji: string;\n    enabled: boolean;\n    // Whether the category is currently visible\n    visible: boolean;\n    // Whether the category is the first visible category\n    firstVisible: boolean;\n    ref: RefObject<HTMLButtonElement | null>;\n}\n\ninterface IProps {\n    id: string;\n    name: string;\n    emojis: IEmoji[];\n    selectedEmojis?: Set<string>;\n    heightBefore: number;\n    viewportHeight: number;\n    scrollTop: number;\n    onClick(ev: ButtonEvent, emoji: IEmoji): void;\n    onMouseEnter(emoji: IEmoji): void;\n    onMouseLeave(emoji: IEmoji): void;\n    isEmojiDisabled?: (unicode: string) => boolean;\n}\n\nfunction hexEncode(str: string): string {\n    let hex: string;\n    let i: number;\n\n    let result = \"\";\n    for (i = 0; i < str.length; i++) {\n        hex = str.charCodeAt(i).toString(16);\n        result += (\"000\" + hex).slice(-4);\n    }\n\n    return result;\n}\n\nclass Category extends React.PureComponent<IProps> {\n    private renderEmojiRow = (rowIndex: number): JSX.Element => {\n        const { onClick, onMouseEnter, onMouseLeave, selectedEmojis, emojis } = this.props;\n        const emojisForRow = emojis.slice(rowIndex * 8, (rowIndex + 1) * 8);\n        return (\n            <div key={rowIndex} role=\"row\">\n                {emojisForRow.map((emoji) => (\n                    <div role=\"gridcell\" className=\"mx_EmojiPicker_item_wrapper\" key={emoji.hexcode}>\n                        <Emoji\n                            emoji={emoji}\n                            selectedEmojis={selectedEmojis}\n                            onClick={onClick}\n                            onMouseEnter={onMouseEnter}\n                            onMouseLeave={onMouseLeave}\n                            disabled={this.props.isEmojiDisabled?.(emoji.unicode)}\n                            id={`mx_EmojiPicker_item_${this.props.id}_${hexEncode(emoji.unicode)}`}\n                        />\n                    </div>\n                ))}\n            </div>\n        );\n    };\n\n    public render(): React.ReactNode {\n        const { emojis, name, heightBefore, viewportHeight, scrollTop } = this.props;\n        if (!emojis || emojis.length === 0) {\n            return null;\n        }\n        const rows = new Array(Math.ceil(emojis.length / EMOJIS_PER_ROW));\n        for (let counter = 0; counter < rows.length; ++counter) {\n            rows[counter] = counter;\n        }\n\n        const viewportTop = scrollTop;\n        const viewportBottom = viewportTop + viewportHeight;\n        const listTop = heightBefore + CATEGORY_HEADER_HEIGHT;\n        const listBottom = listTop + rows.length * EMOJI_HEIGHT;\n        const top = Math.max(viewportTop, listTop);\n        const bottom = Math.min(viewportBottom, listBottom);\n        // the viewport height and scrollTop passed to the LazyRenderList\n        // is capped at the intersection with the real viewport, so lists\n        // out of view are passed height 0, so they won't render any items.\n        const localHeight = Math.max(0, bottom - top);\n        const localScrollTop = Math.max(0, scrollTop - listTop);\n\n        return (\n            <section\n                id={`mx_EmojiPicker_category_${this.props.id}`}\n                className=\"mx_EmojiPicker_category\"\n                data-category-id={this.props.id}\n                role=\"tabpanel\"\n                aria-label={name}\n            >\n                <h2 className=\"mx_EmojiPicker_category_label\">{name}</h2>\n                <LazyRenderList\n                    className=\"mx_EmojiPicker_list\"\n                    itemHeight={EMOJI_HEIGHT}\n                    items={rows}\n                    scrollTop={localScrollTop}\n                    height={localHeight}\n                    overflowItems={OVERFLOW_ROWS}\n                    overflowMargin={0}\n                    renderItem={this.renderEmojiRow}\n                    role=\"grid\"\n                    aria-multiselectable\n                />\n            </section>\n        );\n    }\n}\n\nexport default Category;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Tulir Asokan <tulir@maunium.net>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type Dispatch } from \"react\";\nimport { DATA_BY_CATEGORY, getEmojiFromUnicode, type Emoji as IEmoji } from \"@matrix-org/emojibase-bindings\";\nimport classNames from \"classnames\";\nimport { AutoHideScrollbar } from \"@element-hq/web-shared-components\";\n\nimport { _t } from \"../../../languageHandler\";\nimport * as recent from \"../../../emojipicker/recent\";\nimport Header from \"./Header\";\nimport Search from \"./Search\";\nimport Preview from \"./Preview\";\nimport QuickReactions from \"./QuickReactions\";\nimport Category, { type CategoryKey, type ICategory } from \"./Category\";\nimport { filterBoolean } from \"../../../utils/arrays\";\nimport {\n    type IAction as RovingAction,\n    type IState as RovingState,\n    RovingGridIndexProvider,\n    RovingStateActionType,\n} from \"../../../accessibility/RovingTabIndex\";\nimport { Key } from \"../../../Keyboard\";\nimport { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport { CATEGORY_HEADER_HEIGHT, EMOJI_HEIGHT, EMOJIS_PER_ROW } from \"./config\";\n\nconst ZERO_WIDTH_JOINER = \"\\u200D\";\n\ninterface IProps {\n    selectedEmojis?: Set<string>;\n    onChoose(unicode: string): boolean;\n    onFinished(): void;\n    isEmojiDisabled?: (unicode: string) => boolean;\n}\n\ninterface IState {\n    filter: string;\n    previewEmoji?: IEmoji;\n    scrollTop: number;\n    // initial estimation of height, dialog is hardcoded to 450px height.\n    // should be enough to never have blank rows of emojis as\n    // 3 rows of overflow are also rendered. The actual value is updated on scroll.\n    viewportHeight: number;\n    // Track if user has interacted with arrow keys or search\n    showHighlight: boolean;\n}\n\nclass EmojiPicker extends React.Component<IProps, IState> {\n    private readonly recentlyUsed: IEmoji[];\n    private readonly memoizedDataByCategory: Record<CategoryKey, IEmoji[]>;\n    private readonly categories: ICategory[];\n\n    private scrollElement: HTMLDivElement | null = null;\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            filter: \"\",\n            scrollTop: 0,\n            viewportHeight: 280,\n            showHighlight: false,\n        };\n\n        // Convert recent emoji characters to emoji data, removing unknowns and duplicates\n        this.recentlyUsed = Array.from(new Set(filterBoolean(recent.get().map(getEmojiFromUnicode))));\n        this.memoizedDataByCategory = {\n            recent: this.recentlyUsed,\n            ...DATA_BY_CATEGORY,\n        };\n\n        const hasRecentlyUsed = this.recentlyUsed.length > 0;\n\n        const categoryConfig: Pick<ICategory, \"id\" | \"name\" | \"emoji\">[] = [\n            { id: \"recent\", name: _t(\"emoji|category_frequently_used\"), emoji: \"🕒\" },\n            { id: \"people\", name: _t(\"emoji|category_smileys_people\"), emoji: \"😀\" },\n            { id: \"nature\", name: _t(\"emoji|category_animals_nature\"), emoji: \"🐕\" },\n            { id: \"foods\", name: _t(\"emoji|category_food_drink\"), emoji: \"🍎\" },\n            { id: \"activity\", name: _t(\"emoji|category_activities\"), emoji: \"⚽️\" },\n            { id: \"places\", name: _t(\"emoji|category_travel_places\"), emoji: \"🚗\" },\n            { id: \"objects\", name: _t(\"emoji|category_objects\"), emoji: \"💡\" },\n            { id: \"symbols\", name: _t(\"emoji|category_symbols\"), emoji: \"⁉️\" },\n            { id: \"flags\", name: _t(\"emoji|category_flags\"), emoji: \"🏁\" },\n        ];\n\n        this.categories = categoryConfig.map((config) => {\n            let isEnabled = true;\n            let isVisible = false;\n            let firstVisible = false;\n            if (config.id === \"recent\") {\n                isEnabled = hasRecentlyUsed;\n                isVisible = hasRecentlyUsed;\n                firstVisible = hasRecentlyUsed;\n            } else if (config.id === \"people\") {\n                isVisible = true;\n                firstVisible = !hasRecentlyUsed;\n            }\n            return {\n                ...config,\n                enabled: isEnabled,\n                visible: isVisible,\n                firstVisible: firstVisible,\n                ref: React.createRef(),\n            };\n        });\n    }\n\n    private onScroll = (): void => {\n        const body = this.scrollElement;\n        if (!body) return;\n        this.setState({\n            scrollTop: body.scrollTop,\n            viewportHeight: body.clientHeight,\n        });\n        this.updateVisibility();\n    };\n\n    // Given a roving emoji button returns the role=row element containing it\n    private readonly getRow = (rovingNode?: Element): Element | undefined => {\n        return this.getGridcell(rovingNode)?.parentElement ?? undefined;\n    };\n\n    // Given a roving emoji button returns the role=gridcell element containing it\n    private readonly getGridcell = (rovingNode?: Element): Element | undefined => {\n        return rovingNode?.parentElement ?? undefined;\n    };\n\n    // Given a role=gridcell node returns the roving emoji button contained within\n    private readonly getRovingNode = (gridcellNode: Element): HTMLElement | undefined => {\n        const node = gridcellNode.children[0];\n        return node instanceof HTMLElement ? node : undefined;\n    };\n\n    private onKeyDown = (ev: React.KeyboardEvent, state: RovingState, dispatch: Dispatch<RovingAction>): void => {\n        if (state.activeNode && [Key.ARROW_DOWN, Key.ARROW_RIGHT, Key.ARROW_LEFT, Key.ARROW_UP].includes(ev.key)) {\n            // If highlight is not shown yet, show it and reset to first emoji\n            if (!this.state.showHighlight) {\n                this.setState({ showHighlight: true });\n                // Reset to first emoji when showing highlight for the first time (or after it was hidden)\n                if (state.nodes.length > 0) {\n                    dispatch({\n                        type: RovingStateActionType.SetFocus,\n                        payload: { node: state.nodes[0] },\n                    });\n                }\n                ev.preventDefault();\n                ev.stopPropagation();\n                return;\n            }\n        }\n    };\n\n    private readonly shouldMoveFocus = (): boolean => {\n        return document.activeElement !== document.querySelector(\".mx_EmojiPicker_search input\");\n    };\n\n    private readonly onGridNavigation = (ev: React.KeyboardEvent, focusNode: HTMLElement, state: RovingState): void => {\n        if (this.getRow(state.activeNode) !== this.getRow(focusNode)) {\n            focusNode.scrollIntoView({\n                behavior: \"auto\",\n                block: \"center\",\n                inline: \"center\",\n            });\n        }\n    };\n\n    private updateVisibility = (): void => {\n        const body = this.scrollElement;\n        if (!body) return;\n        const rect = body.getBoundingClientRect();\n        let firstVisibleFound = false;\n        for (const cat of this.categories) {\n            const elem = body.querySelector(`[data-category-id=\"${cat.id}\"]`);\n            if (!elem) {\n                cat.visible = false;\n                cat.ref.current?.classList.remove(\"mx_EmojiPicker_anchor_visible\");\n                continue;\n            }\n            const elemRect = elem.getBoundingClientRect();\n            const y = elemRect.y - rect.y;\n            const yEnd = elemRect.y + elemRect.height - rect.y;\n            cat.visible = y < rect.height && yEnd > 0;\n            if (cat.visible && !firstVisibleFound) {\n                firstVisibleFound = true;\n                cat.firstVisible = true;\n            } else {\n                cat.firstVisible = false;\n            }\n            // We update this here instead of through React to avoid re-render on scroll.\n            if (!cat.ref.current) continue;\n            if (cat.visible) {\n                cat.ref.current.classList.add(\"mx_EmojiPicker_anchor_visible\");\n                cat.ref.current.setAttribute(\"aria-selected\", \"true\");\n            } else {\n                cat.ref.current.classList.remove(\"mx_EmojiPicker_anchor_visible\");\n                cat.ref.current.setAttribute(\"aria-selected\", \"false\");\n            }\n            if (cat.firstVisible) {\n                cat.ref.current.setAttribute(\"tabindex\", \"0\");\n            } else {\n                cat.ref.current.setAttribute(\"tabindex\", \"-1\");\n            }\n        }\n    };\n\n    private scrollToCategory = (category: string): void => {\n        this.scrollElement?.querySelector(`[data-category-id=\"${category}\"]`)?.scrollIntoView();\n    };\n\n    private onChangeFilter = (filter: string): void => {\n        const lcFilter = filter.toLowerCase().trim(); // filter is case insensitive\n\n        // User has typed a query, show highlight\n        // If filter is cleared, hide highlight again\n        if (lcFilter && !this.state.showHighlight) {\n            this.setState({ showHighlight: true });\n        } else if (!lcFilter && this.state.showHighlight) {\n            this.setState({ showHighlight: false });\n        }\n\n        for (const cat of this.categories) {\n            let emojis: IEmoji[];\n            // If the new filter string includes the old filter string, we don't have to re-filter the whole dataset.\n            if (lcFilter.includes(this.state.filter)) {\n                emojis = this.memoizedDataByCategory[cat.id];\n            } else {\n                emojis = cat.id === \"recent\" ? this.recentlyUsed : DATA_BY_CATEGORY[cat.id];\n            }\n\n            if (lcFilter !== \"\") {\n                emojis = emojis.filter((emoji) => this.emojiMatchesFilter(emoji, lcFilter));\n                // Copy the array to not clobber the original unfiltered sorting\n                emojis = [...emojis].sort((a, b) => {\n                    const indexA = a.shortcodes[0].indexOf(lcFilter);\n                    const indexB = b.shortcodes[0].indexOf(lcFilter);\n\n                    // Prioritize emojis containing the filter in its shortcode\n                    if (indexA == -1 || indexB == -1) {\n                        return indexB - indexA;\n                    }\n\n                    // If both emojis start with the filter\n                    // put the shorter emoji first\n                    if (indexA == 0 && indexB == 0) {\n                        return a.shortcodes[0].length - b.shortcodes[0].length;\n                    }\n\n                    // Prioritize emojis starting with the filter\n                    return indexA - indexB;\n                });\n            }\n\n            this.memoizedDataByCategory[cat.id] = emojis;\n            cat.enabled = emojis.length > 0;\n            // The setState below doesn't re-render the header and we already have the refs for updateVisibility, so...\n            if (cat.ref.current) {\n                cat.ref.current.disabled = !cat.enabled;\n            }\n        }\n        this.setState({ filter });\n        // Header underlines need to be updated, but updating requires knowing\n        // where the categories are, so we wait for a tick.\n        window.setTimeout(this.updateVisibility, 0);\n    };\n\n    private emojiMatchesFilter = (emoji: IEmoji, filter: string): boolean => {\n        // If the query is an emoji containing a variation then strip it to provide more useful matches\n        if (filter.includes(ZERO_WIDTH_JOINER)) {\n            filter = filter.split(ZERO_WIDTH_JOINER, 2)[0];\n        }\n        return (\n            emoji.label.toLowerCase().includes(filter) ||\n            (Array.isArray(emoji.emoticon)\n                ? emoji.emoticon.some((x) => x.includes(filter))\n                : emoji.emoticon?.includes(filter)) ||\n            emoji.shortcodes.some((x) => x.toLowerCase().includes(filter)) ||\n            emoji.unicode.split(ZERO_WIDTH_JOINER).includes(filter)\n        );\n    };\n\n    private onEnterFilter = (): void => {\n        // Only select emoji if highlight is shown\n        if (!this.state.showHighlight) return;\n\n        const btn = this.scrollElement?.querySelector<HTMLButtonElement>('.mx_EmojiPicker_item_wrapper [tabindex=\"0\"]');\n        btn?.click();\n        this.props.onFinished();\n    };\n\n    private onHoverEmoji = (emoji: IEmoji): void => {\n        this.setState({\n            previewEmoji: emoji,\n        });\n    };\n\n    private onHoverEmojiEnd = (): void => {\n        this.setState({\n            previewEmoji: undefined,\n        });\n    };\n\n    private onClickEmoji = (ev: ButtonEvent, emoji: IEmoji): void => {\n        if (this.props.onChoose(emoji.unicode) !== false) {\n            recent.add(emoji.unicode);\n        }\n        if ((ev as React.KeyboardEvent).key === Key.ENTER) {\n            this.props.onFinished();\n        }\n    };\n\n    private static categoryHeightForEmojiCount(count: number): number {\n        if (count === 0) {\n            return 0;\n        }\n        return CATEGORY_HEADER_HEIGHT + Math.ceil(count / EMOJIS_PER_ROW) * EMOJI_HEIGHT;\n    }\n\n    public render(): React.ReactNode {\n        return (\n            <RovingGridIndexProvider\n                getGridCell={this.getGridcell}\n                getRow={this.getRow}\n                getRovingNode={this.getRovingNode}\n                handleInputFields\n                moveFocus={this.shouldMoveFocus}\n                onGridNavigation={this.onGridNavigation}\n                onKeyDown={this.onKeyDown}\n            >\n                {({ onKeyDownHandler }) => {\n                    let heightBefore = 0;\n                    return (\n                        <section\n                            className=\"mx_EmojiPicker\"\n                            data-testid=\"mx_EmojiPicker\"\n                            onKeyDown={onKeyDownHandler}\n                            aria-label={_t(\"a11y|emoji_picker\")}\n                        >\n                            <Header categories={this.categories} onAnchorClick={this.scrollToCategory} />\n                            <Search\n                                query={this.state.filter}\n                                onChange={this.onChangeFilter}\n                                onEnter={this.onEnterFilter}\n                                onKeyDown={onKeyDownHandler}\n                            />\n                            <AutoHideScrollbar\n                                id=\"mx_EmojiPicker_body\"\n                                className={classNames(\"mx_AutoHideScrollbar mx_EmojiPicker_body\", {\n                                    mx_EmojiPicker_body_showHighlight: this.state.showHighlight,\n                                })}\n                                wrappedRef={(ref) => {\n                                    this.scrollElement = ref;\n                                }}\n                                onScroll={this.onScroll}\n                            >\n                                {this.categories.map((category) => {\n                                    const emojis = this.memoizedDataByCategory[category.id];\n                                    const categoryElement = (\n                                        <Category\n                                            key={category.id}\n                                            id={category.id}\n                                            name={category.name}\n                                            heightBefore={heightBefore}\n                                            viewportHeight={this.state.viewportHeight}\n                                            scrollTop={this.state.scrollTop}\n                                            emojis={emojis}\n                                            onClick={this.onClickEmoji}\n                                            onMouseEnter={this.onHoverEmoji}\n                                            onMouseLeave={this.onHoverEmojiEnd}\n                                            isEmojiDisabled={this.props.isEmojiDisabled}\n                                            selectedEmojis={this.props.selectedEmojis}\n                                        />\n                                    );\n                                    const height = EmojiPicker.categoryHeightForEmojiCount(emojis.length);\n                                    heightBefore += height;\n                                    return categoryElement;\n                                })}\n                            </AutoHideScrollbar>\n                            {this.state.previewEmoji ? (\n                                <Preview emoji={this.state.previewEmoji} />\n                            ) : (\n                                <QuickReactions\n                                    onClick={this.onClickEmoji}\n                                    selectedEmojis={this.props.selectedEmojis}\n                                />\n                            )}\n                        </section>\n                    );\n                }}\n            </RovingGridIndexProvider>\n        );\n    }\n}\n\nexport default EmojiPicker;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Tulir Asokan <tulir@maunium.net>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type MatrixEvent, EventType, RelationType, type Relations, RelationsEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport EmojiPicker from \"./EmojiPicker\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport dis from \"../../../dispatcher/dispatcher\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport RoomContext from \"../../../contexts/RoomContext\";\nimport { type FocusComposerPayload } from \"../../../dispatcher/payloads/FocusComposerPayload\";\n\ninterface IProps {\n    mxEvent: MatrixEvent;\n    reactions?: Relations | null | undefined;\n    onFinished(): void;\n}\n\ninterface IState {\n    selectedEmojis: Set<string>;\n}\n\nclass ReactionPicker extends React.Component<IProps, IState> {\n    public static contextType = RoomContext;\n    declare public context: React.ContextType<typeof RoomContext>;\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            selectedEmojis: new Set(Object.keys(this.getReactions())),\n        };\n    }\n\n    public componentDidMount(): void {\n        this.addListeners();\n    }\n\n    public componentDidUpdate(prevProps: IProps): void {\n        if (prevProps.reactions !== this.props.reactions) {\n            this.addListeners();\n            this.onReactionsChange();\n        }\n    }\n\n    private addListeners(): void {\n        if (this.props.reactions) {\n            this.props.reactions.on(RelationsEvent.Add, this.onReactionsChange);\n            this.props.reactions.on(RelationsEvent.Remove, this.onReactionsChange);\n            this.props.reactions.on(RelationsEvent.Redaction, this.onReactionsChange);\n        }\n    }\n\n    public componentWillUnmount(): void {\n        if (this.props.reactions) {\n            this.props.reactions.removeListener(RelationsEvent.Add, this.onReactionsChange);\n            this.props.reactions.removeListener(RelationsEvent.Remove, this.onReactionsChange);\n            this.props.reactions.removeListener(RelationsEvent.Redaction, this.onReactionsChange);\n        }\n    }\n\n    private getReactions(): Record<string, string> {\n        if (!this.props.reactions) {\n            return {};\n        }\n        const userId = MatrixClientPeg.safeGet().getSafeUserId();\n        const myAnnotations = this.props.reactions.getAnnotationsBySender()?.[userId] ?? new Set<MatrixEvent>();\n        return Object.fromEntries(\n            [...myAnnotations]\n                .filter((event) => !event.isRedacted())\n                .map((event) => [event.getRelation()?.key, event.getId()]),\n        );\n    }\n\n    private onReactionsChange = (): void => {\n        this.setState({\n            selectedEmojis: new Set(Object.keys(this.getReactions())),\n        });\n    };\n\n    private onChoose = (reaction: string): boolean => {\n        this.componentWillUnmount();\n        this.props.onFinished();\n        const myReactions = this.getReactions();\n        if (myReactions.hasOwnProperty(reaction)) {\n            if (this.props.mxEvent.isRedacted() || !this.context.canSelfRedact) return false;\n\n            MatrixClientPeg.safeGet().redactEvent(this.props.mxEvent.getRoomId()!, myReactions[reaction]);\n            dis.dispatch<FocusComposerPayload>({\n                action: Action.FocusAComposer,\n                context: this.context.timelineRenderingType,\n            });\n            // Tell the emoji picker not to bump this in the more frequently used list.\n            return false;\n        } else {\n            MatrixClientPeg.safeGet().sendEvent(this.props.mxEvent.getRoomId()!, EventType.Reaction, {\n                \"m.relates_to\": {\n                    rel_type: RelationType.Annotation,\n                    event_id: this.props.mxEvent.getId()!,\n                    key: reaction,\n                },\n            });\n            dis.dispatch({ action: \"message_sent\" });\n            dis.dispatch<FocusComposerPayload>({\n                action: Action.FocusAComposer,\n                context: this.context.timelineRenderingType,\n            });\n            return true;\n        }\n    };\n\n    private isEmojiDisabled = (unicode: string): boolean => {\n        if (!this.getReactions()[unicode]) return false;\n        if (this.context.canSelfRedact) return false;\n\n        return true;\n    };\n\n    public render(): React.ReactNode {\n        return (\n            <EmojiPicker\n                onChoose={this.onChoose}\n                isEmojiDisabled={this.isEmojiDisabled}\n                onFinished={this.props.onFinished}\n                selectedEmojis={this.state.selectedEmojis}\n            />\n        );\n    }\n}\n\nexport default ReactionPicker;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport classNames from \"classnames\";\nimport { ErrorIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { getLocationShareErrorMessage, type LocationShareError } from \"../../../utils/location\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport Heading from \"../typography/Heading\";\n\nexport interface MapErrorProps {\n    error: LocationShareError;\n    onFinished?: () => void;\n    isMinimised?: boolean;\n    className?: string;\n    onClick?: () => void;\n}\n\nexport const MapError: React.FC<MapErrorProps> = ({ error, isMinimised, className, onFinished, onClick }) => (\n    <div\n        data-testid=\"map-rendering-error\"\n        className={classNames(\"mx_MapError\", className, { mx_MapError_isMinimised: isMinimised })}\n        onClick={onClick}\n    >\n        <ErrorIcon className=\"mx_MapError_icon\" />\n        <Heading className=\"mx_MapError_heading\" size=\"3\">\n            {_t(\"location_sharing|failed_load_map\")}\n        </Heading>\n        <p className=\"mx_MapError_message\">{getLocationShareErrorMessage(error)}</p>\n        {onFinished && (\n            <AccessibleButton element=\"button\" kind=\"primary\" onClick={onFinished}>\n                {_t(\"action|ok\")}\n            </AccessibleButton>\n        )}\n    </div>\n);\n","var _path, _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\";\nimport { forwardRef } from \"react\";\nvar SvgMap = function SvgMap(props, ref) {\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 848 556\",\n    role: \"presentation\",\n    \"aria-hidden\": true,\n    ref: ref\n  }, props), /*#__PURE__*/React.createElement(\"mask\", {\n    id: \"map_svg__a\",\n    width: 848,\n    height: 556,\n    x: 0,\n    y: 0,\n    maskUnits: \"userSpaceOnUse\",\n    style: {\n      maskType: \"alpha\"\n    }\n  }, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    fill: \"currentColor\",\n    d: \"M0 0h847.147v555.685H0z\"\n  }))), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n    mask: \"url(#map_svg__a)\"\n  }, /*#__PURE__*/React.createElement(\"circle\", {\n    cx: 424.936,\n    cy: 277.842,\n    r: 495.758\n  }), /*#__PURE__*/React.createElement(\"path\", {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M424.935 874.689c329.63 0 596.845-267.217 596.845-596.847S754.565-319.005 424.935-319.005c-329.629 0-596.846 267.218-596.846 596.847 0 329.63 267.217 596.847 596.846 596.847M-46.544 6.905 920.48 442.347l-47.338 105.126-434.953-195.856-219.202 482.882-104.982-47.656L333.061 304.28-93.881 112.031z\",\n    clipRule: \"evenodd\"\n  }))));\n};\nvar ForwardRef = /*#__PURE__*/forwardRef(SvgMap);\nexport { ForwardRef as Icon };\nexport default \"img/location/map.a3d1233.svg\";","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport classNames from \"classnames\";\nimport LocationMarkerIcon from \"@vector-im/compound-design-tokens/assets/web/icons/location-pin-solid\";\n\nimport { Icon as MapFallbackImage } from \"../../../../res/img/location/map.svg\";\nimport Spinner from \"../elements/Spinner\";\n\ninterface Props extends React.HTMLAttributes<HTMLDivElement> {\n    className?: string;\n    isLoading?: boolean;\n}\n\nconst MapFallback: React.FC<Props> = ({ className, isLoading, children, ...rest }) => {\n    return (\n        <div className={classNames(\"mx_MapFallback\", className)} {...rest}>\n            <MapFallbackImage className=\"mx_MapFallback_bg\" />\n            {isLoading ? <Spinner size={32} /> : <LocationMarkerIcon className=\"mx_MapFallback_icon\" />}\n            {children}\n        </div>\n    );\n};\n\nexport default MapFallback;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2024 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n// Exports location components which touch maplibre-gs wrapped in React Suspense to enable code splitting\n\nimport React, { type JSX, type ComponentProps, lazy, Suspense } from \"react\";\n\nimport Spinner from \"../elements/Spinner\";\n\nconst MapComponent = lazy(() => import(\"./Map\"));\n\nexport function Map(props: ComponentProps<typeof MapComponent>): JSX.Element {\n    return (\n        <Suspense fallback={<Spinner />}>\n            <MapComponent {...props} />\n        </Suspense>\n    );\n}\n\nconst SmartMarkerComponent = lazy(() => import(\"./SmartMarker\"));\n\nexport function SmartMarker(props: ComponentProps<typeof SmartMarkerComponent>): JSX.Element {\n    return (\n        <Suspense fallback={<Spinner />}>\n            <SmartMarkerComponent {...props} />\n        </Suspense>\n    );\n}\n\nconst LocationButtonComponent = lazy(() => import(\"./LocationButton\"));\n\nexport function LocationButton(props: ComponentProps<typeof LocationButtonComponent>): JSX.Element {\n    return (\n        <Suspense fallback={<Spinner />}>\n            <LocationButtonComponent {...props} />\n        </Suspense>\n    );\n}\n\nconst LocationViewDialogComponent = lazy(() => import(\"./LocationViewDialog\"));\n\nexport function LocationViewDialog(props: ComponentProps<typeof LocationViewDialogComponent>): JSX.Element {\n    return (\n        <Suspense fallback={<Spinner />}>\n            <LocationViewDialogComponent {...props} />\n        </Suspense>\n    );\n}\n","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction VoiceCallMissedSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M7.623 3.04a1.07 1.07 0 0 1 1.086.929l.542 3.954q.039.27-.038.504a1.1 1.1 0 0 1-.272.427l-1.64 1.64Q7.806 11.5 8.456 12.4c.433.601 1.444 1.697 1.444 1.697.013.012 1.098 1.014 1.696 1.444q.9.65 1.909 1.153l1.64-1.64q.194-.194.426-.27a1.1 1.1 0 0 1 .504-.04l3.953.543q.407.058.67.358.26.301.26.728l.04 3.527q0 .427-.33.756-.33.33-.756.33a16 16 0 0 1-6.57-1.105 16.2 16.2 0 0 1-5.563-3.663 16.1 16.1 0 0 1-3.653-5.573 16.3 16.3 0 0 1-1.116-6.56q0-.426.329-.756Q3.67 3 4.095 3z\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M16 5q.425 0 .713.287Q17 5.575 17 6a.97.97 0 0 1-.287.713A.97.97 0 0 1 16 7h-.5l2.2 2.15 2.4-2.4a.95.95 0 0 1 .7-.275.95.95 0 0 1 .7.275q.3.3.3.7a.92.92 0 0 1-.275.675l-3.125 3.15a.8.8 0 0 1-.312.225 1.04 1.04 0 0 1-.776 0 .9.9 0 0 1-.312-.2l-3-3V9a.97.97 0 0 1-.287.713A.97.97 0 0 1 13 10a.97.97 0 0 1-.713-.287A.97.97 0 0 1 12 9V6q0-.425.287-.713A.97.97 0 0 1 13 5z\"\n    })]\n  });\n}\n;\nVoiceCallMissedSolidIcon.displayName = \"VoiceCallMissedSolidIcon\";\nexport default forwardRef(VoiceCallMissedSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction VideoCallMissedSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M2 8a4 4 0 0 1 4-4h10a2 2 0 0 1 2 2v4.286l3.35-2.871a1 1 0 0 1 1.65.76v7.65a1 1 0 0 1-1.65.76L18 13.715V18a2 2 0 0 1-2 2H6a4 4 0 0 1-4-4zm8.7 5.15L8.5 11H9q.424 0 .713-.287A.97.97 0 0 0 10 10a.97.97 0 0 0-.287-.713A.97.97 0 0 0 9 9H6a.97.97 0 0 0-.713.287A.97.97 0 0 0 5 10v3q0 .424.287.713Q5.576 14 6 14t.713-.287A.97.97 0 0 0 7 13v-.7l3 3q.125.125.313.2a1.03 1.03 0 0 0 .774 0 .8.8 0 0 0 .313-.225l3.125-3.15a.92.92 0 0 0 .275-.675q0-.4-.3-.7a.95.95 0 0 0-.7-.275.95.95 0 0 0-.7.275z\"\n    })\n  });\n}\n;\nVideoCallMissedSolidIcon.displayName = \"VideoCallMissedSolidIcon\";\nexport default forwardRef(VideoCallMissedSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction VideoCallDeclinedSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M2 8a4 4 0 0 1 4-4h10a2 2 0 0 1 2 2v4.286l3.35-2.871a1 1 0 0 1 1.65.76v7.65a1 1 0 0 1-1.65.76L18 13.715V18a2 2 0 0 1-2 2H6a4 4 0 0 1-4-4zm10.828 6.828q.3-.3.3-.707 0-.405-.3-.707L11.414 12l1.414-1.414q.3-.3.3-.707t-.3-.707-.707-.301q-.405 0-.707.3L10 10.587 8.586 9.172q-.3-.3-.707-.301-.407 0-.707.3t-.3.708q0 .405.3.707L8.586 12l-1.414 1.414q-.3.3-.3.707t.3.707.707.3q.405 0 .707-.3L10 13.414l1.414 1.414q.3.3.707.3t.707-.3\"\n    })\n  });\n}\n;\nVideoCallDeclinedSolidIcon.displayName = \"VideoCallDeclinedSolidIcon\";\nexport default forwardRef(VideoCallDeclinedSolidIcon);","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createRef, type JSX } from \"react\";\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { CallErrorCode, CallState } from \"matrix-js-sdk/src/webrtc/call\";\nimport classNames from \"classnames\";\nimport { Clock } from \"@element-hq/web-shared-components\";\nimport {\n    EndCallIcon,\n    VideoCallDeclinedSolidIcon,\n    VideoCallMissedSolidIcon,\n    VideoCallSolidIcon,\n    VoiceCallMissedSolidIcon,\n    VoiceCallSolidIcon,\n    VolumeOffSolidIcon,\n    VolumeOnSolidIcon,\n} from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport MemberAvatar from \"../avatars/MemberAvatar\";\nimport type LegacyCallEventGrouper from \"../../structures/LegacyCallEventGrouper\";\nimport { LegacyCallEventGrouperEvent } from \"../../structures/LegacyCallEventGrouper\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport InfoTooltip, { InfoTooltipKind } from \"../elements/InfoTooltip\";\nimport { formatPreciseDuration } from \"../../../DateUtils\";\n\nconst MAX_NON_NARROW_WIDTH = (450 / 70) * 100;\n\ninterface IProps {\n    mxEvent: MatrixEvent;\n    callEventGrouper: LegacyCallEventGrouper;\n    timestamp?: JSX.Element;\n}\n\ninterface IState {\n    callState?: CallState;\n    silenced: boolean;\n    narrow: boolean;\n    length: number;\n}\n\nexport function getCallStateIcon(isVoice: boolean, state: undefined | \"missed\" | \"declined\"): JSX.Element {\n    let icon = isVoice ? <VoiceCallSolidIcon /> : <VideoCallSolidIcon />;\n    if (state === \"missed\") {\n        icon = isVoice ? <VoiceCallMissedSolidIcon /> : <VideoCallMissedSolidIcon />;\n    } else if (state === \"declined\") {\n        icon = isVoice ? <EndCallIcon /> : <VideoCallDeclinedSolidIcon />;\n    }\n\n    return <div className=\"mx_LegacyCallEvent_type_icon\">{icon}</div>;\n}\n\nexport default class LegacyCallEvent extends React.PureComponent<IProps, IState> {\n    private wrapperElement = createRef<HTMLDivElement>();\n    private resizeObserver?: ResizeObserver;\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            callState: this.props.callEventGrouper.state,\n            silenced: false,\n            narrow: false,\n            length: 0,\n        };\n    }\n\n    public componentDidMount(): void {\n        this.props.callEventGrouper.addListener(LegacyCallEventGrouperEvent.StateChanged, this.onStateChanged);\n        this.props.callEventGrouper.addListener(LegacyCallEventGrouperEvent.SilencedChanged, this.onSilencedChanged);\n        this.props.callEventGrouper.addListener(LegacyCallEventGrouperEvent.LengthChanged, this.onLengthChanged);\n\n        this.resizeObserver = new ResizeObserver(this.resizeObserverCallback);\n        if (this.wrapperElement.current) this.resizeObserver.observe(this.wrapperElement.current);\n    }\n\n    public componentWillUnmount(): void {\n        this.props.callEventGrouper.removeListener(LegacyCallEventGrouperEvent.StateChanged, this.onStateChanged);\n        this.props.callEventGrouper.removeListener(LegacyCallEventGrouperEvent.SilencedChanged, this.onSilencedChanged);\n        this.props.callEventGrouper.removeListener(LegacyCallEventGrouperEvent.LengthChanged, this.onLengthChanged);\n\n        this.resizeObserver?.disconnect();\n    }\n\n    private onLengthChanged = (length: number): void => {\n        this.setState({ length });\n    };\n\n    private resizeObserverCallback = (entries: ResizeObserverEntry[]): void => {\n        const wrapperElementEntry = entries.find((entry) => entry.target === this.wrapperElement.current);\n        if (!wrapperElementEntry) return;\n\n        this.setState({ narrow: wrapperElementEntry.contentRect.width < MAX_NON_NARROW_WIDTH });\n    };\n\n    private onSilencedChanged = (newState: boolean): void => {\n        this.setState({ silenced: newState });\n    };\n\n    private onStateChanged = (newState: CallState): void => {\n        this.setState({ callState: newState });\n    };\n\n    private renderCallBackButton(text: string): JSX.Element {\n        return (\n            <AccessibleButton\n                className=\"mx_LegacyCallEvent_content_button\"\n                onClick={this.props.callEventGrouper.callBack}\n                kind=\"primary\"\n            >\n                {this.props.callEventGrouper.isVoice ? <VoiceCallSolidIcon /> : <VideoCallSolidIcon />}\n                {text}\n            </AccessibleButton>\n        );\n    }\n\n    private renderSilenceIcon(): JSX.Element {\n        return (\n            <AccessibleButton\n                className=\"mx_LegacyCallEvent_iconButton\"\n                onClick={this.props.callEventGrouper.toggleSilenced}\n                title={this.state.silenced ? _t(\"voip|unsilence\") : _t(\"voip|silence\")}\n            >\n                {this.state.silenced ? <VolumeOffSolidIcon /> : <VolumeOnSolidIcon />}\n            </AccessibleButton>\n        );\n    }\n\n    private renderContent(): JSX.Element {\n        if (this.state.callState === CallState.Ringing) {\n            let silenceIcon;\n            if (!this.state.narrow) {\n                silenceIcon = this.renderSilenceIcon();\n            }\n\n            return (\n                <div className=\"mx_LegacyCallEvent_content\">\n                    {silenceIcon}\n                    <AccessibleButton\n                        className=\"mx_LegacyCallEvent_content_button\"\n                        onClick={this.props.callEventGrouper.rejectCall}\n                        kind=\"danger\"\n                    >\n                        <EndCallIcon />\n                        {_t(\"action|decline\")}\n                    </AccessibleButton>\n                    <AccessibleButton\n                        className=\"mx_LegacyCallEvent_content_button\"\n                        onClick={this.props.callEventGrouper.answerCall}\n                        kind=\"primary\"\n                    >\n                        {this.props.callEventGrouper.isVoice ? <VoiceCallSolidIcon /> : <VideoCallSolidIcon />}\n                        {_t(\"action|accept\")}\n                    </AccessibleButton>\n                    {this.props.timestamp}\n                </div>\n            );\n        }\n        if (this.state.callState === CallState.Ended) {\n            const hangupReason = this.props.callEventGrouper.hangupReason;\n            const gotRejected = this.props.callEventGrouper.gotRejected;\n\n            if (gotRejected) {\n                return (\n                    <div className=\"mx_LegacyCallEvent_content\">\n                        {_t(\"timeline|m.call.invite|declined\")}\n                        {this.renderCallBackButton(_t(\"timeline|m.call.invite|call_back_prompt\"))}\n                        {this.props.timestamp}\n                    </div>\n                );\n            } else if (hangupReason === CallErrorCode.AnsweredElsewhere) {\n                return (\n                    <div className=\"mx_LegacyCallEvent_content\">\n                        {_t(\"timeline|m.call.invite|answered_elsewhere\")}\n                        {this.props.timestamp}\n                    </div>\n                );\n            } else if (this.props.callEventGrouper.callWasMissed) {\n                return (\n                    <div className=\"mx_LegacyCallEvent_content\">\n                        {_t(\"timeline|m.call.invite|missed_call\")}\n                        {this.renderCallBackButton(_t(\"timeline|m.call.invite|call_back_prompt\"))}\n                        {this.props.timestamp}\n                    </div>\n                );\n            } else if (!hangupReason || [CallErrorCode.UserHangup, \"user hangup\"].includes(hangupReason)) {\n                // workaround for https://github.com/vector-im/element-web/issues/5178\n                // it seems Android randomly sets a reason of \"user hangup\" which is\n                // interpreted as an error code :(\n                // https://github.com/vector-im/riot-android/issues/2623\n                // Also the correct hangup code as of VoIP v1 (with underscore)\n                // Also, if we don't have a reason\n                const duration = this.props.callEventGrouper.duration!;\n                let text = _t(\"timeline|m.call.hangup|dm\");\n                if (duration) {\n                    text += \" • \" + formatPreciseDuration(duration);\n                }\n                return (\n                    <div className=\"mx_LegacyCallEvent_content\">\n                        {text}\n                        {this.props.timestamp}\n                    </div>\n                );\n            } else if (hangupReason === CallErrorCode.InviteTimeout) {\n                return (\n                    <div className=\"mx_LegacyCallEvent_content\">\n                        {_t(\"timeline|m.call.invite|no_answer\")}\n                        {this.renderCallBackButton(_t(\"timeline|m.call.invite|call_back_prompt\"))}\n                        {this.props.timestamp}\n                    </div>\n                );\n            }\n\n            let reason;\n            if (hangupReason === CallErrorCode.IceFailed) {\n                // We couldn't establish a connection at all\n                reason = _t(\"timeline|m.call.invite|failed_connect_media\");\n            } else if (hangupReason === \"ice_timeout\") {\n                // We established a connection but it died\n                reason = _t(\"timeline|m.call.invite|failed_connection\");\n            } else if (hangupReason === CallErrorCode.NoUserMedia) {\n                // The other side couldn't open capture devices\n                reason = _t(\"timeline|m.call.invite|failed_opponent_media\");\n            } else if (hangupReason === \"unknown_error\") {\n                // An error code the other side doesn't have a way to express\n                // (as opposed to an error code they gave but we don't know about,\n                // in which case we show the error code)\n                reason = _t(\"timeline|m.call.invite|unknown_error\");\n            } else if (hangupReason === CallErrorCode.UserBusy) {\n                reason = _t(\"voip|user_busy_description\");\n            } else {\n                reason = _t(\"timeline|m.call.invite|unknown_failure\", { reason: hangupReason });\n            }\n\n            return (\n                <div className=\"mx_LegacyCallEvent_content\">\n                    <InfoTooltip\n                        tooltip={reason}\n                        className=\"mx_LegacyCallEvent_content_tooltip\"\n                        kind={InfoTooltipKind.Warning}\n                    />\n                    {_t(\"timeline|m.call.invite|failed_connection\")}\n                    {this.renderCallBackButton(_t(\"action|retry\"))}\n                    {this.props.timestamp}\n                </div>\n            );\n        }\n        if (this.state.callState === CallState.Connected) {\n            return (\n                <div className=\"mx_LegacyCallEvent_content\">\n                    <Clock seconds={this.state.length} aria-live=\"off\" />\n                    {this.props.timestamp}\n                </div>\n            );\n        }\n        if (this.state.callState === CallState.Connecting) {\n            return (\n                <div className=\"mx_LegacyCallEvent_content\">\n                    {_t(\"voip|connecting\")}\n                    {this.props.timestamp}\n                </div>\n            );\n        }\n\n        return (\n            <div className=\"mx_LegacyCallEvent_content\">\n                {_t(\"timeline|m.call.invite|unknown_state\")}\n                {this.props.timestamp}\n            </div>\n        );\n    }\n\n    public render(): React.ReactNode {\n        const event = this.props.mxEvent;\n        const sender = event.sender ? event.sender.name : event.getSender();\n        const isVoice = this.props.callEventGrouper.isVoice;\n        const callType = isVoice ? _t(\"voip|voice_call\") : _t(\"voip|video_call\");\n        const callState = this.state.callState;\n        const hangupReason = this.props.callEventGrouper.hangupReason;\n        const content = this.renderContent();\n        const className = classNames(\"mx_LegacyCallEvent\", {\n            mx_LegacyCallEvent_voice: isVoice,\n            mx_LegacyCallEvent_video: !isVoice,\n            mx_LegacyCallEvent_narrow: this.state.narrow,\n        });\n\n        let silenceIcon;\n        if (this.state.narrow && this.state.callState === CallState.Ringing) {\n            silenceIcon = this.renderSilenceIcon();\n        }\n\n        let iconState: Parameters<typeof getCallStateIcon>[1] = undefined;\n        if (this.props.callEventGrouper.callWasMissed) {\n            iconState = \"missed\";\n        } else if (\n            callState === CallState.Ended &&\n            (hangupReason === CallErrorCode.InviteTimeout || this.props.callEventGrouper.gotRejected)\n        ) {\n            iconState = \"declined\";\n        }\n\n        return (\n            <div className=\"mx_LegacyCallEvent_wrapper\" ref={this.wrapperElement}>\n                <div className={className}>\n                    {silenceIcon}\n                    <div className=\"mx_LegacyCallEvent_info\">\n                        <MemberAvatar member={event.sender} size=\"32px\" />\n                        <div className=\"mx_LegacyCallEvent_info_basic\">\n                            <div className=\"mx_LegacyCallEvent_sender\">{sender}</div>\n                            <div className=\"mx_LegacyCallEvent_type\">\n                                {getCallStateIcon(!!isVoice, iconState)}\n                                {callType}\n                            </div>\n                        </div>\n                    </div>\n                    {content}\n                </div>\n            </div>\n        );\n    }\n}\n","/*\n * Copyright 2025 New Vector Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type ChangeEvent, type KeyboardEvent } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport {\n    percentageOf,\n    BaseViewModel,\n    type AudioPlayerViewSnapshot,\n    type AudioPlayerViewModel as AudioPlayerViewModelInterface,\n} from \"@element-hq/web-shared-components\";\n\nimport { type Playback } from \"../../../../../audio/Playback\";\nimport { UPDATE_EVENT } from \"../../../../../stores/AsyncStore\";\nimport { getKeyBindingsManager } from \"../../../../../KeyBindingsManager\";\nimport { KeyBindingAction } from \"../../../../../accessibility/KeyboardShortcuts\";\n\n/**\n * The number of seconds to skip when the user presses the left or right arrow keys.\n */\nconst ARROW_SKIP_SECONDS = 5;\n\ninterface Props {\n    /**\n     * The playback instance that manages the audio playback.\n     */\n    playback: Playback;\n    /**\n     * Optional name of the media being played.\n     */\n    mediaName?: string;\n}\n\n/**\n * ViewModel for the audio player, providing the current state of the audio playback.\n * It listens to updates from the Playback instance and computes a snapshot.\n */\nexport class AudioPlayerViewModel\n    extends BaseViewModel<AudioPlayerViewSnapshot, Props>\n    implements AudioPlayerViewModelInterface\n{\n    /**\n     * Indicates if there was an error processing the audio file.\n     * @private\n     */\n    private error = false;\n\n    /**\n     * Computes the snapshot of the audio player based on the current playback state.\n     * This includes the media name, size in bytes, playback state, duration, percentage complete,\n     * played seconds, and whether there was an error.\n     * @param playback - The playback instance managing the audio playback.\n     * @param mediaName - Optional name of the media being played.\n     * @param error - Indicates if there was an error processing the audio file.\n     */\n    private static readonly computeSnapshot = (\n        playback: Playback,\n        mediaName?: string,\n        error = false,\n    ): AudioPlayerViewSnapshot => {\n        const percentComplete = percentageOf(playback.timeSeconds, 0, playback.durationSeconds) * 100;\n\n        return {\n            mediaName,\n            sizeBytes: playback.sizeBytes,\n            playbackState: playback.currentState,\n            durationSeconds: playback.durationSeconds,\n            percentComplete,\n            playedSeconds: playback.timeSeconds,\n            error,\n        };\n    };\n\n    public constructor(props: Props) {\n        super(props, AudioPlayerViewModel.computeSnapshot(props.playback, props.mediaName));\n        this.disposables.trackListener(props.playback, UPDATE_EVENT, this.setSnapshot);\n        // There is no unsubscribe method in SimpleObservable\n        this.props.playback.clockInfo.liveData.onUpdate(this.setSnapshot);\n\n        // Don't wait for the promise to complete - it will emit a progress update when it\n        // is done, and it's not meant to take long anyhow.\n        this.preparePlayback();\n    }\n\n    /**\n     * Prepares the playback by calling the prepare method on the playback instance.\n     * @private\n     */\n    private async preparePlayback(): Promise<void> {\n        try {\n            await this.props.playback.prepare();\n        } catch (e) {\n            logger.error(\"Error processing audio file:\", e, this.props.playback.currentState);\n            this.error = true;\n            this.setSnapshot();\n        }\n    }\n\n    /**\n     * Sets the snapshot and emits an update to subscribers.\n     */\n    private readonly setSnapshot = (): void => {\n        this.snapshot.set(AudioPlayerViewModel.computeSnapshot(this.props.playback, this.props.mediaName, this.error));\n    };\n\n    public onKeyDown = (ev: KeyboardEvent<HTMLDivElement>): void => {\n        let handled = true;\n        const action = getKeyBindingsManager().getAccessibilityAction(ev);\n\n        switch (action) {\n            case KeyBindingAction.Space:\n                this.togglePlay();\n                break;\n            case KeyBindingAction.ArrowLeft:\n                this.props.playback.skipTo(this.props.playback.timeSeconds - ARROW_SKIP_SECONDS);\n                break;\n            case KeyBindingAction.ArrowRight:\n                this.props.playback.skipTo(this.props.playback.timeSeconds + ARROW_SKIP_SECONDS);\n                break;\n            default:\n                handled = false;\n                break;\n        }\n\n        // stopPropagation() prevents the FocusComposer catch-all from triggering,\n        // but we need to do it on key down instead of press (even though the user\n        // interaction is typically on press).\n        if (handled) {\n            ev.stopPropagation();\n        }\n    };\n\n    public togglePlay = async (): Promise<void> => {\n        await this.props.playback.toggle();\n    };\n\n    public onSeekbarChange = async (ev: ChangeEvent<HTMLInputElement>): Promise<void> => {\n        await this.props.playback.skipTo((Number(ev.target.value) / 100) * this.props.playback.durationSeconds);\n    };\n\n    /**\n     * Updates the properties of the view model and recomputes the snapshot.\n     * @param newProps\n     */\n    public setProps(newProps: Partial<Props>): void {\n        this.props = { ...this.props, ...newProps };\n        this.setSnapshot();\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, useEffect } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type IContent } from \"matrix-js-sdk/src/matrix\";\nimport { type MediaEventContent } from \"matrix-js-sdk/src/types\";\nimport { AudioPlayerView, useCreateAutoDisposedViewModel } from \"@element-hq/web-shared-components\";\n\nimport { type Playback } from \"../../../audio/Playback\";\nimport InlineSpinner from \"../elements/InlineSpinner\";\nimport { _t } from \"../../../languageHandler\";\nimport { type IBodyProps } from \"./IBodyProps\";\nimport { PlaybackManager } from \"../../../audio/PlaybackManager\";\nimport RoomContext, { TimelineRenderingType } from \"../../../contexts/RoomContext\";\nimport MediaProcessingError from \"./shared/MediaProcessingError\";\nimport { AudioPlayerViewModel } from \"../../../viewmodels/room/timeline/event-tile/body/AudioPlayerViewModel\";\nimport { FileBodyFactory, renderMBody } from \"./MBodyFactory\";\n\ninterface IState {\n    error?: boolean;\n    playback?: Playback;\n}\n\nexport default class MAudioBody extends React.PureComponent<IBodyProps, IState> {\n    public static contextType = RoomContext;\n    declare public context: React.ContextType<typeof RoomContext>;\n\n    public state: IState = {};\n\n    public async componentDidMount(): Promise<void> {\n        let buffer: ArrayBuffer;\n        try {\n            try {\n                const blob = await this.props.mediaEventHelper!.sourceBlob.value;\n                buffer = await blob.arrayBuffer();\n            } catch (e) {\n                this.setState({ error: true });\n                logger.warn(\"Unable to decrypt audio message\", e);\n                return; // stop processing the audio file\n            }\n        } catch (e) {\n            this.setState({ error: true });\n            logger.warn(\"Unable to decrypt/download audio message\", e);\n            return; // stop processing the audio file\n        }\n\n        // We should have a buffer to work with now: let's set it up\n\n        // Note: we don't actually need a waveform to render an audio event, but voice messages do.\n        const content = this.props.mxEvent.getContent<MediaEventContent & IContent>();\n        const waveform = content?.[\"org.matrix.msc1767.audio\"]?.waveform?.map((p: number) => p / 1024);\n\n        // We should have a buffer to work with now: let's set it up\n        const playback = PlaybackManager.instance.createPlaybackInstance(buffer, waveform);\n        playback.clockInfo.populatePlaceholdersFrom(this.props.mxEvent);\n        this.setState({ playback });\n\n        this.onMount(playback);\n        // Note: the components later on will handle preparing the Playback class for us\n    }\n\n    protected onMount(playback: Playback): void {}\n\n    public componentWillUnmount(): void {\n        this.state.playback?.destroy();\n    }\n\n    protected get showFileBody(): boolean {\n        return (\n            this.context.timelineRenderingType !== TimelineRenderingType.Room &&\n            this.context.timelineRenderingType !== TimelineRenderingType.Pinned &&\n            this.context.timelineRenderingType !== TimelineRenderingType.Search\n        );\n    }\n\n    public render(): React.ReactNode {\n        if (this.state.error) {\n            return (\n                <MediaProcessingError className=\"mx_MAudioBody\">\n                    {_t(\"timeline|m.audio|error_processing_audio\")}\n                </MediaProcessingError>\n            );\n        }\n\n        if (this.props.forExport) {\n            const content = this.props.mxEvent.getContent();\n            // During export, the content url will point to the MSC, which will later point to a local url\n            const contentUrl = content.file?.url || content.url;\n            return (\n                <span className=\"mx_MAudioBody\">\n                    <audio src={contentUrl} controls />\n                </span>\n            );\n        }\n\n        if (!this.state.playback) {\n            return (\n                <span className=\"mx_MAudioBody\">\n                    <InlineSpinner />\n                </span>\n            );\n        }\n\n        // At this point we should have a playable state\n        return (\n            <span className=\"mx_MAudioBody\">\n                <AudioPlayer playback={this.state.playback} mediaName={this.props.mxEvent.getContent().body} />\n                {this.showFileBody && renderMBody({ ...this.props, showFileInfo: false }, FileBodyFactory)}\n            </span>\n        );\n    }\n}\n\ninterface AudioPlayerProps {\n    /**\n     * The playback instance to control audio playback.\n     */\n    playback: Playback;\n    /**\n     * The name of the media being played\n     */\n    mediaName: string;\n}\n\n/**\n * AudioPlayer component that initializes the AudioPlayerViewModel and renders the AudioPlayerView.\n */\nfunction AudioPlayer({ playback, mediaName }: AudioPlayerProps): JSX.Element {\n    const vm = useCreateAutoDisposedViewModel(() => new AudioPlayerViewModel({ playback, mediaName }));\n    useEffect(() => {\n        vm.setProps({ playback, mediaName });\n    }, [playback, mediaName, vm]);\n\n    return <AudioPlayerView vm={vm} />;\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { DecryptionFailureCode } from \"matrix-js-sdk/src/crypto-api\";\nimport {\n    BaseViewModel,\n    DecryptionFailureReason,\n    type DecryptionFailureBodyViewSnapshot as DecryptionFailureBodyViewSnapshotInterface,\n    type DecryptionFailureBodyViewModel as DecryptionFailureBodyViewModelInterface,\n} from \"@element-hq/web-shared-components\";\n\nexport interface DecryptionFailureBodyViewModelProps {\n    /**\n     * The message event being rendered.\n     */\n    decryptionFailureCode: DecryptionFailureCode | null;\n    /**\n     * The local device verification state.\n     */\n    verificationState?: boolean;\n}\n\n/**\n * ViewModel for the decryption failure body, providing the current state of the component.\n */\nexport class DecryptionFailureBodyViewModel\n    extends BaseViewModel<DecryptionFailureBodyViewSnapshotInterface, DecryptionFailureBodyViewModelProps>\n    implements DecryptionFailureBodyViewModelInterface\n{\n    /**\n     * Convert enum DecryptionFailureCode to enum DecryptionFailureReason.\n     */\n    private static getDecryptionReasonFromCode(\n        decryptionFailureCode: DecryptionFailureCode | null,\n    ): DecryptionFailureReason {\n        switch (decryptionFailureCode) {\n            case DecryptionFailureCode.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED:\n                return DecryptionFailureReason.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED;\n            case DecryptionFailureCode.HISTORICAL_MESSAGE_NO_KEY_BACKUP:\n                return DecryptionFailureReason.HISTORICAL_MESSAGE_NO_KEY_BACKUP;\n            case DecryptionFailureCode.HISTORICAL_MESSAGE_USER_NOT_JOINED:\n                return DecryptionFailureReason.HISTORICAL_MESSAGE_USER_NOT_JOINED;\n            case DecryptionFailureCode.MEGOLM_KEY_WITHHELD_FOR_UNVERIFIED_DEVICE:\n                return DecryptionFailureReason.MEGOLM_KEY_WITHHELD_FOR_UNVERIFIED_DEVICE;\n            case DecryptionFailureCode.SENDER_IDENTITY_PREVIOUSLY_VERIFIED:\n                return DecryptionFailureReason.SENDER_IDENTITY_PREVIOUSLY_VERIFIED;\n            case DecryptionFailureCode.UNSIGNED_SENDER_DEVICE:\n                return DecryptionFailureReason.UNSIGNED_SENDER_DEVICE;\n            default:\n                return DecryptionFailureReason.UNABLE_TO_DECRYPT;\n        }\n    }\n\n    /**\n     * @param decryptionFailureCode - The decryption failure code for the event.\n     * @param verificationState - The local device verification state.\n     */\n    private static readonly computeSnapshot = (\n        decryptionFailureCode: DecryptionFailureCode | null,\n        verificationState?: boolean,\n    ): DecryptionFailureBodyViewSnapshotInterface => {\n        return {\n            decryptionFailureReason: DecryptionFailureBodyViewModel.getDecryptionReasonFromCode(decryptionFailureCode),\n            isLocalDeviceVerified: verificationState,\n        };\n    };\n\n    public constructor(props: DecryptionFailureBodyViewModelProps) {\n        super(\n            props,\n            DecryptionFailureBodyViewModel.computeSnapshot(props.decryptionFailureCode, props.verificationState),\n        );\n    }\n\n    /**\n     * Updates the properties of the view model and recomputes the snapshot.\n     * @param verificationState - The updated local device verification state.\n     */\n    public setVerificationState(verificationState?: boolean): void {\n        this.props.verificationState = verificationState;\n        this.snapshot.merge({ isLocalDeviceVerified: verificationState });\n    }\n\n    public setDecryptionFailureCode(decryptionFailureCode: DecryptionFailureCode | null): void {\n        this.props.decryptionFailureCode = decryptionFailureCode;\n        this.snapshot.merge({\n            decryptionFailureReason: DecryptionFailureBodyViewModel.getDecryptionReasonFromCode(decryptionFailureCode),\n        });\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type MouseEvent, type RefObject } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { MsgType, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { type MediaEventContent } from \"matrix-js-sdk/src/types\";\nimport {\n    BaseViewModel,\n    FileBodyViewState,\n    FileBodyViewInfoIcon,\n    type FileBodyViewSnapshot,\n    type FileBodyViewModel as FileBodyViewModelInterface,\n} from \"@element-hq/web-shared-components\";\n// eslint-disable-next-line no-restricted-imports\nimport DownloadSvg from \"@vector-im/compound-design-tokens/icons/download.svg\";\n\nimport Modal from \"../../Modal\";\nimport { _t } from \"../../languageHandler\";\nimport { mediaFromContent } from \"../../customisations/Media\";\nimport { downloadLabelForFile, presentableTextForFile } from \"../../utils/FileUtils\";\nimport { FileDownloader } from \"../../utils/FileDownloader\";\nimport { type MediaEventHelper } from \"../../utils/MediaEventHelper\";\nimport { TimelineRenderingType } from \"../../contexts/RoomContext\";\nimport ErrorDialog from \"../../components/views/dialogs/ErrorDialog\";\n\nexport interface FileBodyViewModelProps {\n    mxEvent: MatrixEvent;\n    mediaEventHelper?: MediaEventHelper;\n    forExport?: boolean;\n    showFileInfo?: boolean;\n    timelineRenderingType: TimelineRenderingType;\n    refIFrame: RefObject<HTMLIFrameElement>;\n    refLink: RefObject<HTMLAnchorElement>;\n}\n\n// Cached copy of the download.svg asset for the sandboxed iframe.\nconst downloadIconCache = { url: \"\" };\n\nasync function cacheDownloadIcon(): Promise<string> {\n    if (downloadIconCache.url) return downloadIconCache.url;\n    const svg = await fetch(DownloadSvg).then((r) => r.text());\n    downloadIconCache.url = \"data:image/svg+xml;base64,\" + window.btoa(svg);\n    return downloadIconCache.url;\n}\n\n// Cache the asset immediately\n// noinspection JSIgnoredPromiseFromCall\ncacheDownloadIcon();\n\n// User supplied content can contain scripts, we have to be careful that\n// we don't accidentally run those script within the same origin as the\n// client. Otherwise those scripts written by remote users can read\n// the access token and end-to-end keys that are in local storage.\n//\n// For attachments downloaded directly from the homeserver we can use\n// Content-Security-Policy headers to disable script execution.\n//\n// But attachments with end-to-end encryption are more difficult to handle.\n// We need to decrypt the attachment on the client and then display it.\n// To display the attachment we need to turn the decrypted bytes into a URL.\n//\n// There are two ways to turn bytes into URLs, data URL and blob URLs.\n// Data URLs aren't suitable for downloading a file because Chrome has a\n// 2MB limit on the size of URLs that can be viewed in the browser or\n// downloaded. This limit does not seem to apply when the url is used as\n// the source attribute of an image tag.\n//\n// Blob URLs are generated using window.URL.createObjectURL and unfortunately\n// for our purposes they inherit the origin of the page that created them.\n// This means that any scripts that run when the URL is viewed will be able\n// to access local storage.\n//\n// The easiest solution is to host the code that generates the blob URL on\n// a different domain to the client.\n// Another possibility is to generate the blob URL within a sandboxed iframe.\n// The downside of using a second domain is that it complicates hosting,\n// the downside of using a sandboxed iframe is that the browers are overly\n// restrictive in what you are allowed to do with the generated URL.\n\n/**\n * Get the current CSS style for a DOMElement.\n * @param {HTMLElement} element The element to get the current style of.\n * @returns {string} The CSS style encoded as a string.\n */\nfunction computedStyle(element: HTMLElement | null): string {\n    if (!element) {\n        return \"\";\n    }\n    const style = window.getComputedStyle(element, null);\n    let cssText = style.cssText;\n    // noinspection EqualityComparisonWithCoercionJS\n    if (cssText === \"\") {\n        // Firefox doesn't implement \".cssText\" for computed styles.\n        // https://bugzilla.mozilla.org/show_bug.cgi?id=137687\n        for (const rule of style) {\n            cssText += rule + \":\";\n            cssText += style.getPropertyValue(rule) + \";\";\n        }\n    }\n    return cssText;\n}\n\nexport class FileBodyViewModel\n    extends BaseViewModel<FileBodyViewSnapshot, FileBodyViewModelProps>\n    implements FileBodyViewModelInterface\n{\n    private readonly refIFrame: RefObject<HTMLIFrameElement>;\n    private readonly refLink: RefObject<HTMLAnchorElement>;\n    private decryptedBlob?: Blob;\n    private userDidClick = false;\n    private readonly fileDownloader: FileDownloader;\n\n    public constructor(props: FileBodyViewModelProps) {\n        super(props, FileBodyViewModel.computeSnapshot(props));\n        this.refIFrame = props.refIFrame;\n        this.refLink = props.refLink;\n        this.fileDownloader = new FileDownloader(() => this.refIFrame.current);\n    }\n\n    private static getInfoIcon(content: MediaEventContent): FileBodyViewInfoIcon {\n        if (content.msgtype === MsgType.Audio) {\n            return FileBodyViewInfoIcon.AUDIO;\n        } else if (content.msgtype === MsgType.Video) {\n            return FileBodyViewInfoIcon.VIDEO;\n        }\n        return FileBodyViewInfoIcon.ATTACHMENT;\n    }\n\n    private static computeSnapshot(props: FileBodyViewModelProps, decryptedBlob?: Blob): FileBodyViewSnapshot {\n        const content = props.mxEvent.getContent<MediaEventContent>();\n        const media = mediaFromContent(content);\n        const isEncrypted = props.mediaEventHelper?.media.isEncrypted === true;\n\n        //Whether or not to show the default placeholder for the file. Defaults to true.\n        const showFileInfo = props.showFileInfo ?? true;\n\n        const showDownload =\n            !showFileInfo &&\n            props.timelineRenderingType !== TimelineRenderingType.Room &&\n            props.timelineRenderingType !== TimelineRenderingType.Search &&\n            props.timelineRenderingType !== TimelineRenderingType.Pinned &&\n            props.timelineRenderingType !== TimelineRenderingType.Thread;\n\n        const fileInfoLabel = showFileInfo\n            ? presentableTextForFile(content, _t(\"common|attachment\"), true, true)\n            : undefined;\n        const fileInfoTooltip = showFileInfo\n            ? presentableTextForFile(content, _t(\"common|attachment\"), true)\n            : undefined;\n        const fileInfoIcon = showFileInfo ? FileBodyViewModel.getInfoIcon(content) : undefined;\n        const downloadLabel = showDownload ? downloadLabelForFile(content, true) : undefined;\n        const downloadTitle = showDownload\n            ? presentableTextForFile(content, _t(\"common|attachment\"), true, true)\n            : undefined;\n\n        if (props.forExport) {\n            return {\n                state: FileBodyViewState.EXPORT,\n                showInfo: showFileInfo,\n                infoLabel: fileInfoLabel,\n                infoTooltip: fileInfoTooltip,\n                infoIcon: fileInfoIcon,\n                infoHref: content.file?.url || content.url,\n            };\n        }\n\n        if (isEncrypted) {\n            const state = decryptedBlob ? FileBodyViewState.ENCRYPTED : FileBodyViewState.DECRYPTION_PENDING;\n\n            return {\n                state,\n                showInfo: showFileInfo,\n                infoLabel: fileInfoLabel,\n                infoTooltip: fileInfoTooltip,\n                infoIcon: fileInfoIcon,\n                showDownload,\n                downloadLabel,\n                downloadTitle: downloadTitle,\n            };\n        }\n\n        if (media.srcHttp) {\n            return {\n                state: FileBodyViewState.UNENCRYPTED,\n                showInfo: showFileInfo,\n                infoLabel: fileInfoLabel,\n                infoTooltip: fileInfoTooltip,\n                infoIcon: fileInfoIcon,\n                showDownload,\n                downloadLabel,\n                downloadTitle: downloadTitle,\n                downloadHref: media.srcHttp,\n            };\n        }\n\n        return {\n            state: FileBodyViewState.INVALID,\n            showInfo: showFileInfo,\n            infoLabel: fileInfoLabel,\n            infoTooltip: fileInfoTooltip,\n            infoIcon: fileInfoIcon,\n            infoHref: content.file?.url || content.url,\n        };\n    }\n\n    private get content(): MediaEventContent {\n        return this.props.mxEvent.getContent<MediaEventContent>();\n    }\n\n    private get fileName(): string {\n        return this.props.mediaEventHelper?.fileName || _t(\"common|attachment\");\n    }\n\n    private get linkText(): string {\n        return downloadLabelForFile(this.content, true);\n    }\n\n    private downloadFile(fileName: string, text: string): void {\n        if (!this.decryptedBlob) return;\n\n        this.fileDownloader.download({\n            blob: this.decryptedBlob,\n            name: fileName,\n            autoDownload: this.userDidClick,\n            opts: {\n                imgSrc: downloadIconCache.url,\n                imgStyle: null,\n                style: computedStyle(this.refLink.current),\n                textContent: text,\n            },\n        });\n    }\n\n    private decryptFile = async (): Promise<void> => {\n        if (this.decryptedBlob || !this.props.mediaEventHelper) {\n            return;\n        }\n        try {\n            this.userDidClick = true;\n            this.decryptedBlob = await this.props.mediaEventHelper.sourceBlob.value;\n            this.snapshot.set(FileBodyViewModel.computeSnapshot(this.props, this.decryptedBlob));\n        } catch (err) {\n            logger.warn(\"Unable to decrypt attachment: \", err);\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"common|error\"),\n                description: _t(\"timeline|m.file|error_decrypting\"),\n            });\n        }\n    };\n\n    public onInfoClick = async (): Promise<void> => {\n        if (this.props.forExport || !(this.props.showFileInfo ?? true) || !this.props.mediaEventHelper) {\n            return;\n        }\n\n        if (this.props.mediaEventHelper.media.isEncrypted) {\n            await this.decryptFile();\n            this.downloadFile(this.fileName, this.linkText);\n            return;\n        }\n\n        this.fileDownloader.download({\n            blob: await this.props.mediaEventHelper.sourceBlob.value,\n            name: this.fileName,\n        });\n    };\n\n    public onDownloadClick = (): Promise<void> => this.decryptFile();\n\n    public onDownloadLinkClick = (event: MouseEvent<HTMLAnchorElement>): void => {\n        event.preventDefault();\n        event.stopPropagation();\n\n        if (!this.props.mediaEventHelper) return;\n\n        const fileType = this.content.info?.mimetype ?? \"application/octet-stream\";\n        logger.log(`Downloading ${fileType} as blob (unencrypted)`);\n\n        this.props.mediaEventHelper.sourceBlob.value.then((blob) => {\n            const blobUrl = URL.createObjectURL(blob);\n            const tempAnchor = document.createElement(\"a\");\n            tempAnchor.download = this.fileName;\n            tempAnchor.href = blobUrl;\n            document.body.appendChild(tempAnchor);\n            tempAnchor.click();\n            tempAnchor.remove();\n        });\n    };\n\n    public onDownloadIframeLoad = (): void => {\n        this.downloadFile(this.fileName, this.linkText);\n    };\n\n    public setProps(newProps: Partial<FileBodyViewModelProps>): void {\n        const oldEvent = this.props.mxEvent;\n        this.props = { ...this.props, ...newProps };\n\n        if (this.props.mxEvent !== oldEvent) {\n            this.decryptedBlob = undefined;\n            this.userDidClick = false;\n        }\n\n        this.snapshot.set(FileBodyViewModel.computeSnapshot(this.props, this.decryptedBlob));\n    }\n}\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\";\nimport { forwardRef } from \"react\";\nvar SvgDownload = function SvgDownload(props, ref) {\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    role: \"presentation\",\n    \"aria-hidden\": true,\n    ref: ref\n  }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    d: \"M12 15.575q-.2 0-.375-.062a.9.9 0 0 1-.325-.213l-3.6-3.6a.95.95 0 0 1-.275-.7q0-.425.275-.7.274-.275.712-.288t.713.263L11 12.15V5q0-.424.287-.713A.97.97 0 0 1 12 4q.424 0 .713.287Q13 4.576 13 5v7.15l1.875-1.875q.274-.274.713-.263.437.014.712.288a.95.95 0 0 1 .275.7.95.95 0 0 1-.275.7l-3.6 3.6q-.15.15-.325.212a1.1 1.1 0 0 1-.375.063M6 20q-.824 0-1.412-.587A1.93 1.93 0 0 1 4 18v-2q0-.424.287-.713A.97.97 0 0 1 5 15q.424 0 .713.287Q6 15.576 6 16v2h12v-2q0-.424.288-.713A.97.97 0 0 1 19 15q.424 0 .712.287.288.288.288.713v2q0 .824-.587 1.413A1.93 1.93 0 0 1 18 20z\"\n  })));\n};\nvar ForwardRef = /*#__PURE__*/forwardRef(SvgDownload);\nexport { ForwardRef as Icon };\nexport default \"icons/download.364c774.svg\";","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type ComponentProps, type MouseEvent, type RefObject } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { ClientEvent, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { type ImageContent } from \"matrix-js-sdk/src/types\";\nimport {\n    BaseViewModel,\n    ImageBodyViewPlaceholder,\n    ImageBodyViewState,\n    type ImageBodyViewModel as ImageBodyViewModelInterface,\n    type ImageBodyViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\nimport Modal from \"../../Modal\";\nimport { MatrixClientPeg } from \"../../MatrixClientPeg\";\nimport { _t } from \"../../languageHandler\";\nimport { mediaFromContent } from \"../../customisations/Media\";\nimport { TimelineRenderingType } from \"../../contexts/RoomContext\";\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport { type ImageSize, suggestedSize as suggestedImageSize } from \"../../settings/enums/ImageSize\";\nimport { presentableTextForFile } from \"../../utils/FileUtils\";\nimport { type MediaEventHelper } from \"../../utils/MediaEventHelper\";\nimport { blobIsAnimated, mayBeAnimated } from \"../../utils/Image\";\nimport { type RoomPermalinkCreator } from \"../../utils/permalinks/Permalinks\";\nimport { createReconnectedListener } from \"../../utils/connection\";\nimport { DecryptError, DownloadError } from \"../../utils/DecryptFile\";\nimport { BLURHASH_FIELD, createThumbnail } from \"../../utils/image-media\";\nimport { isMimeTypeAllowed } from \"../../utils/blobs\";\nimport ImageView from \"../../components/views/elements/ImageView\";\n\nexport interface ImageBodyViewModelProps {\n    /**\n     * Image event being rendered.\n     */\n    mxEvent: MatrixEvent;\n    /**\n     * Helper for resolving encrypted media sources.\n     */\n    mediaEventHelper?: MediaEventHelper;\n    /**\n     * Whether the image is being rendered for export instead of the live timeline.\n     */\n    forExport?: boolean;\n    /**\n     * Optional maximum height applied when computing the rendered image dimensions.\n     */\n    maxImageHeight?: number;\n    /**\n     * Whether the media should currently be shown instead of the hidden-media preview.\n     */\n    mediaVisible: boolean;\n    /**\n     * Permalink helper passed to the image lightbox.\n     */\n    permalinkCreator?: RoomPermalinkCreator;\n    /**\n     * Timeline context used to decide which labels and supplemental content should be shown.\n     */\n    timelineRenderingType: TimelineRenderingType;\n    /**\n     * Ref to the underlying image element used for load dimensions and lightbox animation.\n     */\n    imageRef: RefObject<HTMLImageElement | null>;\n    /**\n     * Callback invoked when hidden media is revealed.\n     */\n    setMediaVisible?: (visible: boolean) => void;\n}\n\ninterface LoadedImageDimensions {\n    naturalWidth: number;\n    naturalHeight: number;\n}\n\ninterface InternalState {\n    contentUrl: string | null;\n    thumbUrl: string | null;\n    isAnimated: boolean;\n    error: unknown | null;\n    imgError: boolean;\n    imgLoaded: boolean;\n    loadedImageDimensions?: LoadedImageDimensions;\n    placeholder: ImageBodyViewPlaceholder;\n    imageSize: ImageSize;\n    generatedThumbnailUrl: string | null;\n}\n\ntype ImageInfoWithAnimationFlag = NonNullable<ImageContent[\"info\"]> & {\n    \"org.matrix.msc4230.is_animated\"?: boolean;\n};\n\n/**\n * View model for the image message body, encapsulating media loading, sizing,\n * visibility, animated-image previews, and lightbox interactions.\n */\nexport class ImageBodyViewModel\n    extends BaseViewModel<ImageBodyViewSnapshot, ImageBodyViewModelProps>\n    implements ImageBodyViewModelInterface\n{\n    private state: InternalState;\n    private blurhashTimeout?: number;\n\n    private readonly reconnectedListener = createReconnectedListener((): void => {\n        MatrixClientPeg.get()?.off(ClientEvent.Sync, this.reconnectedListener);\n\n        if (!this.state.imgError) {\n            return;\n        }\n\n        this.state = {\n            ...this.state,\n            imgError: false,\n        };\n        this.updateSnapshotFromState();\n    });\n\n    public constructor(props: ImageBodyViewModelProps) {\n        const initialState = ImageBodyViewModel.createInitialState(props.mxEvent);\n        super(props, ImageBodyViewModel.computeSnapshot(props, initialState));\n        this.state = initialState;\n\n        const imageSizeWatcherRef = SettingsStore.watchSetting(\"Images.size\", null, (_s, _r, _l, _nvl, value) => {\n            this.setImageSize(value as ImageSize);\n        });\n        this.disposables.track(() => SettingsStore.unwatchSetting(imageSizeWatcherRef));\n    }\n\n    private static createInitialState(mxEvent: MatrixEvent): InternalState {\n        return {\n            contentUrl: null,\n            thumbUrl: null,\n            isAnimated: false,\n            error: null,\n            imgError: false,\n            imgLoaded: false,\n            loadedImageDimensions: undefined,\n            placeholder: mxEvent.getContent<ImageContent>().info?.[BLURHASH_FIELD]\n                ? ImageBodyViewPlaceholder.NONE\n                : ImageBodyViewPlaceholder.SPINNER,\n            imageSize: SettingsStore.getValue(\"Images.size\") as ImageSize,\n            generatedThumbnailUrl: null,\n        };\n    }\n\n    private static getImageDimensions(\n        props: ImageBodyViewModelProps,\n        state: InternalState,\n    ): Pick<ImageBodyViewSnapshot, \"maxWidth\" | \"maxHeight\" | \"aspectRatio\" | \"isSvg\"> {\n        const content = props.mxEvent.getContent<ImageContent>();\n        const info = content.info;\n        const naturalWidth = info?.w ?? state.loadedImageDimensions?.naturalWidth;\n        const naturalHeight = info?.h ?? state.loadedImageDimensions?.naturalHeight;\n\n        if (!naturalWidth || !naturalHeight) {\n            return {\n                maxWidth: undefined,\n                maxHeight: undefined,\n                aspectRatio: undefined,\n                isSvg: info?.mimetype === \"image/svg+xml\",\n            };\n        }\n\n        const { w: maxWidth, h: maxHeight } = suggestedImageSize(\n            state.imageSize,\n            { w: naturalWidth, h: naturalHeight },\n            props.maxImageHeight,\n        );\n\n        return {\n            maxWidth,\n            maxHeight,\n            aspectRatio: `${naturalWidth}/${naturalHeight}`,\n            isSvg: info?.mimetype === \"image/svg+xml\",\n        };\n    }\n\n    private static computeErrorLabel(error: unknown, imgError: boolean): string {\n        if (error instanceof DecryptError) return _t(\"timeline|m.image|error_decrypting\");\n        if (error instanceof DownloadError) return _t(\"timeline|m.image|error_downloading\");\n        if (imgError || error) return _t(\"timeline|m.image|error\");\n\n        return _t(\"timeline|m.image|error\");\n    }\n\n    private static shouldShowBanner(timelineRenderingType: TimelineRenderingType): boolean {\n        return ![TimelineRenderingType.ThreadsList, TimelineRenderingType.File].includes(timelineRenderingType);\n    }\n\n    private static computeSnapshot(props: ImageBodyViewModelProps, state: InternalState): ImageBodyViewSnapshot {\n        const content = props.mxEvent.getContent<ImageContent>();\n        const dimensions = ImageBodyViewModel.getImageDimensions(props, state);\n        const autoplayGifs = SettingsStore.getValue(\"autoplayGifs\") as boolean;\n        const contentUrl = ImageBodyViewModel.getContentUrl(props, state);\n        const thumbnailSrc = props.forExport\n            ? (contentUrl ?? undefined)\n            : state.isAnimated && autoplayGifs\n              ? (contentUrl ?? undefined)\n              : (state.thumbUrl ?? contentUrl ?? undefined);\n\n        if (state.error || state.imgError) {\n            return {\n                state: ImageBodyViewState.ERROR,\n                errorLabel: ImageBodyViewModel.computeErrorLabel(state.error, state.imgError),\n                ...dimensions,\n            };\n        }\n\n        if (!props.mediaVisible) {\n            return {\n                state: ImageBodyViewState.HIDDEN,\n                hiddenButtonLabel: _t(\"timeline|m.image|show_image\"),\n                ...dimensions,\n            };\n        }\n\n        return {\n            state: ImageBodyViewState.READY,\n            alt: content.body,\n            src: contentUrl ?? undefined,\n            thumbnailSrc,\n            showAnimatedContentOnHover: state.isAnimated && !autoplayGifs && !!contentUrl,\n            placeholder: !props.forExport && !state.imgLoaded ? state.placeholder : ImageBodyViewPlaceholder.NONE,\n            blurhash: content.info?.[BLURHASH_FIELD],\n            gifLabel: state.isAnimated && !autoplayGifs ? \"GIF\" : undefined,\n            bannerLabel: ImageBodyViewModel.shouldShowBanner(props.timelineRenderingType)\n                ? presentableTextForFile(content, _t(\"common|image\"), true, true)\n                : undefined,\n            linkUrl: contentUrl ?? undefined,\n            linkTarget: props.forExport ? \"_blank\" : undefined,\n            ...dimensions,\n        };\n    }\n\n    private static getContentUrl(props: ImageBodyViewModelProps, state: InternalState): string | null {\n        if (props.forExport) {\n            return (\n                props.mxEvent.getContent<ImageContent>().url ??\n                props.mxEvent.getContent<ImageContent>().file?.url ??\n                null\n            );\n        }\n\n        return state.contentUrl;\n    }\n\n    public loadInitialMediaIfVisible(): void {\n        if (!this.props.mediaVisible) {\n            return;\n        }\n\n        this.scheduleBlurhashPlaceholder();\n        void this.downloadImage();\n    }\n\n    private updateSnapshotFromState(): void {\n        this.snapshot.set(ImageBodyViewModel.computeSnapshot(this.props, this.state));\n    }\n\n    private resetState(mxEvent: MatrixEvent): void {\n        this.clearBlurhashTimeout();\n        MatrixClientPeg.get()?.off(ClientEvent.Sync, this.reconnectedListener);\n        this.revokeGeneratedThumbnailUrl();\n        this.state = ImageBodyViewModel.createInitialState(mxEvent);\n    }\n\n    private revokeGeneratedThumbnailUrl(): void {\n        if (!this.state.generatedThumbnailUrl) {\n            return;\n        }\n\n        URL.revokeObjectURL(this.state.generatedThumbnailUrl);\n        this.state = {\n            ...this.state,\n            generatedThumbnailUrl: null,\n        };\n    }\n\n    private clearBlurhashTimeout(): void {\n        if (!this.blurhashTimeout) {\n            return;\n        }\n\n        clearTimeout(this.blurhashTimeout);\n        this.blurhashTimeout = undefined;\n    }\n\n    private scheduleBlurhashPlaceholder(): void {\n        if (\n            !this.props.mxEvent.getContent<ImageContent>().info?.[BLURHASH_FIELD] ||\n            this.state.imgLoaded ||\n            this.state.imgError\n        ) {\n            return;\n        }\n\n        this.clearBlurhashTimeout();\n        this.blurhashTimeout = window.setTimeout(() => {\n            if (this.isDisposed || this.state.imgLoaded || this.state.imgError) {\n                return;\n            }\n\n            this.state = {\n                ...this.state,\n                placeholder: ImageBodyViewPlaceholder.BLURHASH,\n            };\n            this.snapshot.merge({ placeholder: ImageBodyViewPlaceholder.BLURHASH });\n        }, 150);\n    }\n\n    private getThumbUrl(): string | null {\n        const thumbWidth = 800;\n        const thumbHeight = 600;\n\n        const content = this.props.mxEvent.getContent<ImageContent>();\n        const media = mediaFromContent(content);\n        const info = content.info;\n\n        if (info?.mimetype === \"image/svg+xml\" && media.hasThumbnail) {\n            return media.getThumbnailHttp(thumbWidth, thumbHeight, \"scale\");\n        }\n\n        if (this.state.isAnimated || window.devicePixelRatio === 1.0 || !info || !info.w || !info.h || !info.size) {\n            return media.getThumbnailOfSourceHttp(thumbWidth, thumbHeight);\n        }\n\n        const isLargerThanThumbnail = info.w > thumbWidth || info.h > thumbHeight;\n        const isLargeFileSize = info.size > 1 * 1024 * 1024;\n\n        if (isLargeFileSize && isLargerThanThumbnail) {\n            return media.getThumbnailOfSourceHttp(thumbWidth, thumbHeight);\n        }\n\n        return media.srcHttp;\n    }\n\n    private async downloadImage(): Promise<void> {\n        if (this.state.contentUrl || this.props.forExport) {\n            return;\n        }\n\n        let thumbUrl: string | null;\n        let contentUrl: string | null;\n\n        if (this.props.mediaEventHelper?.media.isEncrypted) {\n            try {\n                [contentUrl, thumbUrl] = await Promise.all([\n                    this.props.mediaEventHelper.sourceUrl.value,\n                    this.props.mediaEventHelper.thumbnailUrl.value,\n                ]);\n            } catch (error) {\n                if (this.isDisposed) {\n                    return;\n                }\n\n                if (error instanceof DecryptError) {\n                    logger.error(\"Unable to decrypt attachment: \", error);\n                } else if (error instanceof DownloadError) {\n                    logger.error(\"Unable to download attachment to decrypt it: \", error);\n                } else {\n                    logger.error(\"Error encountered when downloading encrypted attachment: \", error);\n                }\n\n                this.state = {\n                    ...this.state,\n                    error: error as Error,\n                };\n                this.updateSnapshotFromState();\n                return;\n            }\n        } else {\n            contentUrl = mediaFromContent(this.props.mxEvent.getContent<ImageContent>()).srcHttp;\n            thumbUrl = this.getThumbUrl();\n        }\n\n        const content = this.props.mxEvent.getContent<ImageContent>();\n        let generatedThumbnailUrl: string | null = null;\n        let isAnimated = (content.info as ImageInfoWithAnimationFlag | undefined)?.[\"org.matrix.msc4230.is_animated\"];\n        if (isAnimated === undefined) {\n            isAnimated = mayBeAnimated(content.info?.mimetype);\n        }\n\n        const autoplayGifs = SettingsStore.getValue(\"autoplayGifs\") as boolean;\n        if (isAnimated && !autoplayGifs) {\n            if (!thumbUrl || !content.info?.thumbnail_info || mayBeAnimated(content.info.thumbnail_info.mimetype)) {\n                const image = document.createElement(\"img\");\n                const loadPromise = new Promise<void>((resolve, reject) => {\n                    image.onload = (): void => resolve();\n                    image.onerror = (): void => reject(new Error(\"Unable to load image\"));\n                });\n\n                image.crossOrigin = \"Anonymous\";\n                image.src = contentUrl ?? \"\";\n\n                try {\n                    await loadPromise;\n                } catch (error) {\n                    logger.error(\"Unable to download attachment: \", error);\n                    this.state = {\n                        ...this.state,\n                        error: error as Error,\n                    };\n                    this.updateSnapshotFromState();\n                    return;\n                }\n\n                try {\n                    if (\n                        (content.info as ImageInfoWithAnimationFlag | undefined)?.[\"org.matrix.msc4230.is_animated\"] ===\n                            false ||\n                        (this.props.mediaEventHelper &&\n                            (await blobIsAnimated(await this.props.mediaEventHelper.sourceBlob.value)) === false)\n                    ) {\n                        isAnimated = false;\n                    }\n\n                    if (isAnimated) {\n                        const thumbnail = await createThumbnail(\n                            image,\n                            image.width,\n                            image.height,\n                            content.info?.mimetype ?? \"image/jpeg\",\n                            false,\n                        );\n                        generatedThumbnailUrl = URL.createObjectURL(thumbnail.thumbnail);\n                        thumbUrl = generatedThumbnailUrl;\n                    }\n                } catch (error) {\n                    logger.warn(\"Unable to generate thumbnail for animated image: \", error);\n                }\n            }\n        }\n\n        if (this.isDisposed) {\n            if (generatedThumbnailUrl) {\n                URL.revokeObjectURL(generatedThumbnailUrl);\n            }\n            return;\n        }\n\n        this.revokeGeneratedThumbnailUrl();\n        this.state = {\n            ...this.state,\n            contentUrl,\n            thumbUrl,\n            isAnimated,\n            error: null,\n            generatedThumbnailUrl,\n        };\n        this.updateSnapshotFromState();\n    }\n\n    private openImageViewer(event: MouseEvent<HTMLAnchorElement>): void {\n        if (event.button !== 0 || event.metaKey) {\n            return;\n        }\n\n        event.preventDefault();\n\n        if (!this.props.mediaVisible) {\n            this.props.setMediaVisible?.(true);\n            return;\n        }\n\n        const content = this.props.mxEvent.getContent<ImageContent>();\n\n        let httpUrl = this.state.contentUrl;\n        if (\n            this.props.mediaEventHelper?.media.isEncrypted &&\n            !isMimeTypeAllowed(this.props.mediaEventHelper.sourceBlob.cachedValue?.type ?? \"\")\n        ) {\n            httpUrl = this.state.thumbUrl;\n        }\n\n        if (!httpUrl) {\n            return;\n        }\n\n        const params: Omit<ComponentProps<typeof ImageView>, \"onFinished\"> = {\n            src: httpUrl,\n            name: content.body && content.body.length > 0 ? content.body : _t(\"common|attachment\"),\n            mxEvent: this.props.mxEvent,\n            permalinkCreator: this.props.permalinkCreator,\n        };\n\n        if (content.info) {\n            params.width = content.info.w;\n            params.height = content.info.h;\n            params.fileSize = content.info.size;\n        }\n\n        if (this.props.imageRef.current) {\n            const clientRect = this.props.imageRef.current.getBoundingClientRect();\n            params.thumbnailInfo = {\n                width: clientRect.width,\n                height: clientRect.height,\n                positionX: clientRect.x,\n                positionY: clientRect.y,\n            };\n        }\n\n        Modal.createDialog(ImageView, params, \"mx_Dialog_lightbox\", undefined, true);\n    }\n\n    public onLinkClick = (event: MouseEvent<HTMLAnchorElement>): void => {\n        this.openImageViewer(event);\n    };\n\n    public onHiddenButtonClick = (): void => {\n        this.props.setMediaVisible?.(true);\n    };\n\n    public onImageError = (): void => {\n        if (this.state.thumbUrl && this.state.thumbUrl !== this.state.contentUrl) {\n            this.state = {\n                ...this.state,\n                thumbUrl: null,\n            };\n            this.updateSnapshotFromState();\n            return;\n        }\n\n        this.clearBlurhashTimeout();\n\n        if (this.state.imgError) {\n            return;\n        }\n\n        this.state = {\n            ...this.state,\n            imgError: true,\n        };\n        MatrixClientPeg.safeGet().on(ClientEvent.Sync, this.reconnectedListener);\n        this.updateSnapshotFromState();\n    };\n\n    public onImageLoad = (): void => {\n        this.clearBlurhashTimeout();\n\n        let loadedImageDimensions: LoadedImageDimensions | undefined;\n        if (this.props.imageRef.current) {\n            const { naturalWidth, naturalHeight } = this.props.imageRef.current;\n            loadedImageDimensions = { naturalWidth, naturalHeight };\n        }\n\n        this.state = {\n            ...this.state,\n            imgLoaded: true,\n            loadedImageDimensions,\n            placeholder: ImageBodyViewPlaceholder.NONE,\n        };\n        this.updateSnapshotFromState();\n    };\n\n    public setEvent(mxEvent: MatrixEvent, mediaEventHelper?: MediaEventHelper): void {\n        if (this.props.mxEvent === mxEvent && this.props.mediaEventHelper === mediaEventHelper) {\n            return;\n        }\n\n        const previousVisible = this.props.mediaVisible;\n        this.props = {\n            ...this.props,\n            mxEvent,\n            mediaEventHelper,\n        };\n        this.resetState(mxEvent);\n        this.updateSnapshotFromState();\n\n        if (previousVisible) {\n            this.scheduleBlurhashPlaceholder();\n            void this.downloadImage();\n        }\n    }\n\n    public setForExport(forExport?: boolean): void {\n        if (this.props.forExport === forExport) {\n            return;\n        }\n\n        this.props = {\n            ...this.props,\n            forExport,\n        };\n        this.updateSnapshotFromState();\n    }\n\n    public setMaxImageHeight(maxImageHeight?: number): void {\n        if (this.props.maxImageHeight === maxImageHeight) {\n            return;\n        }\n\n        this.props = {\n            ...this.props,\n            maxImageHeight,\n        };\n        this.updateSnapshotFromState();\n    }\n\n    public setMediaVisible(mediaVisible: boolean): void {\n        if (this.props.mediaVisible === mediaVisible) {\n            return;\n        }\n\n        const wasVisible = this.props.mediaVisible;\n        this.props = {\n            ...this.props,\n            mediaVisible,\n        };\n        this.updateSnapshotFromState();\n\n        if (!wasVisible && mediaVisible) {\n            this.scheduleBlurhashPlaceholder();\n            void this.downloadImage();\n        }\n    }\n\n    public setPermalinkCreator(permalinkCreator?: RoomPermalinkCreator): void {\n        if (this.props.permalinkCreator === permalinkCreator) {\n            return;\n        }\n\n        this.props = {\n            ...this.props,\n            permalinkCreator,\n        };\n    }\n\n    public setTimelineRenderingType(timelineRenderingType: TimelineRenderingType): void {\n        if (this.props.timelineRenderingType === timelineRenderingType) {\n            return;\n        }\n\n        this.props = {\n            ...this.props,\n            timelineRenderingType,\n        };\n        this.snapshot.merge(ImageBodyViewModel.computeSnapshot(this.props, this.state));\n    }\n\n    public setSetMediaVisible(setMediaVisible?: (visible: boolean) => void): void {\n        if (this.props.setMediaVisible === setMediaVisible) {\n            return;\n        }\n\n        this.props = {\n            ...this.props,\n            setMediaVisible,\n        };\n    }\n\n    private setImageSize(imageSize: ImageSize): void {\n        if (this.state.imageSize === imageSize) {\n            return;\n        }\n\n        this.state = {\n            ...this.state,\n            imageSize,\n        };\n        this.updateSnapshotFromState();\n    }\n\n    public dispose(): void {\n        this.clearBlurhashTimeout();\n        MatrixClientPeg.get()?.off(ClientEvent.Sync, this.reconnectedListener);\n        this.revokeGeneratedThumbnailUrl();\n        super.dispose();\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport {\n    BaseViewModel,\n    type RedactedBodyViewSnapshot,\n    type RedactedBodyViewModel as RedactedBodyViewModelInterface,\n} from \"@element-hq/web-shared-components\";\n\nimport { formatFullDate } from \"../../DateUtils\";\nimport { _t } from \"../../languageHandler\";\nimport { MatrixClientPeg } from \"../../MatrixClientPeg\";\nimport SettingsStore from \"../../settings/SettingsStore\";\n\nexport interface RedactedBodyViewModelProps {\n    /**\n     * The redacted event being rendered.\n     */\n    mxEvent: MatrixEvent;\n}\n\nexport class RedactedBodyViewModel\n    extends BaseViewModel<RedactedBodyViewSnapshot, RedactedBodyViewModelProps>\n    implements RedactedBodyViewModelInterface\n{\n    private showTwelveHour: boolean;\n\n    private static readonly computeText = ({ mxEvent }: RedactedBodyViewModelProps): string => {\n        const redactedBecauseUserId = mxEvent.getUnsigned().redacted_because?.sender;\n        if (!redactedBecauseUserId || redactedBecauseUserId === mxEvent.getSender()) {\n            return _t(\"timeline|self_redaction\");\n        }\n\n        const roomId = mxEvent.getRoomId();\n        const room = roomId ? MatrixClientPeg.get()?.getRoom(roomId) : null;\n        const sender = room?.getMember(redactedBecauseUserId);\n\n        return _t(\"timeline|redaction\", { name: sender?.name ?? redactedBecauseUserId });\n    };\n\n    private static readonly computeTooltip = (mxEvent: MatrixEvent, showTwelveHour: boolean): string | undefined => {\n        const redactionTs = mxEvent.getUnsigned().redacted_because?.origin_server_ts;\n        if (!redactionTs) {\n            return undefined;\n        }\n\n        return _t(\"timeline|redacted|tooltip\", {\n            date: formatFullDate(new Date(redactionTs), showTwelveHour),\n        });\n    };\n\n    private static readonly computeSnapshot = (\n        props: RedactedBodyViewModelProps,\n        showTwelveHour: boolean,\n    ): RedactedBodyViewSnapshot => ({\n        text: RedactedBodyViewModel.computeText(props),\n        tooltip: RedactedBodyViewModel.computeTooltip(props.mxEvent, showTwelveHour),\n    });\n\n    public constructor(props: RedactedBodyViewModelProps) {\n        const showTwelveHour = SettingsStore.getValue(\"showTwelveHourTimestamps\");\n\n        super(props, RedactedBodyViewModel.computeSnapshot(props, showTwelveHour));\n\n        this.showTwelveHour = showTwelveHour;\n\n        const showTwelveHourWatcherRef = SettingsStore.watchSetting(\n            \"showTwelveHourTimestamps\",\n            null,\n            (_settingName, _roomId, _level, _newValAtLevel, newVal) => {\n                if (this.showTwelveHour === newVal) return;\n\n                this.showTwelveHour = !!newVal;\n                this.updateTooltip();\n            },\n        );\n        this.disposables.track(() => SettingsStore.unwatchSetting(showTwelveHourWatcherRef));\n    }\n\n    public setEvent(mxEvent: MatrixEvent): void {\n        this.props = { ...this.props, mxEvent };\n\n        const text = RedactedBodyViewModel.computeText(this.props);\n        const tooltip = RedactedBodyViewModel.computeTooltip(this.props.mxEvent, this.showTwelveHour);\n        this.snapshot.merge({ text, tooltip });\n    }\n\n    private updateTooltip(): void {\n        const tooltip = RedactedBodyViewModel.computeTooltip(this.props.mxEvent, this.showTwelveHour);\n        this.snapshot.merge({ tooltip });\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { decode } from \"blurhash\";\nimport { type RefObject } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { type MediaEventContent, type VideoInfo } from \"matrix-js-sdk/src/types\";\nimport {\n    BaseViewModel,\n    VideoBodyViewState,\n    type VideoBodyViewModel as VideoBodyViewModelInterface,\n    type VideoBodyViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\nimport { _t } from \"../../languageHandler\";\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport { mediaFromContent } from \"../../customisations/Media\";\nimport { BLURHASH_FIELD } from \"../../utils/image-media\";\nimport { type ImageSize, suggestedSize as suggestedVideoSize } from \"../../settings/enums/ImageSize\";\nimport { type MediaEventHelper } from \"../../utils/MediaEventHelper\";\n\nexport interface VideoBodyViewModelProps {\n    /**\n     * Video event being rendered.\n     */\n    mxEvent: MatrixEvent;\n    /**\n     * Helper for resolving encrypted and unencrypted media sources.\n     */\n    mediaEventHelper?: MediaEventHelper;\n    /**\n     * Whether the video is being rendered for export instead of live playback.\n     */\n    forExport?: boolean;\n    /**\n     * Whether playback controls and autoplay should be disabled.\n     */\n    inhibitInteraction?: boolean;\n    /**\n     * Whether the media should currently be shown instead of the preview button.\n     */\n    mediaVisible: boolean;\n    /**\n     * Callback invoked when the hidden-media preview is revealed.\n     */\n    onPreviewClick?: () => void;\n    /**\n     * Ref to the underlying video element used for replay after lazy decryption.\n     */\n    videoRef: RefObject<HTMLVideoElement | null>;\n}\n\ninterface InternalState {\n    /**\n     * Decrypted playable media URL for encrypted videos.\n     */\n    decryptedUrl: string | null;\n    /**\n     * Decrypted thumbnail URL for encrypted videos.\n     */\n    decryptedThumbnailUrl: string | null;\n    /**\n     * Decrypted media blob cached for download or replay.\n     */\n    decryptedBlob: Blob | null;\n    /**\n     * Last media-processing error, if any.\n     */\n    error: unknown | null;\n    /**\n     * Whether an on-demand media fetch is in progress.\n     */\n    fetchingData: boolean;\n    /**\n     * Whether the blurhash poster is being shown while the real poster loads.\n     */\n    posterLoading: boolean;\n    /**\n     * Data URL generated from the blurhash placeholder.\n     */\n    blurhashUrl: string | null;\n    /**\n     * Current media sizing preference from settings.\n     */\n    imageSize: ImageSize;\n}\n\ntype VideoInfoWithBlurhash = VideoInfo & {\n    [BLURHASH_FIELD]?: string;\n};\n\n/**\n * View model for the video message body, encapsulating media-loading and playback state.\n */\nexport class VideoBodyViewModel\n    extends BaseViewModel<VideoBodyViewSnapshot, VideoBodyViewModelProps>\n    implements VideoBodyViewModelInterface\n{\n    private state: InternalState;\n\n    public constructor(props: VideoBodyViewModelProps) {\n        const initialState = VideoBodyViewModel.createInitialState();\n        super(props, VideoBodyViewModel.computeSnapshot(props, initialState));\n        this.state = initialState;\n\n        const imageSizeWatcherRef = SettingsStore.watchSetting(\"Images.size\", null, (_s, _r, _l, _nvl, value) => {\n            this.setImageSize(value as ImageSize);\n        });\n        this.disposables.track(() => SettingsStore.unwatchSetting(imageSizeWatcherRef));\n    }\n\n    public loadInitialMediaIfVisible(): void {\n        if (this.props.mediaVisible) {\n            void this.downloadVideo();\n        }\n    }\n\n    private static createInitialState(): InternalState {\n        return {\n            fetchingData: false,\n            decryptedUrl: null,\n            decryptedThumbnailUrl: null,\n            decryptedBlob: null,\n            error: null,\n            posterLoading: false,\n            blurhashUrl: null,\n            imageSize: SettingsStore.getValue(\"Images.size\") as ImageSize,\n        };\n    }\n\n    /**\n     * Derive the aspect ratio for the video frame from the event metadata, when available.\n     */\n    private static getAspectRatio(mxEvent: MatrixEvent): string | undefined {\n        const { w, h } = (mxEvent.getContent<MediaEventContent>().info as VideoInfoWithBlurhash | undefined) ?? {};\n        if (!w || !h) {\n            return undefined;\n        }\n\n        return `${w}/${h}`;\n    }\n\n    /**\n     * Compute the rendered video dimensions from the event metadata and current image-size setting.\n     */\n    private static getDimensions(mxEvent: MatrixEvent, imageSize: ImageSize): Required<{ w?: number; h?: number }> {\n        const { w, h } = (mxEvent.getContent<MediaEventContent>().info as VideoInfoWithBlurhash | undefined) ?? {};\n        return suggestedVideoSize(imageSize, { w, h });\n    }\n\n    /**\n     * Resolve the current playable video source URL for the event.\n     */\n    private static getContentUrl(props: VideoBodyViewModelProps, state: InternalState): string | undefined {\n        const content = props.mxEvent.getContent<MediaEventContent>();\n        if (props.forExport) {\n            return content.file?.url ?? content.url;\n        }\n\n        const media = mediaFromContent(content);\n        if (media.isEncrypted) {\n            return state.decryptedUrl ?? undefined;\n        }\n\n        return media.srcHttp ?? undefined;\n    }\n\n    /**\n     * Resolve the best thumbnail or poster URL for the current video state.\n     */\n    private static getThumbnailUrl(props: VideoBodyViewModelProps, state: InternalState): string | null {\n        if (props.forExport) {\n            return null;\n        }\n\n        const content = props.mxEvent.getContent<MediaEventContent>();\n        const media = mediaFromContent(content);\n\n        if (media.isEncrypted && state.decryptedThumbnailUrl) {\n            return state.decryptedThumbnailUrl;\n        }\n        if (state.posterLoading) {\n            return state.blurhashUrl;\n        }\n        if (media.hasThumbnail) {\n            return media.thumbnailHttp;\n        }\n\n        return null;\n    }\n\n    private static computeSnapshot(props: VideoBodyViewModelProps, state: InternalState): VideoBodyViewSnapshot {\n        const content = props.mxEvent.getContent<MediaEventContent>();\n        const autoplay = !props.inhibitInteraction && (SettingsStore.getValue(\"autoplayVideo\") as boolean);\n        const aspectRatio = VideoBodyViewModel.getAspectRatio(props.mxEvent);\n        const { w: maxWidth, h: maxHeight } = VideoBodyViewModel.getDimensions(props.mxEvent, state.imageSize);\n\n        if (state.error !== null) {\n            return {\n                state: VideoBodyViewState.ERROR,\n                errorLabel: _t(\"timeline|m.video|error_decrypting\"),\n                maxWidth,\n                maxHeight,\n                aspectRatio,\n            };\n        }\n\n        if (!props.mediaVisible) {\n            return {\n                state: VideoBodyViewState.HIDDEN,\n                hiddenButtonLabel: _t(\"timeline|m.video|show_video\"),\n                maxWidth,\n                maxHeight,\n                aspectRatio,\n            };\n        }\n\n        if (!props.forExport && content.file !== undefined && state.decryptedUrl === null && autoplay) {\n            return {\n                state: VideoBodyViewState.LOADING,\n                maxWidth,\n                maxHeight,\n                aspectRatio,\n            };\n        }\n\n        const thumbnailUrl = VideoBodyViewModel.getThumbnailUrl(props, state);\n        let preload: VideoBodyViewSnapshot[\"preload\"] = \"metadata\";\n        let poster: string | undefined;\n        if (content.info && thumbnailUrl) {\n            preload = \"none\";\n            poster = thumbnailUrl;\n        }\n\n        return {\n            state: VideoBodyViewState.READY,\n            videoLabel: content.body,\n            videoTitle: content.body,\n            maxWidth,\n            maxHeight,\n            aspectRatio,\n            src: VideoBodyViewModel.getContentUrl(props, state),\n            poster,\n            preload,\n            controls: !props.inhibitInteraction,\n            muted: autoplay,\n            autoPlay: autoplay,\n        };\n    }\n\n    private updateSnapshotFromState(): void {\n        this.snapshot.set(VideoBodyViewModel.computeSnapshot(this.props, this.state));\n    }\n\n    private hasContentUrl(): boolean {\n        const url = VideoBodyViewModel.getContentUrl(this.props, this.state);\n        return !!url && !url.startsWith(\"data:\");\n    }\n\n    private setImageSize(imageSize: ImageSize): void {\n        if (this.state.imageSize === imageSize) {\n            return;\n        }\n\n        this.state = {\n            ...this.state,\n            imageSize,\n        };\n        this.updateSnapshotFromState();\n    }\n\n    private resetMediaState(): void {\n        this.state = {\n            ...this.state,\n            decryptedUrl: null,\n            decryptedThumbnailUrl: null,\n            decryptedBlob: null,\n            error: null,\n            fetchingData: false,\n            posterLoading: false,\n            blurhashUrl: null,\n        };\n    }\n\n    private loadBlurhash(): void {\n        const info = this.props.mxEvent.getContent<MediaEventContent>().info as VideoInfoWithBlurhash | undefined;\n        const blurhash = info?.[BLURHASH_FIELD];\n        if (!blurhash) {\n            return;\n        }\n\n        const canvas = document.createElement(\"canvas\");\n        const { w: width, h: height } = VideoBodyViewModel.getDimensions(this.props.mxEvent, this.state.imageSize);\n\n        canvas.width = width;\n        canvas.height = height;\n\n        const pixels = decode(blurhash, width, height);\n        const ctx = canvas.getContext(\"2d\");\n        if (!ctx) {\n            return;\n        }\n\n        const imgData = ctx.createImageData(width, height);\n        imgData.data.set(pixels);\n        ctx.putImageData(imgData, 0, 0);\n\n        this.state = {\n            ...this.state,\n            blurhashUrl: canvas.toDataURL(),\n            posterLoading: true,\n        };\n        this.updateSnapshotFromState();\n\n        const media = mediaFromContent(this.props.mxEvent.getContent<MediaEventContent>());\n        if (!media.hasThumbnail || !media.thumbnailHttp) {\n            return;\n        }\n\n        const currentEvent = this.props.mxEvent;\n        const image = new Image();\n        image.onload = (): void => {\n            if (this.isDisposed || currentEvent !== this.props.mxEvent || !this.state.posterLoading) {\n                return;\n            }\n\n            this.state = {\n                ...this.state,\n                posterLoading: false,\n            };\n            this.updateSnapshotFromState();\n        };\n        image.src = media.thumbnailHttp;\n    }\n\n    private async downloadVideo(): Promise<void> {\n        try {\n            this.loadBlurhash();\n        } catch (error) {\n            logger.error(\"Failed to load blurhash\", error);\n        }\n\n        if (!this.props.mediaEventHelper?.media.isEncrypted || this.state.decryptedUrl !== null) {\n            return;\n        }\n\n        const currentEvent = this.props.mxEvent;\n        const currentHelper = this.props.mediaEventHelper;\n        try {\n            const autoplay = !this.props.inhibitInteraction && (SettingsStore.getValue(\"autoplayVideo\") as boolean);\n            const thumbnailUrl = await currentHelper.thumbnailUrl.value;\n\n            if (\n                this.isDisposed ||\n                currentEvent !== this.props.mxEvent ||\n                currentHelper !== this.props.mediaEventHelper\n            ) {\n                return;\n            }\n\n            if (autoplay) {\n                logger.log(\"Preloading video\");\n                this.state = {\n                    ...this.state,\n                    decryptedUrl: await currentHelper.sourceUrl.value,\n                    decryptedThumbnailUrl: thumbnailUrl,\n                    decryptedBlob: await currentHelper.sourceBlob.value,\n                };\n            } else {\n                logger.log(\"NOT preloading video\");\n                const content = currentEvent.getContent<MediaEventContent>();\n                let mimetype = content.info?.mimetype ?? \"application/octet-stream\";\n                if (mimetype === \"video/quicktime\") {\n                    mimetype = \"video/mp4\";\n                }\n\n                this.state = {\n                    ...this.state,\n                    decryptedUrl: `data:${mimetype},`,\n                    decryptedThumbnailUrl: thumbnailUrl || `data:${mimetype},`,\n                    decryptedBlob: null,\n                };\n            }\n\n            this.updateSnapshotFromState();\n        } catch (error) {\n            if (\n                this.isDisposed ||\n                currentEvent !== this.props.mxEvent ||\n                currentHelper !== this.props.mediaEventHelper\n            ) {\n                return;\n            }\n\n            logger.warn(\"Unable to decrypt attachment: \", error);\n            this.state = {\n                ...this.state,\n                error,\n            };\n            this.updateSnapshotFromState();\n        }\n    }\n\n    public setEvent(mxEvent: MatrixEvent, mediaEventHelper?: MediaEventHelper): void {\n        if (this.props.mxEvent === mxEvent && this.props.mediaEventHelper === mediaEventHelper) {\n            return;\n        }\n\n        this.props = {\n            ...this.props,\n            mxEvent,\n            mediaEventHelper,\n        };\n        this.resetMediaState();\n        this.updateSnapshotFromState();\n\n        if (this.props.mediaVisible) {\n            void this.downloadVideo();\n        }\n    }\n\n    public setForExport(forExport?: boolean): void {\n        if (this.props.forExport === forExport) {\n            return;\n        }\n\n        this.props = {\n            ...this.props,\n            forExport,\n        };\n        this.updateSnapshotFromState();\n    }\n\n    public setInhibitInteraction(inhibitInteraction?: boolean): void {\n        if (this.props.inhibitInteraction === inhibitInteraction) {\n            return;\n        }\n\n        this.props = {\n            ...this.props,\n            inhibitInteraction,\n        };\n        this.updateSnapshotFromState();\n    }\n\n    public setMediaVisible(mediaVisible: boolean): void {\n        if (this.props.mediaVisible === mediaVisible) {\n            return;\n        }\n\n        this.props = {\n            ...this.props,\n            mediaVisible,\n        };\n        this.updateSnapshotFromState();\n\n        if (mediaVisible) {\n            void this.downloadVideo();\n        }\n    }\n\n    public setOnPreviewClick(onPreviewClick?: () => void): void {\n        if (this.props.onPreviewClick === onPreviewClick) {\n            return;\n        }\n\n        this.props = {\n            ...this.props,\n            onPreviewClick,\n        };\n    }\n\n    public onPreviewClick = (): void => {\n        this.props.onPreviewClick?.();\n    };\n\n    public onPlay = async (): Promise<void> => {\n        if (this.hasContentUrl() || this.state.fetchingData || this.state.error !== null) {\n            return;\n        }\n\n        this.state = {\n            ...this.state,\n            fetchingData: true,\n        };\n\n        if (!this.props.mediaEventHelper?.media.isEncrypted) {\n            this.state = {\n                ...this.state,\n                error: \"No file given in content\",\n                fetchingData: false,\n            };\n            this.updateSnapshotFromState();\n            return;\n        }\n\n        const currentEvent = this.props.mxEvent;\n        const currentHelper = this.props.mediaEventHelper;\n\n        try {\n            const decryptedUrl = await currentHelper.sourceUrl.value;\n            const decryptedBlob = await currentHelper.sourceBlob.value;\n\n            if (\n                this.isDisposed ||\n                currentEvent !== this.props.mxEvent ||\n                currentHelper !== this.props.mediaEventHelper\n            ) {\n                return;\n            }\n\n            this.state = {\n                ...this.state,\n                decryptedUrl,\n                decryptedBlob,\n                fetchingData: false,\n            };\n            this.updateSnapshotFromState();\n            this.props.videoRef.current?.play();\n        } catch (error) {\n            if (\n                this.isDisposed ||\n                currentEvent !== this.props.mxEvent ||\n                currentHelper !== this.props.mediaEventHelper\n            ) {\n                return;\n            }\n\n            logger.warn(\"Unable to decrypt attachment: \", error);\n            this.state = {\n                ...this.state,\n                error,\n                fetchingData: false,\n            };\n            this.updateSnapshotFromState();\n        }\n    };\n}\n","/*\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type RefObject, useContext, useEffect, useRef } from \"react\";\nimport { MsgType } from \"matrix-js-sdk/src/matrix\";\nimport { type ImageContent } from \"matrix-js-sdk/src/types\";\nimport {\n    DecryptionFailureBodyView,\n    FileBodyView,\n    ImageBodyView,\n    RedactedBodyView,\n    VideoBodyView,\n    useCreateAutoDisposedViewModel,\n} from \"@element-hq/web-shared-components\";\n\nimport { type IBodyProps } from \"./IBodyProps\";\nimport RoomContext, { TimelineRenderingType } from \"../../../contexts/RoomContext\";\nimport { LocalDeviceVerificationStateContext } from \"../../../contexts/LocalDeviceVerificationStateContext\";\nimport { useMediaVisible } from \"../../../hooks/useMediaVisible\";\nimport { DecryptionFailureBodyViewModel } from \"../../../viewmodels/room/timeline/event-tile/body/DecryptionFailureBodyViewModel\";\nimport { FileBodyViewModel } from \"../../../viewmodels/message-body/FileBodyViewModel\";\nimport { ImageBodyViewModel } from \"../../../viewmodels/message-body/ImageBodyViewModel\";\nimport { RedactedBodyViewModel } from \"../../../viewmodels/message-body/RedactedBodyViewModel\";\nimport { VideoBodyViewModel } from \"../../../viewmodels/message-body/VideoBodyViewModel\";\nimport { isMimeTypeAllowed } from \"../../../utils/blobs\";\n\ntype MBodyComponent = React.ComponentType<IBodyProps>;\n\nexport function FileBodyFactory({\n    mxEvent,\n    mediaEventHelper,\n    forExport,\n    showFileInfo,\n}: Pick<IBodyProps, \"mxEvent\" | \"mediaEventHelper\" | \"forExport\" | \"showFileInfo\">): JSX.Element {\n    const { timelineRenderingType } = useContext(RoomContext);\n    const refIFrame = useRef<HTMLIFrameElement>(null) as RefObject<HTMLIFrameElement>;\n    const refLink = useRef<HTMLAnchorElement>(null) as RefObject<HTMLAnchorElement>;\n\n    const vm = useCreateAutoDisposedViewModel(\n        () =>\n            new FileBodyViewModel({\n                mxEvent,\n                mediaEventHelper,\n                forExport,\n                showFileInfo,\n                timelineRenderingType,\n                refIFrame,\n                refLink,\n            }),\n    );\n\n    useEffect(() => {\n        vm.setProps({\n            mxEvent,\n            mediaEventHelper,\n            forExport,\n            showFileInfo,\n            timelineRenderingType,\n        });\n    }, [mxEvent, mediaEventHelper, forExport, showFileInfo, timelineRenderingType, vm]);\n\n    return <FileBodyView vm={vm} refIFrame={refIFrame} refLink={refLink} className=\"mx_MFileBody\" />;\n}\n\nexport function VideoBodyFactory({\n    mxEvent,\n    mediaEventHelper,\n    forExport,\n    inhibitInteraction,\n}: Readonly<Pick<IBodyProps, \"mxEvent\" | \"mediaEventHelper\" | \"forExport\" | \"inhibitInteraction\">>): JSX.Element {\n    const { timelineRenderingType } = useContext(RoomContext);\n    const [mediaVisible, setMediaVisible] = useMediaVisible(mxEvent);\n    const videoRef = useRef<HTMLVideoElement>(null);\n\n    const vm = useCreateAutoDisposedViewModel(\n        () =>\n            new VideoBodyViewModel({\n                mxEvent,\n                mediaEventHelper,\n                forExport,\n                inhibitInteraction,\n                mediaVisible,\n                onPreviewClick: (): void => setMediaVisible(true),\n                videoRef,\n            }),\n    );\n\n    useEffect(() => {\n        vm.loadInitialMediaIfVisible();\n    }, [vm]);\n\n    useEffect(() => {\n        vm.setEvent(mxEvent, mediaEventHelper);\n    }, [mxEvent, mediaEventHelper, vm]);\n\n    useEffect(() => {\n        vm.setForExport(forExport);\n    }, [forExport, vm]);\n\n    useEffect(() => {\n        vm.setInhibitInteraction(inhibitInteraction);\n    }, [inhibitInteraction, vm]);\n\n    useEffect(() => {\n        vm.setMediaVisible(mediaVisible);\n    }, [mediaVisible, vm]);\n\n    useEffect(() => {\n        vm.setOnPreviewClick((): void => setMediaVisible(true));\n    }, [setMediaVisible, vm]);\n\n    const showFileBody =\n        !forExport &&\n        timelineRenderingType !== TimelineRenderingType.Room &&\n        timelineRenderingType !== TimelineRenderingType.Pinned &&\n        timelineRenderingType !== TimelineRenderingType.Search;\n\n    return (\n        <VideoBodyView\n            vm={vm}\n            className=\"mx_MVideoBody\"\n            containerClassName=\"mx_MVideoBody_container\"\n            videoRef={videoRef}\n        >\n            {showFileBody ? (\n                <FileBodyFactory\n                    mxEvent={mxEvent}\n                    mediaEventHelper={mediaEventHelper}\n                    forExport={forExport}\n                    showFileInfo={false}\n                />\n            ) : null}\n        </VideoBodyView>\n    );\n}\n\nexport function ImageBodyFactory({\n    mxEvent,\n    mediaEventHelper,\n    forExport,\n    maxImageHeight,\n    permalinkCreator,\n    showFileInfo,\n}: Readonly<\n    Pick<\n        IBodyProps,\n        \"mxEvent\" | \"mediaEventHelper\" | \"forExport\" | \"maxImageHeight\" | \"permalinkCreator\" | \"showFileInfo\"\n    >\n>): JSX.Element {\n    const { timelineRenderingType } = useContext(RoomContext);\n    const [mediaVisible, setMediaVisible] = useMediaVisible(mxEvent);\n    const imageRef = useRef<HTMLImageElement>(null);\n    const content = mxEvent.getContent<ImageContent>();\n    const shouldFallbackToFileBody =\n        mediaEventHelper?.media.isEncrypted === true &&\n        !isMimeTypeAllowed(content.info?.mimetype ?? \"\") &&\n        !content.info?.thumbnail_info;\n\n    const vm = useCreateAutoDisposedViewModel(\n        () =>\n            new ImageBodyViewModel({\n                mxEvent,\n                mediaEventHelper,\n                forExport,\n                maxImageHeight,\n                mediaVisible,\n                permalinkCreator,\n                timelineRenderingType,\n                imageRef,\n                setMediaVisible,\n            }),\n    );\n\n    useEffect(() => {\n        if (shouldFallbackToFileBody) return;\n        vm.loadInitialMediaIfVisible();\n    }, [shouldFallbackToFileBody, vm]);\n\n    useEffect(() => {\n        if (shouldFallbackToFileBody) return;\n        vm.setEvent(mxEvent, mediaEventHelper);\n    }, [mediaEventHelper, mxEvent, shouldFallbackToFileBody, vm]);\n\n    useEffect(() => {\n        if (shouldFallbackToFileBody) return;\n        vm.setForExport(forExport);\n    }, [forExport, shouldFallbackToFileBody, vm]);\n\n    useEffect(() => {\n        if (shouldFallbackToFileBody) return;\n        vm.setMaxImageHeight(maxImageHeight);\n    }, [maxImageHeight, shouldFallbackToFileBody, vm]);\n\n    useEffect(() => {\n        if (shouldFallbackToFileBody) return;\n        vm.setMediaVisible(mediaVisible);\n    }, [mediaVisible, shouldFallbackToFileBody, vm]);\n\n    useEffect(() => {\n        if (shouldFallbackToFileBody) return;\n        vm.setPermalinkCreator(permalinkCreator);\n    }, [permalinkCreator, shouldFallbackToFileBody, vm]);\n\n    useEffect(() => {\n        if (shouldFallbackToFileBody) return;\n        vm.setTimelineRenderingType(timelineRenderingType);\n    }, [shouldFallbackToFileBody, timelineRenderingType, vm]);\n\n    useEffect(() => {\n        if (shouldFallbackToFileBody) return;\n        vm.setSetMediaVisible(setMediaVisible);\n    }, [setMediaVisible, shouldFallbackToFileBody, vm]);\n\n    const showFileBody =\n        !forExport &&\n        timelineRenderingType !== TimelineRenderingType.Room &&\n        timelineRenderingType !== TimelineRenderingType.Pinned &&\n        timelineRenderingType !== TimelineRenderingType.Search &&\n        timelineRenderingType !== TimelineRenderingType.Thread &&\n        timelineRenderingType !== TimelineRenderingType.ThreadsList;\n\n    if (shouldFallbackToFileBody) {\n        return (\n            <FileBodyFactory\n                mxEvent={mxEvent}\n                mediaEventHelper={mediaEventHelper}\n                forExport={forExport}\n                showFileInfo={showFileInfo}\n            />\n        );\n    }\n\n    return (\n        <ImageBodyView\n            vm={vm}\n            className=\"mx_ImageBody\"\n            containerClassName=\"mx_ImageBody_container\"\n            imageClassName=\"mx_ImageBody_image\"\n            imageRef={imageRef}\n        >\n            {showFileBody ? (\n                <FileBodyFactory\n                    mxEvent={mxEvent}\n                    mediaEventHelper={mediaEventHelper}\n                    forExport={forExport}\n                    showFileInfo={false}\n                />\n            ) : null}\n        </ImageBodyView>\n    );\n}\n\nexport function RedactedBodyFactory({ mxEvent, ref }: Pick<IBodyProps, \"mxEvent\" | \"ref\">): JSX.Element {\n    const vm = useCreateAutoDisposedViewModel(() => new RedactedBodyViewModel({ mxEvent }));\n\n    useEffect(() => {\n        vm.setEvent(mxEvent);\n    }, [mxEvent, vm]);\n\n    return <RedactedBodyView vm={vm} ref={ref} className=\"mx_RedactedBody\" />;\n}\n\nexport function DecryptionFailureBodyFactory({ mxEvent, ref }: Pick<IBodyProps, \"mxEvent\" | \"ref\">): JSX.Element {\n    const verificationState = useContext(LocalDeviceVerificationStateContext);\n    const vm = useCreateAutoDisposedViewModel(\n        () =>\n            new DecryptionFailureBodyViewModel({\n                decryptionFailureCode: mxEvent.decryptionFailureReason,\n                verificationState,\n            }),\n    );\n\n    useEffect(() => {\n        vm.setDecryptionFailureCode(mxEvent.decryptionFailureReason);\n        vm.setVerificationState(verificationState);\n    }, [mxEvent, verificationState, vm]);\n\n    return <DecryptionFailureBodyView vm={vm} ref={ref} className=\"mx_DecryptionFailureBody mx_EventTile_content\" />;\n}\n\n// Message body factory registry for bodies that already route through view-model-backed wrappers.\nconst MESSAGE_BODY_TYPES = new Map<string, MBodyComponent>([\n    [MsgType.Image, ImageBodyFactory],\n    [MsgType.File, FileBodyFactory],\n    [MsgType.Video, VideoBodyFactory],\n]);\n\n// Render a body using the picked factory.\n// Falls back to the provided factory when msgtype has no specific handler.\nexport function renderMBody(props: IBodyProps, fallbackFactory?: MBodyComponent): JSX.Element | null {\n    const BodyType = MESSAGE_BODY_TYPES.get(props.mxEvent.getContent().msgtype as string) ?? fallbackFactory;\n    if (!BodyType) {\n        return null;\n    }\n\n    return <BodyType {...props} />;\n}\n","import * as React from 'react';\nimport { decode } from 'blurhash';\n\nexport type Props = React.CanvasHTMLAttributes<HTMLCanvasElement> & {\n  hash: string;\n  height?: number;\n  punch?: number;\n  width?: number;\n};\n\nexport default class BlurhashCanvas extends React.PureComponent<Props> {\n  static defaultProps = {\n    height: 128,\n    width: 128,\n  };\n\n  canvas: HTMLCanvasElement = null;\n\n  componentDidUpdate() {\n    this.draw();\n  }\n\n  handleRef = (canvas: HTMLCanvasElement) => {\n    this.canvas = canvas;\n    this.draw();\n  };\n\n  draw = () => {\n    const { hash, height, punch, width } = this.props;\n\n    if (this.canvas) {\n      const pixels = decode(hash, width, height, punch);\n\n      const ctx = this.canvas.getContext('2d');\n      const imageData = ctx.createImageData(width, height);\n      imageData.data.set(pixels);\n      ctx.putImageData(imageData, 0, 0);\n    }\n  };\n\n  render() {\n    const { hash, height, width, ...rest } = this.props;\n\n    return <canvas {...rest} height={height} width={width} ref={this.handleRef} />;\n  }\n}\n","import * as React from 'react';\n\nimport BlurhashCanvas from './BlurhashCanvas';\n\ntype Props = React.HTMLAttributes<HTMLDivElement> & {\n  hash: string;\n  /** CSS height, default: 128 */\n  height?: number | string | 'auto';\n  punch?: number;\n  resolutionX?: number;\n  resolutionY?: number;\n  style?: React.CSSProperties;\n  /** CSS width, default: 128 */\n  width?: number | string | 'auto';\n};\n\nconst canvasStyle: React.CSSProperties = {\n  position: 'absolute',\n  top: 0,\n  bottom: 0,\n  left: 0,\n  right: 0,\n  width: '100%',\n  height: '100%',\n};\n\nexport default class Blurhash extends React.PureComponent<Props> {\n  static defaultProps = {\n    height: 128,\n    width: 128,\n    resolutionX: 32,\n    resolutionY: 32,\n  };\n\n  componentDidUpdate() {\n    if (this.props.resolutionX <= 0) {\n      throw new Error('resolutionX must be larger than zero');\n    }\n\n    if (this.props.resolutionY <= 0) {\n      throw new Error('resolutionY must be larger than zero');\n    }\n  }\n\n  render() {\n    const { hash, height, width, punch, resolutionX, resolutionY, style, ...rest } = this.props;\n\n    return (\n      <div\n        {...rest}\n        style={{ display: 'inline-block', height, width, ...style, position: 'relative' }}\n      >\n        <BlurhashCanvas\n          hash={hash}\n          height={resolutionY}\n          width={resolutionX}\n          punch={punch}\n          style={canvasStyle}\n        />\n      </div>\n    );\n  }\n}\n","export default {\n  disabled: false\n};","import React from 'react';\nexport default React.createContext(null);","export var forceReflow = function forceReflow(node) {\n  return node.scrollTop;\n};","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport config from './config';\nimport { timeoutsShape } from './utils/PropTypes';\nimport TransitionGroupContext from './TransitionGroupContext';\nimport { forceReflow } from './utils/reflow';\nexport var UNMOUNTED = 'unmounted';\nexport var EXITED = 'exited';\nexport var ENTERING = 'entering';\nexport var ENTERED = 'entered';\nexport var EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n *   transition: `opacity ${duration}ms ease-in-out`,\n *   opacity: 0,\n * }\n *\n * const transitionStyles = {\n *   entering: { opacity: 1 },\n *   entered:  { opacity: 1 },\n *   exiting:  { opacity: 0 },\n *   exited:  { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n *   <Transition in={inProp} timeout={duration}>\n *     {state => (\n *       <div style={{\n *         ...defaultStyle,\n *         ...transitionStyles[state]\n *       }}>\n *         I'm a fade Transition!\n *       </div>\n *     )}\n *   </Transition>\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n *  - `'entering'`\n *  - `'entered'`\n *  - `'exiting'`\n *  - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <Transition in={inProp} timeout={500}>\n *         {state => (\n *           // ...\n *         )}\n *       </Transition>\n *       <button onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(Transition, _React$Component);\n\n  function Transition(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n    var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n    var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n    var initialStatus;\n    _this.appearStatus = null;\n\n    if (props.in) {\n      if (appear) {\n        initialStatus = EXITED;\n        _this.appearStatus = ENTERING;\n      } else {\n        initialStatus = ENTERED;\n      }\n    } else {\n      if (props.unmountOnExit || props.mountOnEnter) {\n        initialStatus = UNMOUNTED;\n      } else {\n        initialStatus = EXITED;\n      }\n    }\n\n    _this.state = {\n      status: initialStatus\n    };\n    _this.nextCallback = null;\n    return _this;\n  }\n\n  Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n    var nextIn = _ref.in;\n\n    if (nextIn && prevState.status === UNMOUNTED) {\n      return {\n        status: EXITED\n      };\n    }\n\n    return null;\n  } // getSnapshotBeforeUpdate(prevProps) {\n  //   let nextStatus = null\n  //   if (prevProps !== this.props) {\n  //     const { status } = this.state\n  //     if (this.props.in) {\n  //       if (status !== ENTERING && status !== ENTERED) {\n  //         nextStatus = ENTERING\n  //       }\n  //     } else {\n  //       if (status === ENTERING || status === ENTERED) {\n  //         nextStatus = EXITING\n  //       }\n  //     }\n  //   }\n  //   return { nextStatus }\n  // }\n  ;\n\n  var _proto = Transition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.updateStatus(true, this.appearStatus);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var nextStatus = null;\n\n    if (prevProps !== this.props) {\n      var status = this.state.status;\n\n      if (this.props.in) {\n        if (status !== ENTERING && status !== ENTERED) {\n          nextStatus = ENTERING;\n        }\n      } else {\n        if (status === ENTERING || status === ENTERED) {\n          nextStatus = EXITING;\n        }\n      }\n    }\n\n    this.updateStatus(false, nextStatus);\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.cancelNextCallback();\n  };\n\n  _proto.getTimeouts = function getTimeouts() {\n    var timeout = this.props.timeout;\n    var exit, enter, appear;\n    exit = enter = appear = timeout;\n\n    if (timeout != null && typeof timeout !== 'number') {\n      exit = timeout.exit;\n      enter = timeout.enter; // TODO: remove fallback for next major\n\n      appear = timeout.appear !== undefined ? timeout.appear : enter;\n    }\n\n    return {\n      exit: exit,\n      enter: enter,\n      appear: appear\n    };\n  };\n\n  _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n    if (mounting === void 0) {\n      mounting = false;\n    }\n\n    if (nextStatus !== null) {\n      // nextStatus will always be ENTERING or EXITING.\n      this.cancelNextCallback();\n\n      if (nextStatus === ENTERING) {\n        if (this.props.unmountOnExit || this.props.mountOnEnter) {\n          var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this); // https://github.com/reactjs/react-transition-group/pull/749\n          // With unmountOnExit or mountOnEnter, the enter animation should happen at the transition between `exited` and `entering`.\n          // To make the animation happen,  we have to separate each rendering and avoid being processed as batched.\n\n          if (node) forceReflow(node);\n        }\n\n        this.performEnter(mounting);\n      } else {\n        this.performExit();\n      }\n    } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n      this.setState({\n        status: UNMOUNTED\n      });\n    }\n  };\n\n  _proto.performEnter = function performEnter(mounting) {\n    var _this2 = this;\n\n    var enter = this.props.enter;\n    var appearing = this.context ? this.context.isMounting : mounting;\n\n    var _ref2 = this.props.nodeRef ? [appearing] : [ReactDOM.findDOMNode(this), appearing],\n        maybeNode = _ref2[0],\n        maybeAppearing = _ref2[1];\n\n    var timeouts = this.getTimeouts();\n    var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n    // if we are mounting and running this it means appear _must_ be set\n\n    if (!mounting && !enter || config.disabled) {\n      this.safeSetState({\n        status: ENTERED\n      }, function () {\n        _this2.props.onEntered(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onEnter(maybeNode, maybeAppearing);\n    this.safeSetState({\n      status: ENTERING\n    }, function () {\n      _this2.props.onEntering(maybeNode, maybeAppearing);\n\n      _this2.onTransitionEnd(enterTimeout, function () {\n        _this2.safeSetState({\n          status: ENTERED\n        }, function () {\n          _this2.props.onEntered(maybeNode, maybeAppearing);\n        });\n      });\n    });\n  };\n\n  _proto.performExit = function performExit() {\n    var _this3 = this;\n\n    var exit = this.props.exit;\n    var timeouts = this.getTimeouts();\n    var maybeNode = this.props.nodeRef ? undefined : ReactDOM.findDOMNode(this); // no exit animation skip right to EXITED\n\n    if (!exit || config.disabled) {\n      this.safeSetState({\n        status: EXITED\n      }, function () {\n        _this3.props.onExited(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onExit(maybeNode);\n    this.safeSetState({\n      status: EXITING\n    }, function () {\n      _this3.props.onExiting(maybeNode);\n\n      _this3.onTransitionEnd(timeouts.exit, function () {\n        _this3.safeSetState({\n          status: EXITED\n        }, function () {\n          _this3.props.onExited(maybeNode);\n        });\n      });\n    });\n  };\n\n  _proto.cancelNextCallback = function cancelNextCallback() {\n    if (this.nextCallback !== null) {\n      this.nextCallback.cancel();\n      this.nextCallback = null;\n    }\n  };\n\n  _proto.safeSetState = function safeSetState(nextState, callback) {\n    // This shouldn't be necessary, but there are weird race conditions with\n    // setState callbacks and unmounting in testing, so always make sure that\n    // we can cancel any pending setState callbacks after we unmount.\n    callback = this.setNextCallback(callback);\n    this.setState(nextState, callback);\n  };\n\n  _proto.setNextCallback = function setNextCallback(callback) {\n    var _this4 = this;\n\n    var active = true;\n\n    this.nextCallback = function (event) {\n      if (active) {\n        active = false;\n        _this4.nextCallback = null;\n        callback(event);\n      }\n    };\n\n    this.nextCallback.cancel = function () {\n      active = false;\n    };\n\n    return this.nextCallback;\n  };\n\n  _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n    this.setNextCallback(handler);\n    var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this);\n    var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n    if (!node || doesNotHaveTimeoutOrListener) {\n      setTimeout(this.nextCallback, 0);\n      return;\n    }\n\n    if (this.props.addEndListener) {\n      var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n          maybeNode = _ref3[0],\n          maybeNextCallback = _ref3[1];\n\n      this.props.addEndListener(maybeNode, maybeNextCallback);\n    }\n\n    if (timeout != null) {\n      setTimeout(this.nextCallback, timeout);\n    }\n  };\n\n  _proto.render = function render() {\n    var status = this.state.status;\n\n    if (status === UNMOUNTED) {\n      return null;\n    }\n\n    var _this$props = this.props,\n        children = _this$props.children,\n        _in = _this$props.in,\n        _mountOnEnter = _this$props.mountOnEnter,\n        _unmountOnExit = _this$props.unmountOnExit,\n        _appear = _this$props.appear,\n        _enter = _this$props.enter,\n        _exit = _this$props.exit,\n        _timeout = _this$props.timeout,\n        _addEndListener = _this$props.addEndListener,\n        _onEnter = _this$props.onEnter,\n        _onEntering = _this$props.onEntering,\n        _onEntered = _this$props.onEntered,\n        _onExit = _this$props.onExit,\n        _onExiting = _this$props.onExiting,\n        _onExited = _this$props.onExited,\n        _nodeRef = _this$props.nodeRef,\n        childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n    return (\n      /*#__PURE__*/\n      // allows for nested Transitions\n      React.createElement(TransitionGroupContext.Provider, {\n        value: null\n      }, typeof children === 'function' ? children(status, childProps) : React.cloneElement(React.Children.only(children), childProps))\n    );\n  };\n\n  return Transition;\n}(React.Component);\n\nTransition.contextType = TransitionGroupContext;\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n  /**\n   * A React reference to DOM element that need to transition:\n   * https://stackoverflow.com/a/51127130/4671932\n   *\n   *   - When `nodeRef` prop is used, `node` is not passed to callback functions\n   *      (e.g. `onEnter`) because user already has direct access to the node.\n   *   - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n   *     `nodeRef` need to be provided to `Transition` with changed `key` prop\n   *     (see\n   *     [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n   */\n  nodeRef: PropTypes.shape({\n    current: typeof Element === 'undefined' ? PropTypes.any : function (propValue, key, componentName, location, propFullName, secret) {\n      var value = propValue[key];\n      return PropTypes.instanceOf(value && 'ownerDocument' in value ? value.ownerDocument.defaultView.Element : Element)(propValue, key, componentName, location, propFullName, secret);\n    }\n  }),\n\n  /**\n   * A `function` child can be used instead of a React element. This function is\n   * called with the current transition status (`'entering'`, `'entered'`,\n   * `'exiting'`, `'exited'`), which can be used to apply context\n   * specific props to a component.\n   *\n   * ```jsx\n   * <Transition in={this.state.in} timeout={150}>\n   *   {state => (\n   *     <MyComponent className={`fade fade-${state}`} />\n   *   )}\n   * </Transition>\n   * ```\n   */\n  children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n  /**\n   * Show the component; triggers the enter or exit states\n   */\n  in: PropTypes.bool,\n\n  /**\n   * By default the child component is mounted immediately along with\n   * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n   * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n   * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n   */\n  mountOnEnter: PropTypes.bool,\n\n  /**\n   * By default the child component stays mounted after it reaches the `'exited'` state.\n   * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n   */\n  unmountOnExit: PropTypes.bool,\n\n  /**\n   * By default the child component does not perform the enter transition when\n   * it first mounts, regardless of the value of `in`. If you want this\n   * behavior, set both `appear` and `in` to `true`.\n   *\n   * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n   * > only adds an additional enter transition. However, in the\n   * > `<CSSTransition>` component that first enter transition does result in\n   * > additional `.appear-*` classes, that way you can choose to style it\n   * > differently.\n   */\n  appear: PropTypes.bool,\n\n  /**\n   * Enable or disable enter transitions.\n   */\n  enter: PropTypes.bool,\n\n  /**\n   * Enable or disable exit transitions.\n   */\n  exit: PropTypes.bool,\n\n  /**\n   * The duration of the transition, in milliseconds.\n   * Required unless `addEndListener` is provided.\n   *\n   * You may specify a single timeout for all transitions:\n   *\n   * ```jsx\n   * timeout={500}\n   * ```\n   *\n   * or individually:\n   *\n   * ```jsx\n   * timeout={{\n   *  appear: 500,\n   *  enter: 300,\n   *  exit: 500,\n   * }}\n   * ```\n   *\n   * - `appear` defaults to the value of `enter`\n   * - `enter` defaults to `0`\n   * - `exit` defaults to `0`\n   *\n   * @type {number | { enter?: number, exit?: number, appear?: number }}\n   */\n  timeout: function timeout(props) {\n    var pt = timeoutsShape;\n    if (!props.addEndListener) pt = pt.isRequired;\n\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    return pt.apply(void 0, [props].concat(args));\n  },\n\n  /**\n   * Add a custom transition end trigger. Called with the transitioning\n   * DOM node and a `done` callback. Allows for more fine grained transition end\n   * logic. Timeouts are still used as a fallback if provided.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * ```jsx\n   * addEndListener={(node, done) => {\n   *   // use the css transitionend event to mark the finish of a transition\n   *   node.addEventListener('transitionend', done, false);\n   * }}\n   * ```\n   */\n  addEndListener: PropTypes.func,\n\n  /**\n   * Callback fired before the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEnter: PropTypes.func,\n\n  /**\n   * Callback fired after the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: PropTypes.func,\n\n  /**\n   * Callback fired after the \"entered\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEntered: PropTypes.func,\n\n  /**\n   * Callback fired before the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExit: PropTypes.func,\n\n  /**\n   * Callback fired after the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExiting: PropTypes.func,\n\n  /**\n   * Callback fired after the \"exited\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExited: PropTypes.func\n} : {}; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n  in: false,\n  mountOnEnter: false,\n  unmountOnExit: false,\n  appear: false,\n  enter: true,\n  exit: true,\n  onEnter: noop,\n  onEntering: noop,\n  onEntered: noop,\n  onExit: noop,\n  onExiting: noop,\n  onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\nexport default Transition;","import _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\n\nvar _leaveRenders, _enterRenders;\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { ENTERED, ENTERING, EXITING } from './Transition';\nimport TransitionGroupContext from './TransitionGroupContext';\n\nfunction areChildrenDifferent(oldChildren, newChildren) {\n  if (oldChildren === newChildren) return false;\n\n  if (React.isValidElement(oldChildren) && React.isValidElement(newChildren) && oldChildren.key != null && oldChildren.key === newChildren.key) {\n    return false;\n  }\n\n  return true;\n}\n/**\n * Enum of modes for SwitchTransition component\n * @enum { string }\n */\n\n\nexport var modes = {\n  out: 'out-in',\n  in: 'in-out'\n};\n\nvar callHook = function callHook(element, name, cb) {\n  return function () {\n    var _element$props;\n\n    element.props[name] && (_element$props = element.props)[name].apply(_element$props, arguments);\n    cb();\n  };\n};\n\nvar leaveRenders = (_leaveRenders = {}, _leaveRenders[modes.out] = function (_ref) {\n  var current = _ref.current,\n      changeState = _ref.changeState;\n  return React.cloneElement(current, {\n    in: false,\n    onExited: callHook(current, 'onExited', function () {\n      changeState(ENTERING, null);\n    })\n  });\n}, _leaveRenders[modes.in] = function (_ref2) {\n  var current = _ref2.current,\n      changeState = _ref2.changeState,\n      children = _ref2.children;\n  return [current, React.cloneElement(children, {\n    in: true,\n    onEntered: callHook(children, 'onEntered', function () {\n      changeState(ENTERING);\n    })\n  })];\n}, _leaveRenders);\nvar enterRenders = (_enterRenders = {}, _enterRenders[modes.out] = function (_ref3) {\n  var children = _ref3.children,\n      changeState = _ref3.changeState;\n  return React.cloneElement(children, {\n    in: true,\n    onEntered: callHook(children, 'onEntered', function () {\n      changeState(ENTERED, React.cloneElement(children, {\n        in: true\n      }));\n    })\n  });\n}, _enterRenders[modes.in] = function (_ref4) {\n  var current = _ref4.current,\n      children = _ref4.children,\n      changeState = _ref4.changeState;\n  return [React.cloneElement(current, {\n    in: false,\n    onExited: callHook(current, 'onExited', function () {\n      changeState(ENTERED, React.cloneElement(children, {\n        in: true\n      }));\n    })\n  }), React.cloneElement(children, {\n    in: true\n  })];\n}, _enterRenders);\n/**\n * A transition component inspired by the [vue transition modes](https://vuejs.org/v2/guide/transitions.html#Transition-Modes).\n * You can use it when you want to control the render between state transitions.\n * Based on the selected mode and the child's key which is the `Transition` or `CSSTransition` component, the `SwitchTransition` makes a consistent transition between them.\n *\n * If the `out-in` mode is selected, the `SwitchTransition` waits until the old child leaves and then inserts a new child.\n * If the `in-out` mode is selected, the `SwitchTransition` inserts a new child first, waits for the new child to enter and then removes the old child.\n *\n * **Note**: If you want the animation to happen simultaneously\n * (that is, to have the old child removed and a new child inserted **at the same time**),\n * you should use\n * [`TransitionGroup`](https://reactcommunity.org/react-transition-group/transition-group)\n * instead.\n *\n * ```jsx\n * function App() {\n *  const [state, setState] = useState(false);\n *  return (\n *    <SwitchTransition>\n *      <CSSTransition\n *        key={state ? \"Goodbye, world!\" : \"Hello, world!\"}\n *        addEndListener={(node, done) => node.addEventListener(\"transitionend\", done, false)}\n *        classNames='fade'\n *      >\n *        <button onClick={() => setState(state => !state)}>\n *          {state ? \"Goodbye, world!\" : \"Hello, world!\"}\n *        </button>\n *      </CSSTransition>\n *    </SwitchTransition>\n *  );\n * }\n * ```\n *\n * ```css\n * .fade-enter{\n *    opacity: 0;\n * }\n * .fade-exit{\n *    opacity: 1;\n * }\n * .fade-enter-active{\n *    opacity: 1;\n * }\n * .fade-exit-active{\n *    opacity: 0;\n * }\n * .fade-enter-active,\n * .fade-exit-active{\n *    transition: opacity 500ms;\n * }\n * ```\n */\n\nvar SwitchTransition = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(SwitchTransition, _React$Component);\n\n  function SwitchTransition() {\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.state = {\n      status: ENTERED,\n      current: null\n    };\n    _this.appeared = false;\n\n    _this.changeState = function (status, current) {\n      if (current === void 0) {\n        current = _this.state.current;\n      }\n\n      _this.setState({\n        status: status,\n        current: current\n      });\n    };\n\n    return _this;\n  }\n\n  var _proto = SwitchTransition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.appeared = true;\n  };\n\n  SwitchTransition.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {\n    if (props.children == null) {\n      return {\n        current: null\n      };\n    }\n\n    if (state.status === ENTERING && props.mode === modes.in) {\n      return {\n        status: ENTERING\n      };\n    }\n\n    if (state.current && areChildrenDifferent(state.current, props.children)) {\n      return {\n        status: EXITING\n      };\n    }\n\n    return {\n      current: React.cloneElement(props.children, {\n        in: true\n      })\n    };\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        children = _this$props.children,\n        mode = _this$props.mode,\n        _this$state = this.state,\n        status = _this$state.status,\n        current = _this$state.current;\n    var data = {\n      children: children,\n      current: current,\n      changeState: this.changeState,\n      status: status\n    };\n    var component;\n\n    switch (status) {\n      case ENTERING:\n        component = enterRenders[mode](data);\n        break;\n\n      case EXITING:\n        component = leaveRenders[mode](data);\n        break;\n\n      case ENTERED:\n        component = current;\n    }\n\n    return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {\n      value: {\n        isMounting: !this.appeared\n      }\n    }, component);\n  };\n\n  return SwitchTransition;\n}(React.Component);\n\nSwitchTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n  /**\n   * Transition modes.\n   * `out-in`: Current element transitions out first, then when complete, the new element transitions in.\n   * `in-out`: New element transitions in first, then when complete, the current element transitions out.\n   *\n   * @type {'out-in'|'in-out'}\n   */\n  mode: PropTypes.oneOf([modes.in, modes.out]),\n\n  /**\n   * Any `Transition` or `CSSTransition` component.\n   */\n  children: PropTypes.oneOfType([PropTypes.element.isRequired])\n} : {};\nSwitchTransition.defaultProps = {\n  mode: modes.out\n};\nexport default SwitchTransition;","function replaceClassName(origClass, classToRemove) {\n  return origClass.replace(new RegExp(\"(^|\\\\s)\" + classToRemove + \"(?:\\\\s|$)\", 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n/**\n * Removes a CSS class from a given element.\n * \n * @param element the element\n * @param className the CSS class name\n */\n\n\nexport default function removeClass(element, className) {\n  if (element.classList) {\n    element.classList.remove(className);\n  } else if (typeof element.className === 'string') {\n    element.className = replaceClassName(element.className, className);\n  } else {\n    element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n  }\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport addOneClass from 'dom-helpers/addClass';\nimport removeOneClass from 'dom-helpers/removeClass';\nimport React from 'react';\nimport Transition from './Transition';\nimport { classNamesShape } from './utils/PropTypes';\nimport { forceReflow } from './utils/reflow';\n\nvar _addClass = function addClass(node, classes) {\n  return node && classes && classes.split(' ').forEach(function (c) {\n    return addOneClass(node, c);\n  });\n};\n\nvar removeClass = function removeClass(node, classes) {\n  return node && classes && classes.split(' ').forEach(function (c) {\n    return removeOneClass(node, c);\n  });\n};\n/**\n * A transition component inspired by the excellent\n * [ng-animate](https://docs.angularjs.org/api/ngAnimate) library, you should\n * use it if you're using CSS transitions or animations. It's built upon the\n * [`Transition`](https://reactcommunity.org/react-transition-group/transition)\n * component, so it inherits all of its props.\n *\n * `CSSTransition` applies a pair of class names during the `appear`, `enter`,\n * and `exit` states of the transition. The first class is applied and then a\n * second `*-active` class in order to activate the CSS transition. After the\n * transition, matching `*-done` class names are applied to persist the\n * transition state.\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <CSSTransition in={inProp} timeout={200} classNames=\"my-node\">\n *         <div>\n *           {\"I'll receive my-node-* classes\"}\n *         </div>\n *       </CSSTransition>\n *       <button type=\"button\" onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the `in` prop is set to `true`, the child component will first receive\n * the class `example-enter`, then the `example-enter-active` will be added in\n * the next tick. `CSSTransition` [forces a\n * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * between before adding the `example-enter-active`. This is an important trick\n * because it allows us to transition between `example-enter` and\n * `example-enter-active` even though they were added immediately one after\n * another. Most notably, this is what makes it possible for us to animate\n * _appearance_.\n *\n * ```css\n * .my-node-enter {\n *   opacity: 0;\n * }\n * .my-node-enter-active {\n *   opacity: 1;\n *   transition: opacity 200ms;\n * }\n * .my-node-exit {\n *   opacity: 1;\n * }\n * .my-node-exit-active {\n *   opacity: 0;\n *   transition: opacity 200ms;\n * }\n * ```\n *\n * `*-active` classes represent which styles you want to animate **to**, so it's\n * important to add `transition` declaration only to them, otherwise transitions\n * might not behave as intended! This might not be obvious when the transitions\n * are symmetrical, i.e. when `*-enter-active` is the same as `*-exit`, like in\n * the example above (minus `transition`), but it becomes apparent in more\n * complex transitions.\n *\n * **Note**: If you're using the\n * [`appear`](http://reactcommunity.org/react-transition-group/transition#Transition-prop-appear)\n * prop, make sure to define styles for `.appear-*` classes as well.\n */\n\n\nvar CSSTransition = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(CSSTransition, _React$Component);\n\n  function CSSTransition() {\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.appliedClasses = {\n      appear: {},\n      enter: {},\n      exit: {}\n    };\n\n    _this.onEnter = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument[0],\n          appearing = _this$resolveArgument[1];\n\n      _this.removeClasses(node, 'exit');\n\n      _this.addClass(node, appearing ? 'appear' : 'enter', 'base');\n\n      if (_this.props.onEnter) {\n        _this.props.onEnter(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onEntering = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument2 = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument2[0],\n          appearing = _this$resolveArgument2[1];\n\n      var type = appearing ? 'appear' : 'enter';\n\n      _this.addClass(node, type, 'active');\n\n      if (_this.props.onEntering) {\n        _this.props.onEntering(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onEntered = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument3 = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument3[0],\n          appearing = _this$resolveArgument3[1];\n\n      var type = appearing ? 'appear' : 'enter';\n\n      _this.removeClasses(node, type);\n\n      _this.addClass(node, type, 'done');\n\n      if (_this.props.onEntered) {\n        _this.props.onEntered(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onExit = function (maybeNode) {\n      var _this$resolveArgument4 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument4[0];\n\n      _this.removeClasses(node, 'appear');\n\n      _this.removeClasses(node, 'enter');\n\n      _this.addClass(node, 'exit', 'base');\n\n      if (_this.props.onExit) {\n        _this.props.onExit(maybeNode);\n      }\n    };\n\n    _this.onExiting = function (maybeNode) {\n      var _this$resolveArgument5 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument5[0];\n\n      _this.addClass(node, 'exit', 'active');\n\n      if (_this.props.onExiting) {\n        _this.props.onExiting(maybeNode);\n      }\n    };\n\n    _this.onExited = function (maybeNode) {\n      var _this$resolveArgument6 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument6[0];\n\n      _this.removeClasses(node, 'exit');\n\n      _this.addClass(node, 'exit', 'done');\n\n      if (_this.props.onExited) {\n        _this.props.onExited(maybeNode);\n      }\n    };\n\n    _this.resolveArguments = function (maybeNode, maybeAppearing) {\n      return _this.props.nodeRef ? [_this.props.nodeRef.current, maybeNode] // here `maybeNode` is actually `appearing`\n      : [maybeNode, maybeAppearing];\n    };\n\n    _this.getClassNames = function (type) {\n      var classNames = _this.props.classNames;\n      var isStringClassNames = typeof classNames === 'string';\n      var prefix = isStringClassNames && classNames ? classNames + \"-\" : '';\n      var baseClassName = isStringClassNames ? \"\" + prefix + type : classNames[type];\n      var activeClassName = isStringClassNames ? baseClassName + \"-active\" : classNames[type + \"Active\"];\n      var doneClassName = isStringClassNames ? baseClassName + \"-done\" : classNames[type + \"Done\"];\n      return {\n        baseClassName: baseClassName,\n        activeClassName: activeClassName,\n        doneClassName: doneClassName\n      };\n    };\n\n    return _this;\n  }\n\n  var _proto = CSSTransition.prototype;\n\n  _proto.addClass = function addClass(node, type, phase) {\n    var className = this.getClassNames(type)[phase + \"ClassName\"];\n\n    var _this$getClassNames = this.getClassNames('enter'),\n        doneClassName = _this$getClassNames.doneClassName;\n\n    if (type === 'appear' && phase === 'done' && doneClassName) {\n      className += \" \" + doneClassName;\n    } // This is to force a repaint,\n    // which is necessary in order to transition styles when adding a class name.\n\n\n    if (phase === 'active') {\n      if (node) forceReflow(node);\n    }\n\n    if (className) {\n      this.appliedClasses[type][phase] = className;\n\n      _addClass(node, className);\n    }\n  };\n\n  _proto.removeClasses = function removeClasses(node, type) {\n    var _this$appliedClasses$ = this.appliedClasses[type],\n        baseClassName = _this$appliedClasses$.base,\n        activeClassName = _this$appliedClasses$.active,\n        doneClassName = _this$appliedClasses$.done;\n    this.appliedClasses[type] = {};\n\n    if (baseClassName) {\n      removeClass(node, baseClassName);\n    }\n\n    if (activeClassName) {\n      removeClass(node, activeClassName);\n    }\n\n    if (doneClassName) {\n      removeClass(node, doneClassName);\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        _ = _this$props.classNames,\n        props = _objectWithoutPropertiesLoose(_this$props, [\"classNames\"]);\n\n    return /*#__PURE__*/React.createElement(Transition, _extends({}, props, {\n      onEnter: this.onEnter,\n      onEntered: this.onEntered,\n      onEntering: this.onEntering,\n      onExit: this.onExit,\n      onExiting: this.onExiting,\n      onExited: this.onExited\n    }));\n  };\n\n  return CSSTransition;\n}(React.Component);\n\nCSSTransition.defaultProps = {\n  classNames: ''\n};\nCSSTransition.propTypes = process.env.NODE_ENV !== \"production\" ? _extends({}, Transition.propTypes, {\n  /**\n   * The animation classNames applied to the component as it appears, enters,\n   * exits or has finished the transition. A single name can be provided, which\n   * will be suffixed for each stage, e.g. `classNames=\"fade\"` applies:\n   *\n   * - `fade-appear`, `fade-appear-active`, `fade-appear-done`\n   * - `fade-enter`, `fade-enter-active`, `fade-enter-done`\n   * - `fade-exit`, `fade-exit-active`, `fade-exit-done`\n   *\n   * A few details to note about how these classes are applied:\n   *\n   * 1. They are _joined_ with the ones that are already defined on the child\n   *    component, so if you want to add some base styles, you can use\n   *    `className` without worrying that it will be overridden.\n   *\n   * 2. If the transition component mounts with `in={false}`, no classes are\n   *    applied yet. You might be expecting `*-exit-done`, but if you think\n   *    about it, a component cannot finish exiting if it hasn't entered yet.\n   *\n   * 2. `fade-appear-done` and `fade-enter-done` will _both_ be applied. This\n   *    allows you to define different behavior for when appearing is done and\n   *    when regular entering is done, using selectors like\n   *    `.fade-enter-done:not(.fade-appear-done)`. For example, you could apply\n   *    an epic entrance animation when element first appears in the DOM using\n   *    [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can\n   *    simply use `fade-enter-done` for defining both cases.\n   *\n   * Each individual classNames can also be specified independently like:\n   *\n   * ```js\n   * classNames={{\n   *  appear: 'my-appear',\n   *  appearActive: 'my-active-appear',\n   *  appearDone: 'my-done-appear',\n   *  enter: 'my-enter',\n   *  enterActive: 'my-active-enter',\n   *  enterDone: 'my-done-enter',\n   *  exit: 'my-exit',\n   *  exitActive: 'my-active-exit',\n   *  exitDone: 'my-done-exit',\n   * }}\n   * ```\n   *\n   * If you want to set these classes using CSS Modules:\n   *\n   * ```js\n   * import styles from './styles.css';\n   * ```\n   *\n   * you might want to use camelCase in your CSS file, that way could simply\n   * spread them instead of listing them one by one:\n   *\n   * ```js\n   * classNames={{ ...styles }}\n   * ```\n   *\n   * @type {string | {\n   *  appear?: string,\n   *  appearActive?: string,\n   *  appearDone?: string,\n   *  enter?: string,\n   *  enterActive?: string,\n   *  enterDone?: string,\n   *  exit?: string,\n   *  exitActive?: string,\n   *  exitDone?: string,\n   * }}\n   */\n  classNames: classNamesShape,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter' or 'appear' class is\n   * applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEnter: PropTypes.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter-active' or\n   * 'appear-active' class is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: PropTypes.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter' or\n   * 'appear' classes are **removed** and the `done` class is added to the DOM node.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntered: PropTypes.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit' class is\n   * applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExit: PropTypes.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit-active' is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExiting: PropTypes.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit' classes\n   * are **removed** and the `exit-done` class is added to the DOM node.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExited: PropTypes.func\n}) : {};\nexport default CSSTransition;","import hasClass from './hasClass';\n/**\n * Adds a CSS class to a given element.\n * \n * @param element the element\n * @param className the CSS class name\n */\n\nexport default function addClass(element, className) {\n  if (element.classList) element.classList.add(className);else if (!hasClass(element, className)) if (typeof element.className === 'string') element.className = element.className + \" \" + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + \" \" + className);\n}","/**\n * Checks if a given element has a CSS class.\n * \n * @param element the element\n * @param className the CSS class name\n */\nexport default function hasClass(element, className) {\n  if (element.classList) return !!className && element.classList.contains(className);\n  return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction ImageErrorIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M5 3a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h7.803a6 6 0 0 1-.72-2H5v-3.172l4-4 3.585 3.585a6 6 0 0 1 1.172-1.656l-3.343-3.343a2 2 0 0 0-2.828 0L5 13V5h14v7.083c.718.12 1.393.368 2 .72V5a2 2 0 0 0-2-2z\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M17 9a2 2 0 1 1-4 0 2 2 0 0 1 4 0m1 5a1 1 0 0 1 1 1v3a1 1 0 1 1-2 0v-3a1 1 0 0 1 1-1m-1 7a1 1 0 1 1 2 0 1 1 0 0 1-2 0\"\n    })]\n  });\n}\n;\nImageErrorIcon.displayName = \"ImageErrorIcon\";\nexport default forwardRef(ImageErrorIcon);","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020, 2021 Tulir Asokan <tulir@maunium.net>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ComponentProps, createRef, type ReactNode } from \"react\";\nimport { Blurhash } from \"react-blurhash\";\nimport classNames from \"classnames\";\nimport { CSSTransition, SwitchTransition } from \"react-transition-group\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { ClientEvent } from \"matrix-js-sdk/src/matrix\";\nimport { type ImageContent } from \"matrix-js-sdk/src/types\";\nimport { Tooltip } from \"@vector-im/compound-web\";\nimport { ImageErrorIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\nimport { HiddenMediaPlaceholder } from \"@element-hq/web-shared-components\";\n\nimport Modal from \"../../../Modal\";\nimport { _t } from \"../../../languageHandler\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport Spinner from \"../elements/Spinner\";\nimport { type Media, mediaFromContent } from \"../../../customisations/Media\";\nimport { BLURHASH_FIELD, createThumbnail } from \"../../../utils/image-media\";\nimport ImageView from \"../elements/ImageView\";\nimport { type IBodyProps } from \"./IBodyProps\";\nimport { type ImageSize, suggestedSize as suggestedImageSize } from \"../../../settings/enums/ImageSize\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport RoomContext, { TimelineRenderingType } from \"../../../contexts/RoomContext\";\nimport { blobIsAnimated, mayBeAnimated } from \"../../../utils/Image\";\nimport { presentableTextForFile } from \"../../../utils/FileUtils\";\nimport { createReconnectedListener } from \"../../../utils/connection\";\nimport MediaProcessingError from \"./shared/MediaProcessingError\";\nimport { DecryptError, DownloadError } from \"../../../utils/DecryptFile\";\nimport { useMediaVisible } from \"../../../hooks/useMediaVisible\";\nimport { isMimeTypeAllowed } from \"../../../utils/blobs.ts\";\nimport { FileBodyFactory, renderMBody } from \"./MBodyFactory\";\n\nenum Placeholder {\n    NoImage,\n    Blurhash,\n}\n\ninterface IState {\n    contentUrl: string | null;\n    thumbUrl: string | null;\n    isAnimated?: boolean;\n    error?: unknown;\n    imgError: boolean;\n    imgLoaded: boolean;\n    loadedImageDimensions?: {\n        naturalWidth: number;\n        naturalHeight: number;\n    };\n    hover: boolean;\n    focus: boolean;\n    placeholder: Placeholder;\n}\n\nexport interface ImageBodyBaseProps extends IBodyProps {\n    mediaVisible: boolean;\n    setMediaVisible: (visible: boolean) => void;\n}\n\nexport class ImageBodyBaseInner extends React.Component<ImageBodyBaseProps, IState> {\n    public static contextType = RoomContext;\n    declare public context: React.ContextType<typeof RoomContext>;\n\n    private unmounted = false;\n    private image = createRef<HTMLImageElement>();\n    private placeholder = createRef<HTMLDivElement>();\n    private timeout?: number;\n    private sizeWatcher?: string;\n\n    public state: IState = {\n        contentUrl: null,\n        thumbUrl: null,\n        imgError: false,\n        imgLoaded: false,\n        hover: false,\n        focus: false,\n        placeholder: Placeholder.NoImage,\n    };\n\n    protected onClick = (ev: React.MouseEvent): void => {\n        if (ev.button === 0 && !ev.metaKey) {\n            ev.preventDefault();\n            if (!this.props.mediaVisible) {\n                this.props.setMediaVisible(true);\n                return;\n            }\n\n            const content = this.props.mxEvent.getContent<ImageContent>();\n\n            let httpUrl = this.state.contentUrl;\n            if (\n                this.props.mediaEventHelper?.media.isEncrypted &&\n                !isMimeTypeAllowed(this.props.mediaEventHelper.sourceBlob.cachedValue?.type ?? \"\")\n            ) {\n                httpUrl = this.state.thumbUrl;\n            }\n\n            if (!httpUrl) return;\n            const params: Omit<ComponentProps<typeof ImageView>, \"onFinished\"> = {\n                src: httpUrl,\n                name: content.body && content.body.length > 0 ? content.body : _t(\"common|attachment\"),\n                mxEvent: this.props.mxEvent,\n                permalinkCreator: this.props.permalinkCreator,\n            };\n\n            if (content.info) {\n                params.width = content.info.w;\n                params.height = content.info.h;\n                params.fileSize = content.info.size;\n            }\n\n            if (this.image.current) {\n                const clientRect = this.image.current.getBoundingClientRect();\n\n                params.thumbnailInfo = {\n                    width: clientRect.width,\n                    height: clientRect.height,\n                    positionX: clientRect.x,\n                    positionY: clientRect.y,\n                };\n            }\n\n            Modal.createDialog(ImageView, params, \"mx_Dialog_lightbox\", undefined, true);\n        }\n    };\n\n    private get shouldAutoplay(): boolean {\n        return !(\n            !this.state.contentUrl ||\n            !this.props.mediaVisible ||\n            !this.state.isAnimated ||\n            SettingsStore.getValue(\"autoplayGifs\")\n        );\n    }\n\n    protected onImageEnter = (): void => {\n        this.setState({ hover: true });\n    };\n\n    protected onImageLeave = (): void => {\n        this.setState({ hover: false });\n    };\n\n    private onFocus = (): void => {\n        this.setState({ focus: true });\n    };\n\n    private onBlur = (): void => {\n        this.setState({ focus: false });\n    };\n\n    private reconnectedListener = createReconnectedListener((): void => {\n        MatrixClientPeg.get()?.off(ClientEvent.Sync, this.reconnectedListener);\n        this.setState({ imgError: false });\n    });\n\n    private onImageError = (): void => {\n        if (this.state.thumbUrl) {\n            this.setState({\n                thumbUrl: null,\n            });\n            return;\n        }\n\n        this.clearBlurhashTimeout();\n        this.setState({\n            imgError: true,\n        });\n        MatrixClientPeg.safeGet().on(ClientEvent.Sync, this.reconnectedListener);\n    };\n\n    private onImageLoad = (): void => {\n        this.clearBlurhashTimeout();\n\n        let loadedImageDimensions: IState[\"loadedImageDimensions\"];\n\n        if (this.image.current) {\n            const { naturalWidth, naturalHeight } = this.image.current;\n            loadedImageDimensions = { naturalWidth, naturalHeight };\n        }\n        this.setState({ imgLoaded: true, loadedImageDimensions });\n    };\n\n    private getContentUrl(): string | null {\n        if (this.props.forExport) return this.media.srcMxc;\n        return this.media.srcHttp;\n    }\n\n    private get media(): Media {\n        return mediaFromContent(this.props.mxEvent.getContent());\n    }\n\n    private getThumbUrl(): string | null {\n        const thumbWidth = 800;\n        const thumbHeight = 600;\n\n        const content = this.props.mxEvent.getContent<ImageContent>();\n        const media = mediaFromContent(content);\n        const info = content.info;\n\n        if (info?.mimetype === \"image/svg+xml\" && media.hasThumbnail) {\n            return media.getThumbnailHttp(thumbWidth, thumbHeight, \"scale\");\n        }\n\n        if (this.state.isAnimated || window.devicePixelRatio === 1.0 || !info || !info.w || !info.h || !info.size) {\n            return media.getThumbnailOfSourceHttp(thumbWidth, thumbHeight);\n        }\n\n        const isLargerThanThumbnail = info.w > thumbWidth || info.h > thumbHeight;\n        const isLargeFileSize = info.size > 1 * 1024 * 1024;\n\n        if (isLargeFileSize && isLargerThanThumbnail) {\n            return media.getThumbnailOfSourceHttp(thumbWidth, thumbHeight);\n        }\n\n        return media.srcHttp;\n    }\n\n    private async downloadImage(): Promise<void> {\n        if (this.state.contentUrl) return;\n\n        let thumbUrl: string | null;\n        let contentUrl: string | null;\n        if (this.props.mediaEventHelper?.media.isEncrypted) {\n            try {\n                [contentUrl, thumbUrl] = await Promise.all([\n                    this.props.mediaEventHelper.sourceUrl.value,\n                    this.props.mediaEventHelper.thumbnailUrl.value,\n                ]);\n            } catch (error) {\n                if (this.unmounted) return;\n\n                if (error instanceof DecryptError) {\n                    logger.error(\"Unable to decrypt attachment: \", error);\n                } else if (error instanceof DownloadError) {\n                    logger.error(\"Unable to download attachment to decrypt it: \", error);\n                } else {\n                    logger.error(\"Error encountered when downloading encrypted attachment: \", error);\n                }\n\n                this.setState({ error });\n                return;\n            }\n        } else {\n            thumbUrl = this.getThumbUrl();\n            contentUrl = this.getContentUrl();\n        }\n\n        const content = this.props.mxEvent.getContent<ImageContent>();\n        let isAnimated = content.info?.[\"org.matrix.msc4230.is_animated\"] ?? mayBeAnimated(content.info?.mimetype);\n\n        if (isAnimated && !SettingsStore.getValue(\"autoplayGifs\")) {\n            if (!thumbUrl || !content?.info?.thumbnail_info || mayBeAnimated(content.info.thumbnail_info.mimetype)) {\n                const img = document.createElement(\"img\");\n                const loadPromise = new Promise((resolve, reject) => {\n                    img.onload = resolve;\n                    img.onerror = reject;\n                });\n                img.crossOrigin = \"Anonymous\";\n                img.src = contentUrl ?? \"\";\n\n                try {\n                    await loadPromise;\n                } catch (error) {\n                    logger.error(\"Unable to download attachment: \", error);\n                    this.setState({ error: error as Error });\n                    return;\n                }\n\n                try {\n                    if (\n                        content.info?.[\"org.matrix.msc4230.is_animated\"] === false ||\n                        (await blobIsAnimated(await this.props.mediaEventHelper!.sourceBlob.value)) === false\n                    ) {\n                        isAnimated = false;\n                    }\n\n                    if (isAnimated) {\n                        const thumb = await createThumbnail(\n                            img,\n                            img.width,\n                            img.height,\n                            content.info?.mimetype ?? \"image/jpeg\",\n                            false,\n                        );\n                        thumbUrl = URL.createObjectURL(thumb.thumbnail);\n                    }\n                } catch (error) {\n                    logger.warn(\"Unable to generate thumbnail for animated image: \", error);\n                }\n            }\n        }\n\n        if (this.unmounted) return;\n        this.setState({\n            contentUrl,\n            thumbUrl,\n            isAnimated,\n        });\n    }\n\n    private clearBlurhashTimeout(): void {\n        if (this.timeout) {\n            clearTimeout(this.timeout);\n            this.timeout = undefined;\n        }\n    }\n\n    public componentDidMount(): void {\n        this.unmounted = false;\n\n        if (this.props.mediaVisible) {\n            void this.downloadImage();\n        }\n\n        if (this.props.mxEvent.getContent().info?.[BLURHASH_FIELD]) {\n            this.clearBlurhashTimeout();\n            this.timeout = window.setTimeout(() => {\n                if (!this.state.imgLoaded || !this.state.imgError) {\n                    this.setState({\n                        placeholder: Placeholder.Blurhash,\n                    });\n                }\n            }, 150);\n        }\n\n        this.sizeWatcher = SettingsStore.watchSetting(\"Images.size\", null, () => {\n            this.forceUpdate();\n        });\n    }\n\n    public componentDidUpdate(prevProps: Readonly<ImageBodyBaseProps>): void {\n        if (!prevProps.mediaVisible && this.props.mediaVisible) {\n            void this.downloadImage();\n        }\n    }\n\n    public componentWillUnmount(): void {\n        this.unmounted = true;\n        MatrixClientPeg.get()?.off(ClientEvent.Sync, this.reconnectedListener);\n        this.clearBlurhashTimeout();\n        SettingsStore.unwatchSetting(this.sizeWatcher);\n        if (this.state.isAnimated && this.state.thumbUrl) {\n            URL.revokeObjectURL(this.state.thumbUrl);\n        }\n    }\n\n    protected getBanner(content: ImageContent): ReactNode {\n        if (\n            [TimelineRenderingType.ThreadsList, TimelineRenderingType.File].includes(this.context.timelineRenderingType)\n        ) {\n            return null;\n        }\n\n        return (\n            <span className=\"mx_MImageBody_banner\">\n                {presentableTextForFile(content, _t(\"common|image\"), true, true)}\n            </span>\n        );\n    }\n\n    protected messageContent(\n        contentUrl: string | null,\n        thumbUrl: string | null,\n        content: ImageContent,\n        forcedHeight?: number,\n    ): ReactNode {\n        if (!thumbUrl) thumbUrl = contentUrl;\n\n        let infoWidth = 500;\n        let infoHeight = 500;\n        let infoSvg = false;\n\n        if (content.info?.w && content.info?.h) {\n            infoWidth = content.info.w;\n            infoHeight = content.info.h;\n            infoSvg = content.info.mimetype === \"image/svg+xml\";\n        } else if (thumbUrl && contentUrl) {\n            if (!this.state.loadedImageDimensions) {\n                let imageElement: JSX.Element;\n                if (!this.props.mediaVisible) {\n                    imageElement = (\n                        <HiddenMediaPlaceholder onClick={this.onClick}>\n                            {_t(\"timeline|m.image|show_image\")}\n                        </HiddenMediaPlaceholder>\n                    );\n                } else {\n                    imageElement = (\n                        <img\n                            style={{ display: \"none\" }}\n                            src={thumbUrl}\n                            ref={this.image}\n                            alt={content.body}\n                            onError={this.onImageError}\n                            onLoad={this.onImageLoad}\n                        />\n                    );\n                }\n                return this.wrapImage(contentUrl, imageElement);\n            }\n            infoWidth = this.state.loadedImageDimensions.naturalWidth;\n            infoHeight = this.state.loadedImageDimensions.naturalHeight;\n        }\n\n        const { w: maxWidth, h: maxHeight } = suggestedImageSize(\n            SettingsStore.getValue(\"Images.size\") as ImageSize,\n            { w: infoWidth, h: infoHeight },\n            forcedHeight ?? this.props.maxImageHeight,\n        );\n\n        let img: JSX.Element | undefined;\n        let placeholder: JSX.Element | undefined;\n        let gifLabel: JSX.Element | undefined;\n\n        if (!this.props.forExport && !this.state.imgLoaded) {\n            const classes = classNames(\"mx_MImageBody_placeholder\", {\n                \"mx_MImageBody_placeholder--blurhash\": this.props.mxEvent.getContent().info?.[BLURHASH_FIELD],\n            });\n\n            placeholder = (\n                <div className={classes} ref={this.placeholder}>\n                    {this.getPlaceholder(maxWidth, maxHeight)}\n                </div>\n            );\n        }\n\n        let showPlaceholder = Boolean(placeholder);\n\n        const hoverOrFocus = this.state.hover || this.state.focus;\n        if (thumbUrl && !this.state.imgError) {\n            let url = thumbUrl;\n            if (hoverOrFocus && this.shouldAutoplay) {\n                url = this.state.contentUrl!;\n            }\n\n            img = (\n                <img\n                    className=\"mx_MImageBody_thumbnail\"\n                    src={url}\n                    ref={this.image}\n                    alt={content.body}\n                    onError={this.onImageError}\n                    onLoad={this.onImageLoad}\n                    onMouseEnter={this.onImageEnter}\n                    onMouseLeave={this.onImageLeave}\n                />\n            );\n        }\n\n        if (!this.props.mediaVisible) {\n            img = (\n                <div style={{ width: maxWidth, height: maxHeight }}>\n                    <HiddenMediaPlaceholder onClick={this.onClick}>\n                        {_t(\"timeline|m.image|show_image\")}\n                    </HiddenMediaPlaceholder>\n                </div>\n            );\n            showPlaceholder = false;\n        }\n\n        if (this.state.isAnimated && !SettingsStore.getValue(\"autoplayGifs\") && !hoverOrFocus) {\n            gifLabel = <p className=\"mx_MImageBody_gifLabel\">GIF</p>;\n        }\n\n        let banner: ReactNode | undefined;\n        if (this.props.mediaVisible && hoverOrFocus) {\n            banner = this.getBanner(content);\n        }\n\n        const sizing = infoSvg ? { maxHeight, maxWidth, width: maxWidth } : { maxHeight, maxWidth };\n\n        if (!this.props.forExport) {\n            placeholder = (\n                <SwitchTransition mode=\"out-in\">\n                    <CSSTransition\n                        classNames=\"mx_rtg--fade\"\n                        key={`img-${showPlaceholder}`}\n                        timeout={300}\n                        nodeRef={this.placeholder}\n                    >\n                        {showPlaceholder ? placeholder : <div ref={this.placeholder} />}\n                    </CSSTransition>\n                </SwitchTransition>\n            );\n        }\n\n        const tooltipProps = this.getTooltipProps();\n        let thumbnail = (\n            <div\n                className=\"mx_MImageBody_thumbnail_container\"\n                style={{ maxHeight, maxWidth, aspectRatio: `${infoWidth}/${infoHeight}` }}\n                tabIndex={tooltipProps ? 0 : undefined}\n            >\n                {placeholder}\n\n                <div style={sizing}>\n                    {img}\n                    {gifLabel}\n                    {banner}\n                </div>\n\n                {!this.props.forExport && !this.state.imgLoaded && !placeholder && (\n                    <div style={{ height: maxHeight, width: maxWidth }} />\n                )}\n            </div>\n        );\n\n        if (tooltipProps) {\n            thumbnail = (\n                <Tooltip {...tooltipProps} isTriggerInteractive={true}>\n                    {thumbnail}\n                </Tooltip>\n            );\n        }\n\n        return this.wrapImage(contentUrl, thumbnail);\n    }\n\n    protected wrapImage(contentUrl: string | null | undefined, children: JSX.Element): ReactNode {\n        if (contentUrl) {\n            return (\n                <a\n                    href={contentUrl}\n                    target={this.props.forExport ? \"_blank\" : undefined}\n                    onClick={this.onClick}\n                    onFocus={this.onFocus}\n                    onBlur={this.onBlur}\n                >\n                    {children}\n                </a>\n            );\n        }\n        return children;\n    }\n\n    protected getPlaceholder(width: number, height: number): ReactNode {\n        const blurhash = this.props.mxEvent.getContent().info?.[BLURHASH_FIELD];\n\n        if (blurhash) {\n            if (this.state.placeholder === Placeholder.NoImage) {\n                return null;\n            } else if (this.state.placeholder === Placeholder.Blurhash) {\n                return <Blurhash className=\"mx_Blurhash\" hash={blurhash} width={width} height={height} />;\n            }\n        }\n        return <Spinner size={32} />;\n    }\n\n    protected getTooltipProps(): ComponentProps<typeof Tooltip> | null {\n        return null;\n    }\n\n    protected getFileBody(): ReactNode {\n        if (this.props.forExport) return null;\n        const hasMessageActionBar =\n            this.context.timelineRenderingType === TimelineRenderingType.Room ||\n            this.context.timelineRenderingType === TimelineRenderingType.Pinned ||\n            this.context.timelineRenderingType === TimelineRenderingType.Search ||\n            this.context.timelineRenderingType === TimelineRenderingType.Thread ||\n            this.context.timelineRenderingType === TimelineRenderingType.ThreadsList;\n        if (!hasMessageActionBar) {\n            return renderMBody({ ...this.props, showFileInfo: false }, FileBodyFactory);\n        }\n    }\n\n    public render(): React.ReactNode {\n        const content = this.props.mxEvent.getContent<ImageContent>();\n\n        if (\n            this.props.mediaEventHelper?.media.isEncrypted &&\n            !isMimeTypeAllowed(content.info?.mimetype ?? \"\") &&\n            !content.info?.thumbnail_info\n        ) {\n            return renderMBody(this.props, FileBodyFactory);\n        }\n\n        if (this.state.error) {\n            let errorText = _t(\"timeline|m.image|error\");\n            if (this.state.error instanceof DecryptError) {\n                errorText = _t(\"timeline|m.image|error_decrypting\");\n            } else if (this.state.error instanceof DownloadError) {\n                errorText = _t(\"timeline|m.image|error_downloading\");\n            }\n\n            return (\n                <MediaProcessingError className=\"mx_MImageBody\" Icon={ImageErrorIcon}>\n                    {errorText}\n                </MediaProcessingError>\n            );\n        }\n\n        let contentUrl = this.state.contentUrl;\n        let thumbUrl: string | null;\n        if (this.props.forExport) {\n            contentUrl = this.props.mxEvent.getContent().url ?? this.props.mxEvent.getContent().file?.url;\n            thumbUrl = contentUrl;\n        } else if (this.state.isAnimated && SettingsStore.getValue(\"autoplayGifs\")) {\n            thumbUrl = contentUrl;\n        } else {\n            thumbUrl = this.state.thumbUrl ?? this.state.contentUrl;\n        }\n\n        const thumbnail = this.messageContent(contentUrl, thumbUrl, content);\n        const fileBody = this.getFileBody();\n\n        return (\n            <div className=\"mx_MImageBody\">\n                {thumbnail}\n                {fileBody}\n            </div>\n        );\n    }\n}\n\nconst FORCED_IMAGE_HEIGHT = 44;\n\nclass MImageReplyBodyInner extends ImageBodyBaseInner {\n    public onClick = (ev: React.MouseEvent): void => {\n        ev.preventDefault();\n    };\n\n    public wrapImage(contentUrl: string, children: JSX.Element): JSX.Element {\n        return children;\n    }\n\n    public render(): React.ReactNode {\n        if (this.state.error) {\n            return super.render();\n        }\n\n        const content = this.props.mxEvent.getContent<ImageContent>();\n        const thumbnail = this.state.contentUrl\n            ? this.messageContent(this.state.contentUrl, this.state.thumbUrl, content, FORCED_IMAGE_HEIGHT)\n            : undefined;\n\n        return <div className=\"mx_MImageReplyBody\">{thumbnail}</div>;\n    }\n}\n\nconst MImageReplyBody: React.FC<IBodyProps> = (props) => {\n    const [mediaVisible, setVisible] = useMediaVisible(props.mxEvent);\n    return <MImageReplyBodyInner mediaVisible={mediaVisible} setMediaVisible={setVisible} {...props} />;\n};\n\nexport default MImageReplyBody;\n","/*\nCopyright 2022 - 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\nimport { M_POLL_RESPONSE, type PollResponseEventContent, type PollResponseSubtype } from \"../@types/polls.ts\";\nimport {\n    type ExtensibleEventType,\n    type IPartialEvent,\n    isEventTypeSame,\n    REFERENCE_RELATION,\n} from \"../@types/extensible_events.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\nimport { type PollStartEvent } from \"./PollStartEvent.ts\";\n\n/**\n * Represents a poll response event.\n */\nexport class PollResponseEvent extends ExtensibleEvent<PollResponseEventContent> {\n    private internalAnswerIds: string[] = [];\n    private internalSpoiled = false;\n\n    /**\n     * The provided answers for the poll. Note that this may be falsy/unpredictable if\n     * the `spoiled` property is true.\n     */\n    public get answerIds(): string[] {\n        return this.internalAnswerIds;\n    }\n\n    /**\n     * The poll start event ID referenced by the response.\n     */\n    public readonly pollEventId: string;\n\n    /**\n     * Whether the vote is spoiled.\n     */\n    public get spoiled(): boolean {\n        return this.internalSpoiled;\n    }\n\n    /**\n     * Creates a new PollResponseEvent from a pure format. Note that the event is *not*\n     * parsed here: it will be treated as a literal m.poll.response primary typed event.\n     *\n     * To validate the response against a poll, call `validateAgainst` after creation.\n     * @param wireFormat - The event.\n     */\n    public constructor(wireFormat: IPartialEvent<PollResponseEventContent>) {\n        super(wireFormat);\n\n        const rel = this.wireContent[\"m.relates_to\"];\n        if (!REFERENCE_RELATION.matches(rel?.rel_type) || typeof rel?.event_id !== \"string\") {\n            throw new InvalidEventError(\"Relationship must be a reference to an event\");\n        }\n\n        this.pollEventId = rel.event_id;\n        this.validateAgainst(null);\n    }\n\n    /**\n     * Validates the poll response using the poll start event as a frame of reference. This\n     * is used to determine if the vote is spoiled, whether the answers are valid, etc.\n     * @param poll - The poll start event.\n     */\n    public validateAgainst(poll: PollStartEvent | null): void {\n        const response = M_POLL_RESPONSE.findIn<PollResponseSubtype>(this.wireContent);\n        if (!Array.isArray(response?.answers)) {\n            this.internalSpoiled = true;\n            this.internalAnswerIds = [];\n            return;\n        }\n\n        let answers = response?.answers ?? [];\n        if (answers.some((a) => typeof a !== \"string\") || answers.length === 0) {\n            this.internalSpoiled = true;\n            this.internalAnswerIds = [];\n            return;\n        }\n\n        if (poll) {\n            if (answers.some((a) => !poll.answers.some((pa) => pa.id === a))) {\n                this.internalSpoiled = true;\n                this.internalAnswerIds = [];\n                return;\n            }\n\n            answers = answers.slice(0, poll.maxSelections);\n        }\n\n        this.internalAnswerIds = answers;\n        this.internalSpoiled = false;\n    }\n\n    public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n        return isEventTypeSame(primaryEventType, M_POLL_RESPONSE);\n    }\n\n    public serialize(): IPartialEvent<object> {\n        return {\n            type: M_POLL_RESPONSE.name,\n            content: {\n                \"m.relates_to\": {\n                    rel_type: REFERENCE_RELATION.name,\n                    event_id: this.pollEventId,\n                },\n                [M_POLL_RESPONSE.name]: {\n                    answers: this.spoiled ? undefined : this.answerIds,\n                },\n            },\n        };\n    }\n\n    /**\n     * Creates a new PollResponseEvent from a set of answers. To spoil the vote, pass an empty\n     * answers array.\n     * @param answers - The user's answers. Should be valid from a poll's answer IDs.\n     * @param pollEventId - The poll start event ID.\n     * @returns The representative poll response event.\n     */\n    public static from(answers: string[], pollEventId: string): PollResponseEvent {\n        return new PollResponseEvent({\n            type: M_POLL_RESPONSE.name,\n            content: {\n                \"m.relates_to\": {\n                    rel_type: REFERENCE_RELATION.name,\n                    event_id: pollEventId,\n                },\n                [M_POLL_RESPONSE.name]: {\n                    answers: answers,\n                },\n            },\n        });\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport {\n    type MatrixEvent,\n    type MatrixClient,\n    type Relations,\n    type Poll,\n    PollEvent,\n    M_POLL_KIND_DISCLOSED,\n    M_POLL_RESPONSE,\n    M_POLL_START,\n    type TimelineEvents,\n} from \"matrix-js-sdk/src/matrix\";\nimport { RelatedRelations } from \"matrix-js-sdk/src/models/related-relations\";\nimport { type PollStartEvent, type PollAnswerSubevent } from \"matrix-js-sdk/src/extensible_events_v1/PollStartEvent\";\nimport { PollResponseEvent } from \"matrix-js-sdk/src/extensible_events_v1/PollResponseEvent\";\nimport PollsIcon from \"@vector-im/compound-design-tokens/assets/web/icons/polls\";\nimport PollsEndIcon from \"@vector-im/compound-design-tokens/assets/web/icons/polls-end\";\n\nimport { _t } from \"../../../languageHandler\";\nimport Modal from \"../../../Modal\";\nimport { type IBodyProps } from \"./IBodyProps\";\nimport { formatList } from \"../../../utils/FormattingUtils\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport ErrorDialog from \"../dialogs/ErrorDialog\";\nimport { type GetRelationsForEvent } from \"../rooms/EventTile\";\nimport PollCreateDialog from \"../elements/PollCreateDialog\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport Spinner from \"../elements/Spinner\";\nimport { PollOption } from \"../polls/PollOption\";\n\ninterface IState {\n    poll?: Poll;\n    // poll instance has fetched at least one page of responses\n    pollInitialised: boolean;\n    selected?: string | null | undefined; // Which option was clicked by the local user\n    voteRelations?: Relations; // Voting (response) events\n}\n\nexport function createVoteRelations(getRelationsForEvent: GetRelationsForEvent, eventId: string): RelatedRelations {\n    const relationsList: Relations[] = [];\n\n    const pollResponseRelations = getRelationsForEvent(eventId, \"m.reference\", M_POLL_RESPONSE.name);\n    if (pollResponseRelations) {\n        relationsList.push(pollResponseRelations);\n    }\n\n    const pollResposnseAltRelations = getRelationsForEvent(eventId, \"m.reference\", M_POLL_RESPONSE.altName);\n    if (pollResposnseAltRelations) {\n        relationsList.push(pollResposnseAltRelations);\n    }\n\n    return new RelatedRelations(relationsList);\n}\n\nexport function findTopAnswer(pollEvent: MatrixEvent, voteRelations: Relations): string {\n    const pollEventId = pollEvent.getId();\n    if (!pollEventId) {\n        logger.warn(\n            \"findTopAnswer: Poll event needs an event ID to fetch relations in order to determine \" +\n                \"the top answer - assuming no best answer\",\n        );\n        return \"\";\n    }\n\n    const poll = pollEvent.unstableExtensibleEvent as PollStartEvent;\n    if (!poll?.isEquivalentTo(M_POLL_START)) {\n        logger.warn(\"Failed to parse poll to determine top answer - assuming no best answer\");\n        return \"\";\n    }\n\n    const findAnswerText = (answerId: string): string => {\n        return poll.answers.find((a) => a.id === answerId)?.text ?? \"\";\n    };\n\n    const userVotes: Map<string, UserVote> = collectUserVotes(allVotes(voteRelations));\n\n    const votes: Map<string, number> = countVotes(userVotes, poll);\n    const highestScore: number = Math.max(...votes.values());\n\n    const bestAnswerIds: string[] = [];\n    for (const [answerId, score] of votes) {\n        if (score == highestScore) {\n            bestAnswerIds.push(answerId);\n        }\n    }\n\n    const bestAnswerTexts = bestAnswerIds.map(findAnswerText);\n\n    return formatList(bestAnswerTexts, 3);\n}\n\nexport function isPollEnded(pollEvent: MatrixEvent, matrixClient: MatrixClient): boolean {\n    const room = matrixClient.getRoom(pollEvent.getRoomId());\n    const poll = room?.polls.get(pollEvent.getId()!);\n    if (!poll || poll.isFetchingResponses) {\n        return false;\n    }\n    return poll.isEnded;\n}\n\nexport function pollAlreadyHasVotes(mxEvent: MatrixEvent, getRelationsForEvent?: GetRelationsForEvent): boolean {\n    if (!getRelationsForEvent) return false;\n\n    const eventId = mxEvent.getId();\n    if (!eventId) return false;\n\n    const voteRelations = createVoteRelations(getRelationsForEvent, eventId);\n    return voteRelations.getRelations().length > 0;\n}\n\nexport function launchPollEditor(mxEvent: MatrixEvent, getRelationsForEvent?: GetRelationsForEvent): void {\n    const room = MatrixClientPeg.safeGet().getRoom(mxEvent.getRoomId());\n    if (pollAlreadyHasVotes(mxEvent, getRelationsForEvent)) {\n        Modal.createDialog(ErrorDialog, {\n            title: _t(\"poll|unable_edit_title\"),\n            description: _t(\"poll|unable_edit_description\"),\n        });\n    } else if (room) {\n        Modal.createDialog(\n            PollCreateDialog,\n            {\n                room,\n                threadId: mxEvent.getThread()?.id,\n                editingMxEvent: mxEvent,\n            },\n            \"mx_CompoundDialog\",\n            false, // isPriorityModal\n            true, // isStaticModal\n        );\n    }\n}\n\nexport default class MPollBody extends React.Component<IBodyProps, IState> {\n    public static contextType = MatrixClientContext;\n    declare public context: React.ContextType<typeof MatrixClientContext>;\n    private seenEventIds: string[] = []; // Events we have already seen\n\n    public constructor(props: IBodyProps) {\n        super(props);\n\n        this.state = {\n            selected: null,\n            pollInitialised: false,\n        };\n    }\n\n    public componentDidMount(): void {\n        const room = this.context?.getRoom(this.props.mxEvent.getRoomId());\n        const poll = room?.polls.get(this.props.mxEvent.getId()!);\n        if (poll) {\n            this.setPollInstance(poll);\n        } else {\n            room?.on(PollEvent.New, this.setPollInstance.bind(this));\n        }\n    }\n\n    public componentWillUnmount(): void {\n        this.removeListeners();\n    }\n\n    private async setPollInstance(poll: Poll): Promise<void> {\n        if (poll.pollId !== this.props.mxEvent.getId()) {\n            return;\n        }\n        this.setState({ poll }, () => {\n            this.addListeners();\n        });\n        const responses = await poll.getResponses();\n        const voteRelations = responses;\n\n        this.setState({ pollInitialised: true, voteRelations });\n    }\n\n    private addListeners(): void {\n        this.state.poll?.on(PollEvent.Responses, this.onResponsesChange);\n        this.state.poll?.on(PollEvent.End, this.onRelationsChange);\n        this.state.poll?.on(PollEvent.UndecryptableRelations, this.render.bind(this));\n    }\n\n    private removeListeners(): void {\n        if (this.state.poll) {\n            this.state.poll.off(PollEvent.Responses, this.onResponsesChange);\n            this.state.poll.off(PollEvent.End, this.onRelationsChange);\n            this.state.poll.off(PollEvent.UndecryptableRelations, this.render.bind(this));\n        }\n    }\n\n    private onResponsesChange = (responses: Relations): void => {\n        this.setState({ voteRelations: responses });\n        this.onRelationsChange();\n    };\n\n    private onRelationsChange = (): void => {\n        // We hold Relations in our state, and they changed under us.\n        // Check whether we should delete our selection, and then\n        // re-render.\n        // Note: re-rendering is a side effect of unselectIfNewEventFromMe().\n        this.unselectIfNewEventFromMe();\n    };\n\n    private selectOption(answerId: string): void {\n        if (this.state.poll?.isEnded) {\n            return;\n        }\n        const userVotes = this.collectUserVotes();\n        const userId = this.context.getSafeUserId();\n        const myVote = userVotes.get(userId)?.answers[0];\n        if (answerId === myVote) {\n            return;\n        }\n\n        const response = PollResponseEvent.from([answerId], this.props.mxEvent.getId()!).serialize();\n\n        this.context\n            .sendEvent(\n                this.props.mxEvent.getRoomId()!,\n                response.type as keyof TimelineEvents,\n                response.content as TimelineEvents[keyof TimelineEvents],\n            )\n            .catch((e: any) => {\n                console.error(\"Failed to submit poll response event:\", e);\n\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"poll|error_voting_title\"),\n                    description: _t(\"poll|error_voting_description\"),\n                });\n            });\n\n        this.setState({ selected: answerId });\n    }\n\n    /**\n     * @returns userId -> UserVote\n     */\n    private collectUserVotes(): Map<string, UserVote> {\n        if (!this.state.voteRelations || !this.context) {\n            return new Map<string, UserVote>();\n        }\n        return collectUserVotes(allVotes(this.state.voteRelations), this.context.getUserId(), this.state.selected);\n    }\n\n    /**\n     * If we've just received a new event that we hadn't seen\n     * before, and that event is me voting (e.g. from a different\n     * device) then forget when the local user selected.\n     *\n     * Either way, calls setState to update our list of events we\n     * have already seen.\n     */\n    private unselectIfNewEventFromMe(): void {\n        const relations = this.state.voteRelations?.getRelations() || [];\n        const newEvents: MatrixEvent[] = relations.filter(\n            (mxEvent: MatrixEvent) => !this.seenEventIds.includes(mxEvent.getId()!),\n        );\n        let newSelected = this.state.selected;\n\n        if (newEvents.length > 0) {\n            for (const mxEvent of newEvents) {\n                if (mxEvent.getSender() === this.context.getUserId()) {\n                    newSelected = null;\n                }\n            }\n        }\n        const newEventIds = newEvents.map((mxEvent: MatrixEvent) => mxEvent.getId()!);\n        this.seenEventIds = this.seenEventIds.concat(newEventIds);\n        this.setState({ selected: newSelected });\n    }\n\n    private totalVotes(collectedVotes: Map<string, number>): number {\n        let sum = 0;\n        for (const v of collectedVotes.values()) {\n            sum += v;\n        }\n        return sum;\n    }\n\n    public render(): ReactNode {\n        const { poll, pollInitialised } = this.state;\n        if (!poll?.pollEvent) {\n            return null;\n        }\n\n        const pollEvent = poll.pollEvent;\n\n        const pollId = this.props.mxEvent.getId()!;\n        const isFetchingResponses = !pollInitialised || poll.isFetchingResponses;\n        const userVotes = this.collectUserVotes();\n        const votes = countVotes(userVotes, pollEvent);\n        const totalVotes = this.totalVotes(votes);\n        const winCount = Math.max(...votes.values());\n        const userId = this.context.getSafeUserId();\n        const myVote = userVotes?.get(userId)?.answers[0];\n        const disclosed = M_POLL_KIND_DISCLOSED.matches(pollEvent.kind.name);\n\n        // Disclosed: votes are hidden until I vote or the poll ends\n        // Undisclosed: votes are hidden until poll ends\n        const showResults = poll.isEnded || (disclosed && myVote !== undefined);\n\n        let totalText: string;\n        if (showResults && poll.undecryptableRelationsCount) {\n            totalText = _t(\"poll|total_decryption_errors\");\n        } else if (poll.isEnded) {\n            totalText = _t(\"right_panel|poll|final_result\", { count: totalVotes });\n        } else if (!disclosed) {\n            totalText = _t(\"poll|total_not_ended\");\n        } else if (myVote === undefined) {\n            if (totalVotes === 0) {\n                totalText = _t(\"poll|total_no_votes\");\n            } else {\n                totalText = _t(\"poll|total_n_votes\", { count: totalVotes });\n            }\n        } else {\n            totalText = _t(\"poll|total_n_votes_voted\", { count: totalVotes });\n        }\n\n        const editedSpan = this.props.mxEvent.replacingEvent() ? (\n            <span className=\"mx_MPollBody_edited\"> ({_t(\"common|edited\")})</span>\n        ) : null;\n\n        const PollIcon = poll.isEnded ? PollsEndIcon : PollsIcon;\n        const pollLabel = poll.isEnded ? _t(\"poll|ended_poll_label\") : _t(\"poll|poll_label\");\n\n        return (\n            <fieldset className=\"mx_MPollBody\">\n                <legend data-testid=\"pollQuestion\">\n                    <PollIcon width=\"20\" height=\"20\" aria-label={pollLabel} />\n                    {pollEvent.question.text}\n                    {editedSpan}\n                </legend>\n                <div className=\"mx_MPollBody_allOptions\">\n                    {pollEvent.answers.map((answer: PollAnswerSubevent, index: number) => {\n                        let answerVotes = 0;\n\n                        if (showResults) {\n                            answerVotes = votes.get(answer.id) ?? 0;\n                        }\n\n                        const checked =\n                            (!poll.isEnded && myVote === answer.id) || (poll.isEnded && answerVotes === winCount);\n\n                        return (\n                            <PollOption\n                                key={answer.id}\n                                pollId={pollId}\n                                answer={answer}\n                                optionNumber={index + 1}\n                                isChecked={checked}\n                                isEnded={poll.isEnded}\n                                voteCount={answerVotes}\n                                totalVoteCount={totalVotes}\n                                displayVoteCount={showResults}\n                                onOptionSelected={this.selectOption.bind(this)}\n                            />\n                        );\n                    })}\n                </div>\n                <div data-testid=\"totalVotes\" className=\"mx_MPollBody_totalVotes\">\n                    {totalText}\n                    {isFetchingResponses && <Spinner size={16} />}\n                </div>\n            </fieldset>\n        );\n    }\n}\nexport class UserVote {\n    public constructor(\n        public readonly ts: number,\n        public readonly sender: string,\n        public readonly answers: string[],\n    ) {}\n}\n\nfunction userResponseFromPollResponseEvent(event: MatrixEvent): UserVote {\n    const response = event.unstableExtensibleEvent as PollResponseEvent;\n    if (!response?.isEquivalentTo(M_POLL_RESPONSE)) {\n        throw new Error(\"Failed to parse Poll Response Event to determine user response\");\n    }\n\n    return new UserVote(event.getTs(), event.getSender()!, response.answerIds);\n}\n\nexport function allVotes(voteRelations: Relations): Array<UserVote> {\n    if (voteRelations) {\n        return voteRelations\n            .getRelations()\n            .filter((e) => !e.isRedacted())\n            .map(userResponseFromPollResponseEvent);\n    } else {\n        return [];\n    }\n}\n\n/**\n * Figure out the correct vote for each user.\n * @param userResponses current vote responses in the poll\n * @param {string?} userId The userId for which the `selected` option will apply to.\n *                  Should be set to the current user ID.\n * @param {string?} selected Local echo selected option for the userId\n * @returns a Map of user ID to their vote info\n */\nexport function collectUserVotes(\n    userResponses: Array<UserVote>,\n    userId?: string | null | undefined,\n    selected?: string | null | undefined,\n): Map<string, UserVote> {\n    const userVotes: Map<string, UserVote> = new Map();\n\n    for (const response of userResponses) {\n        const otherResponse = userVotes.get(response.sender);\n        if (!otherResponse || otherResponse.ts < response.ts) {\n            userVotes.set(response.sender, response);\n        }\n    }\n\n    if (selected && userId) {\n        userVotes.set(userId, new UserVote(0, userId, [selected]));\n    }\n\n    return userVotes;\n}\n\nexport function countVotes(userVotes: Map<string, UserVote>, pollStart: PollStartEvent): Map<string, number> {\n    const collected = new Map<string, number>();\n\n    for (const response of userVotes.values()) {\n        const tempResponse = PollResponseEvent.from(response.answers, \"$irrelevant\");\n        tempResponse.validateAgainst(pollStart);\n        if (!tempResponse.spoiled) {\n            for (const answerId of tempResponse.answerIds) {\n                if (collected.has(answerId)) {\n                    collected.set(answerId, collected.get(answerId)! + 1);\n                } else {\n                    collected.set(answerId, 1);\n                }\n            }\n        }\n    }\n\n    return collected;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021, 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { EventType, type MatrixEvent, type Room } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { type Playback, PlaybackState } from \"./Playback\";\nimport { UPDATE_EVENT } from \"../stores/AsyncStore\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport { arrayFastClone } from \"../utils/arrays\";\nimport { PlaybackManager } from \"./PlaybackManager\";\nimport { isVoiceMessage } from \"../utils/EventUtils\";\nimport { type RoomViewStore } from \"../stores/RoomViewStore\";\n\n/**\n * Audio playback queue management for a given room. This keeps track of where the user\n * was at for each playback, what order the playbacks were played in, and triggers subsequent\n * playbacks.\n *\n * Currently this is only intended to be used by voice messages.\n *\n * The primary mechanics are:\n * * Persisted clock state for each playback instance (tied to Event ID).\n * * Limited memory of playback order (see code; not persisted).\n * * Autoplay of next eligible playback instance.\n */\nexport class PlaybackQueue {\n    private static queues = new Map<string, PlaybackQueue>(); // keyed by room ID\n\n    private playbacks = new Map<string, Playback>(); // keyed by event ID\n    private clockStates = new Map<string, number>(); // keyed by event ID\n    private playbackIdOrder: string[] = []; // event IDs, last == current\n    private currentPlaybackId: string | null = null; // event ID, broken out from above for ease of use\n    private recentFullPlays = new Set<string>(); // event IDs\n\n    /**\n     * Create a PlaybackQueue for a given room.\n     * @param room The room\n     * @param roomViewStore The RoomViewStore instance\n     */\n    public constructor(\n        private room: Room,\n        private roomViewStore: RoomViewStore,\n    ) {\n        this.loadClocks();\n\n        this.roomViewStore.addRoomListener(this.room.roomId, (isActive) => {\n            if (!isActive) return;\n\n            // Reset the state of the playbacks before they start mounting and enqueuing updates.\n            // We reset the entirety of the queue, including order, to ensure the user isn't left\n            // confused with what order the messages are playing in.\n            this.currentPlaybackId = null; // this in particular stops autoplay when the room is switched to\n            this.recentFullPlays = new Set<string>();\n            this.playbackIdOrder = [];\n        });\n    }\n\n    /**\n     * Get the PlaybackQueue for a given room, creating it if necessary.\n     * @param roomId The ID of the room\n     * @param roomViewStore The RoomViewStore instance\n     * @returns The PlaybackQueue for the room\n     */\n    public static forRoom(roomId: string, roomViewStore: RoomViewStore): PlaybackQueue {\n        const cli = MatrixClientPeg.safeGet();\n        const room = cli.getRoom(roomId);\n        if (!room) throw new Error(\"Unknown room\");\n        if (PlaybackQueue.queues.has(room.roomId)) {\n            return PlaybackQueue.queues.get(room.roomId)!;\n        }\n        const queue = new PlaybackQueue(room, roomViewStore);\n        PlaybackQueue.queues.set(room.roomId, queue);\n        return queue;\n    }\n\n    private persistClocks(): void {\n        localStorage.setItem(\n            `mx_voice_message_clocks_${this.room.roomId}`,\n            JSON.stringify(Array.from(this.clockStates.entries())),\n        );\n    }\n\n    private loadClocks(): void {\n        const val = localStorage.getItem(`mx_voice_message_clocks_${this.room.roomId}`);\n        if (!!val) {\n            this.clockStates = new Map<string, number>(JSON.parse(val));\n            // Clean out any null values (from older versions)\n            for (const [key, value] of this.clockStates.entries()) {\n                if (value == null) {\n                    this.clockStates.delete(key);\n                }\n            }\n        }\n    }\n\n    public unsortedEnqueue(mxEvent: MatrixEvent, playback: Playback): void {\n        // We don't ever detach our listeners: we expect the Playback to clean up for us\n        this.playbacks.set(mxEvent.getId()!, playback);\n        playback.on(UPDATE_EVENT, (state) => this.onPlaybackStateChange(playback, mxEvent, state));\n        playback.clockInfo.liveData.onUpdate((clock) => this.onPlaybackClock(playback, mxEvent, clock));\n    }\n\n    private onPlaybackStateChange(playback: Playback, mxEvent: MatrixEvent, newState: PlaybackState): void {\n        // Remember where the user got to in playback\n        const wasLastPlaying = this.currentPlaybackId === mxEvent.getId();\n        const currentClockState = this.clockStates.get(mxEvent.getId()!);\n\n        if (newState === PlaybackState.Stopped && currentClockState !== undefined && !wasLastPlaying) {\n            // noinspection JSIgnoredPromiseFromCall\n            playback.skipTo(currentClockState);\n        } else if (newState === PlaybackState.Stopped) {\n            // Remove the now-useless clock for some space savings\n            this.clockStates.delete(mxEvent.getId()!);\n\n            if (wasLastPlaying && this.currentPlaybackId) {\n                this.recentFullPlays.add(this.currentPlaybackId);\n                const orderClone = arrayFastClone(this.playbackIdOrder);\n                const last = orderClone.pop();\n                if (last === this.currentPlaybackId) {\n                    const next = orderClone.pop();\n                    if (next) {\n                        const instance = this.playbacks.get(next);\n                        if (!instance) {\n                            logger.warn(\n                                \"Voice message queue desync: Missing playback for next message: \" +\n                                    `Current=${this.currentPlaybackId} Last=${last} Next=${next}`,\n                            );\n                        } else {\n                            this.playbackIdOrder = orderClone;\n                            PlaybackManager.instance.pauseAllExcept(instance);\n\n                            // This should cause a Play event, which will re-populate our playback order\n                            // and update our current playback ID.\n                            // noinspection JSIgnoredPromiseFromCall\n                            instance.play();\n                        }\n                    } else {\n                        // else no explicit next event, so find an event we haven't played that comes next. The live\n                        // timeline is already most recent last, so we can iterate down that.\n                        const timeline = arrayFastClone(this.room.getLiveTimeline().getEvents());\n                        let scanForVoiceMessage = false;\n                        let nextEv: MatrixEvent | undefined;\n                        for (const event of timeline) {\n                            if (event.getId() === mxEvent.getId()) {\n                                scanForVoiceMessage = true;\n                                continue;\n                            }\n                            if (!scanForVoiceMessage) continue;\n\n                            if (!isVoiceMessage(event)) {\n                                const evType = event.getType();\n                                if (evType !== EventType.RoomMessage && evType !== EventType.Sticker) {\n                                    continue; // Event can be skipped for automatic playback consideration\n                                }\n                                break; // Stop automatic playback: next useful event is not a voice message\n                            }\n\n                            const havePlayback = this.playbacks.has(event.getId()!);\n                            const isRecentlyCompleted = this.recentFullPlays.has(event.getId()!);\n                            if (havePlayback && !isRecentlyCompleted) {\n                                nextEv = event;\n                                break;\n                            }\n                        }\n                        if (!nextEv) {\n                            // if we don't have anywhere to go, reset the recent playback queue so the user\n                            // can start a new chain of playbacks.\n                            this.recentFullPlays = new Set<string>();\n                            this.playbackIdOrder = [];\n                        } else {\n                            this.playbackIdOrder = orderClone;\n\n                            const instance = this.playbacks.get(nextEv.getId()!);\n                            PlaybackManager.instance.pauseAllExcept(instance);\n\n                            // This should cause a Play event, which will re-populate our playback order\n                            // and update our current playback ID.\n                            // noinspection JSIgnoredPromiseFromCall\n                            instance?.play();\n                        }\n                    }\n                } else {\n                    logger.warn(\n                        \"Voice message queue desync: Expected playback stop to be last in order. \" +\n                            `Current=${this.currentPlaybackId} Last=${last} EventID=${mxEvent.getId()}`,\n                    );\n                }\n            }\n        }\n\n        if (newState === PlaybackState.Playing) {\n            const order = this.playbackIdOrder;\n            if (this.currentPlaybackId !== mxEvent.getId() && !!this.currentPlaybackId) {\n                if (order.length === 0 || order[order.length - 1] !== this.currentPlaybackId) {\n                    const lastInstance = this.playbacks.get(this.currentPlaybackId);\n                    if (\n                        lastInstance &&\n                        [PlaybackState.Playing, PlaybackState.Paused].includes(lastInstance.currentState)\n                    ) {\n                        order.push(this.currentPlaybackId);\n                    }\n                }\n            }\n\n            this.currentPlaybackId = mxEvent.getId()!;\n            if (order.length === 0 || order[order.length - 1] !== this.currentPlaybackId) {\n                order.push(this.currentPlaybackId);\n            }\n        }\n\n        // Only persist clock information on pause/stop (end) to avoid overwhelming the storage.\n        // This should get triggered from normal voice message component unmount due to the playback\n        // stopping itself for cleanup.\n        if (newState === PlaybackState.Paused || newState === PlaybackState.Stopped) {\n            this.persistClocks();\n        }\n    }\n\n    private onPlaybackClock(playback: Playback, mxEvent: MatrixEvent, clocks: number[]): void {\n        if (playback.currentState !== PlaybackState.Playing && playback.currentState !== PlaybackState.Paused) return; // ignore pre-ready values\n\n        this.clockStates.set(mxEvent.getId()!, clocks[0]); // [0] is the current seek position\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport InlineSpinner from \"../elements/InlineSpinner\";\nimport { _t } from \"../../../languageHandler\";\nimport RecordingPlayback from \"../audio_messages/RecordingPlayback\";\nimport MAudioBody from \"./MAudioBody\";\nimport MediaProcessingError from \"./shared/MediaProcessingError\";\nimport { isVoiceMessage } from \"../../../utils/EventUtils\";\nimport { PlaybackQueue } from \"../../../audio/PlaybackQueue\";\nimport { type Playback } from \"../../../audio/Playback\";\nimport RoomContext from \"../../../contexts/RoomContext\";\nimport { FileBodyFactory, renderMBody } from \"./MBodyFactory\";\n\nexport default class MVoiceMessageBody extends MAudioBody {\n    public static contextType = RoomContext;\n    declare public context: React.ContextType<typeof RoomContext>;\n\n    protected onMount(playback: Playback): void {\n        if (isVoiceMessage(this.props.mxEvent)) {\n            PlaybackQueue.forRoom(this.props.mxEvent.getRoomId()!, this.context.roomViewStore).unsortedEnqueue(\n                this.props.mxEvent,\n                playback,\n            );\n        }\n    }\n\n    // A voice message is an audio file but rendered in a special way.\n    public render(): React.ReactNode {\n        if (this.state.error) {\n            return (\n                <MediaProcessingError className=\"mx_MVoiceMessageBody\">\n                    {_t(\"timeline|m.audio|error_processing_voice_message\")}\n                </MediaProcessingError>\n            );\n        }\n\n        if (!this.state.playback) {\n            return (\n                <span className=\"mx_MVoiceMessageBody\">\n                    <InlineSpinner />\n                </span>\n            );\n        }\n\n        // At this point we should have a playable state\n        return (\n            <span className=\"mx_MVoiceMessageBody\">\n                <RecordingPlayback playback={this.state.playback} />\n                {this.showFileBody && renderMBody({ ...this.props, showFileInfo: false }, FileBodyFactory)}\n            </span>\n        );\n    }\n}\n","const types = {\n    'application/prs.cww': ['cww'],\n    'application/prs.xsf+xml': ['xsf'],\n    'application/vnd.1000minds.decision-model+xml': ['1km'],\n    'application/vnd.3gpp.pic-bw-large': ['plb'],\n    'application/vnd.3gpp.pic-bw-small': ['psb'],\n    'application/vnd.3gpp.pic-bw-var': ['pvb'],\n    'application/vnd.3gpp2.tcap': ['tcap'],\n    'application/vnd.3m.post-it-notes': ['pwn'],\n    'application/vnd.accpac.simply.aso': ['aso'],\n    'application/vnd.accpac.simply.imp': ['imp'],\n    'application/vnd.acucobol': ['acu'],\n    'application/vnd.acucorp': ['atc', 'acutc'],\n    'application/vnd.adobe.air-application-installer-package+zip': ['air'],\n    'application/vnd.adobe.formscentral.fcdt': ['fcdt'],\n    'application/vnd.adobe.fxp': ['fxp', 'fxpl'],\n    'application/vnd.adobe.xdp+xml': ['xdp'],\n    'application/vnd.adobe.xfdf': ['*xfdf'],\n    'application/vnd.age': ['age'],\n    'application/vnd.ahead.space': ['ahead'],\n    'application/vnd.airzip.filesecure.azf': ['azf'],\n    'application/vnd.airzip.filesecure.azs': ['azs'],\n    'application/vnd.amazon.ebook': ['azw'],\n    'application/vnd.americandynamics.acc': ['acc'],\n    'application/vnd.amiga.ami': ['ami'],\n    'application/vnd.android.package-archive': ['apk'],\n    'application/vnd.anser-web-certificate-issue-initiation': ['cii'],\n    'application/vnd.anser-web-funds-transfer-initiation': ['fti'],\n    'application/vnd.antix.game-component': ['atx'],\n    'application/vnd.apple.installer+xml': ['mpkg'],\n    'application/vnd.apple.keynote': ['key'],\n    'application/vnd.apple.mpegurl': ['m3u8'],\n    'application/vnd.apple.numbers': ['numbers'],\n    'application/vnd.apple.pages': ['pages'],\n    'application/vnd.apple.pkpass': ['pkpass'],\n    'application/vnd.aristanetworks.swi': ['swi'],\n    'application/vnd.astraea-software.iota': ['iota'],\n    'application/vnd.audiograph': ['aep'],\n    'application/vnd.autodesk.fbx': ['fbx'],\n    'application/vnd.balsamiq.bmml+xml': ['bmml'],\n    'application/vnd.blueice.multipass': ['mpm'],\n    'application/vnd.bmi': ['bmi'],\n    'application/vnd.businessobjects': ['rep'],\n    'application/vnd.chemdraw+xml': ['cdxml'],\n    'application/vnd.chipnuts.karaoke-mmd': ['mmd'],\n    'application/vnd.cinderella': ['cdy'],\n    'application/vnd.citationstyles.style+xml': ['csl'],\n    'application/vnd.claymore': ['cla'],\n    'application/vnd.cloanto.rp9': ['rp9'],\n    'application/vnd.clonk.c4group': ['c4g', 'c4d', 'c4f', 'c4p', 'c4u'],\n    'application/vnd.cluetrust.cartomobile-config': ['c11amc'],\n    'application/vnd.cluetrust.cartomobile-config-pkg': ['c11amz'],\n    'application/vnd.commonspace': ['csp'],\n    'application/vnd.contact.cmsg': ['cdbcmsg'],\n    'application/vnd.cosmocaller': ['cmc'],\n    'application/vnd.crick.clicker': ['clkx'],\n    'application/vnd.crick.clicker.keyboard': ['clkk'],\n    'application/vnd.crick.clicker.palette': ['clkp'],\n    'application/vnd.crick.clicker.template': ['clkt'],\n    'application/vnd.crick.clicker.wordbank': ['clkw'],\n    'application/vnd.criticaltools.wbs+xml': ['wbs'],\n    'application/vnd.ctc-posml': ['pml'],\n    'application/vnd.cups-ppd': ['ppd'],\n    'application/vnd.curl.car': ['car'],\n    'application/vnd.curl.pcurl': ['pcurl'],\n    'application/vnd.dart': ['dart'],\n    'application/vnd.data-vision.rdz': ['rdz'],\n    'application/vnd.dbf': ['dbf'],\n    'application/vnd.dcmp+xml': ['dcmp'],\n    'application/vnd.dece.data': ['uvf', 'uvvf', 'uvd', 'uvvd'],\n    'application/vnd.dece.ttml+xml': ['uvt', 'uvvt'],\n    'application/vnd.dece.unspecified': ['uvx', 'uvvx'],\n    'application/vnd.dece.zip': ['uvz', 'uvvz'],\n    'application/vnd.denovo.fcselayout-link': ['fe_launch'],\n    'application/vnd.dna': ['dna'],\n    'application/vnd.dolby.mlp': ['mlp'],\n    'application/vnd.dpgraph': ['dpg'],\n    'application/vnd.dreamfactory': ['dfac'],\n    'application/vnd.ds-keypoint': ['kpxx'],\n    'application/vnd.dvb.ait': ['ait'],\n    'application/vnd.dvb.service': ['svc'],\n    'application/vnd.dynageo': ['geo'],\n    'application/vnd.ecowin.chart': ['mag'],\n    'application/vnd.enliven': ['nml'],\n    'application/vnd.epson.esf': ['esf'],\n    'application/vnd.epson.msf': ['msf'],\n    'application/vnd.epson.quickanime': ['qam'],\n    'application/vnd.epson.salt': ['slt'],\n    'application/vnd.epson.ssf': ['ssf'],\n    'application/vnd.eszigno3+xml': ['es3', 'et3'],\n    'application/vnd.ezpix-album': ['ez2'],\n    'application/vnd.ezpix-package': ['ez3'],\n    'application/vnd.fdf': ['*fdf'],\n    'application/vnd.fdsn.mseed': ['mseed'],\n    'application/vnd.fdsn.seed': ['seed', 'dataless'],\n    'application/vnd.flographit': ['gph'],\n    'application/vnd.fluxtime.clip': ['ftc'],\n    'application/vnd.framemaker': ['fm', 'frame', 'maker', 'book'],\n    'application/vnd.frogans.fnc': ['fnc'],\n    'application/vnd.frogans.ltf': ['ltf'],\n    'application/vnd.fsc.weblaunch': ['fsc'],\n    'application/vnd.fujitsu.oasys': ['oas'],\n    'application/vnd.fujitsu.oasys2': ['oa2'],\n    'application/vnd.fujitsu.oasys3': ['oa3'],\n    'application/vnd.fujitsu.oasysgp': ['fg5'],\n    'application/vnd.fujitsu.oasysprs': ['bh2'],\n    'application/vnd.fujixerox.ddd': ['ddd'],\n    'application/vnd.fujixerox.docuworks': ['xdw'],\n    'application/vnd.fujixerox.docuworks.binder': ['xbd'],\n    'application/vnd.fuzzysheet': ['fzs'],\n    'application/vnd.genomatix.tuxedo': ['txd'],\n    'application/vnd.geogebra.file': ['ggb'],\n    'application/vnd.geogebra.slides': ['ggs'],\n    'application/vnd.geogebra.tool': ['ggt'],\n    'application/vnd.geometry-explorer': ['gex', 'gre'],\n    'application/vnd.geonext': ['gxt'],\n    'application/vnd.geoplan': ['g2w'],\n    'application/vnd.geospace': ['g3w'],\n    'application/vnd.gmx': ['gmx'],\n    'application/vnd.google-apps.document': ['gdoc'],\n    'application/vnd.google-apps.drawing': ['gdraw'],\n    'application/vnd.google-apps.form': ['gform'],\n    'application/vnd.google-apps.jam': ['gjam'],\n    'application/vnd.google-apps.map': ['gmap'],\n    'application/vnd.google-apps.presentation': ['gslides'],\n    'application/vnd.google-apps.script': ['gscript'],\n    'application/vnd.google-apps.site': ['gsite'],\n    'application/vnd.google-apps.spreadsheet': ['gsheet'],\n    'application/vnd.google-earth.kml+xml': ['kml'],\n    'application/vnd.google-earth.kmz': ['kmz'],\n    'application/vnd.gov.sk.xmldatacontainer+xml': ['xdcf'],\n    'application/vnd.grafeq': ['gqf', 'gqs'],\n    'application/vnd.groove-account': ['gac'],\n    'application/vnd.groove-help': ['ghf'],\n    'application/vnd.groove-identity-message': ['gim'],\n    'application/vnd.groove-injector': ['grv'],\n    'application/vnd.groove-tool-message': ['gtm'],\n    'application/vnd.groove-tool-template': ['tpl'],\n    'application/vnd.groove-vcard': ['vcg'],\n    'application/vnd.hal+xml': ['hal'],\n    'application/vnd.handheld-entertainment+xml': ['zmm'],\n    'application/vnd.hbci': ['hbci'],\n    'application/vnd.hhe.lesson-player': ['les'],\n    'application/vnd.hp-hpgl': ['hpgl'],\n    'application/vnd.hp-hpid': ['hpid'],\n    'application/vnd.hp-hps': ['hps'],\n    'application/vnd.hp-jlyt': ['jlt'],\n    'application/vnd.hp-pcl': ['pcl'],\n    'application/vnd.hp-pclxl': ['pclxl'],\n    'application/vnd.hydrostatix.sof-data': ['sfd-hdstx'],\n    'application/vnd.ibm.minipay': ['mpy'],\n    'application/vnd.ibm.modcap': ['afp', 'listafp', 'list3820'],\n    'application/vnd.ibm.rights-management': ['irm'],\n    'application/vnd.ibm.secure-container': ['sc'],\n    'application/vnd.iccprofile': ['icc', 'icm'],\n    'application/vnd.igloader': ['igl'],\n    'application/vnd.immervision-ivp': ['ivp'],\n    'application/vnd.immervision-ivu': ['ivu'],\n    'application/vnd.insors.igm': ['igm'],\n    'application/vnd.intercon.formnet': ['xpw', 'xpx'],\n    'application/vnd.intergeo': ['i2g'],\n    'application/vnd.intu.qbo': ['qbo'],\n    'application/vnd.intu.qfx': ['qfx'],\n    'application/vnd.ipunplugged.rcprofile': ['rcprofile'],\n    'application/vnd.irepository.package+xml': ['irp'],\n    'application/vnd.is-xpr': ['xpr'],\n    'application/vnd.isac.fcs': ['fcs'],\n    'application/vnd.jam': ['jam'],\n    'application/vnd.jcp.javame.midlet-rms': ['rms'],\n    'application/vnd.jisp': ['jisp'],\n    'application/vnd.joost.joda-archive': ['joda'],\n    'application/vnd.kahootz': ['ktz', 'ktr'],\n    'application/vnd.kde.karbon': ['karbon'],\n    'application/vnd.kde.kchart': ['chrt'],\n    'application/vnd.kde.kformula': ['kfo'],\n    'application/vnd.kde.kivio': ['flw'],\n    'application/vnd.kde.kontour': ['kon'],\n    'application/vnd.kde.kpresenter': ['kpr', 'kpt'],\n    'application/vnd.kde.kspread': ['ksp'],\n    'application/vnd.kde.kword': ['kwd', 'kwt'],\n    'application/vnd.kenameaapp': ['htke'],\n    'application/vnd.kidspiration': ['kia'],\n    'application/vnd.kinar': ['kne', 'knp'],\n    'application/vnd.koan': ['skp', 'skd', 'skt', 'skm'],\n    'application/vnd.kodak-descriptor': ['sse'],\n    'application/vnd.las.las+xml': ['lasxml'],\n    'application/vnd.llamagraphics.life-balance.desktop': ['lbd'],\n    'application/vnd.llamagraphics.life-balance.exchange+xml': ['lbe'],\n    'application/vnd.lotus-1-2-3': ['123'],\n    'application/vnd.lotus-approach': ['apr'],\n    'application/vnd.lotus-freelance': ['pre'],\n    'application/vnd.lotus-notes': ['nsf'],\n    'application/vnd.lotus-organizer': ['org'],\n    'application/vnd.lotus-screencam': ['scm'],\n    'application/vnd.lotus-wordpro': ['lwp'],\n    'application/vnd.macports.portpkg': ['portpkg'],\n    'application/vnd.mapbox-vector-tile': ['mvt'],\n    'application/vnd.mcd': ['mcd'],\n    'application/vnd.medcalcdata': ['mc1'],\n    'application/vnd.mediastation.cdkey': ['cdkey'],\n    'application/vnd.mfer': ['mwf'],\n    'application/vnd.mfmp': ['mfm'],\n    'application/vnd.micrografx.flo': ['flo'],\n    'application/vnd.micrografx.igx': ['igx'],\n    'application/vnd.mif': ['mif'],\n    'application/vnd.mobius.daf': ['daf'],\n    'application/vnd.mobius.dis': ['dis'],\n    'application/vnd.mobius.mbk': ['mbk'],\n    'application/vnd.mobius.mqy': ['mqy'],\n    'application/vnd.mobius.msl': ['msl'],\n    'application/vnd.mobius.plc': ['plc'],\n    'application/vnd.mobius.txf': ['txf'],\n    'application/vnd.mophun.application': ['mpn'],\n    'application/vnd.mophun.certificate': ['mpc'],\n    'application/vnd.mozilla.xul+xml': ['xul'],\n    'application/vnd.ms-artgalry': ['cil'],\n    'application/vnd.ms-cab-compressed': ['cab'],\n    'application/vnd.ms-excel': ['xls', 'xlm', 'xla', 'xlc', 'xlt', 'xlw'],\n    'application/vnd.ms-excel.addin.macroenabled.12': ['xlam'],\n    'application/vnd.ms-excel.sheet.binary.macroenabled.12': ['xlsb'],\n    'application/vnd.ms-excel.sheet.macroenabled.12': ['xlsm'],\n    'application/vnd.ms-excel.template.macroenabled.12': ['xltm'],\n    'application/vnd.ms-fontobject': ['eot'],\n    'application/vnd.ms-htmlhelp': ['chm'],\n    'application/vnd.ms-ims': ['ims'],\n    'application/vnd.ms-lrm': ['lrm'],\n    'application/vnd.ms-officetheme': ['thmx'],\n    'application/vnd.ms-outlook': ['msg'],\n    'application/vnd.ms-pki.seccat': ['cat'],\n    'application/vnd.ms-pki.stl': ['*stl'],\n    'application/vnd.ms-powerpoint': ['ppt', 'pps', 'pot'],\n    'application/vnd.ms-powerpoint.addin.macroenabled.12': ['ppam'],\n    'application/vnd.ms-powerpoint.presentation.macroenabled.12': ['pptm'],\n    'application/vnd.ms-powerpoint.slide.macroenabled.12': ['sldm'],\n    'application/vnd.ms-powerpoint.slideshow.macroenabled.12': ['ppsm'],\n    'application/vnd.ms-powerpoint.template.macroenabled.12': ['potm'],\n    'application/vnd.ms-project': ['*mpp', 'mpt'],\n    'application/vnd.ms-visio.viewer': ['vdx'],\n    'application/vnd.ms-word.document.macroenabled.12': ['docm'],\n    'application/vnd.ms-word.template.macroenabled.12': ['dotm'],\n    'application/vnd.ms-works': ['wps', 'wks', 'wcm', 'wdb'],\n    'application/vnd.ms-wpl': ['wpl'],\n    'application/vnd.ms-xpsdocument': ['xps'],\n    'application/vnd.mseq': ['mseq'],\n    'application/vnd.musician': ['mus'],\n    'application/vnd.muvee.style': ['msty'],\n    'application/vnd.mynfc': ['taglet'],\n    'application/vnd.nato.bindingdataobject+xml': ['bdo'],\n    'application/vnd.neurolanguage.nlu': ['nlu'],\n    'application/vnd.nitf': ['ntf', 'nitf'],\n    'application/vnd.noblenet-directory': ['nnd'],\n    'application/vnd.noblenet-sealer': ['nns'],\n    'application/vnd.noblenet-web': ['nnw'],\n    'application/vnd.nokia.n-gage.ac+xml': ['*ac'],\n    'application/vnd.nokia.n-gage.data': ['ngdat'],\n    'application/vnd.nokia.n-gage.symbian.install': ['n-gage'],\n    'application/vnd.nokia.radio-preset': ['rpst'],\n    'application/vnd.nokia.radio-presets': ['rpss'],\n    'application/vnd.novadigm.edm': ['edm'],\n    'application/vnd.novadigm.edx': ['edx'],\n    'application/vnd.novadigm.ext': ['ext'],\n    'application/vnd.oasis.opendocument.chart': ['odc'],\n    'application/vnd.oasis.opendocument.chart-template': ['otc'],\n    'application/vnd.oasis.opendocument.database': ['odb'],\n    'application/vnd.oasis.opendocument.formula': ['odf'],\n    'application/vnd.oasis.opendocument.formula-template': ['odft'],\n    'application/vnd.oasis.opendocument.graphics': ['odg'],\n    'application/vnd.oasis.opendocument.graphics-template': ['otg'],\n    'application/vnd.oasis.opendocument.image': ['odi'],\n    'application/vnd.oasis.opendocument.image-template': ['oti'],\n    'application/vnd.oasis.opendocument.presentation': ['odp'],\n    'application/vnd.oasis.opendocument.presentation-template': ['otp'],\n    'application/vnd.oasis.opendocument.spreadsheet': ['ods'],\n    'application/vnd.oasis.opendocument.spreadsheet-template': ['ots'],\n    'application/vnd.oasis.opendocument.text': ['odt'],\n    'application/vnd.oasis.opendocument.text-master': ['odm'],\n    'application/vnd.oasis.opendocument.text-template': ['ott'],\n    'application/vnd.oasis.opendocument.text-web': ['oth'],\n    'application/vnd.olpc-sugar': ['xo'],\n    'application/vnd.oma.dd2+xml': ['dd2'],\n    'application/vnd.openblox.game+xml': ['obgx'],\n    'application/vnd.openofficeorg.extension': ['oxt'],\n    'application/vnd.openstreetmap.data+xml': ['osm'],\n    'application/vnd.openxmlformats-officedocument.presentationml.presentation': [\n        'pptx',\n    ],\n    'application/vnd.openxmlformats-officedocument.presentationml.slide': [\n        'sldx',\n    ],\n    'application/vnd.openxmlformats-officedocument.presentationml.slideshow': [\n        'ppsx',\n    ],\n    'application/vnd.openxmlformats-officedocument.presentationml.template': [\n        'potx',\n    ],\n    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': ['xlsx'],\n    'application/vnd.openxmlformats-officedocument.spreadsheetml.template': [\n        'xltx',\n    ],\n    'application/vnd.openxmlformats-officedocument.wordprocessingml.document': [\n        'docx',\n    ],\n    'application/vnd.openxmlformats-officedocument.wordprocessingml.template': [\n        'dotx',\n    ],\n    'application/vnd.osgeo.mapguide.package': ['mgp'],\n    'application/vnd.osgi.dp': ['dp'],\n    'application/vnd.osgi.subsystem': ['esa'],\n    'application/vnd.palm': ['pdb', 'pqa', 'oprc'],\n    'application/vnd.pawaafile': ['paw'],\n    'application/vnd.pg.format': ['str'],\n    'application/vnd.pg.osasli': ['ei6'],\n    'application/vnd.picsel': ['efif'],\n    'application/vnd.pmi.widget': ['wg'],\n    'application/vnd.pocketlearn': ['plf'],\n    'application/vnd.powerbuilder6': ['pbd'],\n    'application/vnd.previewsystems.box': ['box'],\n    'application/vnd.procrate.brushset': ['brushset'],\n    'application/vnd.procreate.brush': ['brush'],\n    'application/vnd.procreate.dream': ['drm'],\n    'application/vnd.proteus.magazine': ['mgz'],\n    'application/vnd.publishare-delta-tree': ['qps'],\n    'application/vnd.pvi.ptid1': ['ptid'],\n    'application/vnd.pwg-xhtml-print+xml': ['xhtm'],\n    'application/vnd.quark.quarkxpress': [\n        'qxd',\n        'qxt',\n        'qwd',\n        'qwt',\n        'qxl',\n        'qxb',\n    ],\n    'application/vnd.rar': ['rar'],\n    'application/vnd.realvnc.bed': ['bed'],\n    'application/vnd.recordare.musicxml': ['mxl'],\n    'application/vnd.recordare.musicxml+xml': ['musicxml'],\n    'application/vnd.rig.cryptonote': ['cryptonote'],\n    'application/vnd.rim.cod': ['cod'],\n    'application/vnd.rn-realmedia': ['rm'],\n    'application/vnd.rn-realmedia-vbr': ['rmvb'],\n    'application/vnd.route66.link66+xml': ['link66'],\n    'application/vnd.sailingtracker.track': ['st'],\n    'application/vnd.seemail': ['see'],\n    'application/vnd.sema': ['sema'],\n    'application/vnd.semd': ['semd'],\n    'application/vnd.semf': ['semf'],\n    'application/vnd.shana.informed.formdata': ['ifm'],\n    'application/vnd.shana.informed.formtemplate': ['itp'],\n    'application/vnd.shana.informed.interchange': ['iif'],\n    'application/vnd.shana.informed.package': ['ipk'],\n    'application/vnd.simtech-mindmapper': ['twd', 'twds'],\n    'application/vnd.smaf': ['mmf'],\n    'application/vnd.smart.teacher': ['teacher'],\n    'application/vnd.software602.filler.form+xml': ['fo'],\n    'application/vnd.solent.sdkm+xml': ['sdkm', 'sdkd'],\n    'application/vnd.spotfire.dxp': ['dxp'],\n    'application/vnd.spotfire.sfs': ['sfs'],\n    'application/vnd.stardivision.calc': ['sdc'],\n    'application/vnd.stardivision.draw': ['sda'],\n    'application/vnd.stardivision.impress': ['sdd'],\n    'application/vnd.stardivision.math': ['smf'],\n    'application/vnd.stardivision.writer': ['sdw', 'vor'],\n    'application/vnd.stardivision.writer-global': ['sgl'],\n    'application/vnd.stepmania.package': ['smzip'],\n    'application/vnd.stepmania.stepchart': ['sm'],\n    'application/vnd.sun.wadl+xml': ['wadl'],\n    'application/vnd.sun.xml.calc': ['sxc'],\n    'application/vnd.sun.xml.calc.template': ['stc'],\n    'application/vnd.sun.xml.draw': ['sxd'],\n    'application/vnd.sun.xml.draw.template': ['std'],\n    'application/vnd.sun.xml.impress': ['sxi'],\n    'application/vnd.sun.xml.impress.template': ['sti'],\n    'application/vnd.sun.xml.math': ['sxm'],\n    'application/vnd.sun.xml.writer': ['sxw'],\n    'application/vnd.sun.xml.writer.global': ['sxg'],\n    'application/vnd.sun.xml.writer.template': ['stw'],\n    'application/vnd.sus-calendar': ['sus', 'susp'],\n    'application/vnd.svd': ['svd'],\n    'application/vnd.symbian.install': ['sis', 'sisx'],\n    'application/vnd.syncml+xml': ['xsm'],\n    'application/vnd.syncml.dm+wbxml': ['bdm'],\n    'application/vnd.syncml.dm+xml': ['xdm'],\n    'application/vnd.syncml.dmddf+xml': ['ddf'],\n    'application/vnd.tao.intent-module-archive': ['tao'],\n    'application/vnd.tcpdump.pcap': ['pcap', 'cap', 'dmp'],\n    'application/vnd.tmobile-livetv': ['tmo'],\n    'application/vnd.trid.tpt': ['tpt'],\n    'application/vnd.triscape.mxs': ['mxs'],\n    'application/vnd.trueapp': ['tra'],\n    'application/vnd.ufdl': ['ufd', 'ufdl'],\n    'application/vnd.uiq.theme': ['utz'],\n    'application/vnd.umajin': ['umj'],\n    'application/vnd.unity': ['unityweb'],\n    'application/vnd.uoml+xml': ['uoml', 'uo'],\n    'application/vnd.vcx': ['vcx'],\n    'application/vnd.visio': ['vsd', 'vst', 'vss', 'vsw', 'vsdx', 'vtx'],\n    'application/vnd.visionary': ['vis'],\n    'application/vnd.vsf': ['vsf'],\n    'application/vnd.wap.wbxml': ['wbxml'],\n    'application/vnd.wap.wmlc': ['wmlc'],\n    'application/vnd.wap.wmlscriptc': ['wmlsc'],\n    'application/vnd.webturbo': ['wtb'],\n    'application/vnd.wolfram.player': ['nbp'],\n    'application/vnd.wordperfect': ['wpd'],\n    'application/vnd.wqd': ['wqd'],\n    'application/vnd.wt.stf': ['stf'],\n    'application/vnd.xara': ['xar'],\n    'application/vnd.xfdl': ['xfdl'],\n    'application/vnd.yamaha.hv-dic': ['hvd'],\n    'application/vnd.yamaha.hv-script': ['hvs'],\n    'application/vnd.yamaha.hv-voice': ['hvp'],\n    'application/vnd.yamaha.openscoreformat': ['osf'],\n    'application/vnd.yamaha.openscoreformat.osfpvg+xml': ['osfpvg'],\n    'application/vnd.yamaha.smaf-audio': ['saf'],\n    'application/vnd.yamaha.smaf-phrase': ['spf'],\n    'application/vnd.yellowriver-custom-menu': ['cmp'],\n    'application/vnd.zul': ['zir', 'zirz'],\n    'application/vnd.zzazz.deck+xml': ['zaz'],\n    'application/x-7z-compressed': ['7z'],\n    'application/x-abiword': ['abw'],\n    'application/x-ace-compressed': ['ace'],\n    'application/x-apple-diskimage': ['*dmg'],\n    'application/x-arj': ['arj'],\n    'application/x-authorware-bin': ['aab', 'x32', 'u32', 'vox'],\n    'application/x-authorware-map': ['aam'],\n    'application/x-authorware-seg': ['aas'],\n    'application/x-bcpio': ['bcpio'],\n    'application/x-bdoc': ['*bdoc'],\n    'application/x-bittorrent': ['torrent'],\n    'application/x-blender': ['blend'],\n    'application/x-blorb': ['blb', 'blorb'],\n    'application/x-bzip': ['bz'],\n    'application/x-bzip2': ['bz2', 'boz'],\n    'application/x-cbr': ['cbr', 'cba', 'cbt', 'cbz', 'cb7'],\n    'application/x-cdlink': ['vcd'],\n    'application/x-cfs-compressed': ['cfs'],\n    'application/x-chat': ['chat'],\n    'application/x-chess-pgn': ['pgn'],\n    'application/x-chrome-extension': ['crx'],\n    'application/x-cocoa': ['cco'],\n    'application/x-compressed': ['*rar'],\n    'application/x-conference': ['nsc'],\n    'application/x-cpio': ['cpio'],\n    'application/x-csh': ['csh'],\n    'application/x-debian-package': ['*deb', 'udeb'],\n    'application/x-dgc-compressed': ['dgc'],\n    'application/x-director': [\n        'dir',\n        'dcr',\n        'dxr',\n        'cst',\n        'cct',\n        'cxt',\n        'w3d',\n        'fgd',\n        'swa',\n    ],\n    'application/x-doom': ['wad'],\n    'application/x-dtbncx+xml': ['ncx'],\n    'application/x-dtbook+xml': ['dtb'],\n    'application/x-dtbresource+xml': ['res'],\n    'application/x-dvi': ['dvi'],\n    'application/x-envoy': ['evy'],\n    'application/x-eva': ['eva'],\n    'application/x-font-bdf': ['bdf'],\n    'application/x-font-ghostscript': ['gsf'],\n    'application/x-font-linux-psf': ['psf'],\n    'application/x-font-pcf': ['pcf'],\n    'application/x-font-snf': ['snf'],\n    'application/x-font-type1': ['pfa', 'pfb', 'pfm', 'afm'],\n    'application/x-freearc': ['arc'],\n    'application/x-futuresplash': ['spl'],\n    'application/x-gca-compressed': ['gca'],\n    'application/x-glulx': ['ulx'],\n    'application/x-gnumeric': ['gnumeric'],\n    'application/x-gramps-xml': ['gramps'],\n    'application/x-gtar': ['gtar'],\n    'application/x-hdf': ['hdf'],\n    'application/x-httpd-php': ['php'],\n    'application/x-install-instructions': ['install'],\n    'application/x-ipynb+json': ['ipynb'],\n    'application/x-iso9660-image': ['*iso'],\n    'application/x-iwork-keynote-sffkey': ['*key'],\n    'application/x-iwork-numbers-sffnumbers': ['*numbers'],\n    'application/x-iwork-pages-sffpages': ['*pages'],\n    'application/x-java-archive-diff': ['jardiff'],\n    'application/x-java-jnlp-file': ['jnlp'],\n    'application/x-keepass2': ['kdbx'],\n    'application/x-latex': ['latex'],\n    'application/x-lua-bytecode': ['luac'],\n    'application/x-lzh-compressed': ['lzh', 'lha'],\n    'application/x-makeself': ['run'],\n    'application/x-mie': ['mie'],\n    'application/x-mobipocket-ebook': ['*prc', 'mobi'],\n    'application/x-ms-application': ['application'],\n    'application/x-ms-shortcut': ['lnk'],\n    'application/x-ms-wmd': ['wmd'],\n    'application/x-ms-wmz': ['wmz'],\n    'application/x-ms-xbap': ['xbap'],\n    'application/x-msaccess': ['mdb'],\n    'application/x-msbinder': ['obd'],\n    'application/x-mscardfile': ['crd'],\n    'application/x-msclip': ['clp'],\n    'application/x-msdos-program': ['*exe'],\n    'application/x-msdownload': ['*exe', '*dll', 'com', 'bat', '*msi'],\n    'application/x-msmediaview': ['mvb', 'm13', 'm14'],\n    'application/x-msmetafile': ['*wmf', '*wmz', '*emf', 'emz'],\n    'application/x-msmoney': ['mny'],\n    'application/x-mspublisher': ['pub'],\n    'application/x-msschedule': ['scd'],\n    'application/x-msterminal': ['trm'],\n    'application/x-mswrite': ['wri'],\n    'application/x-netcdf': ['nc', 'cdf'],\n    'application/x-ns-proxy-autoconfig': ['pac'],\n    'application/x-nzb': ['nzb'],\n    'application/x-perl': ['pl', 'pm'],\n    'application/x-pilot': ['*prc', '*pdb'],\n    'application/x-pkcs12': ['p12', 'pfx'],\n    'application/x-pkcs7-certificates': ['p7b', 'spc'],\n    'application/x-pkcs7-certreqresp': ['p7r'],\n    'application/x-rar-compressed': ['*rar'],\n    'application/x-redhat-package-manager': ['rpm'],\n    'application/x-research-info-systems': ['ris'],\n    'application/x-sea': ['sea'],\n    'application/x-sh': ['sh'],\n    'application/x-shar': ['shar'],\n    'application/x-shockwave-flash': ['swf'],\n    'application/x-silverlight-app': ['xap'],\n    'application/x-sql': ['*sql'],\n    'application/x-stuffit': ['sit'],\n    'application/x-stuffitx': ['sitx'],\n    'application/x-subrip': ['srt'],\n    'application/x-sv4cpio': ['sv4cpio'],\n    'application/x-sv4crc': ['sv4crc'],\n    'application/x-t3vm-image': ['t3'],\n    'application/x-tads': ['gam'],\n    'application/x-tar': ['tar'],\n    'application/x-tcl': ['tcl', 'tk'],\n    'application/x-tex': ['tex'],\n    'application/x-tex-tfm': ['tfm'],\n    'application/x-texinfo': ['texinfo', 'texi'],\n    'application/x-tgif': ['*obj'],\n    'application/x-ustar': ['ustar'],\n    'application/x-virtualbox-hdd': ['hdd'],\n    'application/x-virtualbox-ova': ['ova'],\n    'application/x-virtualbox-ovf': ['ovf'],\n    'application/x-virtualbox-vbox': ['vbox'],\n    'application/x-virtualbox-vbox-extpack': ['vbox-extpack'],\n    'application/x-virtualbox-vdi': ['vdi'],\n    'application/x-virtualbox-vhd': ['vhd'],\n    'application/x-virtualbox-vmdk': ['vmdk'],\n    'application/x-wais-source': ['src'],\n    'application/x-web-app-manifest+json': ['webapp'],\n    'application/x-x509-ca-cert': ['der', 'crt', 'pem'],\n    'application/x-xfig': ['fig'],\n    'application/x-xliff+xml': ['*xlf'],\n    'application/x-xpinstall': ['xpi'],\n    'application/x-xz': ['xz'],\n    'application/x-zip-compressed': ['*zip'],\n    'application/x-zmachine': ['z1', 'z2', 'z3', 'z4', 'z5', 'z6', 'z7', 'z8'],\n    'audio/vnd.dece.audio': ['uva', 'uvva'],\n    'audio/vnd.digital-winds': ['eol'],\n    'audio/vnd.dra': ['dra'],\n    'audio/vnd.dts': ['dts'],\n    'audio/vnd.dts.hd': ['dtshd'],\n    'audio/vnd.lucent.voice': ['lvp'],\n    'audio/vnd.ms-playready.media.pya': ['pya'],\n    'audio/vnd.nuera.ecelp4800': ['ecelp4800'],\n    'audio/vnd.nuera.ecelp7470': ['ecelp7470'],\n    'audio/vnd.nuera.ecelp9600': ['ecelp9600'],\n    'audio/vnd.rip': ['rip'],\n    'audio/x-aac': ['*aac'],\n    'audio/x-aiff': ['aif', 'aiff', 'aifc'],\n    'audio/x-caf': ['caf'],\n    'audio/x-flac': ['flac'],\n    'audio/x-m4a': ['*m4a'],\n    'audio/x-matroska': ['mka'],\n    'audio/x-mpegurl': ['m3u'],\n    'audio/x-ms-wax': ['wax'],\n    'audio/x-ms-wma': ['wma'],\n    'audio/x-pn-realaudio': ['ram', 'ra'],\n    'audio/x-pn-realaudio-plugin': ['rmp'],\n    'audio/x-realaudio': ['*ra'],\n    'audio/x-wav': ['*wav'],\n    'chemical/x-cdx': ['cdx'],\n    'chemical/x-cif': ['cif'],\n    'chemical/x-cmdf': ['cmdf'],\n    'chemical/x-cml': ['cml'],\n    'chemical/x-csml': ['csml'],\n    'chemical/x-xyz': ['xyz'],\n    'image/prs.btif': ['btif', 'btf'],\n    'image/prs.pti': ['pti'],\n    'image/vnd.adobe.photoshop': ['psd'],\n    'image/vnd.airzip.accelerator.azv': ['azv'],\n    'image/vnd.blockfact.facti': ['facti'],\n    'image/vnd.dece.graphic': ['uvi', 'uvvi', 'uvg', 'uvvg'],\n    'image/vnd.djvu': ['djvu', 'djv'],\n    'image/vnd.dvb.subtitle': ['*sub'],\n    'image/vnd.dwg': ['dwg'],\n    'image/vnd.dxf': ['dxf'],\n    'image/vnd.fastbidsheet': ['fbs'],\n    'image/vnd.fpx': ['fpx'],\n    'image/vnd.fst': ['fst'],\n    'image/vnd.fujixerox.edmics-mmr': ['mmr'],\n    'image/vnd.fujixerox.edmics-rlc': ['rlc'],\n    'image/vnd.microsoft.icon': ['ico'],\n    'image/vnd.ms-dds': ['dds'],\n    'image/vnd.ms-modi': ['mdi'],\n    'image/vnd.ms-photo': ['wdp'],\n    'image/vnd.net-fpx': ['npx'],\n    'image/vnd.pco.b16': ['b16'],\n    'image/vnd.tencent.tap': ['tap'],\n    'image/vnd.valve.source.texture': ['vtf'],\n    'image/vnd.wap.wbmp': ['wbmp'],\n    'image/vnd.xiff': ['xif'],\n    'image/vnd.zbrush.pcx': ['pcx'],\n    'image/x-3ds': ['3ds'],\n    'image/x-adobe-dng': ['dng'],\n    'image/x-cmu-raster': ['ras'],\n    'image/x-cmx': ['cmx'],\n    'image/x-freehand': ['fh', 'fhc', 'fh4', 'fh5', 'fh7'],\n    'image/x-icon': ['*ico'],\n    'image/x-jng': ['jng'],\n    'image/x-mrsid-image': ['sid'],\n    'image/x-ms-bmp': ['*bmp'],\n    'image/x-pcx': ['*pcx'],\n    'image/x-pict': ['pic', 'pct'],\n    'image/x-portable-anymap': ['pnm'],\n    'image/x-portable-bitmap': ['pbm'],\n    'image/x-portable-graymap': ['pgm'],\n    'image/x-portable-pixmap': ['ppm'],\n    'image/x-rgb': ['rgb'],\n    'image/x-tga': ['tga'],\n    'image/x-xbitmap': ['xbm'],\n    'image/x-xpixmap': ['xpm'],\n    'image/x-xwindowdump': ['xwd'],\n    'message/vnd.wfa.wsc': ['wsc'],\n    'model/vnd.bary': ['bary'],\n    'model/vnd.cld': ['cld'],\n    'model/vnd.collada+xml': ['dae'],\n    'model/vnd.dwf': ['dwf'],\n    'model/vnd.gdl': ['gdl'],\n    'model/vnd.gtw': ['gtw'],\n    'model/vnd.mts': ['*mts'],\n    'model/vnd.opengex': ['ogex'],\n    'model/vnd.parasolid.transmit.binary': ['x_b'],\n    'model/vnd.parasolid.transmit.text': ['x_t'],\n    'model/vnd.pytha.pyox': ['pyo', 'pyox'],\n    'model/vnd.sap.vds': ['vds'],\n    'model/vnd.usda': ['usda'],\n    'model/vnd.usdz+zip': ['usdz'],\n    'model/vnd.valve.source.compiled-map': ['bsp'],\n    'model/vnd.vtu': ['vtu'],\n    'text/prs.lines.tag': ['dsc'],\n    'text/vnd.curl': ['curl'],\n    'text/vnd.curl.dcurl': ['dcurl'],\n    'text/vnd.curl.mcurl': ['mcurl'],\n    'text/vnd.curl.scurl': ['scurl'],\n    'text/vnd.dvb.subtitle': ['sub'],\n    'text/vnd.familysearch.gedcom': ['ged'],\n    'text/vnd.fly': ['fly'],\n    'text/vnd.fmi.flexstor': ['flx'],\n    'text/vnd.graphviz': ['gv'],\n    'text/vnd.in3d.3dml': ['3dml'],\n    'text/vnd.in3d.spot': ['spot'],\n    'text/vnd.sun.j2me.app-descriptor': ['jad'],\n    'text/vnd.wap.wml': ['wml'],\n    'text/vnd.wap.wmlscript': ['wmls'],\n    'text/x-asm': ['s', 'asm'],\n    'text/x-c': ['c', 'cc', 'cxx', 'cpp', 'h', 'hh', 'dic'],\n    'text/x-component': ['htc'],\n    'text/x-fortran': ['f', 'for', 'f77', 'f90'],\n    'text/x-handlebars-template': ['hbs'],\n    'text/x-java-source': ['java'],\n    'text/x-lua': ['lua'],\n    'text/x-markdown': ['mkd'],\n    'text/x-nfo': ['nfo'],\n    'text/x-opml': ['opml'],\n    'text/x-org': ['*org'],\n    'text/x-pascal': ['p', 'pas'],\n    'text/x-processing': ['pde'],\n    'text/x-sass': ['sass'],\n    'text/x-scss': ['scss'],\n    'text/x-setext': ['etx'],\n    'text/x-sfv': ['sfv'],\n    'text/x-suse-ymp': ['ymp'],\n    'text/x-uuencode': ['uu'],\n    'text/x-vcalendar': ['vcs'],\n    'text/x-vcard': ['vcf'],\n    'video/vnd.dece.hd': ['uvh', 'uvvh'],\n    'video/vnd.dece.mobile': ['uvm', 'uvvm'],\n    'video/vnd.dece.pd': ['uvp', 'uvvp'],\n    'video/vnd.dece.sd': ['uvs', 'uvvs'],\n    'video/vnd.dece.video': ['uvv', 'uvvv'],\n    'video/vnd.dvb.file': ['dvb'],\n    'video/vnd.fvt': ['fvt'],\n    'video/vnd.mpegurl': ['mxu', 'm4u'],\n    'video/vnd.ms-playready.media.pyv': ['pyv'],\n    'video/vnd.uvvu.mp4': ['uvu', 'uvvu'],\n    'video/vnd.vivo': ['viv'],\n    'video/x-f4v': ['f4v'],\n    'video/x-fli': ['fli'],\n    'video/x-flv': ['flv'],\n    'video/x-m4v': ['m4v'],\n    'video/x-matroska': ['mkv', 'mk3d', 'mks'],\n    'video/x-mng': ['mng'],\n    'video/x-ms-asf': ['asf', 'asx'],\n    'video/x-ms-vob': ['vob'],\n    'video/x-ms-wm': ['wm'],\n    'video/x-ms-wmv': ['wmv'],\n    'video/x-ms-wmx': ['wmx'],\n    'video/x-ms-wvx': ['wvx'],\n    'video/x-msvideo': ['avi'],\n    'video/x-sgi-movie': ['movie'],\n    'video/x-smv': ['smv'],\n    'x-conference/x-cooltalk': ['ice'],\n};\nObject.freeze(types);\nexport default types;\n","const types = {\n    'application/andrew-inset': ['ez'],\n    'application/appinstaller': ['appinstaller'],\n    'application/applixware': ['aw'],\n    'application/appx': ['appx'],\n    'application/appxbundle': ['appxbundle'],\n    'application/atom+xml': ['atom'],\n    'application/atomcat+xml': ['atomcat'],\n    'application/atomdeleted+xml': ['atomdeleted'],\n    'application/atomsvc+xml': ['atomsvc'],\n    'application/atsc-dwd+xml': ['dwd'],\n    'application/atsc-held+xml': ['held'],\n    'application/atsc-rsat+xml': ['rsat'],\n    'application/automationml-aml+xml': ['aml'],\n    'application/automationml-amlx+zip': ['amlx'],\n    'application/bdoc': ['bdoc'],\n    'application/calendar+xml': ['xcs'],\n    'application/ccxml+xml': ['ccxml'],\n    'application/cdfx+xml': ['cdfx'],\n    'application/cdmi-capability': ['cdmia'],\n    'application/cdmi-container': ['cdmic'],\n    'application/cdmi-domain': ['cdmid'],\n    'application/cdmi-object': ['cdmio'],\n    'application/cdmi-queue': ['cdmiq'],\n    'application/cpl+xml': ['cpl'],\n    'application/cu-seeme': ['cu'],\n    'application/cwl': ['cwl'],\n    'application/dash+xml': ['mpd'],\n    'application/dash-patch+xml': ['mpp'],\n    'application/davmount+xml': ['davmount'],\n    'application/dicom': ['dcm'],\n    'application/docbook+xml': ['dbk'],\n    'application/dssc+der': ['dssc'],\n    'application/dssc+xml': ['xdssc'],\n    'application/ecmascript': ['ecma'],\n    'application/emma+xml': ['emma'],\n    'application/emotionml+xml': ['emotionml'],\n    'application/epub+zip': ['epub'],\n    'application/exi': ['exi'],\n    'application/express': ['exp'],\n    'application/fdf': ['fdf'],\n    'application/fdt+xml': ['fdt'],\n    'application/font-tdpfr': ['pfr'],\n    'application/geo+json': ['geojson'],\n    'application/gml+xml': ['gml'],\n    'application/gpx+xml': ['gpx'],\n    'application/gxf': ['gxf'],\n    'application/gzip': ['gz'],\n    'application/hjson': ['hjson'],\n    'application/hyperstudio': ['stk'],\n    'application/inkml+xml': ['ink', 'inkml'],\n    'application/ipfix': ['ipfix'],\n    'application/its+xml': ['its'],\n    'application/java-archive': ['jar', 'war', 'ear'],\n    'application/java-serialized-object': ['ser'],\n    'application/java-vm': ['class'],\n    'application/javascript': ['*js'],\n    'application/json': ['json', 'map'],\n    'application/json5': ['json5'],\n    'application/jsonml+json': ['jsonml'],\n    'application/ld+json': ['jsonld'],\n    'application/lgr+xml': ['lgr'],\n    'application/lost+xml': ['lostxml'],\n    'application/mac-binhex40': ['hqx'],\n    'application/mac-compactpro': ['cpt'],\n    'application/mads+xml': ['mads'],\n    'application/manifest+json': ['webmanifest'],\n    'application/marc': ['mrc'],\n    'application/marcxml+xml': ['mrcx'],\n    'application/mathematica': ['ma', 'nb', 'mb'],\n    'application/mathml+xml': ['mathml'],\n    'application/mbox': ['mbox'],\n    'application/media-policy-dataset+xml': ['mpf'],\n    'application/mediaservercontrol+xml': ['mscml'],\n    'application/metalink+xml': ['metalink'],\n    'application/metalink4+xml': ['meta4'],\n    'application/mets+xml': ['mets'],\n    'application/mmt-aei+xml': ['maei'],\n    'application/mmt-usd+xml': ['musd'],\n    'application/mods+xml': ['mods'],\n    'application/mp21': ['m21', 'mp21'],\n    'application/mp4': ['*mp4', '*mpg4', 'mp4s', 'm4p'],\n    'application/msix': ['msix'],\n    'application/msixbundle': ['msixbundle'],\n    'application/msword': ['doc', 'dot'],\n    'application/mxf': ['mxf'],\n    'application/n-quads': ['nq'],\n    'application/n-triples': ['nt'],\n    'application/node': ['cjs'],\n    'application/octet-stream': [\n        'bin',\n        'dms',\n        'lrf',\n        'mar',\n        'so',\n        'dist',\n        'distz',\n        'pkg',\n        'bpk',\n        'dump',\n        'elc',\n        'deploy',\n        'exe',\n        'dll',\n        'deb',\n        'dmg',\n        'iso',\n        'img',\n        'msi',\n        'msp',\n        'msm',\n        'buffer',\n    ],\n    'application/oda': ['oda'],\n    'application/oebps-package+xml': ['opf'],\n    'application/ogg': ['ogx'],\n    'application/omdoc+xml': ['omdoc'],\n    'application/onenote': [\n        'onetoc',\n        'onetoc2',\n        'onetmp',\n        'onepkg',\n        'one',\n        'onea',\n    ],\n    'application/oxps': ['oxps'],\n    'application/p2p-overlay+xml': ['relo'],\n    'application/patch-ops-error+xml': ['xer'],\n    'application/pdf': ['pdf'],\n    'application/pgp-encrypted': ['pgp'],\n    'application/pgp-keys': ['asc'],\n    'application/pgp-signature': ['sig', '*asc'],\n    'application/pics-rules': ['prf'],\n    'application/pkcs10': ['p10'],\n    'application/pkcs7-mime': ['p7m', 'p7c'],\n    'application/pkcs7-signature': ['p7s'],\n    'application/pkcs8': ['p8'],\n    'application/pkix-attr-cert': ['ac'],\n    'application/pkix-cert': ['cer'],\n    'application/pkix-crl': ['crl'],\n    'application/pkix-pkipath': ['pkipath'],\n    'application/pkixcmp': ['pki'],\n    'application/pls+xml': ['pls'],\n    'application/postscript': ['ai', 'eps', 'ps'],\n    'application/provenance+xml': ['provx'],\n    'application/pskc+xml': ['pskcxml'],\n    'application/raml+yaml': ['raml'],\n    'application/rdf+xml': ['rdf', 'owl'],\n    'application/reginfo+xml': ['rif'],\n    'application/relax-ng-compact-syntax': ['rnc'],\n    'application/resource-lists+xml': ['rl'],\n    'application/resource-lists-diff+xml': ['rld'],\n    'application/rls-services+xml': ['rs'],\n    'application/route-apd+xml': ['rapd'],\n    'application/route-s-tsid+xml': ['sls'],\n    'application/route-usd+xml': ['rusd'],\n    'application/rpki-ghostbusters': ['gbr'],\n    'application/rpki-manifest': ['mft'],\n    'application/rpki-roa': ['roa'],\n    'application/rsd+xml': ['rsd'],\n    'application/rss+xml': ['rss'],\n    'application/rtf': ['rtf'],\n    'application/sbml+xml': ['sbml'],\n    'application/scvp-cv-request': ['scq'],\n    'application/scvp-cv-response': ['scs'],\n    'application/scvp-vp-request': ['spq'],\n    'application/scvp-vp-response': ['spp'],\n    'application/sdp': ['sdp'],\n    'application/senml+xml': ['senmlx'],\n    'application/sensml+xml': ['sensmlx'],\n    'application/set-payment-initiation': ['setpay'],\n    'application/set-registration-initiation': ['setreg'],\n    'application/shf+xml': ['shf'],\n    'application/sieve': ['siv', 'sieve'],\n    'application/smil+xml': ['smi', 'smil'],\n    'application/sparql-query': ['rq'],\n    'application/sparql-results+xml': ['srx'],\n    'application/sql': ['sql'],\n    'application/srgs': ['gram'],\n    'application/srgs+xml': ['grxml'],\n    'application/sru+xml': ['sru'],\n    'application/ssdl+xml': ['ssdl'],\n    'application/ssml+xml': ['ssml'],\n    'application/swid+xml': ['swidtag'],\n    'application/tei+xml': ['tei', 'teicorpus'],\n    'application/thraud+xml': ['tfi'],\n    'application/timestamped-data': ['tsd'],\n    'application/toml': ['toml'],\n    'application/trig': ['trig'],\n    'application/ttml+xml': ['ttml'],\n    'application/ubjson': ['ubj'],\n    'application/urc-ressheet+xml': ['rsheet'],\n    'application/urc-targetdesc+xml': ['td'],\n    'application/voicexml+xml': ['vxml'],\n    'application/wasm': ['wasm'],\n    'application/watcherinfo+xml': ['wif'],\n    'application/widget': ['wgt'],\n    'application/winhlp': ['hlp'],\n    'application/wsdl+xml': ['wsdl'],\n    'application/wspolicy+xml': ['wspolicy'],\n    'application/xaml+xml': ['xaml'],\n    'application/xcap-att+xml': ['xav'],\n    'application/xcap-caps+xml': ['xca'],\n    'application/xcap-diff+xml': ['xdf'],\n    'application/xcap-el+xml': ['xel'],\n    'application/xcap-ns+xml': ['xns'],\n    'application/xenc+xml': ['xenc'],\n    'application/xfdf': ['xfdf'],\n    'application/xhtml+xml': ['xhtml', 'xht'],\n    'application/xliff+xml': ['xlf'],\n    'application/xml': ['xml', 'xsl', 'xsd', 'rng'],\n    'application/xml-dtd': ['dtd'],\n    'application/xop+xml': ['xop'],\n    'application/xproc+xml': ['xpl'],\n    'application/xslt+xml': ['*xsl', 'xslt'],\n    'application/xspf+xml': ['xspf'],\n    'application/xv+xml': ['mxml', 'xhvml', 'xvml', 'xvm'],\n    'application/yang': ['yang'],\n    'application/yin+xml': ['yin'],\n    'application/zip': ['zip'],\n    'application/zip+dotlottie': ['lottie'],\n    'audio/3gpp': ['*3gpp'],\n    'audio/aac': ['adts', 'aac'],\n    'audio/adpcm': ['adp'],\n    'audio/amr': ['amr'],\n    'audio/basic': ['au', 'snd'],\n    'audio/midi': ['mid', 'midi', 'kar', 'rmi'],\n    'audio/mobile-xmf': ['mxmf'],\n    'audio/mp3': ['*mp3'],\n    'audio/mp4': ['m4a', 'mp4a', 'm4b'],\n    'audio/mpeg': ['mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a'],\n    'audio/ogg': ['oga', 'ogg', 'spx', 'opus'],\n    'audio/s3m': ['s3m'],\n    'audio/silk': ['sil'],\n    'audio/wav': ['wav'],\n    'audio/wave': ['*wav'],\n    'audio/webm': ['weba'],\n    'audio/xm': ['xm'],\n    'font/collection': ['ttc'],\n    'font/otf': ['otf'],\n    'font/ttf': ['ttf'],\n    'font/woff': ['woff'],\n    'font/woff2': ['woff2'],\n    'image/aces': ['exr'],\n    'image/apng': ['apng'],\n    'image/avci': ['avci'],\n    'image/avcs': ['avcs'],\n    'image/avif': ['avif'],\n    'image/bmp': ['bmp', 'dib'],\n    'image/cgm': ['cgm'],\n    'image/dicom-rle': ['drle'],\n    'image/dpx': ['dpx'],\n    'image/emf': ['emf'],\n    'image/fits': ['fits'],\n    'image/g3fax': ['g3'],\n    'image/gif': ['gif'],\n    'image/heic': ['heic'],\n    'image/heic-sequence': ['heics'],\n    'image/heif': ['heif'],\n    'image/heif-sequence': ['heifs'],\n    'image/hej2k': ['hej2'],\n    'image/ief': ['ief'],\n    'image/jaii': ['jaii'],\n    'image/jais': ['jais'],\n    'image/jls': ['jls'],\n    'image/jp2': ['jp2', 'jpg2'],\n    'image/jpeg': ['jpg', 'jpeg', 'jpe'],\n    'image/jph': ['jph'],\n    'image/jphc': ['jhc'],\n    'image/jpm': ['jpm', 'jpgm'],\n    'image/jpx': ['jpx', 'jpf'],\n    'image/jxl': ['jxl'],\n    'image/jxr': ['jxr'],\n    'image/jxra': ['jxra'],\n    'image/jxrs': ['jxrs'],\n    'image/jxs': ['jxs'],\n    'image/jxsc': ['jxsc'],\n    'image/jxsi': ['jxsi'],\n    'image/jxss': ['jxss'],\n    'image/ktx': ['ktx'],\n    'image/ktx2': ['ktx2'],\n    'image/pjpeg': ['jfif'],\n    'image/png': ['png'],\n    'image/sgi': ['sgi'],\n    'image/svg+xml': ['svg', 'svgz'],\n    'image/t38': ['t38'],\n    'image/tiff': ['tif', 'tiff'],\n    'image/tiff-fx': ['tfx'],\n    'image/webp': ['webp'],\n    'image/wmf': ['wmf'],\n    'message/disposition-notification': ['disposition-notification'],\n    'message/global': ['u8msg'],\n    'message/global-delivery-status': ['u8dsn'],\n    'message/global-disposition-notification': ['u8mdn'],\n    'message/global-headers': ['u8hdr'],\n    'message/rfc822': ['eml', 'mime', 'mht', 'mhtml'],\n    'model/3mf': ['3mf'],\n    'model/gltf+json': ['gltf'],\n    'model/gltf-binary': ['glb'],\n    'model/iges': ['igs', 'iges'],\n    'model/jt': ['jt'],\n    'model/mesh': ['msh', 'mesh', 'silo'],\n    'model/mtl': ['mtl'],\n    'model/obj': ['obj'],\n    'model/prc': ['prc'],\n    'model/step': ['step', 'stp', 'stpnc', 'p21', '210'],\n    'model/step+xml': ['stpx'],\n    'model/step+zip': ['stpz'],\n    'model/step-xml+zip': ['stpxz'],\n    'model/stl': ['stl'],\n    'model/u3d': ['u3d'],\n    'model/vrml': ['wrl', 'vrml'],\n    'model/x3d+binary': ['*x3db', 'x3dbz'],\n    'model/x3d+fastinfoset': ['x3db'],\n    'model/x3d+vrml': ['*x3dv', 'x3dvz'],\n    'model/x3d+xml': ['x3d', 'x3dz'],\n    'model/x3d-vrml': ['x3dv'],\n    'text/cache-manifest': ['appcache', 'manifest'],\n    'text/calendar': ['ics', 'ifb'],\n    'text/coffeescript': ['coffee', 'litcoffee'],\n    'text/css': ['css'],\n    'text/csv': ['csv'],\n    'text/html': ['html', 'htm', 'shtml'],\n    'text/jade': ['jade'],\n    'text/javascript': ['js', 'mjs'],\n    'text/jsx': ['jsx'],\n    'text/less': ['less'],\n    'text/markdown': ['md', 'markdown'],\n    'text/mathml': ['mml'],\n    'text/mdx': ['mdx'],\n    'text/n3': ['n3'],\n    'text/plain': ['txt', 'text', 'conf', 'def', 'list', 'log', 'in', 'ini'],\n    'text/richtext': ['rtx'],\n    'text/rtf': ['*rtf'],\n    'text/sgml': ['sgml', 'sgm'],\n    'text/shex': ['shex'],\n    'text/slim': ['slim', 'slm'],\n    'text/spdx': ['spdx'],\n    'text/stylus': ['stylus', 'styl'],\n    'text/tab-separated-values': ['tsv'],\n    'text/troff': ['t', 'tr', 'roff', 'man', 'me', 'ms'],\n    'text/turtle': ['ttl'],\n    'text/uri-list': ['uri', 'uris', 'urls'],\n    'text/vcard': ['vcard'],\n    'text/vtt': ['vtt'],\n    'text/wgsl': ['wgsl'],\n    'text/xml': ['*xml'],\n    'text/yaml': ['yaml', 'yml'],\n    'video/3gpp': ['3gp', '3gpp'],\n    'video/3gpp2': ['3g2'],\n    'video/h261': ['h261'],\n    'video/h263': ['h263'],\n    'video/h264': ['h264'],\n    'video/iso.segment': ['m4s'],\n    'video/jpeg': ['jpgv'],\n    'video/jpm': ['*jpm', '*jpgm'],\n    'video/mj2': ['mj2', 'mjp2'],\n    'video/mp2t': ['ts', 'm2t', 'm2ts', 'mts'],\n    'video/mp4': ['mp4', 'mp4v', 'mpg4'],\n    'video/mpeg': ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v'],\n    'video/ogg': ['ogv'],\n    'video/quicktime': ['qt', 'mov'],\n    'video/webm': ['webm'],\n};\nObject.freeze(types);\nexport default types;\n","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _Mime_extensionToType, _Mime_typeToExtension, _Mime_typeToExtensions;\nclass Mime {\n    constructor(...args) {\n        _Mime_extensionToType.set(this, new Map());\n        _Mime_typeToExtension.set(this, new Map());\n        _Mime_typeToExtensions.set(this, new Map());\n        for (const arg of args) {\n            this.define(arg);\n        }\n    }\n    define(typeMap, force = false) {\n        for (let [type, extensions] of Object.entries(typeMap)) {\n            type = type.toLowerCase();\n            extensions = extensions.map((ext) => ext.toLowerCase());\n            if (!__classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").has(type)) {\n                __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").set(type, new Set());\n            }\n            const allExtensions = __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").get(type);\n            let first = true;\n            for (let extension of extensions) {\n                const starred = extension.startsWith('*');\n                extension = starred ? extension.slice(1) : extension;\n                allExtensions?.add(extension);\n                if (first) {\n                    __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\").set(type, extension);\n                }\n                first = false;\n                if (starred)\n                    continue;\n                const currentType = __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").get(extension);\n                if (currentType && currentType != type && !force) {\n                    throw new Error(`\"${type} -> ${extension}\" conflicts with \"${currentType} -> ${extension}\". Pass \\`force=true\\` to override this definition.`);\n                }\n                __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").set(extension, type);\n            }\n        }\n        return this;\n    }\n    getType(path) {\n        if (typeof path !== 'string')\n            return null;\n        const last = path.replace(/^.*[/\\\\]/s, '').toLowerCase();\n        const ext = last.replace(/^.*\\./s, '').toLowerCase();\n        const hasPath = last.length < path.length;\n        const hasDot = ext.length < last.length - 1;\n        if (!hasDot && hasPath)\n            return null;\n        return __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").get(ext) ?? null;\n    }\n    getExtension(type) {\n        if (typeof type !== 'string')\n            return null;\n        type = type?.split?.(';')[0];\n        return ((type && __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\").get(type.trim().toLowerCase())) ?? null);\n    }\n    getAllExtensions(type) {\n        if (typeof type !== 'string')\n            return null;\n        return __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").get(type.toLowerCase()) ?? null;\n    }\n    _freeze() {\n        this.define = () => {\n            throw new Error('define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances');\n        };\n        Object.freeze(this);\n        for (const extensions of __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").values()) {\n            Object.freeze(extensions);\n        }\n        return this;\n    }\n    _getTestState() {\n        return {\n            types: __classPrivateFieldGet(this, _Mime_extensionToType, \"f\"),\n            extensions: __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\"),\n        };\n    }\n}\n_Mime_extensionToType = new WeakMap(), _Mime_typeToExtension = new WeakMap(), _Mime_typeToExtensions = new WeakMap();\nexport default Mime;\n","import otherTypes from '../types/other.js';\nimport standardTypes from '../types/standard.js';\nimport Mime from './Mime.js';\nexport { default as Mime } from './Mime.js';\nexport default new Mime(standardTypes, otherTypes)._freeze();\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport MAudioBody from \"./MAudioBody\";\nimport MVoiceMessageBody from \"./MVoiceMessageBody\";\nimport { type IBodyProps } from \"./IBodyProps\";\nimport { isVoiceMessage } from \"../../../utils/EventUtils\";\n\nexport default class MVoiceOrAudioBody extends React.PureComponent<IBodyProps> {\n    public render(): React.ReactNode {\n        if (!this.props.forExport && isVoiceMessage(this.props.mxEvent)) {\n            return <MVoiceMessageBody {...this.props} />;\n        } else {\n            return <MAudioBody {...this.props} />;\n        }\n    }\n}\n","/*\nCopyright 2018-2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ComponentProps, type ReactNode } from \"react\";\nimport { type Tooltip } from \"@vector-im/compound-web\";\nimport { type MediaEventContent } from \"matrix-js-sdk/src/types\";\n\nimport { ImageBodyBaseInner } from \"./MImageReplyBody\";\nimport { BLURHASH_FIELD } from \"../../../utils/image-media\";\nimport IconsShowStickersSvg from \"../../../../res/img/icons-show-stickers.svg\";\nimport { type IBodyProps } from \"./IBodyProps\";\nimport { useMediaVisible } from \"../../../hooks/useMediaVisible\";\n\nclass MStickerBodyInner extends ImageBodyBaseInner {\n    // Mostly empty to prevent default behaviour of MImageBody\n    protected onClick = (ev: React.MouseEvent): void => {\n        ev.preventDefault();\n        if (!this.props.mediaVisible) {\n            this.props.setMediaVisible(true);\n        }\n    };\n\n    // MStickerBody doesn't need a wrapping `<a href=...>`, but it does need extra padding\n    // which is added by mx_MStickerBody_wrapper\n    protected wrapImage(contentUrl: string, children: React.ReactNode): JSX.Element {\n        let onClick: React.MouseEventHandler | undefined;\n        if (!this.props.mediaVisible) {\n            onClick = this.onClick;\n        }\n        return (\n            <div className=\"mx_MStickerBody_wrapper\" onClick={onClick}>\n                {\" \"}\n                {children}{\" \"}\n            </div>\n        );\n    }\n\n    // Placeholder to show in place of the sticker image if img onLoad hasn't fired yet.\n    protected getPlaceholder(width: number, height: number): ReactNode {\n        if (this.props.mxEvent.getContent().info?.[BLURHASH_FIELD]) return super.getPlaceholder(width, height);\n        return (\n            <img\n                aria-hidden\n                alt=\"\"\n                className=\"mx_MStickerBody_placeholder\"\n                src={IconsShowStickersSvg}\n                width=\"80\"\n                height=\"80\"\n                onMouseEnter={this.onImageEnter}\n                onMouseLeave={this.onImageLeave}\n            />\n        );\n    }\n\n    // Tooltip to show on mouse over\n    protected getTooltipProps(): ComponentProps<typeof Tooltip> | null {\n        const content = this.props.mxEvent && this.props.mxEvent.getContent();\n\n        if (!content?.body || !content.info?.w) return null;\n\n        return {\n            placement: \"right\",\n            description: content.body,\n        };\n    }\n\n    // Don't show \"Download this_file.png ...\"\n    protected getFileBody(): ReactNode {\n        return null;\n    }\n\n    protected getBanner(content: MediaEventContent): ReactNode {\n        return null; // we don't need a banner, we have a tooltip\n    }\n}\n\nconst MStickerBody: React.FC<IBodyProps> = (props) => {\n    const [mediaVisible, setVisible] = useMediaVisible(props.mxEvent);\n    return <MStickerBodyInner mediaVisible={mediaVisible} setMediaVisible={setVisible} {...props} />;\n};\n\nexport default MStickerBody;\n","var _path, _path2;\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\";\nimport { forwardRef } from \"react\";\nvar SvgIconsShowStickers = function SvgIconsShowStickers(props, ref) {\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    xmlns: \"http://www.w3.org/2000/svg\",\n    xmlSpace: \"preserve\",\n    viewBox: \"0 0 500 500\",\n    role: \"presentation\",\n    \"aria-hidden\": true,\n    ref: ref\n  }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    fill: \"#76CFA6\",\n    d: \"M250 500c138.571 0 250-111.43 250-250C500 111.429 388.571 0 250 0S0 111.429 0 250c0 138.57 111.429 250 250 250\",\n    opacity: 0.15\n  })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n    fill: \"none\",\n    stroke: \"#76CFA6\",\n    strokeMiterlimit: 10,\n    strokeWidth: 12,\n    d: \"M249 430c-98.996 0-180-81.003-180-180 0-98.998 81.005-180 180-180 98.994 0 180 81.001 180 180 0 98.997-81.005 180-180 180zm72.8-200.8c17.685 0 31.201-13.518 31.201-31.2s-13.519-31.2-31.201-31.2-31.2 13.518-31.2 31.2 13.518 31.2 31.2 31.2zm-145.6 0c17.682 0 31.2-13.518 31.2-31.2s-13.519-31.2-31.2-31.2c-17.683 0-31.201 13.518-31.201 31.2s13.519 31.2 31.201 31.2zM249 364.4c48.883 0 89.436-30.164 106.081-72.801H142.919C159.564 334.236 200.117 364.4 249 364.4z\"\n  })));\n};\nvar ForwardRef = /*#__PURE__*/forwardRef(SvgIconsShowStickers);\nexport { ForwardRef as Icon };\nexport default \"img/icons-show-stickers.27a688b.svg\";","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useMemo } from \"react\";\nimport { type MatrixEvent, ClientEvent, type ClientEventHandlerMap } from \"matrix-js-sdk/src/matrix\";\nimport { secureRandomString } from \"matrix-js-sdk/src/randomstring\";\nimport { Tooltip } from \"@vector-im/compound-web\";\n\nimport { _t } from \"../../../languageHandler\";\nimport Modal from \"../../../Modal\";\nimport {\n    locationEventGeoUri,\n    getLocationShareErrorMessage,\n    LocationShareError,\n    isSelfLocation,\n} from \"../../../utils/location\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { SmartMarker, Map, LocationViewDialog } from \"../location\";\nimport { type IBodyProps } from \"./IBodyProps\";\nimport { createReconnectedListener } from \"../../../utils/connection\";\n\ninterface IState {\n    error?: Error;\n}\n\nexport default class MLocationBody extends React.Component<IBodyProps, IState> {\n    public static contextType = MatrixClientContext;\n    declare public context: React.ContextType<typeof MatrixClientContext>;\n\n    private unmounted = false;\n    private mapId: string;\n    private reconnectedListener: ClientEventHandlerMap[ClientEvent.Sync];\n\n    public constructor(props: IBodyProps) {\n        super(props);\n\n        // multiple instances of same map might be in document\n        // eg thread and main timeline, reply\n        const idSuffix = `${props.mxEvent.getId()}_${secureRandomString(8)}`;\n        this.mapId = `mx_MLocationBody_${idSuffix}`;\n\n        this.reconnectedListener = createReconnectedListener(this.clearError);\n\n        this.state = {};\n    }\n\n    private onClick = (): void => {\n        Modal.createDialog(\n            LocationViewDialog,\n            {\n                mxEvent: this.props.mxEvent,\n            },\n            \"mx_LocationViewDialog_wrapper\",\n            false, // isPriority\n            true, // isStatic\n        );\n    };\n\n    private clearError = (): void => {\n        this.context.off(ClientEvent.Sync, this.reconnectedListener);\n        this.setState({ error: undefined });\n    };\n\n    private onError = (error: Error): void => {\n        if (this.unmounted) return;\n        this.setState({ error });\n        // Unregister first in case we already had it registered\n        this.context.off(ClientEvent.Sync, this.reconnectedListener);\n        this.context.on(ClientEvent.Sync, this.reconnectedListener);\n    };\n\n    public componentDidMount(): void {\n        this.unmounted = false;\n    }\n\n    public componentWillUnmount(): void {\n        this.unmounted = true;\n        this.context.off(ClientEvent.Sync, this.reconnectedListener);\n    }\n\n    public render(): React.ReactElement<HTMLDivElement> {\n        return this.state.error ? (\n            <LocationBodyFallbackContent error={this.state.error} event={this.props.mxEvent} />\n        ) : (\n            <LocationBodyContent\n                mxEvent={this.props.mxEvent}\n                mapId={this.mapId}\n                onError={this.onError}\n                tooltip={_t(\"location_sharing|expand_map\")}\n                onClick={this.onClick}\n            />\n        );\n    }\n}\n\nexport const LocationBodyFallbackContent: React.FC<{ event: MatrixEvent; error: Error }> = ({ error, event }) => {\n    const errorType = error?.message as LocationShareError;\n    const message = `${_t(\"location_sharing|failed_load_map\")}: ${getLocationShareErrorMessage(errorType)}`;\n\n    const locationFallback = isSelfLocation(event.getContent())\n        ? _t(\"timeline|m.location|self_location\") + event.getContent()?.body\n        : _t(\"timeline|m.location|location\") + event.getContent()?.body;\n\n    return (\n        <div className=\"mx_EventTile_body mx_MLocationBody\">\n            <span className={errorType !== LocationShareError.MapStyleUrlNotConfigured ? \"mx_EventTile_tileError\" : \"\"}>\n                {message}\n            </span>\n            <br />\n            {locationFallback}\n        </div>\n    );\n};\n\ninterface LocationBodyContentProps {\n    mxEvent: MatrixEvent;\n    mapId: string;\n    tooltip: string;\n    onError: (error: Error) => void;\n    onClick?: () => void;\n}\nexport const LocationBodyContent: React.FC<LocationBodyContentProps> = ({\n    mxEvent,\n    mapId,\n    tooltip,\n    onError,\n    onClick,\n}) => {\n    // Find the message panel boundary so the tooltip hides when it would overlap the composer\n    const boundaryEl = useMemo(() => document.querySelector<HTMLElement>(\".mx_RoomView_messagePanel\") ?? undefined, []);\n\n    // only pass member to marker when should render avatar marker\n    const markerRoomMember = isSelfLocation(mxEvent.getContent()) ? mxEvent.sender : undefined;\n    const geoUri = locationEventGeoUri(mxEvent);\n\n    const mapElement = (\n        <Map id={mapId} centerGeoUri={geoUri} onClick={onClick} onError={onError} className=\"mx_MLocationBody_map\">\n            {({ map }) => (\n                <SmartMarker\n                    map={map}\n                    id={`${mapId}-marker`}\n                    geoUri={geoUri}\n                    roomMember={markerRoomMember ?? undefined}\n                />\n            )}\n        </Map>\n    );\n\n    return (\n        <div className=\"mx_MLocationBody\">\n            <Tooltip label={tooltip} boundary={boundaryEl}>\n                <div className=\"mx_MLocationBody_map\">{mapElement}</div>\n            </Tooltip>\n        </div>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2024 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n// Exports beacon components which touch maplibre-gs wrapped in React Suspense to enable code splitting\n\nimport React, { type JSX, type ComponentProps, lazy, Suspense } from \"react\";\n\nimport Spinner from \"../elements/Spinner\";\n\nconst BeaconViewDialogComponent = lazy(() => import(\"./BeaconViewDialog\"));\n\nexport function BeaconViewDialog(props: ComponentProps<typeof BeaconViewDialogComponent>): JSX.Element {\n    return (\n        <Suspense fallback={<Spinner />}>\n            <BeaconViewDialogComponent {...props} />\n        </Suspense>\n    );\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, useCallback, useContext, useEffect, useState } from \"react\";\nimport {\n    type Beacon,\n    BeaconEvent,\n    type MatrixEvent,\n    MatrixEventEvent,\n    type MatrixClient,\n    RelationType,\n    type IRedactOpts,\n    type ContentHelpers,\n    M_BEACON,\n} from \"matrix-js-sdk/src/matrix\";\nimport { secureRandomString } from \"matrix-js-sdk/src/randomstring\";\nimport classNames from \"classnames\";\n\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { useEventEmitterState } from \"../../../hooks/useEventEmitter\";\nimport { _t } from \"../../../languageHandler\";\nimport Modal from \"../../../Modal\";\nimport { isBeaconWaitingToStart, useBeacon } from \"../../../utils/beacon\";\nimport { isSelfLocation, LocationShareError } from \"../../../utils/location\";\nimport { BeaconDisplayStatus, getBeaconDisplayStatus } from \"../beacon/displayStatus\";\nimport BeaconStatus from \"../beacon/BeaconStatus\";\nimport OwnBeaconStatus from \"../beacon/OwnBeaconStatus\";\nimport { Map, SmartMarker } from \"../location\";\nimport { MapError } from \"../location/MapError\";\nimport MapFallback from \"../location/MapFallback\";\nimport { type GetRelationsForEvent } from \"../rooms/EventTile\";\nimport { BeaconViewDialog } from \"../beacon\";\nimport { type IBodyProps } from \"./IBodyProps\";\n\nconst useBeaconState = (\n    beaconInfoEvent: MatrixEvent,\n): {\n    beacon?: Beacon;\n    description?: string;\n    latestLocationState?: ContentHelpers.BeaconLocationState;\n    isLive?: boolean;\n    waitingToStart?: boolean;\n} => {\n    const beacon = useBeacon(beaconInfoEvent);\n\n    const isLive = useEventEmitterState(beacon, BeaconEvent.LivenessChange, () => beacon?.isLive);\n\n    const latestLocationState = useEventEmitterState(\n        beacon,\n        BeaconEvent.LocationUpdate,\n        () => beacon?.latestLocationState,\n    );\n\n    if (!beacon) {\n        return {};\n    }\n\n    // a beacon's starting timestamp can be in the future\n    // (either from small deviations in system clock times, or on purpose from another client)\n    // a beacon is only live between its start timestamp and expiry\n    // detect when a beacon is waiting to become live\n    // and display a loading state\n    const waitingToStart = !!beacon && isBeaconWaitingToStart(beacon);\n    const { description } = beacon.beaconInfo;\n\n    return {\n        beacon,\n        description,\n        isLive,\n        waitingToStart,\n        latestLocationState,\n    };\n};\n\n// multiple instances of same map might be in document\n// eg thread and main timeline, reply\n// maplibregl needs a unique id to attach the map instance to\nconst useUniqueId = (eventId: string): string => {\n    const [id, setId] = useState(`${eventId}_${secureRandomString(8)}`);\n\n    useEffect(() => {\n        setId(`${eventId}_${secureRandomString(8)}`);\n    }, [eventId]);\n\n    return id;\n};\n\n// remove related beacon locations on beacon redaction\nconst useHandleBeaconRedaction = (\n    event: MatrixEvent,\n    matrixClient: MatrixClient,\n    getRelationsForEvent?: GetRelationsForEvent,\n): void => {\n    const onBeforeBeaconInfoRedaction = useCallback(\n        (_event: MatrixEvent, redactionEvent: MatrixEvent) => {\n            const relations = getRelationsForEvent\n                ? getRelationsForEvent(event.getId()!, RelationType.Reference, M_BEACON.name)\n                : undefined;\n\n            relations?.getRelations()?.forEach((locationEvent) => {\n                matrixClient.redactEvent(\n                    locationEvent.getRoomId()!,\n                    locationEvent.getId()!,\n                    undefined,\n                    redactionEvent.getContent<IRedactOpts>(),\n                );\n            });\n        },\n        [event, matrixClient, getRelationsForEvent],\n    );\n\n    useEffect(() => {\n        event.addListener(MatrixEventEvent.BeforeRedaction, onBeforeBeaconInfoRedaction);\n        return () => {\n            event.removeListener(MatrixEventEvent.BeforeRedaction, onBeforeBeaconInfoRedaction);\n        };\n    }, [event, onBeforeBeaconInfoRedaction]);\n};\n\nconst MBeaconBody = ({ mxEvent, getRelationsForEvent, ref }: IBodyProps): JSX.Element => {\n    const { beacon, isLive, latestLocationState, waitingToStart } = useBeaconState(mxEvent);\n    const mapId = useUniqueId(mxEvent.getId()!);\n\n    const matrixClient = useContext(MatrixClientContext);\n    const [error, setError] = useState<Error>();\n    const isMapDisplayError =\n        error?.message === LocationShareError.MapStyleUrlNotConfigured ||\n        error?.message === LocationShareError.MapStyleUrlNotReachable;\n    const displayStatus = getBeaconDisplayStatus(\n        !!isLive,\n        latestLocationState,\n        // if we are unable to display maps because it is not configured for the server\n        // don't display an error\n        isMapDisplayError ? undefined : error,\n        waitingToStart,\n    );\n    const markerRoomMember = isSelfLocation(mxEvent.getContent()) ? mxEvent.sender : undefined;\n    const isOwnBeacon = beacon?.beaconInfoOwner === matrixClient.getUserId();\n\n    useHandleBeaconRedaction(mxEvent, matrixClient, getRelationsForEvent);\n\n    const onClick = (): void => {\n        if (displayStatus !== BeaconDisplayStatus.Active) {\n            return;\n        }\n        Modal.createDialog(\n            BeaconViewDialog,\n            {\n                roomId: mxEvent.getRoomId()!,\n                matrixClient,\n                initialFocusedBeacon: beacon,\n            },\n            \"mx_BeaconViewDialog_wrapper\",\n            false, // isPriority\n            true, // isStatic\n        );\n    };\n\n    let map: JSX.Element;\n    if (displayStatus === BeaconDisplayStatus.Active && !isMapDisplayError && latestLocationState?.uri) {\n        map = (\n            <Map\n                id={mapId}\n                centerGeoUri={latestLocationState.uri}\n                onError={setError}\n                onClick={onClick}\n                className=\"mx_MBeaconBody_map\"\n            >\n                {({ map }) => (\n                    <SmartMarker\n                        map={map}\n                        id={`${mapId}-marker`}\n                        geoUri={latestLocationState.uri!}\n                        roomMember={markerRoomMember ?? undefined}\n                        useMemberColor\n                    />\n                )}\n            </Map>\n        );\n    } else if (isMapDisplayError) {\n        map = (\n            <MapError\n                error={error.message as LocationShareError}\n                onClick={onClick}\n                className={classNames(\n                    \"mx_MBeaconBody_mapError\",\n                    // set interactive class when maximised map can be opened\n                    { mx_MBeaconBody_mapErrorInteractive: displayStatus === BeaconDisplayStatus.Active },\n                )}\n                isMinimised\n            />\n        );\n    } else {\n        map = (\n            <MapFallback\n                isLoading={displayStatus === BeaconDisplayStatus.Loading}\n                className=\"mx_MBeaconBody_map mx_MBeaconBody_mapFallback\"\n            />\n        );\n    }\n\n    return (\n        <div className=\"mx_MBeaconBody\" ref={ref}>\n            {map}\n            {isOwnBeacon ? (\n                <OwnBeaconStatus\n                    className=\"mx_MBeaconBody_chin\"\n                    beacon={beacon}\n                    displayStatus={displayStatus}\n                    withIcon\n                />\n            ) : (\n                <BeaconStatus\n                    className=\"mx_MBeaconBody_chin\"\n                    beacon={beacon}\n                    displayStatus={displayStatus}\n                    label={_t(\"timeline|m.beacon_info|view_live_location\")}\n                    withIcon\n                />\n            )}\n        </div>\n    );\n};\n\nexport default MBeaconBody;\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type MouseEvent } from \"react\";\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport {\n    BaseViewModel,\n    type MjolnirBodyViewModel as MjolnirBodyViewModelInterface,\n    type MjolnirBodyViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\nexport interface MjolnirBodyViewModelProps {\n    /**\n     * The event currently hidden by Mjolnir.\n     */\n    mxEvent: MatrixEvent;\n    /**\n     * Invoked after the event has been allowed so the tile can re-render.\n     */\n    onMessageAllowed?: () => void;\n}\n\n/**\n * ViewModel for Mjolnir-hidden message bodies.\n */\nexport class MjolnirBodyViewModel\n    extends BaseViewModel<MjolnirBodyViewSnapshot, MjolnirBodyViewModelProps>\n    implements MjolnirBodyViewModelInterface\n{\n    private static readonly computeSnapshot = (): MjolnirBodyViewSnapshot => ({});\n\n    public constructor(props: MjolnirBodyViewModelProps) {\n        super(props, MjolnirBodyViewModel.computeSnapshot());\n    }\n\n    public setEvent(mxEvent: MatrixEvent): void {\n        if (this.props.mxEvent === mxEvent) return;\n\n        // The view has no event-derived render state; this only changes action inputs.\n        this.props = { ...this.props, mxEvent };\n    }\n\n    public setOnMessageAllowed(onMessageAllowed: (() => void) | undefined): void {\n        if (this.props.onMessageAllowed === onMessageAllowed) return;\n\n        // The view has no callback-derived render state; this only changes action inputs.\n        this.props = { ...this.props, onMessageAllowed };\n    }\n\n    public onAllowClick = (event: MouseEvent<HTMLButtonElement>): void => {\n        event.preventDefault();\n        event.stopPropagation();\n\n        localStorage.setItem(this.localStorageKey, \"true\");\n        this.props.onMessageAllowed?.();\n    };\n\n    private get localStorageKey(): string {\n        return `mx_mjolnir_render_${this.props.mxEvent.getRoomId()}__${this.props.mxEvent.getId()}`;\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport {\n    ActionBarAction,\n    BaseViewModel,\n    type ActionBarViewActions,\n    type ActionBarViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\n/** Props for the edit-history action bar view model. */\nexport interface EditHistoryActionBarViewModelProps {\n    /** Whether to include the remove action. */\n    canRemove: boolean;\n    /** Whether to include the view source action. */\n    showViewSource: boolean;\n    /** Called when the remove action is activated. */\n    onRemoveClick?: (anchor: HTMLElement | null) => void;\n    /** Called when the view source action is activated. */\n    onViewSourceClick?: (anchor: HTMLElement | null) => void;\n}\n\n/** View model for the label-style action bar shown in the edit-history panel. */\nexport class EditHistoryActionBarViewModel\n    extends BaseViewModel<ActionBarViewSnapshot, EditHistoryActionBarViewModelProps>\n    implements ActionBarViewActions\n{\n    public constructor(props: EditHistoryActionBarViewModelProps) {\n        super(props, EditHistoryActionBarViewModel.buildSnapshot(props));\n    }\n\n    private static buildSnapshot(props: EditHistoryActionBarViewModelProps): ActionBarViewSnapshot {\n        const actions: ActionBarAction[] = [];\n\n        if (props.canRemove) {\n            actions.push(ActionBarAction.Remove);\n        }\n        if (props.showViewSource) {\n            actions.push(ActionBarAction.ViewSource);\n        }\n\n        return {\n            actions,\n            presentation: \"label\",\n            isDownloadEncrypted: false,\n            isDownloadLoading: false,\n            isPinned: false,\n            isQuoteExpanded: false,\n            isThreadReplyAllowed: true,\n        };\n    }\n\n    /** Updates props and rebuilds the derived action-bar snapshot. */\n    public setProps(newProps: Partial<EditHistoryActionBarViewModelProps>): void {\n        this.props = {\n            ...this.props,\n            ...newProps,\n        };\n        this.snapshot.merge(EditHistoryActionBarViewModel.buildSnapshot(this.props));\n    }\n\n    /** Forwards the remove action using the triggering button as the anchor. */\n    public onRemoveClick = (anchor: HTMLElement | null): void => {\n        this.props.onRemoveClick?.(anchor);\n    };\n\n    /** Forwards the view source action using the triggering button as the anchor. */\n    public onViewSourceClick = (anchor: HTMLElement | null): void => {\n        this.props.onViewSourceClick?.(anchor);\n    };\n}\n","import HTMLReactParser from '../lib/index.js';\n\nexport {\n  attributesToProps,\n  Comment,\n  domToReact,\n  Element,\n  htmlToDOM,\n  ProcessingInstruction,\n  Text,\n} from '../lib/index.js';\n\nexport default HTMLReactParser.default || HTMLReactParser;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n */\n\nimport React from \"react\";\n\nimport TextWithTooltip from \"./TextWithTooltip\";\n\ninterface IProps extends Omit<React.ComponentProps<typeof TextWithTooltip>, \"tabIndex\" | \"onClick\" | \"tooltip\"> {\n    tooltip: string;\n}\n\nexport default class LinkWithTooltip extends React.Component<IProps> {\n    public render(): React.ReactNode {\n        const { children, tooltip, ...props } = this.props;\n\n        return (\n            <TextWithTooltip\n                // Disable focusing on the tooltip target to avoid double / nested focus. The contained anchor element\n                // itself allows focusing which also triggers the tooltip.\n                tabIndex={-1}\n                tooltip={tooltip}\n                onClick={(e) => (e.target as HTMLElement).blur()} // Force tooltip to hide on clickout\n                {...props}\n            >\n                {children}\n            </TextWithTooltip>\n        );\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type JSX } from \"react\";\nimport { type DOMNode, type Element, type HTMLReactParserOptions, type Text } from \"html-react-parser\";\nimport { type MatrixEvent, type Room } from \"matrix-js-sdk/src/matrix\";\n\n/**\n * The type of a parent node of an element, normally exported by domhandler but that is not a direct dependency of ours\n */\nexport type ParentNode = NonNullable<Element[\"parentNode\"]>;\n\n/**\n * Returns the text content of a node if it is the only child and that child is a text node\n * @param node - the node to check\n */\nexport const getSingleTextContentNode = (node: Element): string | null => {\n    if (node.childNodes.length === 1 && node.childNodes[0].type === \"text\") {\n        return node.childNodes[0].data;\n    }\n    return null;\n};\n\n/**\n * Returns true if the node has a parent that matches the given matcher\n * @param node - the node to check\n * @param matcher - a function that returns true if the node matches\n */\nexport const hasParentMatching = (node: Element, matcher: (node: ParentNode | null) => boolean): boolean => {\n    let parent = node.parentNode;\n    while (parent) {\n        if (matcher(parent)) return true;\n        parent = parent.parentNode;\n    }\n    return false;\n};\n\n/**\n * A replacer function that can be used with html-react-parser\n */\nexport type Replacer = HTMLReactParserOptions[\"replace\"];\n\ninterface Parameters {\n    isHtml: boolean;\n    replace: Replacer;\n    // Required for keywordPillRenderer\n    keywordRegexpPattern?: RegExp;\n    // Required for mentionPillRenderer\n    mxEvent?: MatrixEvent;\n    room?: Room;\n    shouldShowPillAvatar?: boolean;\n}\n\ntype SpecialisedReplacer<T extends DOMNode> = (\n    node: T,\n    parameters: Parameters,\n    index: number,\n) => JSX.Element | string | void;\n\n/**\n * A map of replacer functions for different types of nodes/tags.\n * When a function returns a JSX element, the element will be rendered in place of the node.\n */\nexport type RendererMap = Partial<\n    {\n        [tagName in keyof HTMLElementTagNameMap]: SpecialisedReplacer<Element>;\n    } & {\n        [Node.TEXT_NODE]: SpecialisedReplacer<Text>;\n    }\n>;\n\ntype PreparedRenderer = (parameters: Omit<Parameters, \"replace\">) => Replacer;\n\n/**\n * Combines multiple renderers into a single Replacer function\n * @param renderers - the list of renderers to combine\n */\nexport const combineRenderers =\n    (...renderers: RendererMap[]): PreparedRenderer =>\n    (parameters) => {\n        const replace: Replacer = (node, index) => {\n            if (node.type === \"text\") {\n                for (const replacer of renderers) {\n                    const result = replacer[Node.TEXT_NODE]?.(node, parametersWithReplace, index);\n                    if (result) return result;\n                }\n            }\n            if (node.type === \"tag\") {\n                const tagName = node.tagName.toLowerCase() as keyof HTMLElementTagNameMap;\n                for (const replacer of renderers) {\n                    const result = replacer[tagName]?.(node, parametersWithReplace, index);\n                    if (result) return result;\n                }\n            }\n        };\n        const parametersWithReplace: Parameters = { ...parameters, replace };\n        return replace;\n    };\n","/*\nCopyright 2024-2025 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { domToReact } from \"html-react-parser\";\n\nimport LinkWithTooltip from \"../components/views/elements/LinkWithTooltip\";\nimport { getSingleTextContentNode, type RendererMap } from \"./utils.tsx\";\n\n/**\n * Wraps ambiguous links in a tooltip trigger that shows the full URL.\n */\nexport const ambiguousLinkTooltipRenderer: RendererMap = {\n    a: (anchor, { isHtml }) => {\n        // Ambiguous URLs are only possible in HTML content\n        if (!isHtml) return;\n\n        const href = anchor.attribs[\"href\"];\n        if (href && href !== getSingleTextContentNode(anchor)) {\n            let tooltip = href as string;\n            try {\n                tooltip = new URL(href, window.location.href).toString();\n            } catch {\n                // Not all hrefs will be valid URLs\n            }\n            return <LinkWithTooltip tooltip={tooltip}>{domToReact([anchor])}</LinkWithTooltip>;\n        }\n    },\n};\n","const xmlCodeMap = new Map([\n    [34, \"&quot;\"],\n    [38, \"&amp;\"],\n    [39, \"&apos;\"],\n    [60, \"&lt;\"],\n    [62, \"&gt;\"],\n]);\n\n// For compatibility with node < 4, we wrap `codePointAt`\n/**\n * Read a code point at a given index.\n * @param input Input string to encode or decode.\n * @param index Current read position in the input string.\n */\nexport const getCodePoint: (c: string, index: number) => number =\n    typeof String.prototype.codePointAt === \"function\"\n        ? (input: string, index: number): number => input.codePointAt(index)!\n        : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n          (c: string, index: number): number =>\n              (c.charCodeAt(index) & 0xfc_00) === 0xd8_00\n                  ? (c.charCodeAt(index) - 0xd8_00) * 0x4_00 +\n                    c.charCodeAt(index + 1) -\n                    0xdc_00 +\n                    0x1_00_00\n                  : c.charCodeAt(index);\n\n/**\n * Bitset for ASCII characters that need to be escaped in XML.\n */\nexport const XML_BITSET_VALUE = 0x50_00_00_c4; // 32..63 -> 34 (\"),38 (&),39 ('),60 (<),62 (>)\n\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using XML entities. Uses a fast bitset scan instead of RegExp.\n *\n * If a character has no equivalent entity, a numeric hexadecimal reference\n * (eg. `&#xfc;`) will be used.\n * @param input Input string to encode or decode.\n */\nexport function encodeXML(input: string): string {\n    let out: string | undefined;\n    let last = 0;\n    const { length } = input;\n\n    for (let index = 0; index < length; index++) {\n        const char = input.charCodeAt(index);\n\n        // Check for ASCII chars that don't need escaping\n        if (\n            char < 0x80 &&\n            (((XML_BITSET_VALUE >>> char) & 1) === 0 || char >= 64 || char < 32)\n        ) {\n            continue;\n        }\n\n        if (out === undefined) out = input.substring(0, index);\n        else if (last !== index) out += input.substring(last, index);\n\n        if (char < 64) {\n            // Known replacement\n            out += xmlCodeMap.get(char)!;\n            last = index + 1;\n            continue;\n        }\n\n        // Non-ASCII: encode as numeric entity (handle surrogate pair)\n        const cp = getCodePoint(input, index);\n        out += `&#x${cp.toString(16)};`;\n        if (cp !== char) index++; // Skip trailing surrogate\n        last = index + 1;\n    }\n\n    if (out === undefined) return input;\n    if (last < length) out += input.substr(last);\n    return out;\n}\n\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using numeric hexadecimal reference (eg. `&#xfc;`).\n *\n * Have a look at `escapeUTF8` if you want a more concise output at the expense\n * of reduced transportability.\n * @param data String to escape.\n */\nexport const escape: typeof encodeXML = encodeXML;\n\n/**\n * Creates a function that escapes all characters matched by the given regular\n * expression using the given map of characters to escape to their entities.\n * @param regex Regular expression to match characters to escape.\n * @param map Map of characters to escape to their entities.\n * @returns Function that escapes all characters matched by the given regular\n * expression using the given map of characters to escape to their entities.\n */\nfunction getEscaper(\n    regex: RegExp,\n    map: Map<number, string>,\n): (data: string) => string {\n    return function escape(data: string): string {\n        let match: RegExpExecArray | null;\n        let lastIndex = 0;\n        let result = \"\";\n\n        while ((match = regex.exec(data))) {\n            if (lastIndex !== match.index) {\n                result += data.substring(lastIndex, match.index);\n            }\n\n            // We know that this character will be in the map.\n            result += map.get(match[0].charCodeAt(0))!;\n\n            // Every match will be of length 1\n            lastIndex = match.index + 1;\n        }\n\n        return result + data.substring(lastIndex);\n    };\n}\n\n/**\n * Encodes all characters not valid in XML documents using XML entities.\n *\n * Note that the output will be character-set dependent.\n * @param data String to escape.\n */\nexport const escapeUTF8: (data: string) => string = /* #__PURE__ */ getEscaper(\n    /[\"&'<>]/g,\n    xmlCodeMap,\n);\n\n/**\n * Encodes all characters that have to be escaped in HTML attributes,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n * @param data String to escape.\n */\nexport const escapeAttribute: (data: string) => string =\n    /* #__PURE__ */ getEscaper(\n        /[\"&\\u00A0]/g,\n        new Map([\n            [34, \"&quot;\"],\n            [38, \"&amp;\"],\n            [160, \"&nbsp;\"],\n        ]),\n    );\n\n/**\n * Encodes all characters that have to be escaped in HTML text,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n * @param data String to escape.\n */\nexport const escapeText: (data: string) => string = /* #__PURE__ */ getEscaper(\n    /[&<>\\u00A0]/g,\n    new Map([\n        [38, \"&amp;\"],\n        [60, \"&lt;\"],\n        [62, \"&gt;\"],\n        [160, \"&nbsp;\"],\n    ]),\n);\n","/**\n * Mixed-case SVG and MathML element names recognized in foreign content.\n */\nexport const elementNames = new Map([\n    \"altGlyph\",\n    \"altGlyphDef\",\n    \"altGlyphItem\",\n    \"animateColor\",\n    \"animateMotion\",\n    \"animateTransform\",\n    \"clipPath\",\n    \"feBlend\",\n    \"feColorMatrix\",\n    \"feComponentTransfer\",\n    \"feComposite\",\n    \"feConvolveMatrix\",\n    \"feDiffuseLighting\",\n    \"feDisplacementMap\",\n    \"feDistantLight\",\n    \"feDropShadow\",\n    \"feFlood\",\n    \"feFuncA\",\n    \"feFuncB\",\n    \"feFuncG\",\n    \"feFuncR\",\n    \"feGaussianBlur\",\n    \"feImage\",\n    \"feMerge\",\n    \"feMergeNode\",\n    \"feMorphology\",\n    \"feOffset\",\n    \"fePointLight\",\n    \"feSpecularLighting\",\n    \"feSpotLight\",\n    \"feTile\",\n    \"feTurbulence\",\n    \"foreignObject\",\n    \"glyphRef\",\n    \"linearGradient\",\n    \"radialGradient\",\n    \"textPath\",\n].map((value) => [value.toLowerCase(), value]));\n/**\n * Mixed-case SVG and MathML attribute names recognized in foreign content.\n */\nexport const attributeNames = new Map([\n    \"definitionURL\",\n    \"attributeName\",\n    \"attributeType\",\n    \"baseFrequency\",\n    \"baseProfile\",\n    \"calcMode\",\n    \"clipPathUnits\",\n    \"diffuseConstant\",\n    \"edgeMode\",\n    \"filterUnits\",\n    \"glyphRef\",\n    \"gradientTransform\",\n    \"gradientUnits\",\n    \"kernelMatrix\",\n    \"kernelUnitLength\",\n    \"keyPoints\",\n    \"keySplines\",\n    \"keyTimes\",\n    \"lengthAdjust\",\n    \"limitingConeAngle\",\n    \"markerHeight\",\n    \"markerUnits\",\n    \"markerWidth\",\n    \"maskContentUnits\",\n    \"maskUnits\",\n    \"numOctaves\",\n    \"pathLength\",\n    \"patternContentUnits\",\n    \"patternTransform\",\n    \"patternUnits\",\n    \"pointsAtX\",\n    \"pointsAtY\",\n    \"pointsAtZ\",\n    \"preserveAlpha\",\n    \"preserveAspectRatio\",\n    \"primitiveUnits\",\n    \"refX\",\n    \"refY\",\n    \"repeatCount\",\n    \"repeatDur\",\n    \"requiredExtensions\",\n    \"requiredFeatures\",\n    \"specularConstant\",\n    \"specularExponent\",\n    \"spreadMethod\",\n    \"startOffset\",\n    \"stdDeviation\",\n    \"stitchTiles\",\n    \"surfaceScale\",\n    \"systemLanguage\",\n    \"tableValues\",\n    \"targetX\",\n    \"targetY\",\n    \"textLength\",\n    \"viewBox\",\n    \"viewTarget\",\n    \"xChannelSelector\",\n    \"yChannelSelector\",\n    \"zoomAndPan\",\n].map((value) => [value.toLowerCase(), value]));\n","/*\n * Module dependencies\n */\nimport * as ElementType from \"domelementtype\";\nimport { encodeXML, escapeAttribute, escapeText } from \"entities\";\n/**\n * Mixed-case SVG and MathML tags & attributes\n * recognized by the HTML parser.\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nimport { attributeNames, elementNames } from \"./foreign-names.js\";\nconst unencodedElements = new Set([\n    \"style\",\n    \"script\",\n    \"xmp\",\n    \"iframe\",\n    \"noembed\",\n    \"noframes\",\n    \"plaintext\",\n    \"noscript\",\n]);\nfunction replaceQuotes(value) {\n    return value.replace(/\"/g, \"&quot;\");\n}\n/**\n * Format attributes\n * @param attributes Attribute map to serialize.\n * @param options Options that control this operation.\n */\nfunction formatAttributes(attributes, options) {\n    if (!attributes)\n        return;\n    const encode = (options.encodeEntities ?? options.decodeEntities) === false\n        ? replaceQuotes\n        : !!options.xmlMode || options.encodeEntities !== \"utf8\"\n            ? encodeXML\n            : escapeAttribute;\n    return Object.keys(attributes)\n        .map((key) => {\n        const value = attributes[key];\n        const normalizedValue = value == null ? \"\" : String(value);\n        if (options.xmlMode === \"foreign\") {\n            /* Fix up mixed-case attribute names */\n            key = attributeNames.get(key) ?? key;\n        }\n        if (!(options.emptyAttrs || options.xmlMode) && normalizedValue === \"\") {\n            return key;\n        }\n        return `${key}=\"${encode(normalizedValue)}\"`;\n    })\n        .join(\" \");\n}\n/**\n * Self-enclosing tags\n */\nconst singleTag = new Set([\n    \"area\",\n    \"base\",\n    \"basefont\",\n    \"br\",\n    \"col\",\n    \"command\",\n    \"embed\",\n    \"frame\",\n    \"hr\",\n    \"img\",\n    \"input\",\n    \"isindex\",\n    \"keygen\",\n    \"link\",\n    \"meta\",\n    \"param\",\n    \"source\",\n    \"track\",\n    \"wbr\",\n]);\n/**\n * Renders a DOM node or an array of DOM nodes to a string.\n *\n * Can be thought of as the equivalent of the `outerHTML` of the passed node(s).\n * @param node Node to be rendered.\n * @param options Changes serialization behavior\n */\nexport function render(node, options = {}) {\n    const nodes = \"length\" in node ? node : [node];\n    let output = \"\";\n    let index = 0;\n    while (index < nodes.length) {\n        output += renderNode(nodes[index], options);\n        index++;\n    }\n    return output;\n}\nexport default render;\nfunction renderNode(node, options) {\n    switch (node.type) {\n        case ElementType.Root: {\n            return render(node.children, options);\n        }\n        // @ts-expect-error We don't use `Doctype` yet\n        case ElementType.Doctype:\n        case ElementType.Directive: {\n            return renderDirective(node);\n        }\n        case ElementType.Comment: {\n            return renderComment(node);\n        }\n        case ElementType.CDATA: {\n            return renderCdata(node);\n        }\n        case ElementType.Script:\n        case ElementType.Style:\n        case ElementType.Tag: {\n            return renderTag(node, options);\n        }\n        case ElementType.Text: {\n            return renderText(node, options);\n        }\n    }\n}\nconst foreignModeIntegrationPoints = new Set([\n    \"mi\",\n    \"mo\",\n    \"mn\",\n    \"ms\",\n    \"mtext\",\n    \"annotation-xml\",\n    \"foreignObject\",\n    \"desc\",\n    \"title\",\n]);\nconst foreignElements = new Set([\"svg\", \"math\"]);\nfunction renderTag(element, options) {\n    // Handle SVG / MathML in HTML\n    if (options.xmlMode === \"foreign\") {\n        /* Fix up mixed-case element names */\n        element.name = elementNames.get(element.name) ?? element.name;\n        /* Exit foreign mode at integration points */\n        if (element.parent &&\n            foreignModeIntegrationPoints.has(element.parent.name)) {\n            options = { ...options, xmlMode: false };\n        }\n    }\n    if (!options.xmlMode && foreignElements.has(element.name)) {\n        options = { ...options, xmlMode: \"foreign\" };\n    }\n    let tag = `<${element.name}`;\n    const attribs = formatAttributes(element.attribs, options);\n    if (attribs) {\n        tag += ` ${attribs}`;\n    }\n    if (element.children.length === 0 &&\n        (options.xmlMode\n            ? // In XML mode or foreign mode, and user hasn't explicitly turned off self-closing tags\n                options.selfClosingTags !== false\n            : // User explicitly asked for self-closing tags, even in HTML mode\n                options.selfClosingTags && singleTag.has(element.name))) {\n        if (!options.xmlMode)\n            tag += \" \";\n        tag += \"/>\";\n    }\n    else {\n        tag += \">\";\n        if (element.children.length > 0) {\n            tag += render(element.children, options);\n        }\n        if (!!options.xmlMode || !singleTag.has(element.name)) {\n            tag += `</${element.name}>`;\n        }\n    }\n    return tag;\n}\nfunction renderDirective(element) {\n    return `<${element.data}>`;\n}\nfunction renderText(element, options) {\n    let data = element.data || \"\";\n    // If entities weren't decoded, no need to encode them back\n    if ((options.encodeEntities ?? options.decodeEntities) !== false &&\n        !(!options.xmlMode &&\n            element.parent &&\n            unencodedElements.has(element.parent.name))) {\n        data =\n            !!options.xmlMode || options.encodeEntities !== \"utf8\"\n                ? encodeXML(data)\n                : escapeText(data);\n    }\n    return data;\n}\nfunction renderCdata(element) {\n    return `<![CDATA[${element.children[0].data}]]>`;\n}\nfunction renderComment(element) {\n    return `<!--${element.data}-->`;\n}\n","import renderHTML, { type DomSerializerOptions } from \"dom-serializer\";\nimport { ElementType } from \"domelementtype\";\nimport {\n    type AnyNode,\n    hasChildren,\n    isCDATA,\n    isComment,\n    isTag,\n    isText,\n} from \"domhandler\";\n\n/**\n * @category Stringify\n * @deprecated Use the `dom-serializer` module directly.\n * @param node Node to get the outer HTML of.\n * @param options Options for serialization.\n * @returns `node`'s outer HTML.\n */\nexport function getOuterHTML(\n    node: AnyNode | ArrayLike<AnyNode>,\n    options?: DomSerializerOptions,\n): string {\n    return renderHTML(node, options);\n}\n\n/**\n * @category Stringify\n * @deprecated Use the `dom-serializer` module directly.\n * @param node Node to get the inner HTML of.\n * @param options Options for serialization.\n * @returns `node`'s inner HTML.\n */\nexport function getInnerHTML(\n    node: AnyNode,\n    options?: DomSerializerOptions,\n): string {\n    return hasChildren(node)\n        ? node.children.map((node) => getOuterHTML(node, options)).join(\"\")\n        : \"\";\n}\n\n/**\n * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags. Ignores comments.\n *\n * @category Stringify\n * @deprecated Use `textContent` instead.\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n */\nexport function getText(node: AnyNode | AnyNode[]): string {\n    if (Array.isArray(node)) return node.map(getText).join(\"\");\n    if (isTag(node)) return node.name === \"br\" ? \"\\n\" : getText(node.children);\n    if (isCDATA(node)) return getText(node.children);\n    if (isText(node)) return node.data;\n    return \"\";\n}\n\n/**\n * Get a node's text content. Ignores comments.\n *\n * @category Stringify\n * @param node Node to get the text content of.\n * @returns `node`'s text content.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}\n */\nexport function textContent(node: AnyNode | AnyNode[]): string {\n    if (Array.isArray(node)) return node.map(textContent).join(\"\");\n    if (hasChildren(node) && !isComment(node)) {\n        return textContent(node.children);\n    }\n    if (isText(node)) return node.data;\n    return \"\";\n}\n\n/**\n * Get a node's inner text, ignoring `<script>` and `<style>` tags. Ignores comments.\n *\n * @category Stringify\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}\n */\nexport function innerText(node: AnyNode | AnyNode[]): string {\n    if (Array.isArray(node)) return node.map(innerText).join(\"\");\n    if (hasChildren(node) && (node.type === ElementType.Tag || isCDATA(node))) {\n        return innerText(node.children);\n    }\n    if (isText(node)) return node.data;\n    return \"\";\n}\n","/*\nCopyright 2024-2025 New Vector Ltd.\nCopyright 2019-2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { RuleId } from \"matrix-js-sdk/src/matrix\";\nimport { type Element } from \"html-react-parser\";\nimport { textContent } from \"domutils\";\nimport reactStringReplace from \"react-string-replace\";\nimport { PushProcessor } from \"matrix-js-sdk/src/pushprocessor\";\n\nimport { Pill } from \"../components/views/elements/Pill\";\nimport { PillType } from \"../components/views/elements/PillType\";\nimport { parsePermalink } from \"../utils/permalinks/Permalinks\";\nimport { type PermalinkParts } from \"../utils/permalinks/PermalinkConstructor\";\nimport { hasParentMatching, type RendererMap, type ParentNode } from \"./utils.tsx\";\n\nconst AT_ROOM_REGEX = PushProcessor.getPushRuleGlobRegex(\"@room\", true, \"gmi\");\n\n/**\n * A node here is an A element with a href attribute tag.\n *\n * It should be pillified if the permalink parser returns a result and one of the following conditions match:\n * - Text content equals href. This is the case when sending a plain permalink inside a message.\n * - The link is not from linkify (isHtml=true).\n *   Composer completions already create an A tag.\n */\nconst shouldBePillified = (node: Element, href: string, parts: PermalinkParts | null, isHtml: boolean): boolean => {\n    // permalink parser didn't return any parts\n    if (!parts) return false;\n\n    const text = textContent(node);\n\n    // event permalink with custom label\n    if (parts.eventId && href !== text) return false;\n\n    return href === text || isHtml;\n};\n\nconst isPreCode = (domNode: ParentNode | null): boolean =>\n    (domNode as Element)?.tagName === \"PRE\" || (domNode as Element)?.tagName === \"CODE\";\n\n/**\n * Marks the text that activated a push-notification mention pattern.\n */\nexport const mentionPillRenderer: RendererMap = {\n    a: (anchor, { room, shouldShowPillAvatar, isHtml }) => {\n        if (!room) return;\n\n        const href = anchor.attribs[\"href\"];\n        if (\n            href &&\n            !hasParentMatching(anchor, isPreCode) &&\n            shouldBePillified(anchor, href, parsePermalink(href), isHtml)\n        ) {\n            return <Pill url={href} inMessage={true} room={room} shouldShowPillAvatar={shouldShowPillAvatar} />;\n        }\n    },\n\n    [Node.TEXT_NODE]: (text, { room, mxEvent, shouldShowPillAvatar }) => {\n        if (!room || !mxEvent) return;\n\n        const atRoomRule = room.client.pushProcessor.getPushRuleById(\n            mxEvent.getContent()[\"m.mentions\"] !== undefined ? RuleId.IsRoomMention : RuleId.AtRoomNotification,\n        );\n        if (atRoomRule && room.client.pushProcessor.ruleMatchesEvent(atRoomRule, mxEvent)) {\n            const parts = reactStringReplace(text.data, AT_ROOM_REGEX, (_match, i) => (\n                <Pill\n                    key={i}\n                    type={PillType.AtRoomMention}\n                    inMessage={true}\n                    room={room}\n                    shouldShowPillAvatar={shouldShowPillAvatar}\n                />\n            ));\n\n            if (parts.length <= 1) return; // no matches, skip replacing\n\n            return <>{parts}</>;\n        }\n    },\n};\n\n/**\n * Marks the text that activated a push-notification keyword pattern.\n */\nexport const keywordPillRenderer: RendererMap = {\n    [Node.TEXT_NODE]: (text, { keywordRegexpPattern }) => {\n        if (!keywordRegexpPattern) return;\n\n        const parts = reactStringReplace(text.data, keywordRegexpPattern, (match, i) => (\n            <Pill key={i} text={match} type={PillType.Keyword} />\n        ));\n\n        if (parts.length <= 1) return; // no matches, skip replacing\n\n        return <>{parts}</>;\n    },\n};\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { domToReact, type DOMNode } from \"html-react-parser\";\n\nimport { type RendererMap } from \"./utils.tsx\";\nimport Spoiler from \"../components/views/elements/Spoiler.tsx\";\n\n/**\n * Replaces spans with `data-mx-spoiler` with a Spoiler component.\n */\nexport const spoilerRenderer: RendererMap = {\n    span: (span, params) => {\n        const reason = span.attribs[\"data-mx-spoiler\"];\n        if (typeof reason === \"string\") {\n            return (\n                <Spoiler reason={reason}>{domToReact(span.children as DOMNode[], { replace: params.replace })}</Spoiler>\n            );\n        }\n    },\n};\n","/*\nCopyright 2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { type DOMNode, type Element as ParserElement, domToReact } from \"html-react-parser\";\nimport { textContent, getInnerHTML } from \"domutils\";\nimport { CollapseIcon, CopyIcon, ExpandIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { useSettingValue } from \"../../../hooks/useSettings.ts\";\nimport { CopyTextButton } from \"../elements/CopyableText.tsx\";\n\nconst MAX_HIGHLIGHT_LENGTH = 4096;\nconst MAX_LINES_BEFORE_COLLAPSE = 5;\n\ninterface Props {\n    preNode: ParserElement;\n}\n\nconst ExpandCollapseButton: React.FC<{\n    expanded: boolean;\n    onClick(this: void): void;\n}> = ({ expanded, onClick }) => {\n    return (\n        <span className=\"mx_EventTile_button\" onClick={onClick}>\n            {expanded ? <CollapseIcon /> : <ExpandIcon />}\n        </span>\n    );\n};\n\nconst CodeBlock: React.FC<Props> = ({ preNode }) => {\n    const enableSyntaxHighlightLanguageDetection = useSettingValue(\"enableSyntaxHighlightLanguageDetection\");\n    const showCodeLineNumbers = useSettingValue(\"showCodeLineNumbers\");\n    const expandCodeByDefault = useSettingValue(\"expandCodeByDefault\");\n    const [expanded, setExpanded] = useState(expandCodeByDefault);\n\n    const text = textContent(preNode);\n\n    let expandCollapseButton: JSX.Element | undefined;\n    if (text.split(\"\\n\").length >= MAX_LINES_BEFORE_COLLAPSE) {\n        expandCollapseButton = (\n            <ExpandCollapseButton\n                expanded={expanded}\n                onClick={() => {\n                    setExpanded(!expanded);\n                }}\n            />\n        );\n    }\n\n    const innerHTML = getInnerHTML(preNode);\n    let lineNumbers: JSX.Element | undefined;\n    if (showCodeLineNumbers) {\n        // Calculate number of lines in pre\n        const number = innerHTML.replace(/\\n(<\\/code>)?$/, \"\").split(/\\n/).length;\n        // Iterate through lines starting with 1 (number of the first line is 1)\n        lineNumbers = (\n            <span className=\"mx_EventTile_lineNumbers\">\n                {Array.from({ length: number }, (_, i) => i + 1).map((i) => (\n                    <span key={i}>{i}</span>\n                ))}\n            </span>\n        );\n    }\n\n    async function highlightCode(div: HTMLElement | null): Promise<void> {\n        const code = div?.getElementsByTagName(\"code\")[0];\n        if (!code) return;\n        const { default: highlight } = await import(\"highlight.js\");\n\n        if (code.textContent && code.textContent.length > MAX_HIGHLIGHT_LENGTH) {\n            console.log(\n                `Code block is bigger than highlight limit (${code.textContent.length} > ${MAX_HIGHLIGHT_LENGTH}): not highlighting`,\n            );\n            return;\n        }\n\n        let advertisedLang: string | undefined;\n        for (const cl of code.className.split(/\\s+/)) {\n            if (cl.startsWith(\"language-\")) {\n                const maybeLang = cl.split(\"-\", 2)[1];\n                if (highlight.getLanguage(maybeLang)) {\n                    advertisedLang = maybeLang;\n                    break;\n                }\n            }\n        }\n\n        if (advertisedLang) {\n            // If the code says what language it is, highlight it in that language\n            // We don't use highlightElement here because we can't force language detection\n            // off. It should use the one we've found in the CSS class but we'd rather pass\n            // it in explicitly to make sure.\n            code.innerHTML = highlight.highlight(code.textContent ?? \"\", { language: advertisedLang }).value;\n        } else if (enableSyntaxHighlightLanguageDetection) {\n            // User has language detection enabled, so highlight the block with auto-highlighting enabled.\n            // We pass highlightjs the text to highlight rather than letting it\n            // work on the DOM with highlightElement because that also adds CSS\n            // classes to the pre/code element that we don't want (the CSS\n            // conflicts with our own).\n            code.innerHTML = highlight.highlightAuto(code.textContent ?? \"\").value;\n        }\n    }\n\n    function highlightCodeRef(div: HTMLElement | null): void {\n        highlightCode(div);\n    }\n\n    let content = domToReact(preNode.children as DOMNode[]);\n\n    // Add code element if it's missing since we depend on it\n    if (!preNode.children.some((child) => child.type === \"tag\" && child.tagName.toUpperCase() === \"CODE\")) {\n        content = <code>{content}</code>;\n    }\n\n    return (\n        <div className=\"mx_EventTile_pre_container\">\n            <pre\n                className={classNames({\n                    mx_EventTile_collapsedCodeBlock: !expanded,\n                })}\n            >\n                {lineNumbers}\n                <div style={{ display: \"contents\" }} ref={highlightCodeRef}>\n                    {content}\n                </div>\n            </pre>\n            {expandCollapseButton}\n            <CopyTextButton\n                getTextToCopy={() => text}\n                className={classNames(\"mx_EventTile_button mx_EventTile_copyButton\", {\n                    mx_EventTile_buttonBottom: !!expandCollapseButton,\n                })}\n            >\n                <CopyIcon />\n            </CopyTextButton>\n        </div>\n    );\n};\n\nexport default CodeBlock;\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport { type RendererMap } from \"./utils.tsx\";\nimport CodeBlock from \"../components/views/messages/CodeBlock.tsx\";\n\n/**\n * Replaces `pre` elements with a CodeBlock component\n */\nexport const codeBlockRenderer: RendererMap = {\n    pre: (pre) => {\n        return <CodeBlock preNode={pre} />;\n    },\n};\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n    type IContent,\n    type MatrixClient,\n    type MatrixEvent,\n    MatrixEventEvent,\n    MsgType,\n    PushRuleKind,\n} from \"matrix-js-sdk/src/matrix\";\nimport parse from \"html-react-parser\";\nimport { PushProcessor } from \"matrix-js-sdk/src/pushprocessor\";\nimport {\n    BaseViewModel,\n    type EventContentBodyViewSnapshot,\n    type EventContentBodyViewModel as EventContentBodyViewModelInterface,\n} from \"@element-hq/web-shared-components\";\n\nimport { bodyToNode } from \"../../HtmlUtils\";\nimport PlatformPeg from \"../../PlatformPeg\";\nimport {\n    combineRenderers,\n    type Replacer,\n    type RendererMap,\n    keywordPillRenderer,\n    mentionPillRenderer,\n    ambiguousLinkTooltipRenderer,\n    codeBlockRenderer,\n    spoilerRenderer,\n} from \"../../renderer\";\nimport { filterBoolean } from \"../../utils/arrays\";\nimport SettingsStore from \"../../settings/SettingsStore\";\n\n/**\n * Options for configuring which renderers to apply.\n */\nexport interface ReplacerOptions {\n    /**\n     * Whether to render room/user mentions as pills.\n     * @default false\n     */\n    renderMentionPills?: boolean;\n    /**\n     * Whether to render push rule keywords as pills.\n     * @default false\n     */\n    renderKeywordPills?: boolean;\n    /**\n     * Whether to render spoilers as hidden content revealed on click.\n     * @default false\n     */\n    renderSpoilers?: boolean;\n    /**\n     * Whether to render code blocks as syntax highlighted code with a copy to clipboard button.\n     * @default false\n     */\n    renderCodeBlocks?: boolean;\n    /**\n     * Whether to render tooltips for ambiguous links, only effective on platforms which specify `needsUrlTooltips` true.\n     * @default false\n     */\n    renderTooltipsForAmbiguousLinks?: boolean;\n}\n\n/**\n * Props for the EventContentBody ViewModel.\n */\nexport interface EventContentBodyViewModelProps extends ReplacerOptions {\n    /**\n     * The content to render.\n     */\n    content: IContent;\n    /**\n     * The Matrix event to render, required for renderMentionPills & renderKeywordPills.\n     */\n    mxEvent?: MatrixEvent;\n    /**\n     * Whether to strip reply fallbacks from the content before rendering.\n     * @default false\n     */\n    stripReply?: boolean;\n    /**\n     * Highlights to emphasise in the content.\n     */\n    highlights?: string[];\n    /**\n     * Whether to render links as clickable anchors.\n     * @default true\n     */\n    linkify?: boolean;\n    /**\n     * Whether to include the `dir=\"auto\"` attribute on the rendered element.\n     * Always true for \"div\" elements.\n     * @default true\n     */\n    includeDir?: boolean;\n    /**\n     * Whether to render the content in a div or span.\n     * @default \"span\"\n     */\n    as?: \"span\" | \"div\";\n    /**\n     * Whether big emoji should be enabled.\n     * @default false\n     */\n    enableBigEmoji?: boolean;\n    /**\n     * Whether media is visible in the event.\n     * @default true\n     */\n    mediaIsVisible?: boolean;\n    /**\n     * Whether to show pill avatars.\n     * @default true\n     */\n    shouldShowPillAvatar?: boolean;\n    /**\n     * Matrix client used to resolve room context for renderers.\n     */\n    client: MatrixClient | null;\n}\n\n/**\n * Returns a RegExp pattern for the keyword in the push rule of the given Matrix event, if any.\n */\nconst getPushDetailsKeywordPatternRegexp = (mxEvent: MatrixEvent): RegExp | undefined => {\n    const pushDetails = mxEvent.getPushDetails();\n    if (\n        pushDetails.rule?.enabled &&\n        pushDetails.rule.kind === PushRuleKind.ContentSpecific &&\n        pushDetails.rule.pattern\n    ) {\n        return PushProcessor.getPushRuleGlobRegex(pushDetails.rule.pattern, true, \"gi\");\n    }\n    return undefined;\n};\n\n/**\n * Creates a replacer function based on the provided options and context.\n */\nconst createReplacer = (props: EventContentBodyViewModelProps): Replacer => {\n    const { content, mxEvent, shouldShowPillAvatar, client, ...options } = props;\n    const room = client?.getRoom(mxEvent?.getRoomId()) ?? undefined;\n    const isHtml = content.format === \"org.matrix.custom.html\";\n    const keywordRegexpPattern = mxEvent ? getPushDetailsKeywordPatternRegexp(mxEvent) : undefined;\n\n    const replacers = filterBoolean<RendererMap>([\n        options.renderMentionPills ? mentionPillRenderer : undefined,\n        options.renderKeywordPills && keywordRegexpPattern ? keywordPillRenderer : undefined,\n        options.renderTooltipsForAmbiguousLinks && PlatformPeg.get()?.needsUrlTooltips()\n            ? ambiguousLinkTooltipRenderer\n            : undefined,\n        options.renderSpoilers ? spoilerRenderer : undefined,\n        options.renderCodeBlocks ? codeBlockRenderer : undefined,\n    ]);\n\n    return combineRenderers(...replacers)({\n        isHtml,\n        mxEvent,\n        room,\n        shouldShowPillAvatar,\n        keywordRegexpPattern,\n    });\n};\n\n/**\n * ViewModel for EventContentBody component.\n * Handles all Matrix SDK interactions and content processing.\n */\nexport class EventContentBodyViewModel\n    extends BaseViewModel<EventContentBodyViewSnapshot, EventContentBodyViewModelProps>\n    implements EventContentBodyViewModelInterface\n{\n    private watchedEvent?: MatrixEvent;\n\n    private static readonly computeBodySnapshot = (\n        props: EventContentBodyViewModelProps,\n    ): Pick<EventContentBodyViewSnapshot, \"body\" | \"formattedBody\" | \"className\"> => {\n        const { content, stripReply, highlights, linkify, enableBigEmoji, mediaIsVisible } = props;\n        const isEmote = content.msgtype === MsgType.Emote;\n        const { strippedBody, formattedBody, emojiBodyElements, className } = bodyToNode(content, highlights, {\n            disableBigEmoji: isEmote || !enableBigEmoji,\n            stripReplyFallback: stripReply,\n            mediaIsVisible,\n            linkify,\n        });\n\n        return {\n            body: emojiBodyElements || strippedBody,\n            formattedBody,\n            className,\n        };\n    };\n\n    private static readonly computeDir = (props: EventContentBodyViewModelProps): \"auto\" | undefined => {\n        const { as = \"span\", includeDir = true } = props;\n        return as === \"div\" || includeDir ? \"auto\" : undefined;\n    };\n\n    private static readonly parseFormattedBody = (\n        formattedBody: string,\n        replacer?: Replacer,\n    ): ReturnType<typeof parse> => parse(formattedBody, replacer ? { replace: replacer } : undefined);\n\n    private static readonly computeSnapshot = (props: EventContentBodyViewModelProps): EventContentBodyViewSnapshot => {\n        const { body, formattedBody, className } = EventContentBodyViewModel.computeBodySnapshot(props);\n        const replacer = createReplacer(props);\n        const dir = EventContentBodyViewModel.computeDir(props);\n\n        return {\n            body,\n            formattedBody,\n            replacer,\n            parseFormattedBody: EventContentBodyViewModel.parseFormattedBody,\n            className,\n            dir,\n        };\n    };\n\n    public constructor(props: EventContentBodyViewModelProps) {\n        const propsWithSettingDefaults: EventContentBodyViewModelProps = {\n            ...props,\n            renderMentionPills: props.renderMentionPills ?? false,\n            renderKeywordPills: props.renderKeywordPills ?? false,\n            renderSpoilers: props.renderSpoilers ?? false,\n            renderCodeBlocks: props.renderCodeBlocks ?? false,\n            renderTooltipsForAmbiguousLinks: props.renderTooltipsForAmbiguousLinks ?? false,\n            enableBigEmoji: props.enableBigEmoji ?? SettingsStore.getValue(\"TextualBody.enableBigEmoji\"),\n            shouldShowPillAvatar: props.shouldShowPillAvatar ?? SettingsStore.getValue(\"Pill.shouldShowPillAvatar\"),\n        };\n\n        super(propsWithSettingDefaults, EventContentBodyViewModel.computeSnapshot(propsWithSettingDefaults));\n        this.watchEvent(propsWithSettingDefaults.mxEvent);\n        this.disposables.track(this.unwatchEvent);\n\n        const enableBigEmojiWatcherRef = SettingsStore.watchSetting(\n            \"TextualBody.enableBigEmoji\",\n            null,\n            (_settingName, _roomId, _level, _newValAtLevel, newVal) => {\n                this.setEnableBigEmoji(!!newVal);\n            },\n        );\n        this.disposables.track(() => SettingsStore.unwatchSetting(enableBigEmojiWatcherRef));\n\n        const shouldShowPillAvatarWatcherRef = SettingsStore.watchSetting(\n            \"Pill.shouldShowPillAvatar\",\n            null,\n            (_settingName, _roomId, _level, _newValAtLevel, newVal) => {\n                this.setShouldShowPillAvatar(!!newVal);\n            },\n        );\n        this.disposables.track(() => SettingsStore.unwatchSetting(shouldShowPillAvatarWatcherRef));\n    }\n\n    private readonly onEventContentChanged = (): void => {\n        const mxEvent = this.props.mxEvent;\n        if (!mxEvent) return;\n        this.setEventContent(mxEvent, mxEvent.getContent());\n    };\n\n    private watchEvent(mxEvent?: MatrixEvent): void {\n        if (this.watchedEvent === mxEvent) return;\n        this.unwatchEvent();\n        this.watchedEvent = mxEvent;\n        this.watchedEvent?.on(MatrixEventEvent.Replaced, this.onEventContentChanged);\n    }\n\n    private readonly unwatchEvent = (): void => {\n        this.watchedEvent?.off(MatrixEventEvent.Replaced, this.onEventContentChanged);\n        this.watchedEvent = undefined;\n    };\n\n    public setEventContent = (mxEvent: MatrixEvent | undefined, content: IContent): void => {\n        this.watchEvent(mxEvent);\n        this.props.mxEvent = mxEvent;\n        this.props.content = content;\n        const { body, formattedBody, className } = EventContentBodyViewModel.computeBodySnapshot(this.props);\n        const replacer = createReplacer(this.props);\n\n        this.snapshot.merge({ body, formattedBody, replacer, className });\n    };\n\n    public setStripReply = (stripReply?: boolean): void => {\n        this.props.stripReply = stripReply;\n        const { body, formattedBody, className } = EventContentBodyViewModel.computeBodySnapshot(this.props);\n\n        this.snapshot.merge({ body, formattedBody, className });\n    };\n\n    public setHighlights = (highlights?: string[]): void => {\n        this.props.highlights = highlights;\n        const { body, formattedBody, className } = EventContentBodyViewModel.computeBodySnapshot(this.props);\n\n        this.snapshot.merge({ body, formattedBody, className });\n    };\n\n    public setAs = (as: \"span\" | \"div\"): void => {\n        this.props.as = as;\n        const dir = EventContentBodyViewModel.computeDir(this.props);\n\n        this.snapshot.merge({ dir });\n    };\n\n    public setEnableBigEmoji = (enableBigEmoji?: boolean): void => {\n        this.props.enableBigEmoji = enableBigEmoji;\n        const { body, formattedBody, className } = EventContentBodyViewModel.computeBodySnapshot(this.props);\n\n        this.snapshot.merge({ body, formattedBody, className });\n    };\n\n    public setShouldShowPillAvatar = (shouldShowPillAvatar?: boolean): void => {\n        this.props.shouldShowPillAvatar = shouldShowPillAvatar;\n        const replacer = createReplacer(this.props);\n\n        this.snapshot.merge({ replacer });\n    };\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n    function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n    var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n    var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n    var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n    var _, done = false;\r\n    for (var i = decorators.length - 1; i >= 0; i--) {\r\n        var context = {};\r\n        for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n        for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n        context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n        var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n        if (kind === \"accessor\") {\r\n            if (result === void 0) continue;\r\n            if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n            if (_ = accept(result.get)) descriptor.get = _;\r\n            if (_ = accept(result.set)) descriptor.set = _;\r\n            if (_ = accept(result.init)) initializers.unshift(_);\r\n        }\r\n        else if (_ = accept(result)) {\r\n            if (kind === \"field\") initializers.unshift(_);\r\n            else descriptor[key] = _;\r\n        }\r\n    }\r\n    if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n    done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n    var useValue = arguments.length > 2;\r\n    for (var i = 0; i < initializers.length; i++) {\r\n        value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n    }\r\n    return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n    return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n    if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n    return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    var desc = Object.getOwnPropertyDescriptor(m, k);\r\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n        desc = { enumerable: true, get: function() { return m[k]; } };\r\n    }\r\n    Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n    if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n    return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n    if (value !== null && value !== void 0) {\r\n        if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n        var dispose;\r\n        if (async) {\r\n            if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n            dispose = value[Symbol.asyncDispose];\r\n        }\r\n        if (dispose === void 0) {\r\n            if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n            dispose = value[Symbol.dispose];\r\n        }\r\n        if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n        env.stack.push({ value: value, dispose: dispose, async: async });\r\n    }\r\n    else if (async) {\r\n        env.stack.push({ async: true });\r\n    }\r\n    return value;\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n    function fail(e) {\r\n        env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n        env.hasError = true;\r\n    }\r\n    function next() {\r\n        while (env.stack.length) {\r\n            var rec = env.stack.pop();\r\n            try {\r\n                var result = rec.dispose && rec.dispose.call(rec.value);\r\n                if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n            }\r\n            catch (e) {\r\n                fail(e);\r\n            }\r\n        }\r\n        if (env.hasError) throw env.error;\r\n    }\r\n    return next();\r\n}\r\n\r\nexport default {\r\n    __extends: __extends,\r\n    __assign: __assign,\r\n    __rest: __rest,\r\n    __decorate: __decorate,\r\n    __param: __param,\r\n    __metadata: __metadata,\r\n    __awaiter: __awaiter,\r\n    __generator: __generator,\r\n    __createBinding: __createBinding,\r\n    __exportStar: __exportStar,\r\n    __values: __values,\r\n    __read: __read,\r\n    __spread: __spread,\r\n    __spreadArrays: __spreadArrays,\r\n    __spreadArray: __spreadArray,\r\n    __await: __await,\r\n    __asyncGenerator: __asyncGenerator,\r\n    __asyncDelegator: __asyncDelegator,\r\n    __asyncValues: __asyncValues,\r\n    __makeTemplateObject: __makeTemplateObject,\r\n    __importStar: __importStar,\r\n    __importDefault: __importDefault,\r\n    __classPrivateFieldGet: __classPrivateFieldGet,\r\n    __classPrivateFieldSet: __classPrivateFieldSet,\r\n    __classPrivateFieldIn: __classPrivateFieldIn,\r\n    __addDisposableResource: __addDisposableResource,\r\n    __disposeResources: __disposeResources,\r\n};\r\n","import { elementNodeType } from \"./types\"\n\nexport class Diff {\n    constructor(options = {}) {\n        Object.entries(options).forEach(([key, value]) => (this[key] = value))\n    }\n\n    toString() {\n        return JSON.stringify(this)\n    }\n\n    setValue(\n        aKey: string | number,\n        aValue:\n            | string\n            | number\n            | boolean\n            | number[]\n            | { [key: string]: string | { [key: string]: string } }\n            | elementNodeType,\n    ) {\n        this[aKey] = aValue\n        return this\n    }\n}\n\n/**\n * Checks if an element is of a certain type using direct property checking or DOM instanceof\n *\n * @param element The element to check\n * @param elementTypeNames The element type names to check against\n * @param simplifiedCheck If true, uses simplified checking based on nodeName/nodeType\n * @returns boolean indicating if the element matches any of the specified types\n */\nexport function checkElementType(\n    element,\n    simplifiedCheck = false,\n    ...elementTypeNames: string[]\n) {\n    if (typeof element === \"undefined\" || element === null) {\n        return false\n    }\n\n    // Simplified check for primitive virtual DOMs without ownerDocument\n    if (simplifiedCheck) {\n        const simplifiedResult = elementTypeNames.some((elementTypeName) => {\n            // Special case for basic element types\n            if (elementTypeName === \"Element\") {\n                // Enhanced check that handles both virtual DOM objects and real DOM elements\n                return (\n                    element.nodeType === 1 ||\n                    (typeof element.nodeName === \"string\" &&\n                        element.nodeName !== \"#text\" &&\n                        element.nodeName !== \"#comment\") ||\n                    // Additional check for real DOM elements that might not have nodeType\n                    (element.tagName && typeof element.tagName === \"string\") ||\n                    // Check if it has DOM element-like properties (fallback)\n                    (element.setAttribute &&\n                        typeof element.setAttribute === \"function\")\n                )\n            }\n            if (elementTypeName === \"Text\") {\n                return element.nodeType === 3 || element.nodeName === \"#text\"\n            }\n            if (elementTypeName === \"Comment\") {\n                return element.nodeType === 8 || element.nodeName === \"#comment\"\n            }\n\n            // For HTML element types, check nodeName or tagName\n            if (\n                elementTypeName.startsWith(\"HTML\") &&\n                elementTypeName.endsWith(\"Element\")\n            ) {\n                const tagName = elementTypeName.slice(4, -7).toLowerCase()\n                return (\n                    (element.nodeName &&\n                        element.nodeName.toLowerCase() === tagName) ||\n                    (element.tagName &&\n                        element.tagName.toLowerCase() === tagName)\n                )\n            }\n\n            return false\n        })\n\n        // If simplified check succeeds, return true\n        if (simplifiedResult) {\n            return true\n        }\n\n        // Fallback to DOM-based check if simplified check fails and element has ownerDocument\n        if (element.ownerDocument) {\n            return elementTypeNames.some(\n                (elementTypeName) =>\n                    typeof element?.ownerDocument?.defaultView?.[\n                        elementTypeName\n                    ] === \"function\" &&\n                    element instanceof\n                        element.ownerDocument.defaultView[elementTypeName],\n            )\n        }\n\n        return false\n    }\n\n    // DOM-based check\n    return elementTypeNames.some(\n        (elementTypeName) =>\n            // We need to check if the specified type is defined\n            // because otherwise instanceof throws an exception.\n            typeof element?.ownerDocument?.defaultView?.[elementTypeName] ===\n                \"function\" &&\n            element instanceof\n                element.ownerDocument.defaultView[elementTypeName],\n    )\n}\n","import { DiffDOMOptions, elementNodeType, textNodeType } from \"../types\"\nimport { checkElementType } from \"../helpers\"\n\nexport function objToNode(\n    objNode: elementNodeType,\n    insideSvg: boolean,\n    options: DiffDOMOptions,\n) {\n    let node: Element | Text | Comment\n    if (objNode.nodeName === \"#text\") {\n        node = options.document.createTextNode((objNode as textNodeType).data)\n    } else if (objNode.nodeName === \"#comment\") {\n        node = options.document.createComment((objNode as textNodeType).data)\n    } else {\n        if (insideSvg) {\n            node = options.document.createElementNS(\n                \"http://www.w3.org/2000/svg\",\n                objNode.nodeName,\n            )\n            if (objNode.nodeName === \"foreignObject\") {\n                insideSvg = false\n            }\n        } else if (objNode.nodeName.toLowerCase() === \"svg\") {\n            node = options.document.createElementNS(\n                \"http://www.w3.org/2000/svg\",\n                \"svg\",\n            )\n            insideSvg = true\n        } else {\n            node = options.document.createElement(objNode.nodeName)\n        }\n        if (objNode.attributes) {\n            Object.entries(objNode.attributes).forEach(([key, value]) =>\n                (node as Element).setAttribute(key, value),\n            )\n        }\n        if (objNode.childNodes) {\n            node = node as Element\n            objNode.childNodes.forEach(\n                (childNode: elementNodeType | textNodeType) =>\n                    node.appendChild(objToNode(childNode, insideSvg, options)),\n            )\n        }\n        if (options.valueDiffing) {\n            if (\n                objNode.value &&\n                checkElementType(\n                    node,\n                    options.simplifiedElementCheck,\n                    \"HTMLButtonElement\",\n                    \"HTMLDataElement\",\n                    \"HTMLInputElement\",\n                    \"HTMLLIElement\",\n                    \"HTMLMeterElement\",\n                    \"HTMLOptionElement\",\n                    \"HTMLProgressElement\",\n                    \"HTMLParamElement\",\n                )\n            ) {\n                ;(\n                    node as\n                        | HTMLButtonElement\n                        | HTMLDataElement\n                        | HTMLInputElement\n                        | HTMLLIElement\n                        | HTMLMeterElement\n                        | HTMLOptionElement\n                        | HTMLProgressElement\n                        | HTMLParamElement\n                ).value = objNode.value\n            }\n            if (\n                objNode.checked &&\n                checkElementType(\n                    node,\n                    options.simplifiedElementCheck,\n                    \"HTMLInputElement\",\n                )\n            ) {\n                ;(node as HTMLInputElement).checked = objNode.checked\n            }\n            if (\n                objNode.selected &&\n                checkElementType(\n                    node,\n                    options.simplifiedElementCheck,\n                    \"HTMLOptionElement\",\n                )\n            ) {\n                ;(node as HTMLOptionElement).selected = objNode.selected\n            }\n        }\n    }\n    return node\n}\n","import { DiffDOMOptions, diffType, nodeType } from \"../types\"\nimport { Diff, checkElementType } from \"../helpers\"\n\nimport { objToNode } from \"./fromVirtual\"\n\n// ===== Apply a diff =====\n\nconst getFromRoute = (\n    node: Element,\n    route: number[],\n): Element | Text | false => {\n    route = route.slice()\n    while (route.length > 0) {\n        const c = route.splice(0, 1)[0]\n        node = node.childNodes[c] as Element\n    }\n    return node\n}\n\nexport function applyDiff(\n    tree: Element,\n    diff: diffType,\n    options: DiffDOMOptions, // {preDiffApply, postDiffApply, textDiff, valueDiffing, _const}\n) {\n    const action = diff[options._const.action] as string | number\n    const route = diff[options._const.route] as number[]\n    let node\n\n    if (\n        ![options._const.addElement, options._const.addTextElement].includes(\n            action,\n        )\n    ) {\n        // For adding nodes, we calculate the route later on. It's different because it includes the position of the newly added item.\n        node = getFromRoute(tree, route)\n    }\n\n    let newNode\n    let reference: Element\n    let nodeArray\n\n    // pre-diff hook\n    const info = {\n        diff,\n        node,\n    }\n\n    if (options.preDiffApply(info)) {\n        return true\n    }\n\n    switch (action) {\n        case options._const.addAttribute:\n            if (\n                !node ||\n                !checkElementType(\n                    node,\n                    options.simplifiedElementCheck,\n                    \"Element\",\n                )\n            ) {\n                return false\n            }\n            node.setAttribute(\n                diff[options._const.name] as string,\n                diff[options._const.value] as string,\n            )\n            break\n        case options._const.modifyAttribute:\n            if (\n                !node ||\n                !checkElementType(\n                    node,\n                    options.simplifiedElementCheck,\n                    \"Element\",\n                )\n            ) {\n                return false\n            }\n            node.setAttribute(\n                diff[options._const.name] as string,\n                diff[options._const.newValue] as string,\n            )\n            if (\n                checkElementType(\n                    node,\n                    options.simplifiedElementCheck,\n                    \"HTMLInputElement\",\n                ) &&\n                diff[options._const.name] === \"value\"\n            ) {\n                node.value = diff[options._const.newValue] as string\n            }\n            break\n        case options._const.removeAttribute:\n            if (\n                !node ||\n                !checkElementType(\n                    node,\n                    options.simplifiedElementCheck,\n                    \"Element\",\n                )\n            ) {\n                return false\n            }\n            node.removeAttribute(diff[options._const.name] as string)\n            break\n        case options._const.modifyTextElement:\n            if (\n                !node ||\n                !checkElementType(node, options.simplifiedElementCheck, \"Text\")\n            ) {\n                return false\n            }\n            options.textDiff(\n                node,\n                node.data,\n                diff[options._const.oldValue] as string,\n                diff[options._const.newValue] as string,\n            )\n            if (\n                checkElementType(\n                    node.parentNode,\n                    options.simplifiedElementCheck,\n                    \"HTMLTextAreaElement\",\n                )\n            ) {\n                node.parentNode.value = diff[options._const.newValue] as string\n            }\n            break\n        case options._const.modifyValue:\n            if (!node || typeof node.value === \"undefined\") {\n                return false\n            }\n            node.value = diff[options._const.newValue]\n            break\n        case options._const.modifyComment:\n            if (\n                !node ||\n                !checkElementType(\n                    node,\n                    options.simplifiedElementCheck,\n                    \"Comment\",\n                )\n            ) {\n                return false\n            }\n            options.textDiff(\n                node,\n                node.data,\n                diff[options._const.oldValue] as string,\n                diff[options._const.newValue] as string,\n            )\n            break\n        case options._const.modifyChecked:\n            if (!node || typeof node.checked === \"undefined\") {\n                return false\n            }\n            node.checked = diff[options._const.newValue]\n            break\n        case options._const.modifySelected:\n            if (!node || typeof node.selected === \"undefined\") {\n                return false\n            }\n            node.selected = diff[options._const.newValue]\n            break\n        case options._const.replaceElement: {\n            const insideSvg =\n                (\n                    diff[options._const.newValue] as nodeType\n                ).nodeName.toLowerCase() === \"svg\" ||\n                node.parentNode.namespaceURI === \"http://www.w3.org/2000/svg\"\n            node.parentNode.replaceChild(\n                objToNode(\n                    diff[options._const.newValue] as nodeType,\n                    insideSvg,\n                    options,\n                ),\n                node,\n            )\n            break\n        }\n        case options._const.relocateGroup:\n            nodeArray = [...new Array(diff[options._const.groupLength])].map(\n                () =>\n                    node.removeChild(\n                        node.childNodes[diff[options._const.from] as number],\n                    ),\n            )\n            nodeArray.forEach((childNode, index) => {\n                if (index === 0) {\n                    reference =\n                        node.childNodes[diff[options._const.to] as number]\n                }\n                node.insertBefore(childNode, reference || null)\n            })\n            break\n        case options._const.removeElement:\n            node.parentNode.removeChild(node)\n            break\n        case options._const.addElement: {\n            const parentRoute = route.slice()\n            const c: number = parentRoute.splice(parentRoute.length - 1, 1)[0]\n            node = getFromRoute(tree, parentRoute)\n            if (\n                !checkElementType(\n                    node,\n                    options.simplifiedElementCheck,\n                    \"Element\",\n                )\n            ) {\n                return false\n            }\n            node.insertBefore(\n                objToNode(\n                    diff[options._const.element] as nodeType,\n                    node.namespaceURI === \"http://www.w3.org/2000/svg\",\n                    options,\n                ),\n                node.childNodes[c] || null,\n            )\n            break\n        }\n        case options._const.removeTextElement: {\n            if (!node || node.nodeType !== 3) {\n                return false\n            }\n            const parentNode = node.parentNode\n            parentNode.removeChild(node)\n            if (\n                checkElementType(\n                    parentNode,\n                    options.simplifiedElementCheck,\n                    \"HTMLTextAreaElement\",\n                )\n            ) {\n                parentNode.value = \"\"\n            }\n            break\n        }\n        case options._const.addTextElement: {\n            const parentRoute = route.slice()\n            const c: number = parentRoute.splice(parentRoute.length - 1, 1)[0]\n            newNode = options.document.createTextNode(\n                diff[options._const.value] as string,\n            )\n            node = getFromRoute(tree, parentRoute)\n            if (!node.childNodes) {\n                return false\n            }\n            node.insertBefore(newNode, node.childNodes[c] || null)\n            if (\n                checkElementType(\n                    node.parentNode,\n                    options.simplifiedElementCheck,\n                    \"HTMLTextAreaElement\",\n                )\n            ) {\n                node.parentNode.value = diff[options._const.value] as string\n            }\n            break\n        }\n        default:\n            console.log(\"unknown action\")\n    }\n\n    // if a new node was created, we might be interested in its\n    // post diff hook\n    options.postDiffApply({\n        diff: info.diff,\n        node: info.node,\n        newNode,\n    })\n\n    return true\n}\n\nexport function applyDOM(\n    tree: Element,\n    diffs: (Diff | diffType)[],\n    options: DiffDOMOptions,\n) {\n    return diffs.every((diff: Diff | diffType) =>\n        applyDiff(tree, diff as diffType, options),\n    )\n}\n","import { DiffDOMOptions, diffType } from \"../types\"\nimport { Diff } from \"../helpers\"\nimport { applyDiff } from \"./apply\"\n\n// ===== Undo a diff =====\n\nfunction swap(obj: object, p1: string | number, p2: string | number) {\n    const tmp = obj[p1]\n    obj[p1] = obj[p2]\n    obj[p2] = tmp\n}\n\nfunction undoDiff(\n    tree: Element,\n    diff: diffType,\n    options: DiffDOMOptions, // {preDiffApply, postDiffApply, textDiff, valueDiffing, _const}\n) {\n    switch (diff[options._const.action]) {\n        case options._const.addAttribute:\n            diff[options._const.action] = options._const.removeAttribute\n            applyDiff(tree, diff, options)\n            break\n        case options._const.modifyAttribute:\n            swap(diff, options._const.oldValue, options._const.newValue)\n            applyDiff(tree, diff, options)\n            break\n        case options._const.removeAttribute:\n            diff[options._const.action] = options._const.addAttribute\n            applyDiff(tree, diff, options)\n            break\n        case options._const.modifyTextElement:\n            swap(diff, options._const.oldValue, options._const.newValue)\n            applyDiff(tree, diff, options)\n            break\n        case options._const.modifyValue:\n            swap(diff, options._const.oldValue, options._const.newValue)\n            applyDiff(tree, diff, options)\n            break\n        case options._const.modifyComment:\n            swap(diff, options._const.oldValue, options._const.newValue)\n            applyDiff(tree, diff, options)\n            break\n        case options._const.modifyChecked:\n            swap(diff, options._const.oldValue, options._const.newValue)\n            applyDiff(tree, diff, options)\n            break\n        case options._const.modifySelected:\n            swap(diff, options._const.oldValue, options._const.newValue)\n            applyDiff(tree, diff, options)\n            break\n        case options._const.replaceElement:\n            swap(diff, options._const.oldValue, options._const.newValue)\n            applyDiff(tree, diff, options)\n            break\n        case options._const.relocateGroup:\n            swap(diff, options._const.from, options._const.to)\n            applyDiff(tree, diff, options)\n            break\n        case options._const.removeElement:\n            diff[options._const.action] = options._const.addElement\n            applyDiff(tree, diff, options)\n            break\n        case options._const.addElement:\n            diff[options._const.action] = options._const.removeElement\n            applyDiff(tree, diff, options)\n            break\n        case options._const.removeTextElement:\n            diff[options._const.action] = options._const.addTextElement\n            applyDiff(tree, diff, options)\n            break\n        case options._const.addTextElement:\n            diff[options._const.action] = options._const.removeTextElement\n            applyDiff(tree, diff, options)\n            break\n        default:\n            console.log(\"unknown action\")\n    }\n}\n\nexport function undoDOM(\n    tree: Element,\n    diffs: (diffType | Diff)[],\n    options: DiffDOMOptions,\n) {\n    diffs = diffs.slice()\n    diffs.reverse()\n    diffs.forEach((diff: diffType | Diff) => {\n        undoDiff(tree, diff as diffType, options)\n    })\n}\n","import {\n    diffNodeType,\n    elementDiffNodeType,\n    elementNodeType,\n    nodeType,\n    subsetType,\n    textDiffNodeType,\n    textNodeType,\n} from \"../types\"\nimport { Diff } from \"../helpers\"\nconst elementDescriptors = (el: diffNodeType) => {\n    const output = []\n    output.push(el.nodeName)\n    if (el.nodeName !== \"#text\" && el.nodeName !== \"#comment\") {\n        el = el as elementDiffNodeType\n        if (el.attributes) {\n            if (el.attributes[\"class\"]) {\n                output.push(\n                    `${el.nodeName}.${el.attributes[\"class\"].replace(\n                        / /g,\n                        \".\",\n                    )}`,\n                )\n            }\n            if (el.attributes.id) {\n                output.push(`${el.nodeName}#${el.attributes.id}`)\n            }\n        }\n    }\n    return output\n}\n\nconst findUniqueDescriptors = (li: diffNodeType[]) => {\n    const uniqueDescriptors = {}\n    const duplicateDescriptors = {}\n\n    li.forEach((node: nodeType) => {\n        elementDescriptors(node).forEach((descriptor) => {\n            const inUnique = descriptor in uniqueDescriptors\n            const inDupes = descriptor in duplicateDescriptors\n            if (!inUnique && !inDupes) {\n                uniqueDescriptors[descriptor] = true\n            } else if (inUnique) {\n                delete uniqueDescriptors[descriptor]\n                duplicateDescriptors[descriptor] = true\n            }\n        })\n    })\n\n    return uniqueDescriptors\n}\n\nexport const uniqueInBoth = (l1: diffNodeType[], l2: diffNodeType[]) => {\n    const l1Unique = findUniqueDescriptors(l1)\n    const l2Unique = findUniqueDescriptors(l2)\n    const inBoth = {}\n\n    Object.keys(l1Unique).forEach((key) => {\n        if (l2Unique[key]) {\n            inBoth[key] = true\n        }\n    })\n\n    return inBoth\n}\n\nexport const removeDone = (tree: elementDiffNodeType) => {\n    delete tree.outerDone\n    delete tree.innerDone\n    delete tree.valueDone\n    if (tree.childNodes) {\n        return tree.childNodes.every(removeDone)\n    } else {\n        return true\n    }\n}\n\nexport const cleanNode = (diffNode: diffNodeType) => {\n    if (Object.prototype.hasOwnProperty.call(diffNode, \"data\")) {\n        const textNode: textNodeType = {\n            nodeName: diffNode.nodeName === \"#text\" ? \"#text\" : \"#comment\",\n            data: (diffNode as textDiffNodeType).data,\n        }\n        return textNode\n    } else {\n        const elementNode: elementNodeType = {\n            nodeName: diffNode.nodeName,\n        }\n        diffNode = diffNode as elementDiffNodeType\n        if (Object.prototype.hasOwnProperty.call(diffNode, \"attributes\")) {\n            elementNode.attributes = { ...diffNode.attributes }\n        }\n        if (Object.prototype.hasOwnProperty.call(diffNode, \"checked\")) {\n            elementNode.checked = diffNode.checked\n        }\n        if (Object.prototype.hasOwnProperty.call(diffNode, \"value\")) {\n            elementNode.value = diffNode.value\n        }\n        if (Object.prototype.hasOwnProperty.call(diffNode, \"selected\")) {\n            elementNode.selected = diffNode.selected\n        }\n        if (Object.prototype.hasOwnProperty.call(diffNode, \"childNodes\")) {\n            elementNode.childNodes = diffNode.childNodes.map((diffChildNode) =>\n                cleanNode(diffChildNode),\n            )\n        }\n        return elementNode\n    }\n}\n\nexport const isEqual = (e1: diffNodeType, e2: diffNodeType) => {\n    if (\n        ![\"nodeName\", \"value\", \"checked\", \"selected\", \"data\"].every(\n            (element) => {\n                if (e1[element] !== e2[element]) {\n                    return false\n                }\n                return true\n            },\n        )\n    ) {\n        return false\n    }\n    if (Object.prototype.hasOwnProperty.call(e1, \"data\")) {\n        // Comment or Text\n        return true\n    }\n    e1 = e1 as elementDiffNodeType\n    e2 = e2 as elementDiffNodeType\n    if (Boolean(e1.attributes) !== Boolean(e2.attributes)) {\n        return false\n    }\n\n    if (Boolean(e1.childNodes) !== Boolean(e2.childNodes)) {\n        return false\n    }\n    if (e1.attributes) {\n        const e1Attributes = Object.keys(e1.attributes)\n        const e2Attributes = Object.keys(e2.attributes)\n\n        if (e1Attributes.length !== e2Attributes.length) {\n            return false\n        }\n        if (\n            !e1Attributes.every((attribute) => {\n                if (\n                    (e1 as elementDiffNodeType).attributes[attribute] !==\n                    (e2 as elementDiffNodeType).attributes[attribute]\n                ) {\n                    return false\n                }\n                return true\n            })\n        ) {\n            return false\n        }\n    }\n    if (e1.childNodes) {\n        if (e1.childNodes.length !== e2.childNodes.length) {\n            return false\n        }\n        if (\n            !e1.childNodes.every((childNode: nodeType, index: number) =>\n                isEqual(childNode, e2.childNodes[index]),\n            )\n        ) {\n            return false\n        }\n    }\n\n    return true\n}\n\nexport const roughlyEqual = (\n    e1: diffNodeType,\n    e2: diffNodeType,\n    uniqueDescriptors: { [key: string]: boolean },\n    sameSiblings: boolean,\n    preventRecursion = false,\n) => {\n    if (!e1 || !e2) {\n        return false\n    }\n\n    if (e1.nodeName !== e2.nodeName) {\n        return false\n    }\n\n    if ([\"#text\", \"#comment\"].includes(e1.nodeName)) {\n        // Note that we initially don't care what the text content of a node is,\n        // the mere fact that it's the same tag and \"has text\" means it's roughly\n        // equal, and then we can find out the true text difference later.\n        return preventRecursion\n            ? true\n            : (e1 as textDiffNodeType).data === (e2 as textDiffNodeType).data\n    }\n\n    e1 = e1 as elementDiffNodeType\n    e2 = e2 as elementDiffNodeType\n\n    if (e1.nodeName in uniqueDescriptors) {\n        return true\n    }\n\n    if (e1.attributes && e2.attributes) {\n        if (e1.attributes.id) {\n            if (e1.attributes.id !== e2.attributes.id) {\n                return false\n            } else {\n                const idDescriptor = `${e1.nodeName}#${e1.attributes.id}`\n                if (idDescriptor in uniqueDescriptors) {\n                    return true\n                }\n            }\n        }\n        if (\n            e1.attributes[\"class\"] &&\n            e1.attributes[\"class\"] === e2.attributes[\"class\"]\n        ) {\n            const classDescriptor = `${e1.nodeName}.${e1.attributes[\n                \"class\"\n            ].replace(/ /g, \".\")}`\n            if (classDescriptor in uniqueDescriptors) {\n                return true\n            }\n        }\n    }\n\n    if (sameSiblings) {\n        return true\n    }\n\n    const nodeList1 = e1.childNodes ? e1.childNodes.slice().reverse() : []\n    const nodeList2 = e2.childNodes ? e2.childNodes.slice().reverse() : []\n\n    if (nodeList1.length !== nodeList2.length) {\n        return false\n    }\n\n    if (preventRecursion) {\n        return nodeList1.every(\n            (element: nodeType, index: number) =>\n                element.nodeName === nodeList2[index].nodeName,\n        )\n    } else {\n        // note: we only allow one level of recursion at any depth. If 'preventRecursion'\n        // was not set, we must explicitly force it to true for child iterations.\n        const childUniqueDescriptors = uniqueInBoth(nodeList1, nodeList2)\n        return nodeList1.every((element: nodeType, index: number) =>\n            roughlyEqual(\n                element,\n                nodeList2[index],\n                childUniqueDescriptors,\n                true,\n                true,\n            ),\n        )\n    }\n}\n\n/**\n * based on https://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Longest_common_substring#JavaScript\n */\nconst findCommonSubsets = (\n    c1: diffNodeType[],\n    c2: diffNodeType[],\n    marked1: boolean[],\n    marked2: boolean[],\n) => {\n    let lcsSize = 0\n    let index: number[] = []\n    const c1Length = c1.length\n    const c2Length = c2.length\n\n    const // set up the matching table\n        matches = [...new Array(c1Length + 1)].map(() => [])\n\n    const uniqueDescriptors = uniqueInBoth(c1, c2)\n\n    let // If all of the elements are the same tag, id and class, then we can\n        // consider them roughly the same even if they have a different number of\n        // children. This will reduce removing and re-adding similar elements.\n        subsetsSame = c1Length === c2Length\n\n    if (subsetsSame) {\n        c1.some((element: nodeType, i: number) => {\n            const c1Desc = elementDescriptors(element)\n            const c2Desc = elementDescriptors(c2[i])\n            if (c1Desc.length !== c2Desc.length) {\n                subsetsSame = false\n                return true\n            }\n            c1Desc.some((description, i) => {\n                if (description !== c2Desc[i]) {\n                    subsetsSame = false\n                    return true\n                }\n            })\n            if (!subsetsSame) {\n                return true\n            }\n        })\n    }\n\n    // fill the matches with distance values\n    for (let c1Index = 0; c1Index < c1Length; c1Index++) {\n        const c1Element = c1[c1Index]\n        for (let c2Index = 0; c2Index < c2Length; c2Index++) {\n            const c2Element = c2[c2Index]\n            if (\n                !marked1[c1Index] &&\n                !marked2[c2Index] &&\n                roughlyEqual(\n                    c1Element,\n                    c2Element,\n                    uniqueDescriptors,\n                    subsetsSame,\n                )\n            ) {\n                matches[c1Index + 1][c2Index + 1] = matches[c1Index][c2Index]\n                    ? matches[c1Index][c2Index] + 1\n                    : 1\n                if (matches[c1Index + 1][c2Index + 1] >= lcsSize) {\n                    lcsSize = matches[c1Index + 1][c2Index + 1]\n                    index = [c1Index + 1, c2Index + 1]\n                }\n            } else {\n                matches[c1Index + 1][c2Index + 1] = 0\n            }\n        }\n    }\n\n    if (lcsSize === 0) {\n        return false\n    }\n\n    return {\n        oldValue: index[0] - lcsSize,\n        newValue: index[1] - lcsSize,\n        length: lcsSize,\n    }\n}\n\nconst makeBooleanArray = (n: number, v: boolean) =>\n    [...new Array(n)].map(() => v)\n\n/**\n * Generate arrays that indicate which node belongs to which subset,\n * or whether it's actually an orphan node, existing in only one\n * of the two trees, rather than somewhere in both.\n *\n * So if t1 = <img><canvas><br>, t2 = <canvas><br><img>.\n * The longest subset is \"<canvas><br>\" (length 2), so it will group 0.\n * The second longest is \"<img>\" (length 1), so it will be group 1.\n * gaps1 will therefore be [1,0,0] and gaps2 [0,0,1].\n *\n * If an element is not part of any group, it will stay being 'true', which\n * is the initial value. For example:\n * t1 = <img><p></p><br><canvas>, t2 = <b></b><br><canvas><img>\n *\n * The \"<p></p>\" and \"<b></b>\" do only show up in one of the two and will\n * therefore be marked by \"true\". The remaining parts are parts of the\n * groups 0 and 1:\n * gaps1 = [1, true, 0, 0], gaps2 = [true, 0, 0, 1]\n *\n */\nexport const getGapInformation = (\n    t1: elementDiffNodeType,\n    t2: elementDiffNodeType,\n    stable: subsetType[],\n) => {\n    const gaps1: (true | number)[] = t1.childNodes\n        ? (makeBooleanArray(t1.childNodes.length, true) as true[])\n        : []\n    const gaps2: (true | number)[] = t2.childNodes\n        ? (makeBooleanArray(t2.childNodes.length, true) as true[])\n        : []\n    let group = 0\n\n    // give elements from the same subset the same group number\n    stable.forEach((subset: subsetType) => {\n        const endOld = subset.oldValue + subset.length\n        const endNew = subset.newValue + subset.length\n\n        for (let j = subset.oldValue; j < endOld; j += 1) {\n            gaps1[j] = group\n        }\n        for (let j = subset.newValue; j < endNew; j += 1) {\n            gaps2[j] = group\n        }\n        group += 1\n    })\n\n    return {\n        gaps1,\n        gaps2,\n    }\n}\n\n/**\n * Find all matching subsets, based on immediate child differences only.\n */\nconst markBoth = (marked1, marked2, subset: subsetType, i: number) => {\n    marked1[subset.oldValue + i] = true\n    marked2[subset.newValue + i] = true\n}\n\nexport const markSubTrees = (\n    oldTree: elementDiffNodeType,\n    newTree: elementDiffNodeType,\n) => {\n    // note: the child lists are views, and so update as we update old/newTree\n    const oldChildren = oldTree.childNodes ? oldTree.childNodes : []\n\n    const newChildren = newTree.childNodes ? newTree.childNodes : []\n    const marked1 = makeBooleanArray(oldChildren.length, false)\n    const marked2 = makeBooleanArray(newChildren.length, false)\n    const subsets = []\n\n    const returnIndex = function () {\n        return arguments[1]\n    }\n\n    let foundAllSubsets = false\n\n    while (!foundAllSubsets) {\n        const subset = findCommonSubsets(\n            oldChildren,\n            newChildren,\n            marked1,\n            marked2,\n        )\n        if (subset) {\n            subsets.push(subset)\n            const subsetArray = [...new Array(subset.length)].map(returnIndex)\n            subsetArray.forEach((item) =>\n                markBoth(marked1, marked2, subset, item),\n            )\n        } else {\n            foundAllSubsets = true\n        }\n    }\n\n    oldTree.subsets = subsets\n    oldTree.subsetsAge = 100\n    return subsets\n}\n\nexport class DiffTracker {\n    list: Diff[]\n    constructor() {\n        this.list = []\n    }\n\n    add(diffs: Diff[]) {\n        this.list.push(...diffs)\n    }\n    forEach(fn: (Diff) => void) {\n        this.list.forEach((li: Diff) => fn(li))\n    }\n}\n","import { DiffDOMOptions, elementNodeType, nodeType, subsetType } from \"../types\"\nimport { Diff } from \"../helpers\"\nimport { cleanNode } from \"./helpers\"\n// ===== Apply a virtual diff =====\n\nfunction getFromVirtualRoute(tree: elementNodeType, route: number[]) {\n    let node = tree\n    let parentNode\n    let nodeIndex\n\n    route = route.slice()\n    while (route.length > 0) {\n        nodeIndex = route.splice(0, 1)[0]\n        parentNode = node\n        node = node.childNodes ? node.childNodes[nodeIndex] : undefined\n    }\n    return {\n        node,\n        parentNode,\n        nodeIndex,\n    }\n}\n\nfunction applyVirtualDiff(\n    tree: elementNodeType,\n    diff: Diff,\n    options: DiffDOMOptions, // {preVirtualDiffApply, postVirtualDiffApply, _const}\n) {\n    let node, parentNode, nodeIndex\n\n    if (\n        ![options._const.addElement, options._const.addTextElement].includes(\n            diff[options._const.action],\n        )\n    ) {\n        // For adding nodes, we calculate the route later on. It's different because it includes the position of the newly added item.\n        const routeInfo = getFromVirtualRoute(tree, diff[options._const.route])\n        node = routeInfo.node\n        parentNode = routeInfo.parentNode\n        nodeIndex = routeInfo.nodeIndex\n    }\n\n    const newSubsets: subsetType[] = []\n\n    // pre-diff hook\n    const info = {\n        diff,\n        node,\n    }\n\n    if (options.preVirtualDiffApply(info)) {\n        return true\n    }\n\n    let newNode\n    let nodeArray\n    let route\n\n    switch (diff[options._const.action]) {\n        case options._const.addAttribute:\n            if (!node.attributes) {\n                node.attributes = {}\n            }\n\n            node.attributes[diff[options._const.name]] =\n                diff[options._const.value]\n\n            if (diff[options._const.name] === \"checked\") {\n                node.checked = true\n            } else if (diff[options._const.name] === \"selected\") {\n                node.selected = true\n            } else if (\n                node.nodeName === \"INPUT\" &&\n                diff[options._const.name] === \"value\"\n            ) {\n                node.value = diff[options._const.value]\n            }\n\n            break\n        case options._const.modifyAttribute:\n            node.attributes[diff[options._const.name]] =\n                diff[options._const.newValue]\n            break\n        case options._const.removeAttribute:\n            delete node.attributes[diff[options._const.name]]\n\n            if (Object.keys(node.attributes).length === 0) {\n                delete node.attributes\n            }\n\n            if (diff[options._const.name] === \"checked\") {\n                node.checked = false\n            } else if (diff[options._const.name] === \"selected\") {\n                delete node.selected\n            } else if (\n                node.nodeName === \"INPUT\" &&\n                diff[options._const.name] === \"value\"\n            ) {\n                delete node.value\n            }\n\n            break\n        case options._const.modifyTextElement:\n            node.data = diff[options._const.newValue]\n            if (parentNode.nodeName === \"TEXTAREA\") {\n                parentNode.value = diff[options._const.newValue]\n            }\n            break\n        case options._const.modifyValue:\n            node.value = diff[options._const.newValue]\n            break\n        case options._const.modifyComment:\n            node.data = diff[options._const.newValue]\n            break\n        case options._const.modifyChecked:\n            node.checked = diff[options._const.newValue]\n            break\n        case options._const.modifySelected:\n            node.selected = diff[options._const.newValue]\n            break\n        case options._const.replaceElement:\n            newNode = cleanNode(diff[options._const.newValue])\n            parentNode.childNodes[nodeIndex] = newNode\n            break\n        case options._const.relocateGroup:\n            nodeArray = node.childNodes\n                .splice(\n                    diff[options._const.from],\n                    diff[options._const.groupLength],\n                )\n                .reverse()\n            nodeArray.forEach((movedNode: nodeType) =>\n                node.childNodes.splice(diff[options._const.to], 0, movedNode),\n            )\n            if (node.subsets) {\n                node.subsets.forEach((map: subsetType) => {\n                    if (\n                        diff[options._const.from] < diff[options._const.to] &&\n                        map.oldValue <= diff[options._const.to] &&\n                        map.oldValue > diff[options._const.from]\n                    ) {\n                        map.oldValue -= diff[options._const.groupLength]\n                        const splitLength =\n                            map.oldValue + map.length - diff[options._const.to]\n                        if (splitLength > 0) {\n                            // new insertion splits map.\n                            newSubsets.push({\n                                oldValue:\n                                    diff[options._const.to] +\n                                    diff[options._const.groupLength],\n                                newValue:\n                                    map.newValue + map.length - splitLength,\n                                length: splitLength,\n                            })\n                            map.length -= splitLength\n                        }\n                    } else if (\n                        diff[options._const.from] > diff[options._const.to] &&\n                        map.oldValue > diff[options._const.to] &&\n                        map.oldValue < diff[options._const.from]\n                    ) {\n                        map.oldValue += diff[options._const.groupLength]\n                        const splitLength =\n                            map.oldValue + map.length - diff[options._const.to]\n                        if (splitLength > 0) {\n                            // new insertion splits map.\n                            newSubsets.push({\n                                oldValue:\n                                    diff[options._const.to] +\n                                    diff[options._const.groupLength],\n                                newValue:\n                                    map.newValue + map.length - splitLength,\n                                length: splitLength,\n                            })\n                            map.length -= splitLength\n                        }\n                    } else if (map.oldValue === diff[options._const.from]) {\n                        map.oldValue = diff[options._const.to]\n                    }\n                })\n            }\n\n            break\n        case options._const.removeElement:\n            parentNode.childNodes.splice(nodeIndex, 1)\n            if (parentNode.subsets) {\n                parentNode.subsets.forEach((map: subsetType) => {\n                    if (map.oldValue > nodeIndex) {\n                        map.oldValue -= 1\n                    } else if (map.oldValue === nodeIndex) {\n                        map.delete = true\n                    } else if (\n                        map.oldValue < nodeIndex &&\n                        map.oldValue + map.length > nodeIndex\n                    ) {\n                        if (map.oldValue + map.length - 1 === nodeIndex) {\n                            map.length--\n                        } else {\n                            newSubsets.push({\n                                newValue:\n                                    map.newValue + nodeIndex - map.oldValue,\n                                oldValue: nodeIndex,\n                                length:\n                                    map.length - nodeIndex + map.oldValue - 1,\n                            })\n                            map.length = nodeIndex - map.oldValue\n                        }\n                    }\n                })\n            }\n            node = parentNode\n            break\n        case options._const.addElement: {\n            route = diff[options._const.route].slice()\n            const c: number = route.splice(route.length - 1, 1)[0]\n            node = getFromVirtualRoute(tree, route)?.node\n            newNode = cleanNode(diff[options._const.element])\n\n            if (!node.childNodes) {\n                node.childNodes = []\n            }\n\n            if (c >= node.childNodes.length) {\n                node.childNodes.push(newNode)\n            } else {\n                node.childNodes.splice(c, 0, newNode)\n            }\n            if (node.subsets) {\n                node.subsets.forEach((map: subsetType) => {\n                    if (map.oldValue >= c) {\n                        map.oldValue += 1\n                    } else if (\n                        map.oldValue < c &&\n                        map.oldValue + map.length > c\n                    ) {\n                        const splitLength = map.oldValue + map.length - c\n                        newSubsets.push({\n                            newValue: map.newValue + map.length - splitLength,\n                            oldValue: c + 1,\n                            length: splitLength,\n                        })\n                        map.length -= splitLength\n                    }\n                })\n            }\n            break\n        }\n        case options._const.removeTextElement:\n            parentNode.childNodes.splice(nodeIndex, 1)\n            if (parentNode.nodeName === \"TEXTAREA\") {\n                delete parentNode.value\n            }\n            if (parentNode.subsets) {\n                parentNode.subsets.forEach((map: subsetType) => {\n                    if (map.oldValue > nodeIndex) {\n                        map.oldValue -= 1\n                    } else if (map.oldValue === nodeIndex) {\n                        map.delete = true\n                    } else if (\n                        map.oldValue < nodeIndex &&\n                        map.oldValue + map.length > nodeIndex\n                    ) {\n                        if (map.oldValue + map.length - 1 === nodeIndex) {\n                            map.length--\n                        } else {\n                            newSubsets.push({\n                                newValue:\n                                    map.newValue + nodeIndex - map.oldValue,\n                                oldValue: nodeIndex,\n                                length:\n                                    map.length - nodeIndex + map.oldValue - 1,\n                            })\n                            map.length = nodeIndex - map.oldValue\n                        }\n                    }\n                })\n            }\n            node = parentNode\n            break\n        case options._const.addTextElement: {\n            route = diff[options._const.route].slice()\n            const c: number = route.splice(route.length - 1, 1)[0]\n            newNode = {\n                nodeName: \"#text\",\n                data: diff[options._const.value],\n            }\n            node = getFromVirtualRoute(tree, route).node\n            if (!node.childNodes) {\n                node.childNodes = []\n            }\n\n            if (c >= node.childNodes.length) {\n                node.childNodes.push(newNode)\n            } else {\n                node.childNodes.splice(c, 0, newNode)\n            }\n            if (node.nodeName === \"TEXTAREA\") {\n                node.value = diff[options._const.newValue]\n            }\n            if (node.subsets) {\n                node.subsets.forEach((map: subsetType) => {\n                    if (map.oldValue >= c) {\n                        map.oldValue += 1\n                    }\n                    if (map.oldValue < c && map.oldValue + map.length > c) {\n                        const splitLength = map.oldValue + map.length - c\n                        newSubsets.push({\n                            newValue: map.newValue + map.length - splitLength,\n                            oldValue: c + 1,\n                            length: splitLength,\n                        })\n                        map.length -= splitLength\n                    }\n                })\n            }\n            break\n        }\n        default:\n            console.log(\"unknown action\")\n    }\n\n    if (node.subsets) {\n        node.subsets = node.subsets.filter(\n            (map: subsetType) => !map.delete && map.oldValue !== map.newValue,\n        )\n        if (newSubsets.length) {\n            node.subsets = node.subsets.concat(newSubsets)\n        }\n    }\n\n    options.postVirtualDiffApply({\n        node: info.node,\n        diff: info.diff,\n        newNode,\n    })\n\n    return\n}\n\nexport function applyVirtual(\n    tree: elementNodeType,\n    diffs: Diff[],\n    options: DiffDOMOptions,\n) {\n    diffs.forEach((diff: Diff) => {\n        applyVirtualDiff(tree, diff, options)\n    })\n    return true\n}\n","import { DiffDOMOptionsPartial, elementNodeType, textNodeType } from \"../types\"\nimport { checkElementType } from \"../helpers\"\n\nexport function nodeToObj(\n    aNode: Element,\n    options: DiffDOMOptionsPartial = {\n        valueDiffing: true,\n        simplifiedElementCheck: true,\n    },\n) {\n    const objNode: elementNodeType | textNodeType = {\n        nodeName: aNode.nodeName,\n    }\n    if (\n        checkElementType(\n            aNode,\n            options.simplifiedElementCheck,\n            \"Text\",\n            \"Comment\",\n        )\n    ) {\n        ;(objNode as unknown as textNodeType).data = (\n            aNode as unknown as Text | Comment\n        ).data\n    } else {\n        if (aNode.attributes && aNode.attributes.length > 0) {\n            objNode.attributes = {}\n            const nodeArray = Array.prototype.slice.call(aNode.attributes)\n            nodeArray.forEach(\n                (attribute) =>\n                    (objNode.attributes[attribute.name] = attribute.value),\n            )\n        }\n        if (aNode.childNodes && aNode.childNodes.length > 0) {\n            objNode.childNodes = []\n            const nodeArray = Array.prototype.slice.call(aNode.childNodes)\n            nodeArray.forEach((childNode) =>\n                objNode.childNodes.push(nodeToObj(childNode, options)),\n            )\n        }\n        if (options.valueDiffing) {\n            if (\n                checkElementType(\n                    aNode,\n                    options.simplifiedElementCheck,\n                    \"HTMLTextAreaElement\",\n                )\n            ) {\n                objNode.value = (aNode as HTMLTextAreaElement).value\n            }\n            if (\n                checkElementType(\n                    aNode,\n                    options.simplifiedElementCheck,\n                    \"HTMLInputElement\",\n                ) &&\n                [\"radio\", \"checkbox\"].includes(\n                    (aNode as HTMLInputElement).type.toLowerCase(),\n                ) &&\n                (aNode as HTMLInputElement).checked !== undefined\n            ) {\n                objNode.checked = (aNode as HTMLInputElement).checked\n            } else if (\n                checkElementType(\n                    aNode,\n                    options.simplifiedElementCheck,\n                    \"HTMLButtonElement\",\n                    \"HTMLDataElement\",\n                    \"HTMLInputElement\",\n                    \"HTMLLIElement\",\n                    \"HTMLMeterElement\",\n                    \"HTMLOptionElement\",\n                    \"HTMLProgressElement\",\n                    \"HTMLParamElement\",\n                )\n            ) {\n                objNode.value = (\n                    aNode as\n                        | HTMLButtonElement\n                        | HTMLDataElement\n                        | HTMLInputElement\n                        | HTMLLIElement\n                        | HTMLMeterElement\n                        | HTMLOptionElement\n                        | HTMLProgressElement\n                        | HTMLParamElement\n                ).value\n            }\n            if (\n                checkElementType(\n                    aNode,\n                    options.simplifiedElementCheck,\n                    \"HTMLOptionElement\",\n                )\n            ) {\n                objNode.selected = (aNode as HTMLOptionElement).selected\n            }\n        }\n    }\n    return objNode\n}\n","import { DiffDOMOptionsPartial, nodeType } from \"../types\"\n\n// from html-parse-stringify (MIT)\n\nconst tagRE =\n    /<\\s*\\/*[a-zA-Z:_][a-zA-Z0-9:_\\-.]*\\s*(?:\"[^\"]*\"['\"]*|'[^']*'['\"]*|[^'\"/>])*\\/*\\s*>|<!--(?:.|\\n|\\r)*?-->/g\n\nconst attrRE = /\\s([^'\"/\\s><]+?)[\\s/>]|([^\\s=]+)=\\s?(\"[^\"]*\"|'[^']*')/g\n\nfunction unescape(string: string) {\n    return string\n        .replace(/&lt;/g, \"<\")\n        .replace(/&gt;/g, \">\")\n        .replace(/&amp;/g, \"&\")\n}\n\n// create optimized lookup object for\n// void elements as listed here:\n// https://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\nconst lookup = {\n    area: true,\n    base: true,\n    br: true,\n    col: true,\n    embed: true,\n    hr: true,\n    img: true,\n    input: true,\n    keygen: true,\n    link: true,\n    menuItem: true,\n    meta: true,\n    param: true,\n    source: true,\n    track: true,\n    wbr: true,\n}\n\nconst parseTag = (tag: string, caseSensitive: boolean) => {\n    const res = {\n        nodeName: \"\",\n        attributes: {},\n    }\n    let voidElement = false\n    let type = \"tag\"\n\n    let tagMatch = tag.match(/<\\/?([^\\s]+?)[/\\s>]/)\n    if (tagMatch) {\n        res.nodeName =\n            caseSensitive || tagMatch[1] === \"svg\"\n                ? tagMatch[1]\n                : tagMatch[1].toUpperCase()\n        if (lookup[tagMatch[1]] || tag.charAt(tag.length - 2) === \"/\") {\n            voidElement = true\n        }\n\n        // handle comment tag\n        if (res.nodeName.startsWith(\"!--\")) {\n            const endIndex = tag.indexOf(\"-->\")\n            return {\n                type: \"comment\",\n                node: {\n                    nodeName: \"#comment\",\n                    data: endIndex !== -1 ? tag.slice(4, endIndex) : \"\",\n                },\n                voidElement,\n            }\n        }\n    }\n\n    let reg = new RegExp(attrRE)\n    let result = null\n    let done = false\n    while (!done) {\n        result = reg.exec(tag)\n\n        if (result === null) {\n            done = true\n        } else if (result[0].trim()) {\n            if (result[1]) {\n                let attr = result[1].trim()\n                let arr = [attr, \"\"]\n\n                if (attr.indexOf(\"=\") > -1) arr = attr.split(\"=\")\n                res.attributes[arr[0]] = arr[1]\n                reg.lastIndex--\n            } else if (result[2])\n                res.attributes[result[2]] = result[3]\n                    .trim()\n                    .substring(1, result[3].length - 1)\n        }\n    }\n\n    return {\n        type,\n        node: res,\n        voidElement,\n    }\n}\n\nexport const stringToObj = (\n    html: string,\n    options: DiffDOMOptionsPartial = {\n        valueDiffing: true,\n        caseSensitive: false,\n    },\n) => {\n    const result: nodeType[] = []\n    let current: { type: string; node: nodeType; voidElement: boolean }\n    let level = -1\n    const arr: { type: string; node: nodeType; voidElement: boolean }[] = []\n    let inComponent = false,\n        insideSvg = false\n\n    // handle text at top level\n    if (html.indexOf(\"<\") !== 0) {\n        const end = html.indexOf(\"<\")\n        result.push({\n            nodeName: \"#text\",\n            data: end === -1 ? html : html.substring(0, end),\n        })\n    }\n\n    html.replace(tagRE, (tag: string, index: number) => {\n        if (inComponent) {\n            if (tag !== `</${current.node.nodeName}>`) {\n                return \"\"\n            } else {\n                inComponent = false\n            }\n        }\n        const isOpen = tag.charAt(1) !== \"/\"\n        const isComment = tag.startsWith(\"<!--\")\n        const start = index + tag.length\n        const nextChar = html.charAt(start)\n\n        if (isComment) {\n            const comment = parseTag(tag, options.caseSensitive).node\n\n            // if we're at root, push new base node\n            if (level < 0) {\n                result.push(comment)\n                return \"\"\n            }\n            const parent = arr[level]\n            if (parent && comment.nodeName) {\n                if (!parent.node.childNodes) {\n                    parent.node.childNodes = []\n                }\n                parent.node.childNodes.push(comment)\n            }\n            return \"\"\n        }\n\n        if (isOpen) {\n            current = parseTag(tag, options.caseSensitive || insideSvg)\n            if (current.node.nodeName === \"svg\") {\n                insideSvg = true\n            }\n            level++\n            if (\n                !current.voidElement &&\n                !inComponent &&\n                nextChar &&\n                nextChar !== \"<\"\n            ) {\n                if (!current.node.childNodes) {\n                    current.node.childNodes = []\n                }\n                const data = unescape(\n                    html.slice(start, html.indexOf(\"<\", start)),\n                )\n                current.node.childNodes.push({\n                    nodeName: \"#text\",\n                    data,\n                })\n                if (\n                    options.valueDiffing &&\n                    current.node.nodeName === \"TEXTAREA\"\n                ) {\n                    current.node.value = data\n                }\n            }\n            // if we're at root, push new base node\n            if (level === 0 && current.node.nodeName) {\n                result.push(current.node)\n            }\n\n            const parent = arr[level - 1]\n            if (parent && current.node.nodeName) {\n                if (!parent.node.childNodes) {\n                    parent.node.childNodes = []\n                }\n                parent.node.childNodes.push(current.node)\n            }\n            arr[level] = current\n        }\n        if (!isOpen || current.voidElement) {\n            if (\n                level > -1 &&\n                (current.voidElement ||\n                    (options.caseSensitive &&\n                        current.node.nodeName === tag.slice(2, -1)) ||\n                    (!options.caseSensitive &&\n                        current.node.nodeName.toUpperCase() ===\n                            tag.slice(2, -1).toUpperCase()))\n            ) {\n                level--\n                // move current up a level to match the end tag\n                if (level > -1) {\n                    if (current.node.nodeName === \"svg\") {\n                        insideSvg = false\n                    }\n                    current = arr[level]\n                }\n            }\n            if (!inComponent && nextChar !== \"<\" && nextChar) {\n                // trailing text node\n                // if we're at the root, push a base text node. otherwise add as\n                // a child to the current node.\n                const childNodes =\n                    level === -1 ? result : arr[level].node.childNodes || []\n\n                // calculate correct end of the data slice in case there's\n                // no tag after the text node.\n                const end = html.indexOf(\"<\", start)\n                let data = unescape(\n                    html.slice(start, end === -1 ? undefined : end),\n                )\n                childNodes.push({\n                    nodeName: \"#text\",\n                    data,\n                })\n            }\n        }\n        return \"\"\n    })\n    return result[0]\n}\n","import {\n    DiffDOMOptions,\n    diffNodeType,\n    elementDiffNodeType,\n    elementNodeType,\n    subsetType,\n    textDiffNodeType,\n} from \"../types\"\nimport {\n    DiffTracker,\n    cleanNode,\n    getGapInformation,\n    isEqual,\n    markSubTrees,\n    removeDone,\n    roughlyEqual,\n} from \"./helpers\"\nimport { Diff, checkElementType } from \"../helpers\"\nimport { applyVirtual } from \"./apply\"\nimport { nodeToObj } from \"./fromDOM\"\nimport { stringToObj } from \"./fromString\"\n\n// ===== Create a diff =====\n\nexport class DiffFinder {\n    debug: boolean\n    diffcount: number\n    foundAll: boolean\n    options: DiffDOMOptions\n    t1: elementDiffNodeType\n    t1Orig: elementNodeType\n    t2: elementDiffNodeType\n    t2Orig: elementNodeType\n    tracker: DiffTracker\n    constructor(\n        t1Node: string | elementNodeType | Element,\n        t2Node: string | elementNodeType | Element,\n        options: DiffDOMOptions,\n    ) {\n        this.options = options\n        this.t1 = (\n            typeof Element !== \"undefined\" &&\n            checkElementType(\n                t1Node,\n                this.options.simplifiedElementCheck,\n                \"Element\",\n            )\n                ? nodeToObj(t1Node as Element, this.options)\n                : typeof t1Node === \"string\"\n                  ? stringToObj(t1Node, this.options)\n                  : JSON.parse(JSON.stringify(t1Node))\n        ) as elementDiffNodeType\n        this.t2 = (\n            typeof Element !== \"undefined\" &&\n            checkElementType(\n                t2Node,\n                this.options.simplifiedElementCheck,\n                \"Element\",\n            )\n                ? nodeToObj(t2Node as Element, this.options)\n                : typeof t2Node === \"string\"\n                  ? stringToObj(t2Node, this.options)\n                  : JSON.parse(JSON.stringify(t2Node))\n        ) as elementDiffNodeType\n        this.diffcount = 0\n        this.foundAll = false\n        if (this.debug) {\n            this.t1Orig =\n                typeof Element !== \"undefined\" &&\n                checkElementType(\n                    t1Node,\n                    this.options.simplifiedElementCheck,\n                    \"Element\",\n                )\n                    ? nodeToObj(t1Node as Element, this.options)\n                    : typeof t1Node === \"string\"\n                      ? stringToObj(t1Node, this.options)\n                      : JSON.parse(JSON.stringify(t1Node))\n            this.t2Orig =\n                typeof Element !== \"undefined\" &&\n                checkElementType(\n                    t2Node,\n                    this.options.simplifiedElementCheck,\n                    \"Element\",\n                )\n                    ? nodeToObj(t2Node as Element, this.options)\n                    : typeof t2Node === \"string\"\n                      ? stringToObj(t2Node, this.options)\n                      : JSON.parse(JSON.stringify(t2Node))\n        }\n\n        this.tracker = new DiffTracker()\n    }\n\n    init() {\n        return this.findDiffs(this.t1, this.t2)\n    }\n\n    findDiffs(t1: elementDiffNodeType, t2: elementDiffNodeType) {\n        let diffs\n        do {\n            if (this.options.debug) {\n                this.diffcount += 1\n                if (this.diffcount > this.options.diffcap) {\n                    throw new Error(\n                        `surpassed diffcap:${JSON.stringify(\n                            this.t1Orig,\n                        )} -> ${JSON.stringify(this.t2Orig)}`,\n                    )\n                }\n            }\n            diffs = this.findNextDiff(t1, t2, [])\n\n            if (diffs.length === 0) {\n                // Last check if the elements really are the same now.\n                // If not, remove all info about being done and start over.\n                // Sometimes a node can be marked as done, but the creation of subsequent diffs means that it has to be changed again.\n                if (!isEqual(t1, t2)) {\n                    if (this.foundAll) {\n                        console.error(\"Could not find remaining diffs!\")\n                    } else {\n                        this.foundAll = true\n                        removeDone(t1)\n                        diffs = this.findNextDiff(t1, t2, [])\n                    }\n                }\n            }\n            if (diffs.length > 0) {\n                this.foundAll = false\n                this.tracker.add(diffs)\n                applyVirtual(t1, diffs, this.options)\n            }\n        } while (diffs.length > 0)\n\n        return this.tracker.list\n    }\n\n    findNextDiff(t1: diffNodeType, t2: diffNodeType, route: number[]) {\n        let diffs\n        let fdiffs\n\n        if (this.options.maxDepth && route.length > this.options.maxDepth) {\n            return []\n        }\n        // outer differences?\n        if (!t1.outerDone) {\n            diffs = this.findOuterDiff(t1, t2, route)\n            if (this.options.filterOuterDiff) {\n                fdiffs = this.options.filterOuterDiff(t1, t2, diffs)\n                if (fdiffs) diffs = fdiffs\n            }\n            if (diffs.length > 0) {\n                t1.outerDone = true\n                return diffs\n            } else {\n                t1.outerDone = true\n            }\n        }\n        if (Object.prototype.hasOwnProperty.call(t1, \"data\")) {\n            // Comment or Text\n            return []\n        }\n        t1 = t1 as elementDiffNodeType\n        t2 = t2 as elementDiffNodeType\n\n        // inner differences?\n        if (!t1.innerDone) {\n            diffs = this.findInnerDiff(t1, t2, route)\n            if (diffs.length > 0) {\n                return diffs\n            } else {\n                t1.innerDone = true\n            }\n        }\n\n        if (this.options.valueDiffing && !t1.valueDone) {\n            // value differences?\n            diffs = this.findValueDiff(t1, t2, route)\n\n            if (diffs.length > 0) {\n                t1.valueDone = true\n                return diffs\n            } else {\n                t1.valueDone = true\n            }\n        }\n\n        // no differences\n        return []\n    }\n\n    findOuterDiff(t1: diffNodeType, t2: diffNodeType, route: number[]) {\n        const diffs = []\n        let attr\n        let attr1\n        let attr2\n        let attrLength\n        let pos\n        let i\n        if (t1.nodeName !== t2.nodeName) {\n            if (!route.length) {\n                throw new Error(\"Top level nodes have to be of the same kind.\")\n            }\n            return [\n                new Diff()\n                    .setValue(\n                        this.options._const.action,\n                        this.options._const.replaceElement,\n                    )\n                    .setValue(this.options._const.oldValue, cleanNode(t1))\n                    .setValue(this.options._const.newValue, cleanNode(t2))\n                    .setValue(this.options._const.route, route),\n            ]\n        }\n        if (\n            route.length &&\n            this.options.diffcap <\n                Math.abs(\n                    (t1.childNodes || []).length - (t2.childNodes || []).length,\n                )\n        ) {\n            return [\n                new Diff()\n                    .setValue(\n                        this.options._const.action,\n                        this.options._const.replaceElement,\n                    )\n                    .setValue(this.options._const.oldValue, cleanNode(t1))\n                    .setValue(this.options._const.newValue, cleanNode(t2))\n                    .setValue(this.options._const.route, route),\n            ]\n        }\n\n        if (\n            Object.prototype.hasOwnProperty.call(t1, \"data\") &&\n            (t1 as textDiffNodeType).data !== (t2 as textDiffNodeType).data\n        ) {\n            // Comment or text node.\n            if (t1.nodeName === \"#text\") {\n                return [\n                    new Diff()\n                        .setValue(\n                            this.options._const.action,\n                            this.options._const.modifyTextElement,\n                        )\n                        .setValue(this.options._const.route, route)\n                        .setValue(\n                            this.options._const.oldValue,\n                            (t1 as textDiffNodeType).data,\n                        )\n                        .setValue(\n                            this.options._const.newValue,\n                            (t2 as textDiffNodeType).data,\n                        ),\n                ]\n            } else {\n                return [\n                    new Diff()\n                        .setValue(\n                            this.options._const.action,\n                            this.options._const.modifyComment,\n                        )\n                        .setValue(this.options._const.route, route)\n                        .setValue(\n                            this.options._const.oldValue,\n                            (t1 as textDiffNodeType).data,\n                        )\n                        .setValue(\n                            this.options._const.newValue,\n                            (t2 as textDiffNodeType).data,\n                        ),\n                ]\n            }\n        }\n\n        t1 = t1 as elementDiffNodeType\n        t2 = t2 as elementDiffNodeType\n\n        attr1 = t1.attributes ? Object.keys(t1.attributes).sort() : []\n        attr2 = t2.attributes ? Object.keys(t2.attributes).sort() : []\n\n        attrLength = attr1.length\n        for (i = 0; i < attrLength; i++) {\n            attr = attr1[i]\n            pos = attr2.indexOf(attr)\n            if (pos === -1) {\n                diffs.push(\n                    new Diff()\n                        .setValue(\n                            this.options._const.action,\n                            this.options._const.removeAttribute,\n                        )\n                        .setValue(this.options._const.route, route)\n                        .setValue(this.options._const.name, attr)\n                        .setValue(\n                            this.options._const.value,\n                            t1.attributes[attr],\n                        ),\n                )\n            } else {\n                attr2.splice(pos, 1)\n                if (t1.attributes[attr] !== t2.attributes[attr]) {\n                    diffs.push(\n                        new Diff()\n                            .setValue(\n                                this.options._const.action,\n                                this.options._const.modifyAttribute,\n                            )\n                            .setValue(this.options._const.route, route)\n                            .setValue(this.options._const.name, attr)\n                            .setValue(\n                                this.options._const.oldValue,\n                                t1.attributes[attr],\n                            )\n                            .setValue(\n                                this.options._const.newValue,\n                                t2.attributes[attr],\n                            ),\n                    )\n                }\n            }\n        }\n\n        attrLength = attr2.length\n        for (i = 0; i < attrLength; i++) {\n            attr = attr2[i]\n            diffs.push(\n                new Diff()\n                    .setValue(\n                        this.options._const.action,\n                        this.options._const.addAttribute,\n                    )\n                    .setValue(this.options._const.route, route)\n                    .setValue(this.options._const.name, attr)\n                    .setValue(this.options._const.value, t2.attributes[attr]),\n            )\n        }\n\n        return diffs\n    }\n\n    findInnerDiff(\n        t1: elementDiffNodeType,\n        t2: elementDiffNodeType,\n        route: number[],\n    ) {\n        const t1ChildNodes = t1.childNodes ? t1.childNodes.slice() : []\n        const t2ChildNodes = t2.childNodes ? t2.childNodes.slice() : []\n        const last = Math.max(t1ChildNodes.length, t2ChildNodes.length)\n        let childNodesLengthDifference = Math.abs(\n            t1ChildNodes.length - t2ChildNodes.length,\n        )\n        let diffs: Diff[] = []\n        let index = 0\n        if (!this.options.maxChildCount || last < this.options.maxChildCount) {\n            const cachedSubtrees = Boolean(t1.subsets && t1.subsetsAge--)\n            const subtrees = cachedSubtrees\n                ? t1.subsets\n                : t1.childNodes && t2.childNodes\n                  ? markSubTrees(t1, t2)\n                  : []\n            if (subtrees.length > 0) {\n                /* One or more groups have been identified among the childnodes of t1\n                 * and t2.\n                 */\n                diffs = this.attemptGroupRelocation(\n                    t1,\n                    t2,\n                    subtrees,\n                    route,\n                    cachedSubtrees,\n                )\n                if (diffs.length > 0) {\n                    return diffs\n                }\n            }\n        }\n\n        /* 0 or 1 groups of similar child nodes have been found\n         * for t1 and t2. 1 If there is 1, it could be a sign that the\n         * contents are the same. When the number of groups is below 2,\n         * t1 and t2 are made to have the same length and each of the\n         * pairs of child nodes are diffed.\n         */\n\n        for (let i = 0; i < last; i += 1) {\n            const e1 = t1ChildNodes[i]\n            const e2 = t2ChildNodes[i]\n\n            if (childNodesLengthDifference) {\n                /* t1 and t2 have different amounts of childNodes. Add\n                 * and remove as necessary to obtain the same length */\n                if (e1 && !e2) {\n                    if (e1.nodeName === \"#text\") {\n                        diffs.push(\n                            new Diff()\n                                .setValue(\n                                    this.options._const.action,\n                                    this.options._const.removeTextElement,\n                                )\n                                .setValue(\n                                    this.options._const.route,\n                                    route.concat(index),\n                                )\n                                .setValue(\n                                    this.options._const.value,\n                                    (e1 as textDiffNodeType).data,\n                                ),\n                        )\n                        index -= 1\n                    } else {\n                        diffs.push(\n                            new Diff()\n                                .setValue(\n                                    this.options._const.action,\n                                    this.options._const.removeElement,\n                                )\n                                .setValue(\n                                    this.options._const.route,\n                                    route.concat(index),\n                                )\n                                .setValue(\n                                    this.options._const.element,\n                                    cleanNode(e1),\n                                ),\n                        )\n                        index -= 1\n                    }\n                } else if (e2 && !e1) {\n                    if (e2.nodeName === \"#text\") {\n                        diffs.push(\n                            new Diff()\n                                .setValue(\n                                    this.options._const.action,\n                                    this.options._const.addTextElement,\n                                )\n                                .setValue(\n                                    this.options._const.route,\n                                    route.concat(index),\n                                )\n                                .setValue(\n                                    this.options._const.value,\n                                    (e2 as textDiffNodeType).data,\n                                ),\n                        )\n                    } else {\n                        diffs.push(\n                            new Diff()\n                                .setValue(\n                                    this.options._const.action,\n                                    this.options._const.addElement,\n                                )\n                                .setValue(\n                                    this.options._const.route,\n                                    route.concat(index),\n                                )\n                                .setValue(\n                                    this.options._const.element,\n                                    cleanNode(e2),\n                                ),\n                        )\n                    }\n                }\n            }\n            /* We are now guaranteed that childNodes e1 and e2 exist,\n             * and that they can be diffed.\n             */\n            /* Diffs in child nodes should not affect the parent node,\n             * so we let these diffs be submitted together with other\n             * diffs.\n             */\n\n            if (e1 && e2) {\n                if (\n                    !this.options.maxChildCount ||\n                    last < this.options.maxChildCount\n                ) {\n                    diffs = diffs.concat(\n                        this.findNextDiff(e1, e2, route.concat(index)),\n                    )\n                } else if (!isEqual(e1, e2)) {\n                    if (t1ChildNodes.length > t2ChildNodes.length) {\n                        if (e1.nodeName === \"#text\") {\n                            diffs.push(\n                                new Diff()\n                                    .setValue(\n                                        this.options._const.action,\n                                        this.options._const.removeTextElement,\n                                    )\n                                    .setValue(\n                                        this.options._const.route,\n                                        route.concat(index),\n                                    )\n                                    .setValue(\n                                        this.options._const.value,\n                                        (e1 as textDiffNodeType).data,\n                                    ),\n                            )\n                        } else {\n                            diffs.push(\n                                new Diff()\n                                    .setValue(\n                                        this.options._const.action,\n                                        this.options._const.removeElement,\n                                    )\n                                    .setValue(\n                                        this.options._const.element,\n                                        cleanNode(e1),\n                                    )\n                                    .setValue(\n                                        this.options._const.route,\n                                        route.concat(index),\n                                    ),\n                            )\n                        }\n                        t1ChildNodes.splice(i, 1)\n                        i -= 1\n                        index -= 1\n\n                        childNodesLengthDifference -= 1\n                    } else if (t1ChildNodes.length < t2ChildNodes.length) {\n                        diffs = diffs.concat([\n                            new Diff()\n                                .setValue(\n                                    this.options._const.action,\n                                    this.options._const.addElement,\n                                )\n                                .setValue(\n                                    this.options._const.element,\n                                    cleanNode(e2),\n                                )\n                                .setValue(\n                                    this.options._const.route,\n                                    route.concat(index),\n                                ),\n                        ])\n                        t1ChildNodes.splice(i, 0, cleanNode(e2))\n                        childNodesLengthDifference -= 1\n                    } else {\n                        diffs = diffs.concat([\n                            new Diff()\n                                .setValue(\n                                    this.options._const.action,\n                                    this.options._const.replaceElement,\n                                )\n                                .setValue(\n                                    this.options._const.oldValue,\n                                    cleanNode(e1),\n                                )\n                                .setValue(\n                                    this.options._const.newValue,\n                                    cleanNode(e2),\n                                )\n                                .setValue(\n                                    this.options._const.route,\n                                    route.concat(index),\n                                ),\n                        ])\n                    }\n                }\n            }\n            index += 1\n        }\n        t1.innerDone = true\n        return diffs\n    }\n\n    attemptGroupRelocation(\n        t1: elementDiffNodeType,\n        t2: elementDiffNodeType,\n        subtrees: subsetType[],\n        route: number[],\n        cachedSubtrees: boolean,\n    ) {\n        /* Either t1.childNodes and t2.childNodes have the same length, or\n         * there are at least two groups of similar elements can be found.\n         * attempts are made at equalizing t1 with t2. First all initial\n         * elements with no group affiliation (gaps=true) are removed (if\n         * only in t1) or added (if only in t2). Then the creation of a group\n         * relocation diff is attempted.\n         */\n        const gapInformation = getGapInformation(t1, t2, subtrees)\n        const gaps1 = gapInformation.gaps1\n        const gaps2 = gapInformation.gaps2\n        const t1ChildNodes = t1.childNodes.slice()\n        const t2ChildNodes = t2.childNodes.slice()\n        let shortest = Math.min(gaps1.length, gaps2.length)\n        let destinationDifferent\n        let toGroup\n        let group\n        let node\n        let similarNode\n        const diffs = []\n        for (\n            let index2 = 0, index1 = 0;\n            index2 < shortest;\n            index1 += 1, index2 += 1\n        ) {\n            if (\n                cachedSubtrees &&\n                (gaps1[index2] === true || gaps2[index2] === true)\n            ) {\n                // pass\n            } else if (gaps1[index1] === true) {\n                node = t1ChildNodes[index1]\n                if (node.nodeName === \"#text\") {\n                    if (t2ChildNodes[index2].nodeName === \"#text\") {\n                        if (\n                            (node as textDiffNodeType).data !==\n                            (t2ChildNodes[index2] as textDiffNodeType).data\n                        ) {\n                            // Check whether a text node with the same value follows later on.\n                            let testI = index1\n                            while (\n                                t1ChildNodes.length > testI + 1 &&\n                                t1ChildNodes[testI + 1].nodeName === \"#text\"\n                            ) {\n                                testI += 1\n                                if (\n                                    (t2ChildNodes[index2] as textDiffNodeType)\n                                        .data ===\n                                    (t1ChildNodes[testI] as textDiffNodeType)\n                                        .data\n                                ) {\n                                    similarNode = true\n                                    break\n                                }\n                            }\n                            if (!similarNode) {\n                                diffs.push(\n                                    new Diff()\n                                        .setValue(\n                                            this.options._const.action,\n                                            this.options._const\n                                                .modifyTextElement,\n                                        )\n                                        .setValue(\n                                            this.options._const.route,\n                                            route.concat(index1),\n                                        )\n                                        .setValue(\n                                            this.options._const.oldValue,\n                                            node.data,\n                                        )\n                                        .setValue(\n                                            this.options._const.newValue,\n                                            (\n                                                t2ChildNodes[\n                                                    index2\n                                                ] as textDiffNodeType\n                                            ).data,\n                                        ),\n                                    // t1ChildNodes at position index1 is not up-to-date, but that does not matter as\n                                    // index1 will increase +1\n                                )\n                            }\n                        }\n                    } else {\n                        diffs.push(\n                            new Diff()\n                                .setValue(\n                                    this.options._const.action,\n                                    this.options._const.removeTextElement,\n                                )\n                                .setValue(\n                                    this.options._const.route,\n                                    route.concat(index1),\n                                )\n                                .setValue(this.options._const.value, node.data),\n                        )\n                        gaps1.splice(index1, 1)\n                        t1ChildNodes.splice(index1, 1)\n                        shortest = Math.min(gaps1.length, gaps2.length)\n                        index1 -= 1\n                        index2 -= 1\n                    }\n                } else if (gaps2[index2] === true) {\n                    // both gaps1[index1] and gaps2[index2]  are true.\n                    // We replace one element with another.\n                    diffs.push(\n                        new Diff()\n                            .setValue(\n                                this.options._const.action,\n                                this.options._const.replaceElement,\n                            )\n                            .setValue(\n                                this.options._const.oldValue,\n                                cleanNode(node),\n                            )\n                            .setValue(\n                                this.options._const.newValue,\n                                cleanNode(t2ChildNodes[index2]),\n                            )\n                            .setValue(\n                                this.options._const.route,\n                                route.concat(index1),\n                            ),\n                    )\n                    // t1ChildNodes at position index1 is not up-to-date, but that does not matter as\n                    // index1 will increase +1\n                } else {\n                    diffs.push(\n                        new Diff()\n                            .setValue(\n                                this.options._const.action,\n                                this.options._const.removeElement,\n                            )\n                            .setValue(\n                                this.options._const.route,\n                                route.concat(index1),\n                            )\n                            .setValue(\n                                this.options._const.element,\n                                cleanNode(node),\n                            ),\n                    )\n                    gaps1.splice(index1, 1)\n                    t1ChildNodes.splice(index1, 1)\n                    shortest = Math.min(gaps1.length, gaps2.length)\n                    index1 -= 1\n                    index2 -= 1\n                }\n            } else if (gaps2[index2] === true) {\n                node = t2ChildNodes[index2]\n                if (node.nodeName === \"#text\") {\n                    diffs.push(\n                        new Diff()\n                            .setValue(\n                                this.options._const.action,\n                                this.options._const.addTextElement,\n                            )\n                            .setValue(\n                                this.options._const.route,\n                                route.concat(index1),\n                            )\n                            .setValue(this.options._const.value, node.data),\n                    )\n                    gaps1.splice(index1, 0, true)\n                    t1ChildNodes.splice(index1, 0, {\n                        nodeName: \"#text\",\n                        data: node.data,\n                    })\n                    shortest = Math.min(gaps1.length, gaps2.length)\n                    //index1 += 1\n                } else {\n                    diffs.push(\n                        new Diff()\n                            .setValue(\n                                this.options._const.action,\n                                this.options._const.addElement,\n                            )\n                            .setValue(\n                                this.options._const.route,\n                                route.concat(index1),\n                            )\n                            .setValue(\n                                this.options._const.element,\n                                cleanNode(node),\n                            ),\n                    )\n                    gaps1.splice(index1, 0, true)\n                    t1ChildNodes.splice(index1, 0, cleanNode(node))\n                    shortest = Math.min(gaps1.length, gaps2.length)\n                    //index1 += 1\n                }\n            } else if (gaps1[index1] !== gaps2[index2]) {\n                if (diffs.length > 0) {\n                    return diffs\n                }\n                // group relocation\n                group = subtrees[gaps1[index1] as number]\n                toGroup = Math.min(\n                    group.newValue,\n                    t1ChildNodes.length - group.length,\n                )\n                if (toGroup !== group.oldValue && toGroup > -1) {\n                    // Check whether destination nodes are different than originating ones.\n                    destinationDifferent = false\n                    for (let j = 0; j < group.length; j += 1) {\n                        if (\n                            !roughlyEqual(\n                                t1ChildNodes[toGroup + j],\n                                t1ChildNodes[group.oldValue + j],\n                                {},\n                                false,\n                                true,\n                            )\n                        ) {\n                            destinationDifferent = true\n                        }\n                    }\n                    if (destinationDifferent) {\n                        return [\n                            new Diff()\n                                .setValue(\n                                    this.options._const.action,\n                                    this.options._const.relocateGroup,\n                                )\n                                .setValue(\n                                    this.options._const.groupLength,\n                                    group.length,\n                                )\n                                .setValue(\n                                    this.options._const.from,\n                                    group.oldValue,\n                                )\n                                .setValue(this.options._const.to, toGroup)\n                                .setValue(this.options._const.route, route),\n                        ]\n                    }\n                }\n            }\n        }\n        return diffs\n    }\n\n    findValueDiff(\n        t1: elementDiffNodeType,\n        t2: elementDiffNodeType,\n        route: number[],\n    ) {\n        // Differences of value. Only useful if the value/selection/checked value\n        // differs from what is represented in the DOM. For example in the case\n        // of filled out forms, etc.\n        const diffs = []\n\n        if (t1.selected !== t2.selected) {\n            diffs.push(\n                new Diff()\n                    .setValue(\n                        this.options._const.action,\n                        this.options._const.modifySelected,\n                    )\n                    .setValue(this.options._const.oldValue, t1.selected)\n                    .setValue(this.options._const.newValue, t2.selected)\n                    .setValue(this.options._const.route, route),\n            )\n        }\n\n        if (\n            (t1.value || t2.value) &&\n            t1.value !== t2.value &&\n            t1.nodeName !== \"OPTION\"\n        ) {\n            diffs.push(\n                new Diff()\n                    .setValue(\n                        this.options._const.action,\n                        this.options._const.modifyValue,\n                    )\n                    .setValue(this.options._const.oldValue, t1.value || \"\")\n                    .setValue(this.options._const.newValue, t2.value || \"\")\n                    .setValue(this.options._const.route, route),\n            )\n        }\n        if (t1.checked !== t2.checked) {\n            diffs.push(\n                new Diff()\n                    .setValue(\n                        this.options._const.action,\n                        this.options._const.modifyChecked,\n                    )\n                    .setValue(this.options._const.oldValue, t1.checked)\n                    .setValue(this.options._const.newValue, t2.checked)\n                    .setValue(this.options._const.route, route),\n            )\n        }\n\n        return diffs\n    }\n}\n","import {\n    ConstNames,\n    ConstNamesPartial,\n    DiffDOMOptions,\n    DiffDOMOptionsPartial,\n    diffType,\n    elementNodeType,\n    textNodeType,\n} from \"./types\"\nimport { applyDOM, undoDOM } from \"./dom/index\"\nimport { Diff } from \"./helpers\"\nimport { DiffFinder } from \"./virtual/index\"\nexport { nodeToObj, stringToObj } from \"./virtual/index\"\n\nconst DEFAULT_OPTIONS = {\n    debug: false,\n    diffcap: 10, // Limit for how many diffs are accepting when debugging. Inactive when debug is false.\n    maxDepth: false, // False or a numeral. If set to a numeral, limits the level of depth that the the diff mechanism looks for differences. If false, goes through the entire tree.\n    maxChildCount: 50, // False or a numeral. If set to a numeral, only does a simplified form of diffing of contents so that the number of diffs cannot be higher than the number of child nodes.\n    valueDiffing: true, // Whether to take into consideration the values of forms that differ from auto assigned values (when a user fills out a form).\n    simplifiedElementCheck: false, // Whether to use simplified element type checking for primitive virtual DOMs without ownerDocument\n    // syntax: textDiff: function (node, currentValue, expectedValue, newValue)\n    textDiff(\n        node: textNodeType,\n        currentValue: string,\n        expectedValue: string,\n        newValue: string,\n    ) {\n        node.data = newValue\n        return\n    },\n    // empty functions were benchmarked as running faster than both\n    // `f && f()` and `if (f) { f(); }`\n    preVirtualDiffApply() {}, // eslint-disable-line @typescript-eslint/no-empty-function\n    postVirtualDiffApply() {}, // eslint-disable-line @typescript-eslint/no-empty-function\n    preDiffApply() {}, // eslint-disable-line @typescript-eslint/no-empty-function\n    postDiffApply() {}, // eslint-disable-line @typescript-eslint/no-empty-function\n    filterOuterDiff: null,\n    compress: false, // Whether to work with compressed diffs\n    _const: false, // object with strings for every change types to be used in diffs.\n    document:\n        typeof window !== \"undefined\" && window.document\n            ? window.document\n            : false,\n    components: [], // list of components used for converting from string\n}\n\nexport class DiffDOM {\n    options: DiffDOMOptions\n    constructor(options: DiffDOMOptionsPartial = {}) {\n        // IE11 doesn't have Object.assign and buble doesn't translate object spreaders\n        // by default, so this is the safest way of doing it currently.\n        Object.entries(DEFAULT_OPTIONS).forEach(([key, value]) => {\n            if (!Object.prototype.hasOwnProperty.call(options, key)) {\n                options[key] = value\n            }\n        })\n\n        if (!options._const) {\n            const varNames = [\n                \"addAttribute\",\n                \"modifyAttribute\",\n                \"removeAttribute\",\n                \"modifyTextElement\",\n                \"relocateGroup\",\n                \"removeElement\",\n                \"addElement\",\n                \"removeTextElement\",\n                \"addTextElement\",\n                \"replaceElement\",\n                \"modifyValue\",\n                \"modifyChecked\",\n                \"modifySelected\",\n                \"modifyComment\",\n                \"action\",\n                \"route\",\n                \"oldValue\",\n                \"newValue\",\n                \"element\",\n                \"group\",\n                \"groupLength\",\n                \"from\",\n                \"to\",\n                \"name\",\n                \"value\",\n                \"data\",\n                \"attributes\",\n                \"nodeName\",\n                \"childNodes\",\n                \"checked\",\n                \"selected\",\n            ]\n            const constNames: ConstNamesPartial = {}\n            if (options.compress) {\n                varNames.forEach(\n                    (varName, index) => (constNames[varName] = index),\n                )\n            } else {\n                varNames.forEach((varName) => (constNames[varName] = varName))\n            }\n            options._const = constNames as ConstNames\n        }\n\n        this.options = options as DiffDOMOptions\n    }\n\n    apply(tree: Element, diffs: (Diff | diffType)[]) {\n        return applyDOM(tree, diffs, this.options)\n    }\n\n    undo(tree: Element, diffs: (Diff | diffType)[]) {\n        return undoDOM(tree, diffs, this.options)\n    }\n\n    diff(\n        t1Node: string | elementNodeType | Element,\n        t2Node: string | elementNodeType | Element,\n    ) {\n        const finder = new DiffFinder(t1Node, t2Node, this.options)\n        return finder.init()\n    }\n}\n","import { checkElementType } from \"./diffDOM/helpers\"\n\n/**\n * Use TraceLogger to figure out function calls inside\n * JS objects by wrapping an object with a TraceLogger\n * instance.\n *\n * Pretty-prints the call trace (using unicode box code)\n * when tracelogger.toString() is called.\n */\n\n/**\n * Wrap an object by calling new TraceLogger(obj)\n *\n * If you're familiar with Python decorators, this\n * does roughly the same thing, adding pre/post\n * call hook logging calls so that you can see\n * what's going on.\n */\nexport class TraceLogger {\n    messages: string[]\n    pad: string\n    padding: string\n    tick: number\n    constructor(obj = {}) {\n        this.pad = \"│   \"\n        this.padding = \"\"\n        this.tick = 1\n        this.messages = []\n        const wrapkey = (obj: object, key: string) => {\n            // trace this function\n            const oldfn = obj[key]\n            obj[key] = (\n                ...args: ((\n                    ...args: (\n                        | string\n                        | HTMLElement\n                        | number\n                        | boolean\n                        | false\n                        | (string | HTMLElement | number | boolean | false)[]\n                    )[]\n                ) => void)[]\n            ) => {\n                this.fin(key, Array.prototype.slice.call(args))\n                const result = oldfn.apply(obj, args)\n                this.fout(key, result)\n                return result\n            }\n        }\n        // can't use Object.keys for prototype walking\n        for (let key in obj) {\n            if (typeof obj[key] === \"function\") {\n                wrapkey(obj, key)\n            }\n        }\n        this.log(\"┌ TRACELOG START\")\n    }\n    // called when entering a function\n    fin(\n        fn: string,\n        args:\n            | string\n            | HTMLElement\n            | number\n            | boolean\n            | false\n            | (string | HTMLElement | number | boolean | false)[],\n    ) {\n        this.padding += this.pad\n        this.log(`├─> entering ${fn}`, args)\n    }\n    // called when exiting a function\n    fout(\n        fn: string,\n        result:\n            | string\n            | HTMLElement\n            | number\n            | boolean\n            | false\n            | (string | HTMLElement | number | boolean | false)[],\n    ) {\n        this.log(\"│<──┘ generated return value\", result)\n        this.padding = this.padding.substring(\n            0,\n            this.padding.length - this.pad.length,\n        )\n    }\n    // log message formatting\n    format(s: string, tick: number) {\n        let nf = function (t: number) {\n            let tStr = `${t}`\n            while (tStr.length < 4) {\n                tStr = `0${t}`\n            }\n            return tStr\n        }\n        return `${nf(tick)}> ${this.padding}${s}`\n    }\n    // log a trace message\n    log(...args) {\n        const stringCollapse = function (\n            v:\n                | string\n                | HTMLElement\n                | number\n                | boolean\n                | false\n                | (string | HTMLElement | number | boolean | false)[],\n        ) {\n            if (!v) {\n                return \"<falsey>\"\n            }\n            if (typeof v === \"string\") {\n                return v\n            }\n            // Use simplified check for HTMLElement since this is outside the main diff process\n            if (checkElementType(v, true, \"HTMLElement\")) {\n                return (v as HTMLElement).outerHTML || \"<empty>\"\n            }\n            if (v instanceof Array) {\n                return `[${v.map(stringCollapse).join(\",\")}]`\n            }\n            return v.toString() || v.valueOf() || \"<unknown>\"\n        }\n        const s = args.map(stringCollapse).join(\", \")\n        this.messages.push(this.format(s, this.tick++))\n    }\n    // turn the log into a structured string with\n    // unicode box codes to make it a sensible trace.\n    toString() {\n        let cap = \"×   \"\n        let terminator = \"└───\"\n        while (terminator.length <= this.padding.length + this.pad.length) {\n            terminator += cap\n        }\n        let _ = this.padding\n        this.padding = \"\"\n        terminator = this.format(terminator, this.tick)\n        this.padding = _\n        return `${this.messages.join(\"\\n\")}\\n${terminator}`\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2021 , 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport classNames from \"classnames\";\nimport DiffMatchPatch from \"diff-match-patch\";\nimport { DiffDOM, type IDiff } from \"diff-dom\";\nimport { type IContent } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { unescape } from \"lodash\";\n\nimport { bodyToHtml, checkBlockNode, type EventRenderOpts } from \"../HtmlUtils\";\n\nfunction textToHtml(text: string): string {\n    const container = document.createElement(\"div\");\n    container.textContent = text;\n    return container.innerHTML;\n}\n\nfunction getSanitizedHtmlBody(content: IContent): string {\n    const opts: EventRenderOpts = {\n        stripReplyFallback: true,\n    };\n    if (content.format === \"org.matrix.custom.html\") {\n        return bodyToHtml(content, undefined, opts);\n    } else {\n        // convert the string to something that can be safely\n        // embedded in an html document, e.g. use html entities where needed\n        // This is also needed so that DiffDOM wouldn't interpret something\n        // as a tag when somebody types e.g. \"</sarcasm>\"\n\n        // as opposed to bodyToHtml, here we also render\n        // text messages with dangerouslySetInnerHTML, to unify\n        // the code paths and because we need html to show differences\n        return textToHtml(bodyToHtml(content, undefined, opts));\n    }\n}\n\nfunction wrapInsertion(child: Node): HTMLElement {\n    const wrapper = document.createElement(checkBlockNode(child) ? \"div\" : \"span\");\n    wrapper.className = \"mx_EditHistoryMessage_insertion\";\n    wrapper.appendChild(child);\n    return wrapper;\n}\n\nfunction wrapDeletion(child: Node): HTMLElement {\n    const wrapper = document.createElement(checkBlockNode(child) ? \"div\" : \"span\");\n    wrapper.className = \"mx_EditHistoryMessage_deletion\";\n    wrapper.appendChild(child);\n    return wrapper;\n}\n\nfunction findRefNodes(\n    root: Node,\n    route: number[],\n    isAddition = false,\n): {\n    refNode: Node | undefined;\n    refParentNode: Node | undefined;\n} {\n    let refNode: Node | undefined = root;\n    let refParentNode: Node | undefined;\n    const end = isAddition ? route.length - 1 : route.length;\n    for (let i = 0; i < end; ++i) {\n        refParentNode = refNode;\n        refNode = refNode?.childNodes[route[i]!];\n    }\n    return { refNode, refParentNode };\n}\n\nfunction isTextNode(node: Text | HTMLElement): node is Text {\n    return node.nodeName === \"#text\";\n}\n\nfunction diffTreeToDOM(desc: Text | HTMLElement): Node {\n    if (isTextNode(desc)) {\n        return stringAsTextNode(desc.data);\n    } else {\n        const node = document.createElement(desc.nodeName);\n        for (const [key, value] of Object.entries(desc.attributes)) {\n            node.setAttribute(key, value.value);\n        }\n        if (desc.childNodes) {\n            for (const childDesc of desc.childNodes) {\n                node.appendChild(diffTreeToDOM(childDesc as Text | HTMLElement));\n            }\n        }\n        return node;\n    }\n}\n\nfunction insertBefore(parent: Node, nextSibling: Node | undefined, child: Node): void {\n    if (nextSibling) {\n        parent.insertBefore(child, nextSibling);\n    } else {\n        parent.appendChild(child);\n    }\n}\n\nfunction isRouteOfNextSibling(route1: number[], route2: number[]): boolean {\n    // routes are arrays with indices,\n    // to be interpreted as a path in the dom tree\n\n    // ensure same parent\n    for (let i = 0; i < route1.length - 1; ++i) {\n        if (route1[i] !== route2[i]) {\n            return false;\n        }\n    }\n    // the route2 is only affected by the diff of route1\n    // inserting an element if the index at the level of the\n    // last element of route1 being larger\n    // (e.g. coming behind route1 at that level)\n    const lastD1Idx = route1.length - 1;\n    return route2[lastD1Idx]! >= route1[lastD1Idx]!;\n}\n\nfunction adjustRoutes(diff: IDiff, remainingDiffs: IDiff[]): void {\n    if (diff.action === \"removeTextElement\" || diff.action === \"removeElement\") {\n        // as removed text is not removed from the html, but marked as deleted,\n        // we need to readjust indices that assume the current node has been removed.\n        const advance = 1;\n        for (const rd of remainingDiffs) {\n            if (isRouteOfNextSibling(diff.route, rd.route)) {\n                rd.route[diff.route.length - 1] += advance;\n            }\n        }\n    }\n}\n\nfunction stringAsTextNode(string: string): Text {\n    return document.createTextNode(unescape(string));\n}\n\nfunction renderDifferenceInDOM(originalRootNode: Node, diff: IDiff, diffMathPatch: DiffMatchPatch): void {\n    const { refNode, refParentNode } = findRefNodes(originalRootNode, diff.route);\n\n    switch (diff.action) {\n        case \"replaceElement\": {\n            if (!refNode) {\n                console.warn(\"Unable to apply replaceElement operation due to missing node\");\n                return;\n            }\n            const container = document.createElement(\"span\");\n            const delNode = wrapDeletion(diffTreeToDOM(diff.oldValue as HTMLElement));\n            const insNode = wrapInsertion(diffTreeToDOM(diff.newValue as HTMLElement));\n            container.appendChild(delNode);\n            container.appendChild(insNode);\n            refNode.parentNode!.replaceChild(container, refNode);\n            break;\n        }\n        case \"removeTextElement\": {\n            if (!refNode) {\n                console.warn(\"Unable to apply removeTextElement operation due to missing node\");\n                return;\n            }\n            const delNode = wrapDeletion(stringAsTextNode(diff.value as string));\n            refNode.parentNode!.replaceChild(delNode, refNode);\n            break;\n        }\n        case \"removeElement\": {\n            if (!refNode) {\n                console.warn(\"Unable to apply removeElement operation due to missing node\");\n                return;\n            }\n            const delNode = wrapDeletion(diffTreeToDOM(diff.element as HTMLElement));\n            refNode.parentNode!.replaceChild(delNode, refNode);\n            break;\n        }\n        case \"modifyTextElement\": {\n            if (!refNode) {\n                console.warn(\"Unable to apply modifyTextElement operation due to missing node\");\n                return;\n            }\n            const textDiffs = diffMathPatch.diff_main(diff.oldValue as string, diff.newValue as string);\n            diffMathPatch.diff_cleanupSemantic(textDiffs);\n            const container = document.createElement(\"span\");\n            for (const [modifier, text] of textDiffs) {\n                let textDiffNode: Node = stringAsTextNode(text);\n                if (modifier < 0) {\n                    textDiffNode = wrapDeletion(textDiffNode);\n                } else if (modifier > 0) {\n                    textDiffNode = wrapInsertion(textDiffNode);\n                }\n                container.appendChild(textDiffNode);\n            }\n            refNode.parentNode!.replaceChild(container, refNode);\n            break;\n        }\n        case \"addElement\": {\n            if (!refParentNode) {\n                console.warn(\"Unable to apply addElement operation due to missing node\");\n                return;\n            }\n            const insNode = wrapInsertion(diffTreeToDOM(diff.element as HTMLElement));\n            insertBefore(refParentNode, refNode, insNode);\n            break;\n        }\n        case \"addTextElement\": {\n            if (!refParentNode) {\n                console.warn(\"Unable to apply addTextElement operation due to missing node\");\n                return;\n            }\n            // XXX: sometimes diffDOM says insert a newline when there shouldn't be one\n            // but we must insert the node anyway so that we don't break the route child IDs.\n            // See https://github.com/fiduswriter/diffDOM/issues/100\n            const insNode = wrapInsertion(stringAsTextNode(diff.value !== \"\\n\" ? (diff.value as string) : \"\"));\n            insertBefore(refParentNode, refNode, insNode);\n            break;\n        }\n        // e.g. when changing a the href of a link,\n        // show the link with old href as removed and with the new href as added\n        case \"removeAttribute\":\n        case \"addAttribute\":\n        case \"modifyAttribute\": {\n            if (!refNode) {\n                console.warn(`Unable to apply ${diff.action} operation due to missing node`);\n                return;\n            }\n            const delNode = wrapDeletion(refNode.cloneNode(true));\n            const updatedNode = refNode.cloneNode(true) as HTMLElement;\n            if (diff.action === \"addAttribute\" || diff.action === \"modifyAttribute\") {\n                updatedNode.setAttribute(diff.name, diff.newValue as string);\n            } else {\n                updatedNode.removeAttribute(diff.name);\n            }\n            const insNode = wrapInsertion(updatedNode);\n            const container = document.createElement(checkBlockNode(refNode) ? \"div\" : \"span\");\n            container.appendChild(delNode);\n            container.appendChild(insNode);\n            refNode.parentNode!.replaceChild(container, refNode);\n            break;\n        }\n        default:\n            // Should not happen (modifyComment, ???)\n            logger.warn(\"MessageDiffUtils::editBodyDiffToHtml: diff action not supported atm\", diff);\n    }\n}\n\n/**\n * Renders a message with the changes made in an edit shown visually.\n * @param {IContent} originalContent the content for the base message\n * @param {IContent} editContent the content for the edit message\n * @returns {JSX.Element} a react element similar to what `bodyToHtml` returns\n */\nexport function editBodyDiffToHtml(originalContent: IContent, editContent: IContent): JSX.Element {\n    // wrap the body in a div, DiffDOM needs a root element\n    const originalBody = `<div>${getSanitizedHtmlBody(originalContent)}</div>`;\n    const editBody = `<div>${getSanitizedHtmlBody(editContent)}</div>`;\n    const dd = new DiffDOM();\n    // diffActions is an array of objects with at least a `action` and `route`\n    // property. `action` tells us what the diff object changes, and `route` where.\n    // `route` is a path on the DOM tree expressed as an array of indices.\n    const diffActions = dd.diff(originalBody, editBody);\n    // for diffing text fragments\n    const diffMathPatch = new DiffMatchPatch();\n    // parse the base html message as a DOM tree, to which we'll apply the differences found.\n    // fish out the div in which we wrapped the messages above with children[0].\n    const originalRootNode = new DOMParser().parseFromString(originalBody, \"text/html\").body.children[0]!;\n    for (let i = 0; i < diffActions.length; ++i) {\n        const diff = diffActions[i]!;\n        renderDifferenceInDOM(originalRootNode, diff, diffMathPatch);\n        // DiffDOM assumes in subsequent diffs route path that\n        // the action was applied (e.g. that a removeElement action removed the element).\n        // This is not the case for us. We render differences in the DOM tree, and don't apply them.\n        // So we need to adjust the routes of the remaining diffs to account for this.\n        adjustRoutes(diff, diffActions.slice(i + 1));\n    }\n    // take the html out of the modified DOM tree again\n    const safeBody = originalRootNode.innerHTML;\n    const className = classNames({\n        \"mx_EventTile_body\": true,\n        \"markdown-body\": true,\n    });\n    return <span key=\"body\" className={className} dangerouslySetInnerHTML={{ __html: safeBody }} dir=\"auto\" />;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type MatrixEvent, HTTPError, MatrixError } from \"matrix-js-sdk/src/matrix\";\n\nimport { _t } from \"../../../languageHandler\";\nimport ConfirmRedactDialog from \"./ConfirmRedactDialog\";\nimport ErrorDialog from \"./ErrorDialog\";\nimport BaseDialog from \"./BaseDialog\";\nimport Spinner from \"../elements/Spinner\";\n\ninterface IProps {\n    event: MatrixEvent;\n    redact: () => Promise<void>;\n    onFinished: (success?: boolean) => void;\n}\n\ninterface IState {\n    isRedacting: boolean;\n    redactionErrorCode: string | number | null;\n}\n\n/*\n * A dialog for confirming a redaction.\n * Also shows a spinner (and possible error) while the redaction is ongoing,\n * and only closes the dialog when the redaction is done or failed.\n *\n * This is done to prevent the edit history dialog racing with the redaction:\n * if this dialog closes and the MessageEditHistoryDialog is shown again,\n * it will fetch the relations again, which will race with the ongoing /redact request.\n * which will cause the edit to appear unredacted.\n *\n * To avoid this, we keep the dialog open as long as /redact is in progress.\n */\nexport default class ConfirmAndWaitRedactDialog extends React.PureComponent<IProps, IState> {\n    public constructor(props: IProps) {\n        super(props);\n        this.state = {\n            isRedacting: false,\n            redactionErrorCode: null,\n        };\n    }\n\n    public onParentFinished = async (proceed?: boolean): Promise<void> => {\n        if (proceed) {\n            this.setState({ isRedacting: true });\n            try {\n                await this.props.redact();\n                this.props.onFinished(true);\n            } catch (error) {\n                let code: string | number | undefined;\n                if (error instanceof MatrixError) {\n                    code = error.errcode;\n                } else if (error instanceof HTTPError) {\n                    code = error.httpStatus;\n                }\n\n                if (typeof code !== \"undefined\") {\n                    this.setState({ redactionErrorCode: code });\n                } else {\n                    this.props.onFinished(true);\n                }\n            }\n        } else {\n            this.props.onFinished(false);\n        }\n    };\n\n    public render(): React.ReactNode {\n        if (this.state.isRedacting) {\n            if (this.state.redactionErrorCode) {\n                const code = this.state.redactionErrorCode;\n                return (\n                    <ErrorDialog\n                        onFinished={this.props.onFinished}\n                        title={_t(\"common|error\")}\n                        description={_t(\"redact|error\", { code })}\n                    />\n                );\n            } else {\n                return (\n                    <BaseDialog onFinished={this.props.onFinished} hasCancel={false} title={_t(\"redact|ongoing\")}>\n                        <Spinner />\n                    </BaseDialog>\n                );\n            }\n        } else {\n            return <ConfirmRedactDialog event={this.props.event} onFinished={this.onParentFinished} />;\n        }\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createRef } from \"react\";\nimport { type EventStatus, type IContent, type MatrixEvent, MatrixEventEvent, MsgType } from \"matrix-js-sdk/src/matrix\";\nimport classNames from \"classnames\";\nimport { ActionBarView, EventContentBodyView, MessageTimestampView } from \"@element-hq/web-shared-components\";\n\nimport { EditHistoryActionBarViewModel } from \"../../../viewmodels/message-body/EditHistoryActionBarViewModel\";\nimport { EventContentBodyViewModel } from \"../../../viewmodels/message-body/EventContentBodyViewModel\";\nimport { MessageTimestampViewModel } from \"../../../viewmodels/room/timeline/event-tile/timestamp/MessageTimestampViewModel\";\nimport { editBodyDiffToHtml } from \"../../../utils/MessageDiffUtils\";\nimport Modal from \"../../../Modal\";\nimport ConfirmAndWaitRedactDialog from \"../dialogs/ConfirmAndWaitRedactDialog\";\nimport ViewSource from \"../../structures/ViewSource\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { RedactedBodyFactory } from \"./MBodyFactory\";\n\nfunction getReplacedContent(event: MatrixEvent): IContent {\n    const originalContent = event.getOriginalContent();\n    return originalContent[\"m.new_content\"] || originalContent;\n}\n\ninterface IProps {\n    // the message event being edited\n    mxEvent: MatrixEvent;\n    previousEdit?: MatrixEvent;\n    isBaseEvent?: boolean;\n    isTwelveHour?: boolean;\n}\n\ninterface IState {\n    canRedact: boolean;\n    sendStatus: EventStatus | null;\n}\n\nexport default class EditHistoryMessage extends React.PureComponent<IProps, IState> {\n    public static contextType = MatrixClientContext;\n    declare public context: React.ContextType<typeof MatrixClientContext>;\n\n    private content = createRef<HTMLDivElement>();\n    private readonly eventContentBodyViewModel: EventContentBodyViewModel;\n    private readonly editHistoryActionBarViewModel: EditHistoryActionBarViewModel;\n    private readonly messageTimestampViewModel: MessageTimestampViewModel;\n\n    public constructor(props: IProps, context: React.ContextType<typeof MatrixClientContext>) {\n        super(props, context);\n\n        const cli = this.context;\n        const userId = cli.getSafeUserId();\n        const event = props.mxEvent;\n        const room = cli.getRoom(event.getRoomId());\n        event.localRedactionEvent()?.on(MatrixEventEvent.Status, this.onAssociatedStatusChanged);\n        const canRedact = room?.currentState.maySendRedactionForEvent(event, userId) ?? false;\n        this.state = { canRedact, sendStatus: event.getAssociatedStatus() };\n\n        const mxEventContent = getReplacedContent(event);\n        this.eventContentBodyViewModel = new EventContentBodyViewModel({\n            mxEvent: event,\n            content: mxEventContent,\n            highlights: [],\n            stripReply: true,\n            renderTooltipsForAmbiguousLinks: true,\n            renderMentionPills: true,\n            renderCodeBlocks: true,\n            renderSpoilers: true,\n            linkify: true,\n            client: cli,\n        });\n        this.messageTimestampViewModel = new MessageTimestampViewModel({\n            ts: event.getTs(),\n            showTwelveHour: props.isTwelveHour,\n            inhibitTooltip: true,\n        });\n\n        this.editHistoryActionBarViewModel = new EditHistoryActionBarViewModel({\n            canRemove: !props.mxEvent.isRedacted() && !props.isBaseEvent && canRedact,\n            showViewSource: SettingsStore.getValue(\"developerMode\"),\n            onRemoveClick: this.onRedactClick,\n            onViewSourceClick: this.onViewSourceClick,\n        });\n    }\n\n    public componentDidUpdate(prevProps: IProps): void {\n        if (prevProps.mxEvent !== this.props.mxEvent) {\n            const mxEventContent = getReplacedContent(this.props.mxEvent);\n            this.eventContentBodyViewModel.setEventContent(this.props.mxEvent, mxEventContent);\n        }\n\n        if (prevProps.mxEvent !== this.props.mxEvent || prevProps.isTwelveHour !== this.props.isTwelveHour) {\n            this.messageTimestampViewModel.setProps({\n                ts: this.props.mxEvent.getTs(),\n                showTwelveHour: this.props.isTwelveHour,\n                inhibitTooltip: true,\n            });\n        }\n\n        this.editHistoryActionBarViewModel.setProps({\n            canRemove: !this.props.mxEvent.isRedacted() && !this.props.isBaseEvent && this.state.canRedact,\n            showViewSource: SettingsStore.getValue(\"developerMode\"),\n            onRemoveClick: this.onRedactClick,\n            onViewSourceClick: this.onViewSourceClick,\n        });\n    }\n\n    private onAssociatedStatusChanged = (): void => {\n        this.setState({ sendStatus: this.props.mxEvent.getAssociatedStatus() });\n    };\n\n    private onRedactClick = async (): Promise<void> => {\n        const event = this.props.mxEvent;\n        const cli = this.context;\n\n        Modal.createDialog(\n            ConfirmAndWaitRedactDialog,\n            {\n                event,\n                redact: async () => {\n                    await cli.redactEvent(event.getRoomId()!, event.getId()!);\n                },\n            },\n            \"mx_Dialog_confirmredact\",\n        );\n    };\n\n    private onViewSourceClick = (): void => {\n        Modal.createDialog(\n            ViewSource,\n            {\n                mxEvent: this.props.mxEvent,\n                ignoreEdits: true,\n            },\n            \"mx_Dialog_viewsource\",\n        );\n    };\n\n    public componentWillUnmount(): void {\n        const event = this.props.mxEvent;\n        event.localRedactionEvent()?.off(MatrixEventEvent.Status, this.onAssociatedStatusChanged);\n        this.eventContentBodyViewModel.dispose();\n        this.editHistoryActionBarViewModel.dispose();\n        this.messageTimestampViewModel.dispose();\n    }\n\n    private renderActionBar(): React.ReactNode {\n        return (\n            <ActionBarView vm={this.editHistoryActionBarViewModel} className=\"mx_ThreadActionBar mx_HistoryActionBar\" />\n        );\n    }\n\n    public render(): React.ReactNode {\n        const { mxEvent } = this.props;\n        const content = getReplacedContent(mxEvent);\n        let contentContainer;\n        if (mxEvent.isRedacted()) {\n            contentContainer = <RedactedBodyFactory mxEvent={this.props.mxEvent} />;\n        } else {\n            let contentElements;\n            if (this.props.previousEdit) {\n                contentElements = editBodyDiffToHtml(getReplacedContent(this.props.previousEdit), content);\n            } else {\n                contentElements = <EventContentBodyView vm={this.eventContentBodyViewModel} as=\"span\" />;\n            }\n            if (mxEvent.getContent().msgtype === MsgType.Emote) {\n                const name = mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender();\n                contentContainer = (\n                    <div className=\"mx_EventTile_content\" ref={this.content}>\n                        *&nbsp;\n                        <span className=\"mx_EditHistoryMessage_emoteSender\">{name}</span>\n                        &nbsp;{contentElements}\n                    </div>\n                );\n            } else {\n                contentContainer = (\n                    <div className=\"mx_EventTile_content\" ref={this.content}>\n                        {contentElements}\n                    </div>\n                );\n            }\n        }\n\n        const isSending = [\"sending\", \"queued\", \"encrypting\"].includes(this.state.sendStatus!);\n        const classes = classNames(\"mx_EventTile\", {\n            // Note: we keep the `sending` state class for tests, not for our styles\n            mx_EventTile_sending: isSending,\n        });\n        return (\n            <li>\n                <div className={classes}>\n                    <div className=\"mx_EventTile_line\">\n                        <MessageTimestampView vm={this.messageTimestampViewModel} className=\"mx_MessageTimestamp\" />\n                        {contentContainer}\n                        {this.renderActionBar()}\n                    </div>\n                </div>\n            </li>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport { type MatrixEvent, EventType, RelationType, type MatrixClient, MatrixError } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { DateSeparatorView } from \"@element-hq/web-shared-components\";\n\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport { _t } from \"../../../languageHandler\";\nimport { wantsDateSeparator } from \"../../../DateUtils\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport BaseDialog from \"./BaseDialog\";\nimport ScrollPanel from \"../../structures/ScrollPanel\";\nimport Spinner from \"../elements/Spinner\";\nimport EditHistoryMessage from \"../messages/EditHistoryMessage\";\nimport { DateSeparatorViewModel } from \"../../../viewmodels/room/timeline/DateSeparatorViewModel\";\nimport { SDKContextClass } from \"../../../contexts/SDKContextClass.ts\";\n\ninterface IProps {\n    mxEvent: MatrixEvent;\n    onFinished(): void;\n}\n\ninterface IState {\n    originalEvent: MatrixEvent | null;\n    error: MatrixError | null;\n    events: MatrixEvent[];\n    nextBatch: string | null;\n    isLoading: boolean;\n    isTwelveHour: boolean;\n}\n\nexport default class MessageEditHistoryDialog extends React.PureComponent<IProps, IState> {\n    private dateSeparatorVms = new Map<string, DateSeparatorViewModel>();\n\n    public constructor(props: IProps) {\n        super(props);\n        this.state = {\n            originalEvent: null,\n            error: null,\n            events: [],\n            nextBatch: null,\n            isLoading: true,\n            isTwelveHour: SettingsStore.getValue(\"showTwelveHourTimestamps\"),\n        };\n    }\n\n    private getDateSeparatorVm(roomId: string, ts: number): DateSeparatorViewModel {\n        const key = `${roomId}-${ts}`;\n        let vm = this.dateSeparatorVms.get(key);\n        if (!vm) {\n            vm = new DateSeparatorViewModel({ roomId, ts, roomViewStore: SDKContextClass.instance.roomViewStore });\n            this.dateSeparatorVms.set(key, vm);\n        }\n        return vm;\n    }\n\n    private loadMoreEdits = async (backwards?: boolean): Promise<boolean> => {\n        if (backwards || (!this.state.nextBatch && !this.state.isLoading)) {\n            // bail out on backwards as we only paginate in one direction\n            return false;\n        }\n        const opts = { from: this.state.nextBatch ?? undefined };\n        const roomId = this.props.mxEvent.getRoomId()!;\n        const eventId = this.props.mxEvent.getId()!;\n        const client = MatrixClientPeg.safeGet();\n\n        const { resolve, reject, promise } = Promise.withResolvers<boolean>();\n        let result: Awaited<ReturnType<MatrixClient[\"relations\"]>>;\n\n        try {\n            result = await client.relations(roomId, eventId, RelationType.Replace, EventType.RoomMessage, opts);\n        } catch (error) {\n            // log if the server returned an error\n            if (error instanceof MatrixError && error.errcode) {\n                logger.error(\"fetching /relations failed with error\", error);\n            }\n            this.setState({ error: error as MatrixError }, () => reject(error));\n            return promise;\n        }\n\n        const newEvents = result.events;\n        this.locallyRedactEventsIfNeeded(newEvents);\n        this.setState(\n            {\n                originalEvent: this.state.originalEvent ?? result.originalEvent ?? null,\n                events: this.state.events.concat(newEvents),\n                nextBatch: result.nextBatch ?? null,\n                isLoading: false,\n            },\n            () => {\n                const hasMoreResults = !!this.state.nextBatch;\n                resolve(hasMoreResults);\n            },\n        );\n        return promise;\n    };\n\n    private locallyRedactEventsIfNeeded(newEvents: MatrixEvent[]): void {\n        const roomId = this.props.mxEvent.getRoomId();\n        const client = MatrixClientPeg.safeGet();\n        const room = client.getRoom(roomId);\n        if (!room) return;\n        const pendingEvents = room.getPendingEvents();\n        for (const e of newEvents) {\n            const pendingRedaction = pendingEvents.find((pe) => {\n                return pe.getType() === EventType.RoomRedaction && pe.getAssociatedId() === e.getId();\n            });\n            if (pendingRedaction) {\n                e.markLocallyRedacted(pendingRedaction);\n            }\n        }\n    }\n\n    public componentDidMount(): void {\n        this.loadMoreEdits();\n    }\n\n    public componentWillUnmount(): void {\n        for (const vm of this.dateSeparatorVms.values()) {\n            vm.dispose();\n        }\n        this.dateSeparatorVms.clear();\n    }\n\n    private renderEdits(): JSX.Element[] {\n        const nodes: JSX.Element[] = [];\n        let lastEvent: MatrixEvent;\n        let allEvents = this.state.events;\n        // append original event when we've done last pagination\n        if (this.state.originalEvent && !this.state.nextBatch) {\n            allEvents = allEvents.concat(this.state.originalEvent);\n        }\n        const baseEventId = this.props.mxEvent.getId();\n        allEvents.forEach((e, i) => {\n            if (!lastEvent || wantsDateSeparator(lastEvent.getDate() || undefined, e.getDate() || undefined)) {\n                const separatorRoomId = e.getRoomId()!;\n                const separatorTs = e.getTs();\n                nodes.push(\n                    <li key={`${separatorRoomId}-${separatorTs}~`}>\n                        <DateSeparatorView\n                            vm={this.getDateSeparatorVm(separatorRoomId, separatorTs)}\n                            className=\"mx_TimelineSeparator\"\n                        />\n                    </li>,\n                );\n            }\n            const isBaseEvent = e.getId() === baseEventId;\n            nodes.push(\n                <EditHistoryMessage\n                    key={e.getId()}\n                    previousEdit={!isBaseEvent ? allEvents[i + 1] : undefined}\n                    isBaseEvent={isBaseEvent}\n                    mxEvent={e}\n                    isTwelveHour={this.state.isTwelveHour}\n                />,\n            );\n            lastEvent = e;\n        });\n        return nodes;\n    }\n\n    public render(): React.ReactNode {\n        let content;\n        if (this.state.error) {\n            const { error } = this.state;\n            if (error.errcode === \"M_UNRECOGNIZED\") {\n                content = <p className=\"mx_MessageEditHistoryDialog_error\">{_t(\"error|edit_history_unsupported\")}</p>;\n            } else if (error.errcode) {\n                // some kind of error from the homeserver\n                content = <p className=\"mx_MessageEditHistoryDialog_error\">{_t(\"error|something_went_wrong\")}</p>;\n            } else {\n                content = (\n                    <p className=\"mx_MessageEditHistoryDialog_error\">\n                        {_t(\"cannot_reach_homeserver\")}\n                        <br />\n                        {_t(\"cannot_reach_homeserver_detail\")}\n                    </p>\n                );\n            }\n        } else if (this.state.isLoading) {\n            content = <Spinner />;\n        } else {\n            content = (\n                <ScrollPanel\n                    className=\"mx_MessageEditHistoryDialog_scrollPanel\"\n                    onFillRequest={this.loadMoreEdits}\n                    stickyBottom={false}\n                    startAtBottom={false}\n                >\n                    <ul className=\"mx_MessageEditHistoryDialog_edits\">{this.renderEdits()}</ul>\n                </ScrollPanel>\n            );\n        }\n        return (\n            <BaseDialog\n                className=\"mx_MessageEditHistoryDialog\"\n                hasCancel={true}\n                onFinished={this.props.onFinished}\n                title={_t(\"message_edit_dialog_title\")}\n            >\n                {content}\n            </BaseDialog>\n        );\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport React, { type MouseEvent } from \"react\";\nimport { MatrixEventEvent, MsgType, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport {\n    BaseViewModel,\n    LINKIFIED_DATA_ATTRIBUTE,\n    TextualBodyViewBodyWrapperKind,\n    TextualBodyViewKind,\n    type TextualBodyViewModel as TextualBodyViewModelInterface,\n    type TextualBodyViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\nimport { formatDate } from \"../../../../../DateUtils\";\nimport Modal from \"../../../../../Modal\";\nimport dis from \"../../../../../dispatcher/dispatcher\";\nimport { _t } from \"../../../../../languageHandler\";\nimport { IntegrationManagers } from \"../../../../../integrations/IntegrationManagers\";\nimport { tryTransformPermalinkToLocalHref } from \"../../../../../utils/permalinks/Permalinks\";\nimport { Action } from \"../../../../../dispatcher/actions\";\nimport QuestionDialog from \"../../../../../components/views/dialogs/QuestionDialog\";\nimport MessageEditHistoryDialog from \"../../../../../components/views/dialogs/MessageEditHistoryDialog\";\nimport { type TimelineRenderingType } from \"../../../../../contexts/RoomContext\";\n\nconst CAPTION_MESSAGE_TYPES = new Set<MsgType>([MsgType.Image, MsgType.File, MsgType.Audio, MsgType.Video]);\n\nexport interface TextualBodyViewModelProps {\n    /**\n     * Optional DOM id forwarded to the root textual body element.\n     */\n    id?: string;\n    /**\n     * Matrix event used to derive the body kind, sender label, starter link, edit state, and moderation state.\n     */\n    mxEvent: MatrixEvent;\n    /**\n     * Optional URL that wraps the body when the message should behave as a highlighted link target.\n     */\n    highlightLink?: string;\n    /**\n     * Event id of the replacement event, when this message has been edited.\n     */\n    replacingEventId?: string;\n    /**\n     * Whether the user is viewing a hidden message while moderation is pending.\n     */\n    isSeeingThroughMessageHiddenForModeration?: boolean;\n    /**\n     * Timeline context used when dispatching actions from textual body interactions.\n     */\n    timelineRenderingType: TimelineRenderingType;\n}\n\nexport class TextualBodyViewModel\n    extends BaseViewModel<TextualBodyViewSnapshot, TextualBodyViewModelProps>\n    implements TextualBodyViewModelInterface\n{\n    private watchedEvent?: MatrixEvent;\n\n    private static readonly getKind = (mxEvent: MatrixEvent): TextualBodyViewKind => {\n        const msgtype = mxEvent.getContent().msgtype as MsgType | undefined;\n\n        if (msgtype === MsgType.Notice) {\n            return TextualBodyViewKind.NOTICE;\n        }\n\n        if (msgtype === MsgType.Emote) {\n            return TextualBodyViewKind.EMOTE;\n        }\n\n        if (msgtype && CAPTION_MESSAGE_TYPES.has(msgtype)) {\n            return TextualBodyViewKind.CAPTION;\n        }\n\n        return TextualBodyViewKind.TEXT;\n    };\n\n    private static readonly getStarterLink = (mxEvent: MatrixEvent): string | undefined => {\n        const starterLink = mxEvent.getContent().data?.[\"org.matrix.neb.starter_link\"];\n\n        return typeof starterLink === \"string\" ? starterLink : undefined;\n    };\n\n    private static readonly computeBodyWrapperSnapshot = (\n        props: TextualBodyViewModelProps,\n    ): Pick<TextualBodyViewSnapshot, \"bodyWrapper\" | \"bodyLinkHref\" | \"bodyActionAriaLabel\"> => {\n        if (props.highlightLink) {\n            return {\n                bodyWrapper: TextualBodyViewBodyWrapperKind.LINK,\n                bodyLinkHref: props.highlightLink,\n                bodyActionAriaLabel: undefined,\n            };\n        }\n\n        if (TextualBodyViewModel.getStarterLink(props.mxEvent)) {\n            return {\n                bodyWrapper: TextualBodyViewBodyWrapperKind.ACTION,\n                bodyLinkHref: undefined,\n                bodyActionAriaLabel: undefined,\n            };\n        }\n\n        return {\n            bodyWrapper: TextualBodyViewBodyWrapperKind.NONE,\n            bodyLinkHref: undefined,\n            bodyActionAriaLabel: undefined,\n        };\n    };\n\n    private static readonly computeEditedMarkerSnapshot = (\n        props: TextualBodyViewModelProps,\n    ): Pick<\n        TextualBodyViewSnapshot,\n        | \"showEditedMarker\"\n        | \"editedMarkerText\"\n        | \"editedMarkerAriaLabel\"\n        | \"editedMarkerTooltip\"\n        | \"editedMarkerCaption\"\n    > => {\n        const replacingEventId = props.replacingEventId ?? props.mxEvent.replacingEventId();\n        if (!replacingEventId) {\n            return {\n                showEditedMarker: false,\n                editedMarkerText: undefined,\n                editedMarkerAriaLabel: undefined,\n                editedMarkerTooltip: undefined,\n                editedMarkerCaption: undefined,\n            };\n        }\n\n        const replacingDate = props.mxEvent.replacingEventDate();\n        const date = replacingDate ? formatDate(replacingDate) : undefined;\n\n        return {\n            showEditedMarker: true,\n            editedMarkerText: `(${_t(\"common|edited\")})`,\n            editedMarkerAriaLabel: _t(\"timeline|edits|tooltip_label\", { date }),\n            editedMarkerTooltip: _t(\"timeline|edits|tooltip_title\", { date }),\n            editedMarkerCaption: _t(\"timeline|edits|tooltip_sub\"),\n        };\n    };\n\n    private static readonly computePendingModerationSnapshot = (\n        props: TextualBodyViewModelProps,\n    ): Pick<TextualBodyViewSnapshot, \"showPendingModerationMarker\" | \"pendingModerationText\"> => {\n        if (!props.isSeeingThroughMessageHiddenForModeration) {\n            return {\n                showPendingModerationMarker: false,\n                pendingModerationText: undefined,\n            };\n        }\n\n        const visibility = props.mxEvent.messageVisibility();\n        if (visibility.visible) {\n            throw new Error(\"TextualBodyViewModel should only render pending moderation for hidden messages\");\n        }\n\n        const text = visibility.reason\n            ? _t(\"timeline|pending_moderation_reason\", { reason: visibility.reason })\n            : _t(\"timeline|pending_moderation\");\n\n        return {\n            showPendingModerationMarker: true,\n            pendingModerationText: `(${text})`,\n        };\n    };\n\n    private static readonly computeEventSnapshot = (\n        props: TextualBodyViewModelProps,\n    ): Pick<\n        TextualBodyViewSnapshot,\n        | \"kind\"\n        | \"bodyWrapper\"\n        | \"bodyLinkHref\"\n        | \"bodyActionAriaLabel\"\n        | \"showEditedMarker\"\n        | \"editedMarkerText\"\n        | \"editedMarkerTooltip\"\n        | \"editedMarkerCaption\"\n        | \"showPendingModerationMarker\"\n        | \"pendingModerationText\"\n        | \"emoteSenderName\"\n    > => ({\n        kind: TextualBodyViewModel.getKind(props.mxEvent),\n        emoteSenderName: props.mxEvent.sender?.name ?? props.mxEvent.getSender(),\n        ...TextualBodyViewModel.computeBodyWrapperSnapshot(props),\n        ...TextualBodyViewModel.computeEditedMarkerSnapshot(props),\n        ...TextualBodyViewModel.computePendingModerationSnapshot(props),\n    });\n\n    private static readonly computeSnapshot = (props: TextualBodyViewModelProps): TextualBodyViewSnapshot => ({\n        id: props.id,\n        ...TextualBodyViewModel.computeEventSnapshot(props),\n    });\n\n    public constructor(props: TextualBodyViewModelProps) {\n        super(props, TextualBodyViewModel.computeSnapshot(props));\n        this.watchEvent(props.mxEvent);\n        this.disposables.track(this.unwatchEvent);\n    }\n\n    private readonly onEventContentChanged = (): void => {\n        this.snapshot.merge(TextualBodyViewModel.computeEventSnapshot(this.props));\n    };\n\n    private watchEvent(mxEvent: MatrixEvent): void {\n        if (this.watchedEvent === mxEvent) return;\n        this.unwatchEvent();\n        this.watchedEvent = mxEvent;\n        this.watchedEvent.on(MatrixEventEvent.Replaced, this.onEventContentChanged);\n    }\n\n    private readonly unwatchEvent = (): void => {\n        this.watchedEvent?.off(MatrixEventEvent.Replaced, this.onEventContentChanged);\n        this.watchedEvent = undefined;\n    };\n\n    public setId(id: string | undefined): void {\n        this.props = {\n            ...this.props,\n            id,\n        };\n\n        this.snapshot.merge({ id });\n    }\n\n    public setEvent(mxEvent: MatrixEvent): void {\n        this.props = {\n            ...this.props,\n            mxEvent,\n        };\n        this.watchEvent(mxEvent);\n\n        this.snapshot.merge(TextualBodyViewModel.computeEventSnapshot(this.props));\n    }\n\n    public setHighlightLink(highlightLink: string | undefined): void {\n        this.props = {\n            ...this.props,\n            highlightLink,\n        };\n\n        this.snapshot.merge(TextualBodyViewModel.computeBodyWrapperSnapshot(this.props));\n    }\n\n    public setReplacingEventId(replacingEventId: string | undefined): void {\n        this.props = {\n            ...this.props,\n            replacingEventId,\n        };\n\n        this.snapshot.merge(TextualBodyViewModel.computeEditedMarkerSnapshot(this.props));\n    }\n\n    public setIsSeeingThroughMessageHiddenForModeration(\n        isSeeingThroughMessageHiddenForModeration: boolean | undefined,\n    ): void {\n        this.props = {\n            ...this.props,\n            isSeeingThroughMessageHiddenForModeration,\n        };\n\n        this.snapshot.merge(TextualBodyViewModel.computePendingModerationSnapshot(this.props));\n    }\n\n    public setTimelineRenderingType(timelineRenderingType: TimelineRenderingType): void {\n        this.props = {\n            ...this.props,\n            timelineRenderingType,\n        };\n    }\n\n    public onRootClick = (event: MouseEvent<HTMLDivElement>): void => {\n        let target: HTMLLinkElement | null = event.target as HTMLLinkElement;\n\n        if (target.dataset?.[LINKIFIED_DATA_ATTRIBUTE]) {\n            return;\n        }\n\n        if (target.nodeName !== \"A\") {\n            target = target.closest<HTMLLinkElement>(\"a\");\n        }\n\n        if (!target) {\n            return;\n        }\n\n        const localHref = tryTransformPermalinkToLocalHref(target.href);\n        if (localHref !== target.href) {\n            event.preventDefault();\n            window.location.hash = localHref;\n        }\n    };\n\n    public onBodyActionClick = (event: MouseEvent<HTMLButtonElement>): void => {\n        event.preventDefault();\n\n        const starterLink = TextualBodyViewModel.getStarterLink(this.props.mxEvent);\n        if (!starterLink) {\n            return;\n        }\n\n        const managers = IntegrationManagers.sharedInstance();\n        if (!managers.hasManager()) {\n            managers.openNoManagerDialog();\n            return;\n        }\n\n        const integrationManager = managers.getPrimaryManager();\n        const scalarClient = integrationManager?.getScalarClient();\n        scalarClient?.connect().then(() => {\n            const completeUrl = scalarClient.getStarterLink(starterLink);\n            const integrationsUrl = integrationManager!.uiUrl;\n            const { finished } = Modal.createDialog(QuestionDialog, {\n                title: _t(\"timeline|scalar_starter_link|dialog_title\"),\n                description: <div>{_t(\"timeline|scalar_starter_link|dialog_description\", { integrationsUrl })}</div>,\n                button: _t(\"action|continue\"),\n            });\n\n            finished.then(([confirmed]) => {\n                if (!confirmed) {\n                    return;\n                }\n\n                const width = Math.min(window.screen.width, 1024);\n                const height = Math.min(window.screen.height, 800);\n                const left = (window.screen.width - width) / 2;\n                const top = (window.screen.height - height) / 2;\n                const features = `height=${height}, width=${width}, top=${top}, left=${left},`;\n                const wnd = window.open(completeUrl, \"_blank\", features)!;\n                wnd.opener = null;\n            });\n        });\n    };\n\n    public onEditedMarkerClick = (): void => {\n        Modal.createDialog(MessageEditHistoryDialog, { mxEvent: this.props.mxEvent });\n    };\n\n    public onEmoteSenderClick = (): void => {\n        dis.dispatch({\n            action: Action.ComposerInsert,\n            userId: this.props.mxEvent.getSender(),\n            timelineRenderingType: this.props.timelineRenderingType,\n        });\n    };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createRef, type KeyboardEvent } from \"react\";\nimport classNames from \"classnames\";\nimport { EventStatus, type MatrixEvent, type Room, MsgType } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type Composer as ComposerEvent } from \"@matrix-org/analytics-events/types/typescript/Composer\";\nimport {\n    type ReplacementEvent,\n    type RoomMessageEventContent,\n    type RoomMessageTextEventContent,\n} from \"matrix-js-sdk/src/types\";\n\nimport { _t } from \"../../../languageHandler\";\nimport dis from \"../../../dispatcher/dispatcher\";\nimport EditorModel from \"../../../editor/model\";\nimport { getCaretOffsetAndText } from \"../../../editor/dom\";\nimport { htmlSerializeIfNeeded, textSerialize, containsEmote, stripEmoteCommand } from \"../../../editor/serialize\";\nimport { findEditableEvent } from \"../../../utils/EventUtils\";\nimport { parseEvent } from \"../../../editor/deserialize\";\nimport { CommandPartCreator, type Part, type PartCreator, type SerializedPart } from \"../../../editor/parts\";\nimport type EditorStateTransfer from \"../../../utils/EditorStateTransfer\";\nimport BasicMessageComposer, { REGEX_EMOTICON } from \"./BasicMessageComposer\";\nimport { CommandCategories } from \"../../../slash-commands/SlashCommands\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport SendHistoryManager from \"../../../SendHistoryManager\";\nimport { type ActionPayload } from \"../../../dispatcher/payloads\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport { createRedactEventDialog } from \"../dialogs/ConfirmRedactDialog\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { withMatrixClientHOC, type MatrixClientProps } from \"../../../contexts/MatrixClientContext\";\nimport RoomContext from \"../../../contexts/RoomContext\";\nimport { ComposerType } from \"../../../dispatcher/payloads/ComposerInsertPayload\";\nimport { getSlashCommand, isSlashCommand, runSlashCommand, shouldSendAnyway } from \"../../../editor/commands\";\nimport { KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\nimport { PosthogAnalytics } from \"../../../PosthogAnalytics\";\nimport { editorRoomKey, editorStateKey } from \"../../../Editing\";\nimport type DocumentOffset from \"../../../editor/offset\";\nimport { attachMentions, attachRelation } from \"../../../utils/messages\";\nimport { filterBoolean } from \"../../../utils/arrays\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\n\n// exported for tests\nexport function createEditContent(\n    model: EditorModel,\n    editedEvent: MatrixEvent,\n    replyToEvent?: MatrixEvent,\n): RoomMessageEventContent {\n    const isEmote = containsEmote(model);\n    if (isEmote) {\n        model = stripEmoteCommand(model);\n    }\n    const body = textSerialize(model);\n\n    const newContent: RoomMessageEventContent = {\n        msgtype: isEmote ? MsgType.Emote : MsgType.Text,\n        body: body,\n    };\n    const contentBody: RoomMessageTextEventContent & Omit<ReplacementEvent<RoomMessageEventContent>, \"m.relates_to\"> = {\n        \"msgtype\": newContent.msgtype,\n        \"body\": `* ${body}`,\n        \"m.new_content\": newContent,\n    };\n\n    const formattedBody = htmlSerializeIfNeeded(model, {\n        useMarkdown: SettingsStore.getValue(\"MessageComposerInput.useMarkdown\"),\n    });\n    if (formattedBody) {\n        newContent.format = \"org.matrix.custom.html\";\n        newContent.formatted_body = formattedBody;\n        contentBody.format = newContent.format;\n        contentBody.formatted_body = `* ${formattedBody}`;\n    }\n\n    // Build the mentions properties for both the content and new_content.\n    attachMentions(editedEvent.sender!.userId, contentBody, model, replyToEvent, editedEvent.getContent());\n    attachRelation(contentBody, { rel_type: \"m.replace\", event_id: editedEvent.getId() });\n\n    return contentBody as RoomMessageEventContent;\n}\n\ninterface IEditMessageComposerProps extends MatrixClientProps {\n    editState: EditorStateTransfer;\n    className?: string;\n}\ninterface IState {\n    saveDisabled: boolean;\n}\n\nclass EditMessageComposer extends React.Component<IEditMessageComposerProps, IState> {\n    public static contextType = RoomContext;\n    declare public context: React.ContextType<typeof RoomContext>;\n\n    private readonly editorRef = createRef<BasicMessageComposer>();\n    private dispatcherRef?: string;\n    private readonly replyToEvent?: MatrixEvent;\n    private model!: EditorModel;\n\n    public constructor(props: IEditMessageComposerProps, context: React.ContextType<typeof RoomContext>) {\n        super(props, context);\n\n        const isRestored = this.createEditorModel();\n        const ev = this.props.editState.getEvent();\n\n        this.replyToEvent = ev.replyEventId ? this.context.room?.findEventById(ev.replyEventId) : undefined;\n\n        const editContent = createEditContent(this.model, ev, this.replyToEvent);\n        this.state = {\n            saveDisabled: !isRestored || !this.isContentModified(editContent[\"m.new_content\"]!),\n        };\n    }\n\n    public componentDidMount(): void {\n        window.addEventListener(\"beforeunload\", this.saveStoredEditorState);\n        this.dispatcherRef = dis.register(this.onAction);\n    }\n\n    private getRoom(): Room {\n        if (!this.context.room) {\n            throw new Error(`Cannot render without room`);\n        }\n        return this.context.room;\n    }\n\n    private onKeyDown = (event: KeyboardEvent): void => {\n        // ignore any keypress while doing IME compositions\n        if (this.editorRef.current?.isComposing(event)) {\n            return;\n        }\n        const action = getKeyBindingsManager().getMessageComposerAction(event);\n        switch (action) {\n            case KeyBindingAction.SendMessage:\n                this.sendEdit();\n                event.stopPropagation();\n                event.preventDefault();\n                break;\n            case KeyBindingAction.CancelReplyOrEdit:\n                event.stopPropagation();\n                this.cancelEdit();\n                break;\n            case KeyBindingAction.EditPrevMessage: {\n                if (this.editorRef.current?.isModified() || !this.editorRef.current?.isCaretAtStart()) {\n                    return;\n                }\n                const previousEvent = findEditableEvent({\n                    events: this.events,\n                    isForward: false,\n                    fromEventId: this.props.editState.getEvent().getId(),\n                    matrixClient: MatrixClientPeg.safeGet(),\n                });\n                if (previousEvent) {\n                    dis.dispatch({\n                        action: Action.EditEvent,\n                        event: previousEvent,\n                        timelineRenderingType: this.context.timelineRenderingType,\n                    });\n                    event.preventDefault();\n                }\n                break;\n            }\n            case KeyBindingAction.EditNextMessage: {\n                if (this.editorRef.current?.isModified() || !this.editorRef.current?.isCaretAtEnd()) {\n                    return;\n                }\n                const nextEvent = findEditableEvent({\n                    events: this.events,\n                    isForward: true,\n                    fromEventId: this.props.editState.getEvent().getId(),\n                    matrixClient: MatrixClientPeg.safeGet(),\n                });\n                if (nextEvent) {\n                    dis.dispatch({\n                        action: Action.EditEvent,\n                        event: nextEvent,\n                        timelineRenderingType: this.context.timelineRenderingType,\n                    });\n                } else {\n                    this.cancelEdit();\n                }\n                event.preventDefault();\n                break;\n            }\n        }\n    };\n\n    private endEdit(): void {\n        localStorage.removeItem(this.editorRoomKey);\n        localStorage.removeItem(this.editorStateKey);\n\n        // close the event editing and focus composer\n        dis.dispatch({\n            action: Action.EditEvent,\n            event: null,\n            timelineRenderingType: this.context.timelineRenderingType,\n        });\n        dis.dispatch({\n            action: Action.FocusSendMessageComposer,\n            context: this.context.timelineRenderingType,\n        });\n    }\n\n    private get editorRoomKey(): string {\n        return editorRoomKey(this.props.editState.getEvent().getRoomId()!, this.context.timelineRenderingType);\n    }\n\n    private get editorStateKey(): string {\n        return editorStateKey(this.props.editState.getEvent().getId()!);\n    }\n\n    private get events(): MatrixEvent[] {\n        const liveTimelineEvents = this.context.liveTimeline?.getEvents();\n        const room = this.getRoom();\n        if (!liveTimelineEvents || !room) return [];\n        const pendingEvents = room.getPendingEvents();\n        const isInThread = Boolean(this.props.editState.getEvent().getThread());\n        return liveTimelineEvents.concat(isInThread ? [] : pendingEvents);\n    }\n\n    private cancelEdit = (): void => {\n        this.endEdit();\n    };\n\n    private get shouldSaveStoredEditorState(): boolean {\n        return localStorage.getItem(this.editorRoomKey) !== null;\n    }\n\n    private restoreStoredEditorState(partCreator: PartCreator): Part[] | undefined {\n        const json = localStorage.getItem(this.editorStateKey);\n        if (json) {\n            try {\n                const { parts: serializedParts } = JSON.parse(json);\n                const parts: Part[] = serializedParts.map((p: SerializedPart) => partCreator.deserializePart(p));\n                return parts;\n            } catch (e) {\n                logger.error(\"Error parsing editing state: \", e);\n            }\n        }\n    }\n\n    private clearPreviousEdit(): void {\n        if (localStorage.getItem(this.editorRoomKey)) {\n            localStorage.removeItem(`mx_edit_state_${localStorage.getItem(this.editorRoomKey)}`);\n        }\n    }\n\n    private saveStoredEditorState = (): void => {\n        const item = SendHistoryManager.createItem(this.model);\n        this.clearPreviousEdit();\n        localStorage.setItem(this.editorRoomKey, this.props.editState.getEvent().getId()!);\n        localStorage.setItem(this.editorStateKey, JSON.stringify(item));\n    };\n\n    private isContentModified(newContent: RoomMessageEventContent): boolean {\n        // if nothing has changed then bail\n        const oldContent = this.props.editState.getEvent().getContent<RoomMessageEventContent>();\n        if (\n            oldContent[\"msgtype\"] === newContent[\"msgtype\"] &&\n            oldContent[\"body\"] === newContent[\"body\"] &&\n            (oldContent as RoomMessageTextEventContent)[\"format\"] ===\n                (newContent as RoomMessageTextEventContent)[\"format\"] &&\n            (oldContent as RoomMessageTextEventContent)[\"formatted_body\"] ===\n                (newContent as RoomMessageTextEventContent)[\"formatted_body\"]\n        ) {\n            return false;\n        }\n        return true;\n    }\n\n    private sendEdit = async (): Promise<void> => {\n        if (this.state.saveDisabled) return;\n\n        const editedEvent = this.props.editState.getEvent();\n\n        PosthogAnalytics.instance.trackEvent<ComposerEvent>({\n            eventName: \"Composer\",\n            isEditing: true,\n            messageType: \"Text\",\n            inThread: !!editedEvent?.getThread(),\n            isReply: !!editedEvent.replyEventId,\n        });\n\n        // Replace emoticon at the end of the message\n        if (SettingsStore.getValue(\"MessageComposerInput.autoReplaceEmoji\") && this.editorRef.current) {\n            const caret = this.editorRef.current.getCaret();\n            const position = this.model.positionForOffset(caret.offset, caret.atNodeEnd);\n            this.editorRef.current.replaceEmoticon(position, REGEX_EMOTICON);\n        }\n        const editContent = createEditContent(this.model, editedEvent, this.replyToEvent);\n        const newContent = editContent[\"m.new_content\"]!;\n\n        let shouldSend = true;\n\n        if (newContent?.body === \"\") {\n            this.cancelPreviousPendingEdit();\n            createRedactEventDialog({\n                mxEvent: editedEvent,\n                onCloseDialog: () => {\n                    this.cancelEdit();\n                },\n            });\n            return;\n        }\n\n        // If content is modified then send an updated event into the room\n        if (this.isContentModified(newContent)) {\n            const roomId = editedEvent.getRoomId()!;\n            if (!containsEmote(this.model) && isSlashCommand(this.model)) {\n                const [cmd, args, commandText] = getSlashCommand(roomId, this.model);\n                if (cmd) {\n                    const threadId = editedEvent?.getThread()?.id || null;\n                    const [content, commandSuccessful] = await runSlashCommand(\n                        MatrixClientPeg.safeGet(),\n                        cmd,\n                        args,\n                        roomId,\n                        threadId,\n                    );\n                    if (!commandSuccessful) {\n                        return; // errored\n                    }\n\n                    if (cmd.category === CommandCategories.messages || cmd.category === CommandCategories.effects) {\n                        editContent[\"m.new_content\"] = content!;\n                    } else {\n                        shouldSend = false;\n                    }\n                } else {\n                    const sendAnyway = await shouldSendAnyway(commandText);\n                    // re-focus the composer after QuestionDialog is closed\n                    dis.dispatch({\n                        action: Action.FocusAComposer,\n                        context: this.context.timelineRenderingType,\n                    });\n                    // if !sendAnyway bail to let the user edit the composer and try again\n                    if (!sendAnyway) return;\n                }\n            }\n            if (shouldSend) {\n                this.cancelPreviousPendingEdit();\n\n                const event = this.props.editState.getEvent();\n                const threadId = event.threadRootId || null;\n\n                this.props.mxClient.sendMessage(roomId, threadId, editContent);\n                dis.dispatch({ action: \"message_sent\" });\n            }\n        }\n\n        this.endEdit();\n    };\n\n    private cancelPreviousPendingEdit(): void {\n        const originalEvent = this.props.editState.getEvent();\n        const previousEdit = originalEvent.replacingEvent();\n        if (\n            previousEdit &&\n            (previousEdit.status === EventStatus.QUEUED || previousEdit.status === EventStatus.NOT_SENT)\n        ) {\n            this.props.mxClient.cancelPendingEvent(previousEdit);\n        }\n    }\n\n    public componentWillUnmount(): void {\n        // store caret and serialized parts in the\n        // editorstate so it can be restored when the remote echo event tile gets rendered\n        // in case we're currently editing a pending event\n        const sel = document.getSelection()!;\n        let caret: DocumentOffset | undefined;\n        if (sel.focusNode && this.editorRef.current?.editorRef.current) {\n            caret = getCaretOffsetAndText(this.editorRef.current.editorRef.current, sel).caret;\n        }\n        const parts = this.model.serializeParts();\n        // if caret is undefined because for some reason there isn't a valid selection,\n        // then when mounting the editor again with the same editor state,\n        // it will set the cursor at the end.\n        this.props.editState.setEditorState(caret ?? null, parts);\n        window.removeEventListener(\"beforeunload\", this.saveStoredEditorState);\n        if (this.shouldSaveStoredEditorState) {\n            this.saveStoredEditorState();\n        }\n        dis.unregister(this.dispatcherRef);\n    }\n\n    private createEditorModel(): boolean {\n        const { editState } = this.props;\n        const room = this.getRoom();\n        const partCreator = new CommandPartCreator(room, this.props.mxClient);\n\n        let parts: Part[];\n        let isRestored = false;\n        if (editState.hasEditorState()) {\n            // if restoring state from a previous editor,\n            // restore serialized parts from the state\n            // (editState.hasEditorState() checks getSerializedParts is not null)\n            parts = filterBoolean<Part>(editState.getSerializedParts()!.map((p) => partCreator.deserializePart(p)));\n        } else {\n            // otherwise, either restore serialized parts from localStorage or parse the body of the event\n            const restoredParts = this.restoreStoredEditorState(partCreator);\n            parts =\n                restoredParts ||\n                parseEvent(editState.getEvent(), partCreator, {\n                    shouldEscape: SettingsStore.getValue(\"MessageComposerInput.useMarkdown\"),\n                });\n            isRestored = !!restoredParts;\n        }\n        this.model = new EditorModel(parts, partCreator);\n        this.saveStoredEditorState();\n\n        return isRestored;\n    }\n\n    private onChange = (): void => {\n        if (!this.state.saveDisabled || !this.editorRef.current?.isModified()) {\n            return;\n        }\n\n        this.setState({\n            saveDisabled: false,\n        });\n    };\n\n    private onAction = (payload: ActionPayload): void => {\n        if (!this.editorRef.current) return;\n\n        if (payload.action === Action.ComposerInsert) {\n            if (payload.timelineRenderingType !== this.context.timelineRenderingType) return;\n            if (payload.composerType !== ComposerType.Edit) return;\n\n            if (payload.userId) {\n                this.editorRef.current?.insertMention(payload.userId);\n            } else if (payload.event) {\n                this.editorRef.current?.insertQuotedMessage(payload.event);\n            } else if (payload.text) {\n                this.editorRef.current?.insertPlaintext(payload.text);\n            }\n        } else if (payload.action === Action.FocusEditMessageComposer) {\n            this.editorRef.current.focus();\n        }\n    };\n\n    public render(): React.ReactNode {\n        const room = this.getRoom();\n        if (!room) return null;\n\n        return (\n            <div className={classNames(\"mx_EditMessageComposer\", this.props.className)} onKeyDown={this.onKeyDown}>\n                <BasicMessageComposer\n                    ref={this.editorRef}\n                    model={this.model}\n                    room={room}\n                    threadId={this.props.editState?.getEvent()?.getThread()?.id}\n                    initialCaret={this.props.editState.getCaret() ?? undefined}\n                    label={_t(\"composer|edit_composer_label\")}\n                    onChange={this.onChange}\n                />\n                <div className=\"mx_EditMessageComposer_buttons\">\n                    <AccessibleButton kind=\"secondary\" onClick={this.cancelEdit}>\n                        {_t(\"action|cancel\")}\n                    </AccessibleButton>\n                    <AccessibleButton kind=\"primary\" onClick={this.sendEdit} disabled={this.state.saveDisabled}>\n                        {_t(\"action|save\")}\n                    </AccessibleButton>\n                </div>\n            </div>\n        );\n    }\n}\n\nconst EditMessageComposerWithMatrixClient = withMatrixClientHOC(EditMessageComposer);\nexport default EditMessageComposerWithMatrixClient;\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type MatrixClient, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport {\n    BaseViewModel,\n    type UrlPreview,\n    type UrlPreviewGroupViewActions,\n    type UrlPreviewGroupViewSnapshot,\n} from \"@element-hq/web-shared-components\";\nimport { type UrlPreviewVisibilityChanged } from \"@matrix-org/analytics-events/types/typescript/UrlPreviewVisibilityChanged\";\n\nimport { PosthogAnalytics } from \"../../PosthogAnalytics\";\nimport { isPermalinkHost } from \"../../utils/permalinks/Permalinks\";\nimport { UrlPreviewFetcher } from \"../../utils/UrlPreviewFetcher\";\n\n// From https://github.com/matrix-org/matrix-spec-proposals/pull/4095\nexport const BUNDLED_LINK_PREVIEWS = \"com.beeper.linkpreviews\";\n\nexport const MAX_PREVIEWS_WHEN_LIMITED = 2;\n\nexport enum PreviewVisibility {\n    /** Preview is entirely hidden and cannot be changed. */\n    Hidden,\n    /** Preview is hidden by the user and may be shown again. */\n    UserHidden,\n    /** Preview is visible but media should not be rendered. */\n    MediaHidden,\n    /** Preview is fully visible including media. */\n    Visible,\n}\n\nexport interface UrlPreviewGroupViewModelProps {\n    client: MatrixClient;\n    mxEvent: MatrixEvent;\n    visible: boolean;\n    mediaVisible: boolean;\n    showTooltips: boolean;\n    onImageClicked: (preview: UrlPreview) => void;\n}\n\nexport class UrlPreviewGroupViewModel\n    extends BaseViewModel<UrlPreviewGroupViewSnapshot, UrlPreviewGroupViewModelProps>\n    implements UrlPreviewGroupViewActions\n{\n    /**\n     * Determine if an anchor element can be rendered into a preview.\n     * If it can, return the value of `href`\n     * @param node The anchor element DOM node.\n     * @returns The value of the `href` of the node, or null if this node cannot be previewed.\n     */\n    private static getAnchorLink(node: HTMLAnchorElement): string | null {\n        const href = node.getAttribute(\"href\");\n        if (!href || !URL.canParse(href)) return null;\n\n        const url = new URL(href);\n        if (![\"http:\", \"https:\"].includes(url.protocol)) return null;\n        if (isPermalinkHost(url.host)) return null;\n\n        if (node.textContent?.includes(\"/\")) return href;\n        if (node.textContent?.toLowerCase().trim().startsWith(url.host.toLowerCase())) return null;\n        return href;\n    }\n\n    /**\n     * Calculate the set of links from a set of DOM nodes.\n     * @param nodes An array of DOM elements that may be or contain anchor elements.\n     * @returns A unique array of links that can be previewed, in order of discovery.\n     */\n    private static findLinks(nodes: Iterable<Element>): string[] {\n        let links = new Set<string>();\n        for (const node of nodes) {\n            if (node.tagName === \"A\") {\n                const href = this.getAnchorLink(node as HTMLAnchorElement);\n                if (href) links.add(href);\n            } else if (node.tagName === \"PRE\" || node.tagName === \"CODE\" || node.tagName === \"BLOCKQUOTE\") {\n                continue;\n            } else if (node.children?.length) {\n                links = new Set([...links, ...this.findLinks(node.children)]);\n            }\n        }\n        return [...links];\n    }\n\n    private readonly storageKey: string;\n    private readonly fetcher: UrlPreviewFetcher;\n\n    /**\n     * Calculated set of links from the provided DOM element.\n     */\n    private links: string[] = [];\n\n    /**\n     * Should the preview limit how many links are rendered. If `false`, all\n     * links will be rendered.\n     */\n    private limitPreviews = true;\n\n    /**\n     * Should the URL preview render according to the application.\n     */\n    private urlPreviewVisible: boolean;\n\n    /**\n     * Should media be rendered in the preview.\n     */\n    private mediaVisible: boolean;\n\n    /**\n     * Has the user opted to render this individual preview, or hide it.\n     */\n    private urlPreviewEnabledByUser: boolean;\n\n    /**\n     * Called when the user clicks on the preview thumbnail.\n     */\n    public readonly onImageClick: (preview: UrlPreview) => void;\n\n    public constructor(props: UrlPreviewGroupViewModelProps) {\n        super(props, {\n            previews: [],\n            totalPreviewCount: 0,\n            previewsLimited: true,\n            overPreviewLimit: false,\n        });\n        this.onImageClick = props.onImageClicked;\n        this.storageKey = `hide_preview_${props.mxEvent.getId()}`;\n        this.urlPreviewVisible = props.visible;\n        this.mediaVisible = props.mediaVisible;\n        this.urlPreviewEnabledByUser = globalThis.localStorage.getItem(this.storageKey) !== \"1\";\n        this.fetcher = new UrlPreviewFetcher(props.client, props.mxEvent.getTs(), props.showTooltips);\n    }\n\n    /**\n     * `true` only when the user has chosen to hide previews.\n     */\n    public get isPreviewHiddenByUser(): boolean {\n        return this.visibility === PreviewVisibility.UserHidden;\n    }\n\n    private get visibility(): PreviewVisibility {\n        if (!this.urlPreviewVisible) return PreviewVisibility.Hidden;\n        if (!this.urlPreviewEnabledByUser) return PreviewVisibility.UserHidden;\n        if (!this.mediaVisible) return PreviewVisibility.MediaHidden;\n        return PreviewVisibility.Visible;\n    }\n\n    /**\n     * Recompute the snapshot for the view model, generating previews\n     * for the previously-calculated links.\n     */\n    private async computeSnapshot(): Promise<void> {\n        // MSC4095: an empty bundled previews array means the sender opted out of previews.\n        const bundledLinkPreviews = this.props.mxEvent.getContent()[BUNDLED_LINK_PREVIEWS];\n        if (Array.isArray(bundledLinkPreviews) && bundledLinkPreviews.length === 0) {\n            this.snapshot.merge({\n                previews: [],\n                totalPreviewCount: 0,\n                previewsLimited: false,\n                overPreviewLimit: false,\n            });\n            return;\n        }\n\n        const loadMedia = this.visibility === PreviewVisibility.Visible;\n        const previews =\n            this.visibility <= PreviewVisibility.UserHidden\n                ? []\n                : await Promise.all(\n                      this.links\n                          .slice(0, this.limitPreviews ? MAX_PREVIEWS_WHEN_LIMITED : undefined)\n                          .map((link) => this.fetcher.fetchPreview(link, loadMedia)),\n                  );\n        this.snapshot.merge({\n            previews: previews.filter((p) => !!p),\n            totalPreviewCount: this.links.length,\n            previewsLimited: this.limitPreviews,\n            overPreviewLimit: this.links.length > MAX_PREVIEWS_WHEN_LIMITED,\n        });\n    }\n\n    /**\n     * Trigger a recalculation of the links in an event.\n     * @param eventElement\n     */\n    public async updateEventElement(eventElement: HTMLDivElement | HTMLSpanElement): Promise<void> {\n        const newLinks = UrlPreviewGroupViewModel.findLinks([eventElement]);\n        if (newLinks.some((x) => !this.links.includes(x)) || this.links.some((x) => !newLinks.includes(x))) {\n            this.links = newLinks;\n            return this.computeSnapshot();\n        }\n    }\n\n    /**\n     * Update the view model about visible state of previews.\n     * @param urlPreviewVisible Whether URL previews are hidden for this room.\n     *\n     * @returns A promise that completes when the snapshot has been recomputed.\n     */\n    public readonly updateUrlPreviewVisible = (urlPreviewVisible: boolean): Promise<void> => {\n        this.urlPreviewVisible = urlPreviewVisible;\n        this.fetcher.clearCache();\n        return this.computeSnapshot();\n    };\n\n    /**\n     * Update the view model about visible state of media.\n     * @param urlPreviewVisible Whether media is hidden for this room or event.\n     *\n     * @returns A promise that completes when the snapshot has been recomputed.\n     */\n    public readonly updateMediaVisible = (mediaVisible: boolean): Promise<void> => {\n        this.mediaVisible = mediaVisible;\n        this.fetcher.clearCache();\n        return this.computeSnapshot();\n    };\n\n    /**\n     * Called when the user has requsted previews be visible. The provided\n     * props `urlPreviewVisible` state will always override this.\n     *\n     * @returns A promise that completes when the snapshot has been recomputed.\n     */\n    public readonly onShowClick = (): Promise<void> => {\n        // FIXME: persist this somewhere smarter than local storage\n        this.urlPreviewEnabledByUser = true;\n        globalThis.localStorage?.removeItem(this.storageKey);\n        return this.computeSnapshot();\n    };\n\n    /**\n     * Called when the user has requsted previews be hidden. Will take precedence\n     * over other settings.\n     *\n     * @returns A promise that completes when the snapshot has been recomputed.\n     */\n    public readonly onHideClick = (): Promise<void> => {\n        // FIXME: persist this somewhere smarter than local storage\n        globalThis.localStorage?.setItem(this.storageKey, \"1\");\n        this.urlPreviewEnabledByUser = false;\n        PosthogAnalytics.instance.trackEvent<UrlPreviewVisibilityChanged>({\n            eventName: \"UrlPreviewVisibilityChanged\",\n            previewKind: \"LegacyCard\",\n            hasThumbnail: this.snapshot.current.previews.some((p) => !!p.image),\n            previewCount: this.snapshot.current.previews.length,\n            visible: this.urlPreviewEnabledByUser,\n        });\n        return this.computeSnapshot();\n    };\n\n    /**\n     * Called when the user toggles the number of previews visible.\n     *\n     * @returns A promise that completes when the snapshot has been recomputed.\n     */\n    public readonly onTogglePreviewLimit = (): Promise<void> => {\n        this.limitPreviews = !this.limitPreviews;\n        return this.computeSnapshot();\n    };\n}\n","/*\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, useContext, useEffect, useRef } from \"react\";\nimport { logger as rootLogger } from \"matrix-js-sdk/src/logger\";\nimport { MsgType } from \"matrix-js-sdk/src/matrix\";\nimport {\n    EventContentBodyView,\n    TextualBodyView,\n    type TextualBodyContentElement,\n    type UrlPreview,\n    UrlPreviewGroupView,\n    useCreateAutoDisposedViewModel,\n    useViewModel,\n} from \"@element-hq/web-shared-components\";\n\nimport { type IBodyProps } from \"./IBodyProps\";\nimport RoomContext from \"../../../contexts/RoomContext\";\nimport { useMatrixClientContext } from \"../../../contexts/MatrixClientContext\";\nimport { useMediaVisible } from \"../../../hooks/useMediaVisible\";\nimport { TextualBodyViewModel } from \"../../../viewmodels/room/timeline/event-tile/body/TextualBodyViewModel\";\nimport { EventContentBodyViewModel } from \"../../../viewmodels/message-body/EventContentBodyViewModel\";\nimport { getParentEventId } from \"../../../utils/Reply\";\nimport Modal from \"../../../Modal\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport PosthogTrackers from \"../../../PosthogTrackers\";\nimport ImageView from \"../elements/ImageView\";\nimport EditMessageComposer from \"../rooms/EditMessageComposer\";\nimport { EditWysiwygComposer } from \"../rooms/wysiwyg_composer\";\nimport { UrlPreviewGroupViewModel } from \"../../../viewmodels/message-body/UrlPreviewGroupViewModel\";\nimport PlatformPeg from \"../../../PlatformPeg\";\n\nconst logger = rootLogger.getChild(\"TextualBodyFactory\");\n\nfunction getTextualBodyClassName(msgtype: MsgType | undefined): string {\n    if (msgtype === MsgType.Notice) {\n        return \"mx_MNoticeBody mx_EventTile_content\";\n    }\n\n    if (msgtype === MsgType.Emote) {\n        return \"mx_MEmoteBody mx_EventTile_content\";\n    }\n\n    if ([MsgType.Image, MsgType.File, MsgType.Audio, MsgType.Video].includes(msgtype as MsgType)) {\n        return \"mx_MTextBody mx_EventTile_caption\";\n    }\n\n    return \"mx_MTextBody mx_EventTile_content\";\n}\n\nexport function TextualBodyFactory(props: Readonly<IBodyProps>): JSX.Element {\n    const roomContext = useContext(RoomContext);\n    const client = useMatrixClientContext();\n    const [mediaVisible] = useMediaVisible(props.mxEvent);\n    const content = props.mxEvent.getContent();\n    const isEmote = content.msgtype === MsgType.Emote;\n    const willHaveWrapper = !!props.replacingEventId || !!props.isSeeingThroughMessageHiddenForModeration || isEmote;\n    const stripReply = !props.mxEvent.replacingEvent() && !!getParentEventId(props.mxEvent);\n    const contentRef = useRef<TextualBodyContentElement>(null);\n\n    const textualBodyVm = useCreateAutoDisposedViewModel(\n        () =>\n            new TextualBodyViewModel({\n                id: props.id,\n                mxEvent: props.mxEvent,\n                highlightLink: props.highlightLink,\n                replacingEventId: props.replacingEventId,\n                isSeeingThroughMessageHiddenForModeration: props.isSeeingThroughMessageHiddenForModeration,\n                timelineRenderingType: roomContext.timelineRenderingType,\n            }),\n    );\n\n    const eventContentBodyVm = useCreateAutoDisposedViewModel(\n        () =>\n            new EventContentBodyViewModel({\n                as: willHaveWrapper ? \"span\" : \"div\",\n                includeDir: false,\n                mxEvent: props.mxEvent,\n                content,\n                stripReply,\n                linkify: true,\n                highlights: props.highlights,\n                renderTooltipsForAmbiguousLinks: true,\n                renderKeywordPills: true,\n                renderMentionPills: true,\n                renderCodeBlocks: true,\n                renderSpoilers: true,\n                client: roomContext.room?.client ?? client ?? null,\n            }),\n    );\n\n    const urlPreviewVm = useCreateAutoDisposedViewModel(\n        () =>\n            new UrlPreviewGroupViewModel({\n                client,\n                mxEvent: props.mxEvent,\n                mediaVisible,\n                onImageClicked: (preview: UrlPreview): void => {\n                    if (!preview.image?.imageFull) {\n                        return;\n                    }\n\n                    Modal.createDialog(\n                        ImageView,\n                        {\n                            src: preview.image.imageFull,\n                            width: preview.image.width,\n                            height: preview.image.height,\n                            name: preview.title,\n                            fileSize: preview.image.fileSize,\n                            link: preview.link,\n                        },\n                        \"mx_Dialog_lightbox\",\n                        undefined,\n                        true,\n                    );\n                },\n                visible: props.showUrlPreview ?? false,\n                showTooltips: PlatformPeg.get()?.needsUrlTooltips() ?? true,\n            }),\n    );\n\n    const { previews } = useViewModel(urlPreviewVm);\n\n    useEffect(() => {\n        textualBodyVm.setId(props.id);\n    }, [props.id, textualBodyVm]);\n\n    useEffect(() => {\n        textualBodyVm.setEvent(props.mxEvent);\n    }, [props.mxEvent, textualBodyVm]);\n\n    useEffect(() => {\n        textualBodyVm.setHighlightLink(props.highlightLink);\n    }, [props.highlightLink, textualBodyVm]);\n\n    useEffect(() => {\n        textualBodyVm.setReplacingEventId(props.replacingEventId);\n    }, [props.replacingEventId, textualBodyVm]);\n\n    useEffect(() => {\n        textualBodyVm.setIsSeeingThroughMessageHiddenForModeration(props.isSeeingThroughMessageHiddenForModeration);\n    }, [props.isSeeingThroughMessageHiddenForModeration, textualBodyVm]);\n\n    useEffect(() => {\n        textualBodyVm.setTimelineRenderingType(roomContext.timelineRenderingType);\n    }, [roomContext.timelineRenderingType, textualBodyVm]);\n\n    useEffect(() => {\n        eventContentBodyVm.setEventContent(props.mxEvent, content);\n    }, [content, props.mxEvent, eventContentBodyVm]);\n\n    useEffect(() => {\n        eventContentBodyVm.setStripReply(stripReply);\n    }, [stripReply, eventContentBodyVm]);\n\n    useEffect(() => {\n        eventContentBodyVm.setAs(willHaveWrapper ? \"span\" : \"div\");\n    }, [willHaveWrapper, eventContentBodyVm]);\n\n    useEffect(() => {\n        eventContentBodyVm.setHighlights(props.highlights);\n    }, [props.highlights, eventContentBodyVm]);\n\n    useEffect(() => {\n        const eventElement = contentRef.current;\n        if (!eventElement) {\n            return;\n        }\n\n        void urlPreviewVm.updateEventElement(eventElement).catch((error) => {\n            logger.warn(\"UrlPreviewViewModel failed to updateEventElement\", error);\n        });\n    }, [\n        props.mxEvent,\n        props.highlights,\n        props.replacingEventId,\n        props.isSeeingThroughMessageHiddenForModeration,\n        urlPreviewVm,\n    ]);\n\n    useEffect(() => {\n        void urlPreviewVm.updateUrlPreviewVisible(props.showUrlPreview ?? false).catch((error) => {\n            logger.warn(\"UrlPreviewViewModel failed to updateUrlPreviewVisible\", error);\n        });\n    }, [props.showUrlPreview, urlPreviewVm]);\n\n    useEffect(() => {\n        void urlPreviewVm.updateMediaVisible(mediaVisible).catch((error) => {\n            logger.warn(\"UrlPreviewViewModel failed to updateMediaVisible\", error);\n        });\n    }, [mediaVisible, urlPreviewVm]);\n\n    useEffect(() => {\n        if (previews.length === 0) {\n            return;\n        }\n\n        PosthogTrackers.instance.trackUrlPreview(props.mxEvent.getId()!, props.mxEvent.isEncrypted(), previews);\n    }, [props.mxEvent, previews]);\n\n    if (props.editState) {\n        const isWysiwygComposerEnabled = SettingsStore.getValue(\"feature_wysiwyg_composer\");\n\n        return isWysiwygComposerEnabled ? (\n            <EditWysiwygComposer editorStateTransfer={props.editState} className=\"mx_EventTile_content\" />\n        ) : (\n            <EditMessageComposer editState={props.editState} className=\"mx_EventTile_content\" />\n        );\n    }\n\n    return (\n        <TextualBodyView\n            vm={textualBodyVm}\n            body={<EventContentBodyView vm={eventContentBodyVm} as={willHaveWrapper ? \"span\" : \"div\"} />}\n            bodyRef={contentRef}\n            urlPreviews={<UrlPreviewGroupView vm={urlPreviewVm} className=\"mx_TextualBody_urlPreviews\" />}\n            className={getTextualBodyClassName(content.msgtype as MsgType | undefined)}\n        />\n    );\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport mime from \"mime\";\nimport React, { createRef, type JSX, useEffect } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport {\n    EventType,\n    MsgType,\n    MatrixEventEvent,\n    M_BEACON_INFO,\n    M_LOCATION,\n    M_POLL_START,\n    type IContent,\n} from \"matrix-js-sdk/src/matrix\";\nimport { MjolnirBodyView, UnknownBodyView, useCreateAutoDisposedViewModel } from \"@element-hq/web-shared-components\";\n\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { Mjolnir } from \"../../../mjolnir/Mjolnir\";\nimport { type IMediaBody } from \"./IMediaBody\";\nimport { MediaEventHelper } from \"../../../utils/MediaEventHelper\";\nimport { type IBodyProps } from \"./IBodyProps\";\nimport MVoiceOrAudioBody from \"./MVoiceOrAudioBody\";\nimport MStickerBody from \"./MStickerBody\";\nimport MPollBody from \"./MPollBody\";\nimport MLocationBody from \"./MLocationBody\";\nimport MBeaconBody from \"./MBeaconBody\";\nimport { type GetRelationsForEvent, type IEventTileOps } from \"../rooms/EventTile\";\nimport { MjolnirBodyViewModel } from \"../../../viewmodels/room/timeline/event-tile/body/MjolnirBodyViewModel\";\nimport {\n    DecryptionFailureBodyFactory,\n    FileBodyFactory,\n    ImageBodyFactory,\n    RedactedBodyFactory,\n    VideoBodyFactory,\n    renderMBody,\n} from \"./MBodyFactory\";\nimport { TextualBodyFactory } from \"./TextualBodyFactory\";\n\n// onMessageAllowed is handled internally\ninterface IProps extends Omit<IBodyProps, \"onMessageAllowed\" | \"mediaEventHelper\"> {\n    /* overrides for the msgtype-specific components, used by ReplyTile to override file rendering */\n    overrideBodyTypes?: Record<string, React.ComponentType<IBodyProps>>;\n    overrideEventTypes?: Record<string, React.ComponentType<IBodyProps>>;\n\n    // helper function to access relations for this event\n    getRelationsForEvent?: GetRelationsForEvent;\n\n    isSeeingThroughMessageHiddenForModeration?: boolean;\n\n    /**\n     * Optional ID for the root element.\n     */\n    id?: string;\n}\n\nexport interface IOperableEventTile {\n    getEventTileOps(): IEventTileOps | null;\n}\n\nconst baseBodyTypes = new Map<string, React.ComponentType<IBodyProps>>([\n    [MsgType.Text, TextualBodyFactory],\n    [MsgType.Notice, TextualBodyFactory],\n    [MsgType.Emote, TextualBodyFactory],\n    [MsgType.Image, ImageBodyFactory],\n    [MsgType.File, (props: IBodyProps) => renderMBody(props, FileBodyFactory)!],\n    [MsgType.Audio, MVoiceOrAudioBody],\n    [MsgType.Video, VideoBodyFactory],\n]);\nconst baseEvTypes = new Map<string, React.ComponentType<IBodyProps>>([\n    [EventType.Sticker, MStickerBody],\n    [M_POLL_START.name, MPollBody],\n    [M_POLL_START.altName, MPollBody],\n    [M_BEACON_INFO.name, MBeaconBody],\n    [M_BEACON_INFO.altName, MBeaconBody],\n]);\n\nfunction MjolnirBodyWrappedView({ mxEvent, onMessageAllowed, ref }: IBodyProps): JSX.Element {\n    const vm = useCreateAutoDisposedViewModel(() => new MjolnirBodyViewModel({ mxEvent, onMessageAllowed }));\n\n    useEffect(() => {\n        vm.setEvent(mxEvent);\n    }, [mxEvent, vm]);\n\n    useEffect(() => {\n        vm.setOnMessageAllowed(onMessageAllowed);\n    }, [onMessageAllowed, vm]);\n\n    return <MjolnirBodyView vm={vm} ref={ref} />;\n}\n\nfunction UnknownBody({ mxEvent, ref }: IBodyProps): JSX.Element {\n    return <UnknownBodyView text={mxEvent.getContent().body} ref={ref} className=\"mx_UnknownBody\" />;\n}\n\nexport default class MessageEvent extends React.Component<IProps> implements IMediaBody, IOperableEventTile {\n    private body = createRef<React.Component | IOperableEventTile>();\n    private mediaHelper?: MediaEventHelper;\n    private bodyTypes = new Map<string, React.ComponentType<IBodyProps>>(baseBodyTypes.entries());\n    private evTypes = new Map<string, React.ComponentType<IBodyProps>>(baseEvTypes.entries());\n\n    public constructor(props: IProps) {\n        super(props);\n\n        if (MediaEventHelper.isEligible(this.props.mxEvent)) {\n            this.mediaHelper = new MediaEventHelper(this.props.mxEvent);\n        }\n\n        this.updateComponentMaps();\n    }\n\n    public componentDidMount(): void {\n        this.props.mxEvent.addListener(MatrixEventEvent.Decrypted, this.onDecrypted);\n    }\n\n    public componentWillUnmount(): void {\n        this.props.mxEvent.removeListener(MatrixEventEvent.Decrypted, this.onDecrypted);\n        this.mediaHelper?.destroy();\n    }\n\n    public componentDidUpdate(prevProps: Readonly<IProps>): void {\n        if (this.props.mxEvent !== prevProps.mxEvent && MediaEventHelper.isEligible(this.props.mxEvent)) {\n            this.mediaHelper?.destroy();\n            this.mediaHelper = new MediaEventHelper(this.props.mxEvent);\n        }\n\n        this.updateComponentMaps();\n    }\n\n    private updateComponentMaps(): void {\n        this.bodyTypes = new Map<string, React.ComponentType<IBodyProps>>(baseBodyTypes.entries());\n        for (const [bodyType, bodyComponent] of Object.entries(this.props.overrideBodyTypes ?? {})) {\n            this.bodyTypes.set(bodyType, bodyComponent);\n        }\n\n        this.evTypes = new Map<string, React.ComponentType<IBodyProps>>(baseEvTypes.entries());\n        for (const [evType, evComponent] of Object.entries(this.props.overrideEventTypes ?? {})) {\n            this.evTypes.set(evType, evComponent);\n        }\n    }\n\n    public getEventTileOps = (): IEventTileOps | null => {\n        return (this.body.current as IOperableEventTile)?.getEventTileOps?.() || null;\n    };\n\n    public getMediaHelper(): MediaEventHelper | undefined {\n        return this.mediaHelper;\n    }\n\n    private onDecrypted = (): void => {\n        // Recheck MediaEventHelper eligibility as it can change when the event gets decrypted\n        if (MediaEventHelper.isEligible(this.props.mxEvent)) {\n            this.mediaHelper?.destroy();\n            this.mediaHelper = new MediaEventHelper(this.props.mxEvent);\n        }\n    };\n\n    private onTileUpdate = (): void => {\n        this.forceUpdate();\n    };\n\n    /**\n     *  Validates that the filename extension and advertised mimetype\n     *  of the supplied image/file message content match and are actuallly video/image content.\n     *  For image/video messages with a thumbnail it also validates the mimetype is an image.\n     * @param content The mxEvent content of the message\n     * @returns A boolean indicating whether the validation passed\n     */\n    private validateImageOrVideoMimetype = (content: IContent): boolean => {\n        // As per the spec if filename is not present the body represents the filename\n        const filename = content.filename ?? content.body;\n        if (!filename) {\n            logger.log(\"Failed to validate image/video content, filename null\");\n            return false;\n        }\n        // Check mimetype of the thumbnail\n        if (!this.validateThumbnailMimetype(content)) {\n            logger.log(\"Failed to validate file/image thumbnail\");\n            return false;\n        }\n\n        // if there is no mimetype from the extesion or the mimetype is not image/video validation fails\n        const typeFromExtension = mime.getType(filename) ?? undefined;\n        const extensionMajorMimetype = this.parseMajorMimetype(typeFromExtension);\n        if (!typeFromExtension || !this.validateAllowedMimetype(typeFromExtension, [\"image\", \"video\"])) {\n            logger.log(\"Failed to validate image/video content, invalid or missing extension\");\n            return false;\n        }\n\n        // if the content mimetype is set check it is an image/video and that it matches the extesion mimetype otherwise validation fails\n        const contentMimetype = content.info?.mimetype;\n        if (contentMimetype) {\n            const contentMajorMimetype = this.parseMajorMimetype(contentMimetype);\n            if (\n                !this.validateAllowedMimetype(contentMimetype, [\"image\", \"video\"]) ||\n                extensionMajorMimetype !== contentMajorMimetype\n            ) {\n                logger.log(\"Failed to validate image/video content, invalid or missing mimetype\");\n                return false;\n            }\n        }\n        return true;\n    };\n\n    /**\n     *  Validates that the advertised mimetype of the sticker content\n     *  is an image.\n     *  For stickers with a thumbnail it also validates the mimetype is an image.\n     * @param content The mxEvent content of the message\n     * @returns A boolean indicating whether the validation passed\n     */\n    private validateStickerMimetype = (content: IContent): boolean => {\n        // Validate mimetype of the thumbnail\n        const thumbnailResult = this.validateThumbnailMimetype(content);\n        if (!thumbnailResult) {\n            logger.log(\"Failed to validate sticker thumbnail\");\n            return false;\n        }\n        // Validate mimetype of the content info is valid if it is set\n        const contentMimetype = content.info?.mimetype;\n        if (contentMimetype && !this.validateAllowedMimetype(contentMimetype, [\"image\"])) {\n            logger.log(\"Failed to validate image/video content, invalid or missing mimetype/extensions\");\n            return false;\n        }\n        return true;\n    };\n\n    /**\n     *  For image/video messages or stickers that have a thumnail mimetype specified,\n     *  validates that the major mimetime is image.\n     * @param content The mxEvent content of the message\n     * @returns A boolean indicating whether the validation passed\n     */\n    private validateThumbnailMimetype = (content: IContent): boolean => {\n        const thumbnailMimetype = content.info?.thumbnail_info?.mimetype;\n        return !thumbnailMimetype || this.validateAllowedMimetype(thumbnailMimetype, [\"image\"]);\n    };\n\n    /**\n     * Validates that the major part of a mimetime from an allowed list.\n     * @param mimetype The mimetype to validate\n     * @param allowedMajorMimeTypes The list of allowed major mimetimes\n     * @returns A boolean indicating whether the validation passed\n     */\n    private validateAllowedMimetype = (mimetype: string, allowedMajorMimeTypes: string[]): boolean => {\n        const majorMimetype = this.parseMajorMimetype(mimetype);\n        return !!majorMimetype && allowedMajorMimeTypes.includes(majorMimetype);\n    };\n\n    /**\n     * Parses and returns the the major part of a mimetype(before the \"/\").\n     * @param mimetype As optional mimetype string to parse\n     * @returns The major part of the mimetype string or undefined\n     */\n    private parseMajorMimetype(mimetype?: string): string | undefined {\n        return mimetype?.split(\"/\")[0];\n    }\n\n    public render(): React.ReactNode {\n        const content = this.props.mxEvent.getContent();\n        const type = this.props.mxEvent.getType();\n        const msgtype = content.msgtype;\n        let BodyType: React.ComponentType<IBodyProps> = RedactedBodyFactory;\n        if (!this.props.mxEvent.isRedacted()) {\n            // only resolve BodyType if event is not redacted\n            if (this.props.mxEvent.isDecryptionFailure()) {\n                BodyType = DecryptionFailureBodyFactory;\n            } else if (type && this.evTypes.has(type)) {\n                BodyType = this.evTypes.get(type)!;\n            } else if (msgtype && this.bodyTypes.has(msgtype)) {\n                BodyType = this.bodyTypes.get(msgtype)!;\n            } else if (content.url) {\n                // Fallback to file body if there's a content URL\n                BodyType = this.bodyTypes.get(MsgType.File)!;\n            } else {\n                // Fallback to UnknownBody otherwise if not redacted\n                BodyType = UnknownBody;\n            }\n\n            if (\n                ((BodyType === ImageBodyFactory || BodyType === VideoBodyFactory) &&\n                    !this.validateImageOrVideoMimetype(content)) ||\n                (BodyType === MStickerBody && !this.validateStickerMimetype(content))\n            ) {\n                BodyType = this.bodyTypes.get(MsgType.File)!;\n            }\n\n            // TODO: move to eventTypes when location sharing spec stabilises\n            if (M_LOCATION.matches(type) || (type === EventType.RoomMessage && msgtype === MsgType.Location)) {\n                BodyType = MLocationBody;\n            }\n        }\n\n        if (SettingsStore.getValue(\"feature_mjolnir\")) {\n            const key = `mx_mjolnir_render_${this.props.mxEvent.getRoomId()}__${this.props.mxEvent.getId()}`;\n            const allowRender = localStorage.getItem(key) === \"true\";\n\n            if (!allowRender) {\n                const userDomain = this.props.mxEvent.getSender()?.split(\":\").slice(1).join(\":\");\n                const userBanned = Mjolnir.sharedInstance().isUserBanned(this.props.mxEvent.getSender()!);\n                const serverBanned = userDomain && Mjolnir.sharedInstance().isServerBanned(userDomain);\n\n                if (userBanned || serverBanned) {\n                    BodyType = MjolnirBodyWrappedView;\n                }\n            }\n        }\n\n        const hasCaption =\n            [MsgType.Image, MsgType.File, MsgType.Audio, MsgType.Video].includes(msgtype as MsgType) &&\n            content.filename &&\n            content.filename !== content.body;\n        const bodyProps: IBodyProps = {\n            ref: this.body,\n            mxEvent: this.props.mxEvent,\n            highlights: this.props.highlights,\n            highlightLink: this.props.highlightLink,\n            showUrlPreview: this.props.showUrlPreview,\n            forExport: this.props.forExport,\n            maxImageHeight: this.props.maxImageHeight,\n            replacingEventId: this.props.replacingEventId,\n            editState: this.props.editState,\n            onMessageAllowed: this.onTileUpdate,\n            permalinkCreator: this.props.permalinkCreator,\n            mediaEventHelper: this.mediaHelper,\n            getRelationsForEvent: this.props.getRelationsForEvent,\n            isSeeingThroughMessageHiddenForModeration: this.props.isSeeingThroughMessageHiddenForModeration,\n            inhibitInteraction: this.props.inhibitInteraction,\n            id: this.props.id,\n        };\n        if (hasCaption) {\n            return <CaptionBody {...bodyProps} WrappedBodyType={BodyType} />;\n        }\n\n        return BodyType ? <BodyType {...bodyProps} /> : null;\n    }\n}\n\nconst CaptionBody: React.FunctionComponent<IBodyProps & { WrappedBodyType: React.ComponentType<IBodyProps> }> = ({\n    WrappedBodyType,\n    ...props\n}) => (\n    <div className=\"mx_EventTile_content\">\n        <WrappedBodyType {...props} />\n        <TextualBodyFactory {...{ ...props, ref: undefined }} />\n    </div>\n);\n","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction FileErrorIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M6 22q-.824 0-1.412-.587A1.93 1.93 0 0 1 4 20V4q0-.824.588-1.412A1.93 1.93 0 0 1 6 2h7.175a1.98 1.98 0 0 1 1.4.575l4.85 4.85q.275.275.425.638.15.361.15.762v3.516A6 6 0 0 0 18 12V9h-4a.97.97 0 0 1-.713-.287A.97.97 0 0 1 13 8V4H6v16h6.341c.264.745.67 1.423 1.187 2z\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M18 14a1 1 0 0 1 1 1v3a1 1 0 1 1-2 0v-3a1 1 0 0 1 1-1m-1 7a1 1 0 1 1 2 0 1 1 0 0 1-2 0\"\n    })]\n  });\n}\n;\nFileErrorIcon.displayName = \"FileErrorIcon\";\nexport default forwardRef(FileErrorIcon);","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { FileErrorIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\ninterface Props {\n    className?: string;\n    Icon?: typeof FileErrorIcon;\n    children: React.ReactNode;\n}\n\nconst MediaProcessingError: React.FC<Props> = ({ className, children, Icon = FileErrorIcon }) => (\n    <span className={className}>\n        <Icon className=\"mx_MediaProcessingError_Icon\" width=\"16\" height=\"16\" />\n        {children}\n    </span>\n);\n\nexport default MediaProcessingError;\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\";\nimport { forwardRef } from \"react\";\nvar SvgTrophy = function SvgTrophy(props, ref) {\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 12 12\",\n    role: \"presentation\",\n    \"aria-hidden\": true,\n    ref: ref\n  }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    fill: \"currentColor\",\n    d: \"M10.667 1.333H9.333V.667C9.333.3 9.033 0 8.667 0H3.333c-.366 0-.666.3-.666.667v.666H1.333C.6 1.333 0 1.933 0 2.667v.666c0 1.7 1.28 3.087 2.927 3.294A3.34 3.34 0 0 0 5.333 8.6v2.067h-2c-.366 0-.666.3-.666.666s.3.667.666.667h5.334c.366 0 .666-.3.666-.667 0-.366-.3-.666-.666-.666h-2V8.6a3.34 3.34 0 0 0 2.406-1.973C10.72 6.42 12 5.033 12 3.333v-.666c0-.734-.6-1.334-1.333-1.334m-9.334 2v-.666h1.334v2.546a2.01 2.01 0 0 1-1.334-1.88m9.334 0c0 .867-.56 1.6-1.334 1.88V2.667h1.334z\"\n  })));\n};\nvar ForwardRef = /*#__PURE__*/forwardRef(SvgTrophy);\nexport { ForwardRef as Icon };\nexport default \"img/element-icons/trophy.1ab5e03.svg\";","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode } from \"react\";\nimport classNames from \"classnames\";\nimport { type PollAnswerSubevent } from \"matrix-js-sdk/src/extensible_events_v1/PollStartEvent\";\nimport { CheckIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { Icon as TrophyIcon } from \"../../../../res/img/element-icons/trophy.svg\";\nimport StyledRadioButton from \"../elements/StyledRadioButton\";\n\ntype PollOptionContentProps = {\n    answer: PollAnswerSubevent;\n    voteCount: number;\n    displayVoteCount?: boolean;\n    isWinner?: boolean;\n};\nconst PollOptionContent: React.FC<PollOptionContentProps> = ({ isWinner, answer, voteCount, displayVoteCount }) => {\n    const votesText = displayVoteCount ? _t(\"timeline|m.poll|count_of_votes\", { count: voteCount }) : \"\";\n    return (\n        <div className=\"mx_PollOption_content\">\n            <div className=\"mx_PollOption_optionText\">{answer.text}</div>\n            <div className=\"mx_PollOption_optionVoteCount\">\n                {isWinner && <TrophyIcon className=\"mx_PollOption_winnerIcon\" />}\n                {votesText}\n            </div>\n        </div>\n    );\n};\n\ninterface PollOptionProps extends PollOptionContentProps {\n    pollId: string;\n    totalVoteCount: number;\n    optionNumber: number;\n    isEnded?: boolean;\n    isChecked?: boolean;\n    onOptionSelected?: (id: string) => void;\n    children?: ReactNode;\n}\n\nconst ActivePollOption: React.FC<Omit<PollOptionProps, \"totalVoteCount\">> = ({\n    pollId,\n    isChecked,\n    isEnded,\n    optionNumber,\n    isWinner,\n    voteCount,\n    displayVoteCount,\n    children,\n    answer,\n    onOptionSelected,\n}) => {\n    let ariaLabel: string;\n\n    if (displayVoteCount && isWinner) {\n        ariaLabel = _t(\"poll|option_label_winning_with_total\", {\n            number: optionNumber,\n            answer: answer.text,\n            count: voteCount,\n        });\n    } else if (displayVoteCount) {\n        ariaLabel = _t(\"poll|option_label_with_total\", {\n            number: optionNumber,\n            answer: answer.text,\n            count: voteCount,\n        });\n    } else {\n        ariaLabel = _t(\"poll|option_label\", {\n            number: optionNumber,\n            answer: answer.text,\n        });\n    }\n\n    return (\n        <StyledRadioButton\n            className=\"mx_PollOption_live-option\"\n            name={`poll_answer_select-${pollId}`}\n            value={answer.id}\n            checked={isChecked}\n            disabled={isEnded}\n            aria-label={ariaLabel}\n            onChange={() => onOptionSelected?.(answer.id)}\n            icon={isChecked ? <CheckIcon /> : undefined}\n        >\n            <div aria-hidden=\"true\">{children}</div>\n        </StyledRadioButton>\n    );\n};\n\nexport const PollOption: React.FC<PollOptionProps> = ({\n    pollId,\n    answer,\n    voteCount,\n    totalVoteCount,\n    optionNumber,\n    displayVoteCount,\n    isEnded,\n    isChecked,\n    onOptionSelected,\n}) => {\n    const cls = classNames({\n        mx_PollOption: true,\n        mx_PollOption_checked: isChecked,\n        mx_PollOption_ended: isEnded,\n    });\n    const isWinner = isEnded && isChecked;\n    const answerPercent = totalVoteCount === 0 ? 0 : Math.round((100.0 * voteCount) / totalVoteCount);\n    return (\n        <div data-testid={`pollOption-${answer.id}`} className={cls} onClick={() => onOptionSelected?.(answer.id)}>\n            <ActivePollOption\n                pollId={pollId}\n                answer={answer}\n                optionNumber={optionNumber}\n                isChecked={isChecked}\n                isEnded={isEnded}\n                isWinner={isWinner}\n                voteCount={voteCount}\n                displayVoteCount={displayVoteCount}\n                onOptionSelected={onOptionSelected}\n            >\n                <PollOptionContent\n                    isWinner={isWinner}\n                    answer={answer}\n                    voteCount={voteCount}\n                    displayVoteCount={displayVoteCount}\n                />\n            </ActivePollOption>\n            <div className=\"mx_PollOption_popularityBackground\">\n                <div className=\"mx_PollOption_popularityAmount\" style={{ width: `${answerPercent}%` }} />\n            </div>\n        </div>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode, type KeyboardEvent, type Ref, type MouseEvent, useMemo, useContext } from \"react\";\nimport classNames from \"classnames\";\nimport { IconButton, Text } from \"@vector-im/compound-web\";\nimport CloseIcon from \"@vector-im/compound-design-tokens/assets/web/icons/close\";\nimport ChevronLeftIcon from \"@vector-im/compound-design-tokens/assets/web/icons/chevron-left\";\nimport { AutoHideScrollbar } from \"@element-hq/web-shared-components\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { backLabelForPhase } from \"../../../stores/right-panel/RightPanelStorePhases\";\nimport { CardContext } from \"./context\";\nimport { SDKContext } from \"../../../contexts/SDKContext.ts\";\n\ninterface IProps {\n    header?: ReactNode | null;\n    hideHeaderButtons?: boolean;\n    footer?: ReactNode;\n    className?: string;\n    id?: string;\n    role?: \"tabpanel\";\n    ariaLabelledBy?: string;\n    withoutScrollContainer?: boolean;\n    closeLabel?: string;\n    onClose?(this: void, ev: MouseEvent<HTMLButtonElement>): void;\n    onBack?(this: void, ev: MouseEvent<HTMLButtonElement>): void;\n    onKeyDown?(this: void, ev: KeyboardEvent): void;\n    ref?: Ref<HTMLDivElement>;\n    // Ref for the 'close' button the card\n    closeButtonRef?: Ref<HTMLButtonElement>;\n    children: ReactNode;\n}\n\nconst BaseCard: React.FC<IProps> = ({\n    closeLabel,\n    onClose,\n    onBack,\n    className,\n    id,\n    ariaLabelledBy,\n    role,\n    hideHeaderButtons,\n    header,\n    footer,\n    withoutScrollContainer,\n    children,\n    onKeyDown,\n    closeButtonRef,\n    ref,\n}: IProps) => {\n    const sdkContext = useContext(SDKContext);\n\n    let backButton;\n    const cardHistory = sdkContext.rightPanelStore.roomPhaseHistory;\n    if (cardHistory.length > 1 && !hideHeaderButtons) {\n        const prevCard = cardHistory[cardHistory.length - 2];\n        const onBackClick = (ev: MouseEvent<HTMLButtonElement>): void => {\n            onBack?.(ev);\n            sdkContext.rightPanelStore.popCard();\n        };\n        const label = backLabelForPhase(prevCard.phase) ?? _t(\"action|back\");\n        backButton = (\n            <IconButton\n                size=\"28px\"\n                data-testid=\"base-card-back-button\"\n                onClick={onBackClick}\n                tooltip={label}\n                kind=\"secondary\"\n            >\n                <ChevronLeftIcon />\n            </IconButton>\n        );\n    }\n\n    let closeButton;\n    if (!hideHeaderButtons) {\n        // eslint-disable-next-line no-inner-declarations\n        function closeRightPanel(ev: MouseEvent<HTMLButtonElement>): void {\n            ev.preventDefault();\n            ev.stopPropagation();\n            sdkContext.rightPanelStore.popCard();\n        }\n\n        closeButton = (\n            <IconButton\n                size=\"28px\"\n                data-testid=\"base-card-close-button\"\n                onClick={onClose ?? closeRightPanel}\n                ref={closeButtonRef}\n                tooltip={closeLabel ?? _t(\"action|close\")}\n                kind=\"secondary\"\n            >\n                <CloseIcon />\n            </IconButton>\n        );\n    }\n\n    if (!withoutScrollContainer) {\n        children = <AutoHideScrollbar className=\"mx_AutoHideScrollbar\">{children}</AutoHideScrollbar>;\n    }\n\n    const shouldRenderHeader = header || !hideHeaderButtons;\n    const context = useMemo(() => ({ isCard: true }), []);\n\n    return (\n        <CardContext.Provider value={context}>\n            <div\n                id={id}\n                aria-labelledby={ariaLabelledBy}\n                role={role}\n                className={classNames(\"mx_BaseCard\", className)}\n                ref={ref}\n                onKeyDown={onKeyDown}\n            >\n                {shouldRenderHeader && (\n                    <div className=\"mx_BaseCard_header\">\n                        {backButton}\n                        {typeof header === \"string\" ? (\n                            <div className=\"mx_BaseCard_header_title\">\n                                <Text\n                                    size=\"md\"\n                                    weight=\"medium\"\n                                    className=\"mx_BaseCard_header_title_heading\"\n                                    role=\"heading\"\n                                >\n                                    {header}\n                                </Text>\n                            </div>\n                        ) : (\n                            (header ?? <div className=\"mx_BaseCard_header_spacer\" />)\n                        )}\n                        {closeButton}\n                    </div>\n                )}\n                {children}\n                {footer && <div className=\"mx_BaseCard_footer\">{footer}</div>}\n            </div>\n        </CardContext.Provider>\n    );\n};\n\nexport default BaseCard;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport { type RoomMember, type User } from \"matrix-js-sdk/src/matrix\";\n\nimport { _t } from \"../../../languageHandler\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport Spinner from \"../elements/Spinner\";\n\nexport const PendingActionSpinner: React.FC<{ text: string }> = ({ text }) => {\n    return (\n        <div className=\"mx_EncryptionInfo_spinner\">\n            <Spinner />\n            {text}\n        </div>\n    );\n};\n\ninterface IProps {\n    waitingForOtherParty: boolean;\n    waitingForNetwork: boolean;\n    member: RoomMember | User;\n    onStartVerification: () => Promise<void>;\n    isRoomEncrypted: boolean;\n    inDialog: boolean;\n    isSelfVerification: boolean;\n}\n\nconst EncryptionInfo: React.FC<IProps> = ({\n    waitingForOtherParty,\n    waitingForNetwork,\n    member,\n    onStartVerification,\n    isRoomEncrypted,\n    inDialog,\n    isSelfVerification,\n}: IProps) => {\n    let content: JSX.Element;\n    if (waitingForOtherParty && isSelfVerification) {\n        content = <div>{_t(\"encryption|verification|once_accepted_can_continue\")}</div>;\n    } else if (waitingForOtherParty || waitingForNetwork) {\n        let text: string;\n        if (waitingForOtherParty) {\n            text = _t(\"encryption|verification|waiting_for_user_accept\", {\n                displayName: (member as User).displayName || (member as RoomMember).name || member.userId,\n            });\n        } else {\n            text = _t(\"encryption|verification|accepting\");\n        }\n        content = <PendingActionSpinner text={text} />;\n    } else {\n        content = (\n            <AccessibleButton\n                kind=\"primary\"\n                className=\"mx_UserInfo_wideButton mx_UserInfo_startVerification\"\n                onClick={onStartVerification}\n            >\n                {_t(\"encryption|verification|start_button\")}\n            </AccessibleButton>\n        );\n    }\n\n    let description: JSX.Element;\n    if (isRoomEncrypted) {\n        description = (\n            <div>\n                <p>{_t(\"user_info|room_encrypted\")}</p>\n                <p>{_t(\"user_info|room_encrypted_detail\")}</p>\n            </div>\n        );\n    } else {\n        description = (\n            <div>\n                <p>{_t(\"user_info|room_unencrypted\")}</p>\n                <p>{_t(\"user_info|room_unencrypted_detail\")}</p>\n            </div>\n        );\n    }\n\n    if (inDialog) {\n        return content;\n    }\n\n    return (\n        <React.Fragment>\n            <div data-testid=\"encryption-info-description\" className=\"mx_UserInfo_container\">\n                <h3>{_t(\"settings|security|encryption_section\")}</h3>\n                {description}\n            </div>\n            <div className=\"mx_UserInfo_container\">\n                <h3>{_t(\"user_info|verify_button\")}</h3>\n                <div>\n                    <p>{_t(\"user_info|verify_explainer\")}</p>\n                    <p>{_t(\"encryption|verification|in_person\")}</p>\n                    {content}\n                </div>\n            </div>\n        </React.Fragment>\n    );\n};\n\nexport default EncryptionInfo;\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\";\nimport { forwardRef } from \"react\";\nvar SvgErrorSolid = function SvgErrorSolid(props, ref) {\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    role: \"presentation\",\n    \"aria-hidden\": true,\n    ref: ref\n  }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    d: \"M12 17q.424 0 .713-.288A.97.97 0 0 0 13 16a.97.97 0 0 0-.287-.713A.97.97 0 0 0 12 15a.97.97 0 0 0-.713.287A.97.97 0 0 0 11 16q0 .424.287.712.288.288.713.288m0-4q.424 0 .713-.287A.97.97 0 0 0 13 12V8a.97.97 0 0 0-.287-.713A.97.97 0 0 0 12 7a.97.97 0 0 0-.713.287A.97.97 0 0 0 11 8v4q0 .424.287.713.288.287.713.287m0 9a9.7 9.7 0 0 1-3.9-.788 10.1 10.1 0 0 1-3.175-2.137q-1.35-1.35-2.137-3.175A9.7 9.7 0 0 1 2 12q0-2.075.788-3.9a10.1 10.1 0 0 1 2.137-3.175q1.35-1.35 3.175-2.137A9.7 9.7 0 0 1 12 2q2.075 0 3.9.788a10.1 10.1 0 0 1 3.175 2.137q1.35 1.35 2.137 3.175A9.7 9.7 0 0 1 22 12a9.7 9.7 0 0 1-.788 3.9 10.1 10.1 0 0 1-2.137 3.175q-1.35 1.35-3.175 2.137A9.7 9.7 0 0 1 12 22\"\n  })));\n};\nvar ForwardRef = /*#__PURE__*/forwardRef(SvgErrorSolid);\nexport { ForwardRef as Icon };\nexport default \"icons/error-solid.7cb2e4d.svg\";","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport QRCode from \"../QRCode\";\n\ninterface IProps {\n    /** The data for the QR code. If `undefined`, a spinner is shown. */\n    qrCodeBytes: undefined | Uint8ClampedArray;\n}\n\nexport default class VerificationQRCode extends React.PureComponent<IProps> {\n    public render(): React.ReactNode {\n        return (\n            <QRCode\n                data={this.props.qrCodeBytes === undefined ? null : [{ data: this.props.qrCodeBytes, mode: \"byte\" }]}\n                className=\"mx_VerificationQRCode\"\n                width={196}\n            />\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport {\n    type ShowQrCodeCallbacks,\n    type ShowSasCallbacks,\n    VerificationPhase as Phase,\n    type VerificationRequest,\n    VerificationRequestEvent,\n    VerifierEvent,\n} from \"matrix-js-sdk/src/crypto-api\";\nimport { type Device, type RoomMember, type User } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { VerificationMethod } from \"matrix-js-sdk/src/types\";\n\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport VerificationQRCode from \"../elements/crypto/VerificationQRCode\";\nimport { _t } from \"../../../languageHandler\";\nimport SdkConfig from \"../../../SdkConfig\";\nimport E2EIcon from \"../rooms/E2EIcon\";\nimport Spinner from \"../elements/Spinner\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport VerificationShowSas from \"../verification/VerificationShowSas\";\nimport { getDeviceCryptoInfo } from \"../../../utils/crypto/deviceInfo\";\nimport { E2EStatus } from \"../../../utils/ShieldUtils\";\n\ninterface IProps {\n    layout: string;\n    request: VerificationRequest;\n    member: RoomMember | User;\n    phase?: Phase;\n    onClose: () => void;\n    isRoomEncrypted: boolean;\n}\n\ninterface IState {\n    /**\n     * The data for the QR code to display.\n     *\n     * We attempt to calculate this once the verification request transitions into the \"Ready\" phase. If the other\n     * side cannot scan QR codes, it will remain `undefined`.\n     */\n    qrCodeBytes: Uint8ClampedArray | undefined;\n\n    sasEvent: ShowSasCallbacks | null;\n    emojiButtonClicked?: boolean;\n    reciprocateButtonClicked?: boolean;\n    reciprocateQREvent: ShowQrCodeCallbacks | null;\n\n    /**\n     * Details of the other device involved in the transaction.\n     *\n     * `undefined` if there is not (yet) another device in the transaction, or if we do not know about it.\n     */\n    otherDeviceDetails?: Device;\n}\n\nexport default class VerificationPanel extends React.PureComponent<IProps, IState> {\n    private hasVerifier: boolean;\n\n    /** have we yet tried to check the other device's info */\n    private haveCheckedDevice = false;\n\n    /** have we yet tried to get the QR code */\n    private haveFetchedQRCode = false;\n\n    public constructor(props: IProps) {\n        super(props);\n        this.state = { qrCodeBytes: undefined, sasEvent: null, reciprocateQREvent: null };\n        this.hasVerifier = false;\n    }\n\n    private renderQRPhase(): JSX.Element {\n        const { member, request } = this.props;\n        const showSAS: boolean = request.otherPartySupportsMethod(VerificationMethod.Sas);\n        const showQR: boolean = request.otherPartySupportsMethod(VerificationMethod.ScanQrCode);\n        const brand = SdkConfig.get().brand;\n\n        const noCommonMethodError: JSX.Element | null =\n            !showSAS && !showQR ? <p>{_t(\"encryption|verification|no_support_qr_emoji\", { brand })}</p> : null;\n\n        if (this.props.layout === \"dialog\") {\n            // HACK: This is a terrible idea.\n            let qrBlockDialog: JSX.Element | undefined;\n            let sasBlockDialog: JSX.Element | undefined;\n            if (showQR) {\n                qrBlockDialog = (\n                    <div className=\"mx_VerificationPanel_QRPhase_startOption\">\n                        <p>{_t(\"encryption|verification|qr_prompt\")}</p>\n                        <VerificationQRCode qrCodeBytes={this.state.qrCodeBytes} />\n                    </div>\n                );\n            }\n            if (showSAS) {\n                sasBlockDialog = (\n                    <div className=\"mx_VerificationPanel_QRPhase_startOption\">\n                        <p>{_t(\"encryption|verification|sas_prompt\")}</p>\n                        <span className=\"mx_VerificationPanel_QRPhase_helpText\">\n                            {_t(\"encryption|verification|sas_description\")}\n                        </span>\n                        <AccessibleButton\n                            disabled={this.state.emojiButtonClicked}\n                            onClick={this.startSAS}\n                            kind=\"primary\"\n                        >\n                            {_t(\"action|start\")}\n                        </AccessibleButton>\n                    </div>\n                );\n            }\n            const or =\n                qrBlockDialog && sasBlockDialog ? (\n                    <div className=\"mx_VerificationPanel_QRPhase_betweenText\">\n                        {_t(\"encryption|verification|qr_or_sas\", {\n                            emojiCompare: \"\",\n                            qrCode: \"\",\n                        })}\n                    </div>\n                ) : null;\n            return (\n                <div>\n                    {_t(\"encryption|verification|verify_by_completing_one_of\")}\n                    <div className=\"mx_VerificationPanel_QRPhase_startOptions\">\n                        {qrBlockDialog}\n                        {or}\n                        {sasBlockDialog}\n                        {noCommonMethodError}\n                    </div>\n                </div>\n            );\n        }\n\n        let qrBlock: JSX.Element | undefined;\n        if (showQR) {\n            qrBlock = (\n                <div className=\"mx_UserInfo_container\">\n                    <h3>{_t(\"encryption|verification|scan_qr\")}</h3>\n                    <p>\n                        {_t(\"encryption|verification|scan_qr_explainer\", {\n                            displayName: (member as User).displayName || (member as RoomMember).name || member.userId,\n                        })}\n                    </p>\n\n                    <div className=\"mx_VerificationPanel_qrCode\">\n                        <VerificationQRCode qrCodeBytes={this.state.qrCodeBytes} />\n                    </div>\n                </div>\n            );\n        }\n\n        let sasBlock: JSX.Element | undefined;\n        if (showSAS) {\n            const disabled = this.state.emojiButtonClicked;\n            const sasLabel = showQR\n                ? _t(\"encryption|verification|verify_emoji_prompt_qr\")\n                : _t(\"encryption|verification|verify_emoji_prompt\");\n\n            // Note: mx_VerificationPanel_verifyByEmojiButton is for the end-to-end tests\n            sasBlock = (\n                <div className=\"mx_UserInfo_container\">\n                    <h3>{_t(\"encryption|verification|verify_emoji\")}</h3>\n                    <p>{sasLabel}</p>\n                    <AccessibleButton\n                        disabled={disabled}\n                        kind=\"primary\"\n                        className=\"mx_UserInfo_wideButton mx_VerificationPanel_verifyByEmojiButton\"\n                        onClick={this.startSAS}\n                    >\n                        {_t(\"encryption|verification|verify_emoji\")}\n                    </AccessibleButton>\n                </div>\n            );\n        }\n\n        const noCommonMethodBlock = noCommonMethodError ? (\n            <div className=\"mx_UserInfo_container\">{noCommonMethodError}</div>\n        ) : null;\n\n        // TODO: add way to open camera to scan a QR code\n        return (\n            <React.Fragment>\n                {qrBlock}\n                {sasBlock}\n                {noCommonMethodBlock}\n            </React.Fragment>\n        );\n    }\n\n    private onReciprocateYesClick = (): void => {\n        if (!this.state.reciprocateQREvent) return;\n        this.setState({ reciprocateButtonClicked: true });\n        this.state.reciprocateQREvent?.confirm();\n    };\n\n    private onReciprocateNoClick = (): void => {\n        if (!this.state.reciprocateQREvent) return;\n        this.setState({ reciprocateButtonClicked: true });\n        this.state.reciprocateQREvent?.cancel();\n    };\n\n    /**\n     * Get details of the other device involved in the verification, if we haven't before, and store in the state.\n     */\n    private async maybeGetOtherDevice(): Promise<void> {\n        if (this.haveCheckedDevice) return;\n\n        const client = MatrixClientPeg.safeGet();\n        const deviceId = this.props.request?.otherDeviceId;\n        const userId = client.getUserId();\n        if (!deviceId || !userId) {\n            return;\n        }\n        this.haveCheckedDevice = true;\n        this.setState({ otherDeviceDetails: await getDeviceCryptoInfo(client, userId, deviceId) });\n    }\n\n    private renderQRReciprocatePhase(): JSX.Element {\n        const { member, request } = this.props;\n        const description = request.isSelfVerification\n            ? _t(\"encryption|verification|qr_reciprocate_check_again_device\")\n            : _t(\"encryption|verification|qr_reciprocate_same_shield_user\", {\n                  displayName: (member as User).displayName || (member as RoomMember).name || member.userId,\n              });\n        let body: JSX.Element;\n        if (this.state.reciprocateQREvent) {\n            // Element Web doesn't support scanning yet, so assume here we're the client being scanned.\n            body = (\n                <React.Fragment>\n                    <p>{description}</p>\n                    <E2EIcon isUser={true} status={E2EStatus.Verified} size={128} hideTooltip={true} />\n                    <div className=\"mx_VerificationPanel_reciprocateButtons\">\n                        <AccessibleButton\n                            kind=\"primary\"\n                            disabled={this.state.reciprocateButtonClicked}\n                            onClick={this.onReciprocateYesClick}\n                        >\n                            {_t(\"encryption|verification|qr_reciprocate_yes\")}\n                        </AccessibleButton>\n                        <AccessibleButton\n                            disabled={this.state.reciprocateButtonClicked}\n                            onClick={this.onReciprocateNoClick}\n                        >\n                            {_t(\"encryption|verification|qr_reciprocate_no\")}\n                        </AccessibleButton>\n                    </div>\n                </React.Fragment>\n            );\n        } else {\n            body = (\n                <p>\n                    <Spinner as=\"span\" />\n                </p>\n            );\n        }\n        return <div className=\"mx_UserInfo_container mx_VerificationPanel_reciprocate_section\">{body}</div>;\n    }\n\n    private renderVerifiedPhase(): JSX.Element {\n        const { member, request } = this.props;\n\n        let text: string | undefined;\n        if (!request.isSelfVerification) {\n            if (this.props.isRoomEncrypted) {\n                text = _t(\"encryption|verification|prompt_encrypted\");\n            } else {\n                text = _t(\"encryption|verification|prompt_unencrypted\");\n            }\n        }\n\n        let description: string;\n        if (request.isSelfVerification) {\n            description = _t(\"encryption|verification|now_you_can\");\n        } else {\n            description = _t(\"encryption|verification|successful_user\", {\n                displayName: (member as User).displayName || (member as RoomMember).name || member.userId,\n            });\n        }\n\n        return (\n            <div className=\"mx_UserInfo_container mx_VerificationPanel_verified_section\">\n                <p>{description}</p>\n                <E2EIcon isUser={true} status={E2EStatus.Verified} size={128} hideTooltip={true} />\n                {text ? <p>{text}</p> : null}\n                <AccessibleButton kind=\"primary\" className=\"mx_UserInfo_wideButton\" onClick={this.props.onClose}>\n                    {_t(\"action|got_it\")}\n                </AccessibleButton>\n            </div>\n        );\n    }\n\n    private renderCancelledPhase(): JSX.Element {\n        return (\n            <div className=\"mx_UserInfo_container\">\n                <p>{_t(\"encryption|verification|cancelled_verification\")}</p>\n\n                <AccessibleButton kind=\"primary\" className=\"mx_UserInfo_wideButton\" onClick={this.props.onClose}>\n                    {_t(\"action|got_it\")}\n                </AccessibleButton>\n            </div>\n        );\n    }\n\n    public render(): React.ReactNode {\n        const { member, phase, request } = this.props;\n\n        const displayName = (member as User).displayName || (member as RoomMember).name || member.userId;\n\n        switch (phase) {\n            case Phase.Ready:\n                return this.renderQRPhase();\n            case Phase.Started:\n                switch (request.chosenMethod) {\n                    case VerificationMethod.Reciprocate:\n                        return this.renderQRReciprocatePhase();\n                    case VerificationMethod.Sas: {\n                        const emojis = this.state.sasEvent ? (\n                            <VerificationShowSas\n                                displayName={displayName}\n                                otherDeviceDetails={this.state.otherDeviceDetails}\n                                sas={this.state.sasEvent.sas}\n                                onCancel={this.onSasMismatchesClick}\n                                onDone={this.onSasMatchesClick}\n                                isSelf={request.isSelfVerification}\n                            />\n                        ) : (\n                            <Spinner />\n                        );\n                        return <div className=\"mx_UserInfo_container\">{emojis}</div>;\n                    }\n                    default:\n                        return null;\n                }\n            case Phase.Done:\n                return this.renderVerifiedPhase();\n            case Phase.Cancelled:\n                return this.renderCancelledPhase();\n        }\n        logger.error(\"VerificationPanel unhandled phase:\", phase);\n        return null;\n    }\n\n    private startSAS = async (): Promise<void> => {\n        this.setState({ emojiButtonClicked: true });\n        await this.props.request.startVerification(VerificationMethod.Sas);\n    };\n\n    private onSasMatchesClick = (): void => {\n        this.state.sasEvent?.confirm();\n    };\n\n    private onSasMismatchesClick = (): void => {\n        this.state.sasEvent?.mismatch();\n    };\n\n    private updateVerifierState = (): void => {\n        // this method is only called once we know there is a verifier.\n        const verifier = this.props.request.verifier!;\n        const sasEvent = verifier.getShowSasCallbacks();\n        const reciprocateQREvent = verifier.getReciprocateQrCodeCallbacks();\n        verifier.off(VerifierEvent.ShowSas, this.updateVerifierState);\n        verifier.off(VerifierEvent.ShowReciprocateQr, this.updateVerifierState);\n        this.setState({ sasEvent, reciprocateQREvent });\n    };\n\n    private onRequestChange = async (): Promise<void> => {\n        const { request } = this.props;\n\n        // if we have a device ID and did not have one before, fetch the device's details\n        this.maybeGetOtherDevice();\n\n        // if we have had a reply from the other side (ie, the phase is \"ready\") and we have not\n        // yet done so, fetch the QR code\n        if (request.phase === Phase.Ready && !this.haveFetchedQRCode) {\n            this.haveFetchedQRCode = true;\n            request.generateQRCode().then(\n                (buf) => {\n                    this.setState({ qrCodeBytes: buf });\n                },\n                (error) => {\n                    console.error(\"Error generating QR code:\", error);\n                },\n            );\n        }\n\n        const hadVerifier = this.hasVerifier;\n        this.hasVerifier = !!request.verifier;\n        if (!hadVerifier && this.hasVerifier) {\n            request.verifier?.on(VerifierEvent.ShowSas, this.updateVerifierState);\n            request.verifier?.on(VerifierEvent.ShowReciprocateQr, this.updateVerifierState);\n            try {\n                // on the requester side, this is also awaited in startSAS,\n                // but that's ok as verify should return the same promise.\n                await request.verifier?.verify();\n            } catch (err) {\n                logger.error(\"error verify\", err);\n            }\n        }\n    };\n\n    public componentDidMount(): void {\n        const { request } = this.props;\n        request.on(VerificationRequestEvent.Change, this.onRequestChange);\n        if (request.verifier) {\n            const sasEvent = request.verifier.getShowSasCallbacks();\n            const reciprocateQREvent = request.verifier.getReciprocateQrCodeCallbacks();\n            this.setState({ sasEvent, reciprocateQREvent });\n        }\n        this.onRequestChange();\n    }\n\n    public componentWillUnmount(): void {\n        const { request } = this.props;\n        if (request.verifier) {\n            request.verifier.off(VerifierEvent.ShowSas, this.updateVerifierState);\n            request.verifier.off(VerifierEvent.ShowReciprocateQr, this.updateVerifierState);\n        }\n        request.off(VerificationRequestEvent.Change, this.onRequestChange);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { VerificationPhase, type VerificationRequest, VerificationRequestEvent } from \"matrix-js-sdk/src/crypto-api\";\nimport { type RoomMember, type User } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n// ErrorDialog needs path to the image, not the image node\n// eslint-disable-next-line no-restricted-imports\nimport ErrorSolidIcon from \"@vector-im/compound-design-tokens/icons/error-solid.svg\";\n\nimport EncryptionInfo from \"./EncryptionInfo\";\nimport VerificationPanel from \"./VerificationPanel\";\nimport { ensureDMExists } from \"../../../createRoom\";\nimport { useTypedEventEmitter } from \"../../../hooks/useEventEmitter\";\nimport Modal from \"../../../Modal\";\nimport { _t } from \"../../../languageHandler\";\nimport { RightPanelPhases } from \"../../../stores/right-panel/RightPanelStorePhases\";\nimport ErrorDialog from \"../dialogs/ErrorDialog\";\nimport { SDKContext } from \"../../../contexts/SDKContext.ts\";\n\n// cancellation codes which constitute a key mismatch\nconst MISMATCHES = [\"m.key_mismatch\", \"m.user_error\", \"m.mismatched_sas\"];\n\ninterface IProps {\n    member: RoomMember | User;\n    onClose: () => void;\n    verificationRequest?: VerificationRequest;\n    verificationRequestPromise?: Promise<VerificationRequest>;\n    layout: string;\n    isRoomEncrypted: boolean;\n}\n\nconst EncryptionPanel: React.FC<IProps> = (props: IProps) => {\n    const sdkContext = useContext(SDKContext);\n    const { verificationRequest, verificationRequestPromise, member, onClose, layout, isRoomEncrypted } = props;\n    const [request, setRequest] = useState(verificationRequest);\n    // state to show a spinner immediately after clicking \"start verification\",\n    // before we have a request\n    const [isRequesting, setRequesting] = useState(false);\n    const [phase, doSetPhase] = useState(request?.phase);\n    const setPhase = (phase: VerificationPhase | undefined): void => {\n        logger.debug(`EncryptionPanel: phase now ${phase === undefined ? phase : VerificationPhase[phase]}`);\n        doSetPhase(phase);\n    };\n\n    useEffect(() => {\n        setRequest(verificationRequest);\n        if (verificationRequest) {\n            setRequesting(false);\n            setPhase(verificationRequest.phase);\n        }\n    }, [verificationRequest]);\n\n    useEffect(() => {\n        async function awaitPromise(): Promise<void> {\n            setRequesting(true);\n            const requestFromPromise = await verificationRequestPromise;\n            setRequesting(false);\n            setRequest(requestFromPromise);\n            setPhase(requestFromPromise?.phase);\n        }\n        if (verificationRequestPromise) {\n            awaitPromise();\n        }\n    }, [verificationRequestPromise]);\n    // Use a ref to track whether we are already showing the mismatch modal as state may not update fast enough\n    // if two change events are fired in quick succession like can happen with rust crypto.\n    const isShowingMismatchModal = useRef(false);\n    const changeHandler = useCallback(() => {\n        // handle transitions -> cancelled for mismatches which fire a modal instead of showing a card\n        if (\n            !isShowingMismatchModal.current &&\n            request?.phase === VerificationPhase.Cancelled &&\n            MISMATCHES.includes(request.cancellationCode ?? \"\")\n        ) {\n            isShowingMismatchModal.current = true;\n            Modal.createDialog(ErrorDialog, {\n                headerImage: ErrorSolidIcon,\n                title: _t(\"encryption|messages_not_secure|title\"),\n                description: (\n                    <div>\n                        {_t(\"encryption|messages_not_secure|heading\")}\n                        <ul>\n                            <li>{_t(\"encryption|messages_not_secure|cause_1\")}</li>\n                            <li>{_t(\"encryption|messages_not_secure|cause_2\")}</li>\n                            <li>{_t(\"encryption|messages_not_secure|cause_3\")}</li>\n                            <li>{_t(\"encryption|messages_not_secure|cause_4\")}</li>\n                        </ul>\n                    </div>\n                ),\n                onFinished: onClose,\n            });\n            return; // don't update phase here as we will be transitioning away from this view shortly\n        }\n\n        if (request) {\n            setPhase(request.phase);\n        }\n    }, [onClose, request]);\n\n    useTypedEventEmitter(request, VerificationRequestEvent.Change, changeHandler);\n\n    const onStartVerification = useCallback(async (): Promise<void> => {\n        setRequesting(true);\n        let verificationRequest_: VerificationRequest;\n        try {\n            const roomId = await ensureDMExists(sdkContext.client!, member.userId);\n            if (!roomId) {\n                throw new Error(\"Unable to create Room for verification\");\n            }\n            verificationRequest_ = await sdkContext.client!.getCrypto()!.requestVerificationDM(member.userId, roomId);\n        } catch (e) {\n            console.error(\"Error starting verification\", e);\n            setRequesting(false);\n\n            Modal.createDialog(ErrorDialog, {\n                headerImage: ErrorSolidIcon,\n                title: _t(\"encryption|verification|error_starting_title\"),\n                description: _t(\"encryption|verification|error_starting_description\"),\n            });\n            return;\n        }\n        setRequest(verificationRequest_);\n        setPhase(verificationRequest_.phase);\n        // Notify the RightPanelStore about this\n        if (sdkContext.rightPanelStore.currentCard.phase != RightPanelPhases.EncryptionPanel) {\n            sdkContext.rightPanelStore.pushCard({\n                phase: RightPanelPhases.EncryptionPanel,\n                state: { member, verificationRequest: verificationRequest_ },\n            });\n        }\n        if (!sdkContext.rightPanelStore.isOpen) sdkContext.rightPanelStore.togglePanel(null);\n    }, [sdkContext.client, sdkContext.rightPanelStore, member]);\n\n    const requested: boolean =\n        (!request && isRequesting) ||\n        (!!request &&\n            (phase === VerificationPhase.Requested || phase === VerificationPhase.Unsent || phase === undefined));\n    const isSelfVerification = request ? request.isSelfVerification : member.userId === sdkContext.client?.getUserId();\n\n    if (!request || requested) {\n        const initiatedByMe = (!request && isRequesting) || (!!request && request.initiatedByMe);\n        return (\n            <EncryptionInfo\n                isRoomEncrypted={isRoomEncrypted}\n                onStartVerification={onStartVerification}\n                member={member}\n                isSelfVerification={isSelfVerification}\n                waitingForOtherParty={requested && initiatedByMe}\n                waitingForNetwork={requested && !initiatedByMe}\n                inDialog={layout === \"dialog\"}\n            />\n        );\n    } else {\n        return (\n            <VerificationPanel\n                isRoomEncrypted={isRoomEncrypted}\n                layout={layout}\n                onClose={onClose}\n                member={member}\n                request={request}\n                key={request.transactionId}\n                phase={phase}\n            />\n        );\n    }\n};\n\nexport default EncryptionPanel;\n","/*\nCopyright 2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\nimport { useEffect, useState } from \"react\";\nimport {\n    type MatrixClient,\n    MatrixError,\n    ProfileKeyMSC4175Timezone,\n    ProfileKeyTimezone,\n} from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { getTwelveHourOptions } from \"../DateUtils.ts\";\nimport { useSettingValue } from \"./useSettings.ts\";\n\nconst log = logger.getChild(\"useUserTimezone\");\n\n/**\n * Fetch a user's delclared timezone through their profile, and return\n * a friendly string of the current time for that user. This will keep\n * in sync with the current time, and will be refreshed once a minute.\n *\n * @param cli The Matrix Client instance.\n * @param userId The userID to fetch the timezone for.\n * @returns A timezone name and friendly string for the user's timezone, or\n *          null if the user has no timezone or the timezone was not recognised\n *          by the browser.\n */\nexport const useUserTimezone = (cli: MatrixClient, userId: string): { timezone: string; friendly: string } | null => {\n    const [timezone, setTimezone] = useState<string>();\n    const [updateInterval, setUpdateInterval] = useState<ReturnType<typeof setTimeout>>();\n    const [friendly, setFriendly] = useState<string>();\n    const [supported, setSupported] = useState<boolean>();\n    const showTwelveHour = useSettingValue(\"showTwelveHourTimestamps\");\n\n    useEffect(() => {\n        if (!cli || supported !== undefined) {\n            return;\n        }\n        cli.doesServerSupportExtendedProfiles()\n            .then(setSupported)\n            .catch((ex) => {\n                console.warn(\"Unable to determine if extended profiles are supported\", ex);\n            });\n    }, [supported, cli]);\n\n    useEffect(() => {\n        return () => {\n            if (updateInterval) {\n                clearInterval(updateInterval);\n            }\n        };\n    }, [updateInterval]);\n\n    useEffect(() => {\n        if (supported !== true) {\n            return;\n        }\n        (async () => {\n            log.debug(\"Trying to fetch TZ for\", userId);\n            try {\n                const userProfile = await cli.getExtendedProfile(userId);\n                // In a future spec release, remove support for legacy key.\n                const tz = userProfile[ProfileKeyTimezone] ?? userProfile[ProfileKeyMSC4175Timezone];\n                if (typeof tz !== \"string\") {\n                    // Definitely not a tz.\n                    throw Error(\"Timezone value was not a string\");\n                }\n                // This will validate the timezone for us.\n                // eslint-disable-next-line new-cap\n                Intl.DateTimeFormat(undefined, { timeZone: tz });\n\n                const updateTime = (): void => {\n                    const currentTime = new Date();\n                    const friendly = currentTime.toLocaleString(undefined, {\n                        ...getTwelveHourOptions(showTwelveHour),\n                        timeZone: tz,\n                        hour: \"2-digit\",\n                        minute: \"2-digit\",\n                        timeZoneName: \"shortOffset\",\n                    });\n                    setTimezone(tz);\n                    setFriendly(friendly);\n                    setUpdateInterval(setTimeout(updateTime, (60 - currentTime.getSeconds()) * 1000));\n                };\n                updateTime();\n            } catch (ex) {\n                setTimezone(undefined);\n                setFriendly(undefined);\n                setUpdateInterval(undefined);\n                if (ex instanceof MatrixError && ex.errcode === \"M_NOT_FOUND\") {\n                    // No timezone set, ignore.\n                    return;\n                }\n                log.warn(`Could not render current timezone for ${userId}`, ex);\n            }\n        })();\n    }, [supported, userId, cli, showTwelveHour]);\n\n    if (!timezone || !friendly) {\n        return null;\n    }\n\n    return {\n        friendly,\n        timezone,\n    };\n};\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { RoomMember, type User } from \"matrix-js-sdk/src/matrix\";\nimport { useCallback, useContext } from \"react\";\n\nimport { mediaFromMxc } from \"../../../../customisations/Media\";\nimport Modal from \"../../../../Modal\";\nimport ImageView from \"../../../views/elements/ImageView\";\nimport SdkConfig from \"../../../../SdkConfig\";\nimport MatrixClientContext from \"../../../../contexts/MatrixClientContext\";\nimport { type Member } from \"../../../views/right_panel/UserInfo\";\nimport { useUserTimezone } from \"../../../../hooks/useUserTimezone\";\nimport UserIdentifierCustomisations from \"../../../../customisations/UserIdentifier\";\n\nexport interface PresenceInfo {\n    lastActiveAgo: number | undefined;\n    currentlyActive: boolean | undefined;\n    state: string | undefined;\n}\n\nexport interface TimezoneInfo {\n    timezone: string;\n    friendly: string;\n}\n\nexport interface UserInfoHeaderState {\n    /**\n     * callback function when selected user avatar is clicked in user info\n     */\n    onMemberAvatarClick: () => void;\n    /**\n     * Object containing information about the precense of the selected user\n     */\n    precenseInfo: PresenceInfo;\n    /**\n     * Boolean that show or hide the precense information\n     */\n    showPresence: boolean;\n    /**\n     *  Timezone object\n     */\n    timezoneInfo: TimezoneInfo | null;\n    /**\n     * Displayed identifier for the selected user\n     */\n    userIdentifier: string | null;\n}\ninterface UserInfoHeaderViewModelProps {\n    member: Member;\n    roomId?: string;\n}\n\n/**\n * View model for the userInfoHeaderView\n * props\n * @see {@link UserInfoHeaderState} for more information about what this view model returns.\n */\nexport function useUserfoHeaderViewModel({ member, roomId }: UserInfoHeaderViewModelProps): UserInfoHeaderState {\n    const cli = useContext(MatrixClientContext);\n\n    let showPresence = true;\n\n    const precenseInfo: PresenceInfo = {\n        lastActiveAgo: undefined,\n        currentlyActive: undefined,\n        state: undefined,\n    };\n\n    const enablePresenceByHsUrl = SdkConfig.get(\"enable_presence_by_hs_url\");\n\n    const timezoneInfo = useUserTimezone(cli, member.userId);\n\n    const userIdentifier = UserIdentifierCustomisations.getDisplayUserIdentifier?.(member.userId, {\n        roomId,\n        withDisplayName: true,\n    });\n\n    const onMemberAvatarClick = useCallback(() => {\n        const avatarUrl = (member as RoomMember).getMxcAvatarUrl\n            ? (member as RoomMember).getMxcAvatarUrl()\n            : (member as User).avatarUrl;\n\n        const httpUrl = mediaFromMxc(avatarUrl).srcHttp;\n        if (!httpUrl) return;\n\n        const params = {\n            src: httpUrl,\n            name: (member as RoomMember).name || (member as User).displayName,\n        };\n\n        Modal.createDialog(ImageView, params, \"mx_Dialog_lightbox\", undefined, true);\n    }, [member]);\n\n    if (member instanceof RoomMember && member.user) {\n        precenseInfo.state = member.user.presence;\n        precenseInfo.lastActiveAgo = member.user.lastActiveAgo;\n        precenseInfo.currentlyActive = member.user.currentlyActive;\n    }\n\n    if (enablePresenceByHsUrl && enablePresenceByHsUrl[cli.baseUrl] !== undefined) {\n        showPresence = enablePresenceByHsUrl[cli.baseUrl];\n    }\n\n    return {\n        onMemberAvatarClick,\n        showPresence,\n        precenseInfo,\n        timezoneInfo,\n        userIdentifier,\n    };\n}\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient, type RoomMember, type User } from \"matrix-js-sdk/src/matrix\";\nimport { useContext } from \"react\";\nimport { type UserVerificationStatus } from \"matrix-js-sdk/src/crypto-api\";\n\nimport { type IDevice } from \"../../../views/right_panel/UserInfo\";\nimport { useAsyncMemo } from \"../../../../hooks/useAsyncMemo\";\nimport { verifyUser } from \"../../../../verification\";\nimport { SDKContext } from \"../../../../contexts/SDKContext.ts\";\n\nexport interface UserInfoVerificationSectionState {\n    /**\n     * variables used to check if we can verify the user and display the verify button\n     */\n    canVerify: boolean;\n    hasCrossSigningKeys: boolean | undefined;\n    /**\n     * used to display correct badge value\n     */\n    isUserVerified: boolean;\n    /**\n     * callback function when verifyUser button is clicked\n     */\n    verifySelectedUser: () => void;\n}\n\nconst useHasCrossSigningKeys = (cli: MatrixClient, member: User, canVerify: boolean): boolean | undefined => {\n    return useAsyncMemo(async () => {\n        if (!canVerify) return undefined;\n        return cli.getCrypto()?.userHasCrossSigningKeys(member.userId, true);\n    }, [cli, member, canVerify]);\n};\n\n/**\n * View model for the userInfoVerificationHeaderView\n * @see {@link UserInfoVerificationSectionState} for more information about what this view model returns.\n */\nexport const useUserInfoVerificationViewModel = (\n    member: User | RoomMember,\n    devices: IDevice[],\n): UserInfoVerificationSectionState => {\n    const sdkContext = useContext(SDKContext);\n\n    const userTrust = useAsyncMemo<UserVerificationStatus | undefined>(\n        async () => sdkContext.client?.getCrypto()?.getUserVerificationStatus(member.userId),\n        [member.userId],\n        // the user verification status is not initialized\n        undefined,\n    );\n    const hasUserVerificationStatus = Boolean(userTrust);\n    const isUserVerified = Boolean(userTrust?.isVerified());\n    const isMe = member.userId === sdkContext.client!.getUserId();\n    const canVerify = hasUserVerificationStatus && !isUserVerified && !isMe && devices && devices.length > 0;\n\n    const hasCrossSigningKeys = useHasCrossSigningKeys(sdkContext.client!, member as User, canVerify);\n    const verifySelectedUser = (): void => verifyUser(sdkContext.rightPanelStore, sdkContext.client!, member as User);\n\n    return {\n        canVerify,\n        hasCrossSigningKeys,\n        isUserVerified,\n        verifySelectedUser,\n    };\n};\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type User, type RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { Text, Button, InlineSpinner, Badge } from \"@vector-im/compound-web\";\nimport { VerifiedIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\nimport { Flex } from \"@element-hq/web-shared-components\";\n\nimport { useUserInfoVerificationViewModel } from \"../../../viewmodels/right_panel/user_info/UserInfoHeaderVerificationViewModel\";\nimport { type IDevice } from \"../UserInfo\";\nimport { _t } from \"../../../../languageHandler\";\n\nexport const UserInfoHeaderVerificationView: React.FC<{\n    member: User | RoomMember;\n    devices: IDevice[];\n}> = ({ member, devices }) => {\n    let content;\n    const vm = useUserInfoVerificationViewModel(member, devices);\n\n    if (vm.isUserVerified) {\n        content = (\n            <Badge kind=\"green\" className=\"mx_UserInfo_verified_badge\">\n                <VerifiedIcon className=\"mx_UserInfo_verified_icon\" height=\"16px\" width=\"16px\" />\n                <Text size=\"sm\" weight=\"medium\" className=\"mx_UserInfo_verified_label\">\n                    {_t(\"common|verified\")}\n                </Text>\n            </Badge>\n        );\n    } else if (vm.hasCrossSigningKeys === undefined) {\n        // We are still fetching the cross-signing keys for the user, show spinner.\n        content = <InlineSpinner size={24} />;\n    } else if (vm.canVerify && vm.hasCrossSigningKeys) {\n        content = (\n            <div className=\"mx_UserInfo_container_verifyButton\">\n                <Button\n                    className=\"mx_UserInfo_verify_button\"\n                    kind=\"tertiary\"\n                    size=\"md\"\n                    onClick={() => vm.verifySelectedUser()}\n                >\n                    {_t(\"user_info|verify_button\")}\n                </Button>\n            </div>\n        );\n    } else {\n        content = (\n            <Text className=\"mx_UserInfo_verification_unavailable\" size=\"sm\">\n                ({_t(\"user_info|verification_unavailable\")})\n            </Text>\n        );\n    }\n\n    return (\n        <Flex justify=\"center\" align=\"center\" className=\"mx_UserInfo_verification\">\n            {content}\n        </Flex>\n    );\n};\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport { type User, type RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { Heading, Tooltip, Text } from \"@vector-im/compound-web\";\nimport { Flex, StatusTextView } from \"@element-hq/web-shared-components\";\n\nimport { useUserfoHeaderViewModel } from \"../../../viewmodels/right_panel/user_info/UserInfoHeaderViewModel\";\nimport MemberAvatar from \"../../avatars/MemberAvatar\";\nimport { Container, type Member, type IDevice } from \"../UserInfo\";\nimport PresenceLabel from \"../../rooms/PresenceLabel\";\nimport CopyableText from \"../../elements/CopyableText\";\nimport { UserInfoHeaderVerificationView } from \"./UserInfoHeaderVerificationView\";\nimport { useUserStatus } from \"../../../../hooks/useUserStatus\";\n\nexport interface UserInfoHeaderViewProps {\n    member: Member;\n    roomId?: string;\n    devices: IDevice[];\n    hideVerificationSection: boolean;\n}\n\nexport const UserInfoHeaderView: React.FC<UserInfoHeaderViewProps> = ({\n    member,\n    devices,\n    roomId,\n    hideVerificationSection,\n}) => {\n    const vm = useUserfoHeaderViewModel({ member, roomId });\n    const avatarUrl = (member as User).avatarUrl;\n    const displayName = (member as RoomMember).rawDisplayName;\n    const userStatus = useUserStatus(member.userId);\n\n    let presenceLabel: JSX.Element | undefined;\n\n    if (vm.showPresence) {\n        presenceLabel = (\n            <PresenceLabel\n                activeAgo={vm.precenseInfo.lastActiveAgo}\n                currentlyActive={vm.precenseInfo.currentlyActive}\n                presenceState={vm.precenseInfo.state}\n                className=\"mx_UserInfo_profileStatus\"\n                coloured\n            />\n        );\n    }\n\n    return (\n        <React.Fragment>\n            <div className=\"mx_UserInfo_avatar\">\n                <div className=\"mx_UserInfo_avatar_transition\">\n                    <div className=\"mx_UserInfo_avatar_transition_child\">\n                        <MemberAvatar\n                            key={member.userId} // to instantly blank the avatar when UserInfo changes members\n                            member={member as RoomMember}\n                            size=\"120px\"\n                            resizeMethod=\"scale\"\n                            fallbackUserId={member.userId}\n                            onClick={vm.onMemberAvatarClick}\n                            urls={avatarUrl ? [avatarUrl] : undefined}\n                        />\n                    </div>\n                </div>\n            </div>\n\n            <Container className=\"mx_UserInfo_header\">\n                <Flex direction=\"column\" align=\"center\" className=\"mx_UserInfo_profile\">\n                    <Heading size=\"sm\" weight=\"semibold\" as=\"h1\" dir=\"auto\">\n                        <Flex className=\"mx_UserInfo_profile_name\" direction=\"row-reverse\" align=\"center\">\n                            {displayName}\n                        </Flex>\n                    </Heading>\n                    {userStatus && <StatusTextView status={userStatus} />}\n                    {presenceLabel}\n                    {vm.timezoneInfo && (\n                        <Tooltip label={vm.timezoneInfo?.timezone ?? \"\"}>\n                            <Flex align=\"center\" className=\"mx_UserInfo_timezone\">\n                                <Text size=\"sm\" weight=\"regular\">\n                                    {vm.timezoneInfo?.friendly ?? \"\"}\n                                </Text>\n                            </Flex>\n                        </Tooltip>\n                    )}\n                    <Text size=\"sm\" weight=\"semibold\" className=\"mx_UserInfo_profile_mxid\">\n                        <CopyableText getTextToCopy={() => vm.userIdentifier} border={false}>\n                            {vm.userIdentifier}\n                        </CopyableText>\n                    </Text>\n                </Flex>\n                {!hideVerificationSection && <UserInfoHeaderVerificationView member={member} devices={devices} />}\n            </Container>\n        </React.Fragment>\n    );\n};\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport {\n    EventType,\n    type RoomMember,\n    type IPowerLevelsContent,\n    type Room,\n    RoomStateEvent,\n    type MatrixClient,\n    type User,\n    type MatrixEvent,\n} from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { useAsyncMemo } from \"../../../../hooks/useAsyncMemo\";\nimport { useTypedEventEmitter } from \"../../../../hooks/useEventEmitter\";\nimport Modal from \"../../../../Modal\";\nimport ErrorDialog from \"../../../views/dialogs/ErrorDialog\";\nimport { _t } from \"../../../../languageHandler\";\nimport { type IRoomPermissions } from \"../../../views/right_panel/UserInfo\";\nimport { useMatrixClientContext } from \"../../../../contexts/MatrixClientContext\";\nimport QuestionDialog from \"../../../views/dialogs/QuestionDialog\";\nimport DMRoomMap from \"../../../../utils/DMRoomMap\";\n\nexport interface UserInfoBasicState {\n    // current room powerlevels\n    powerLevels: IPowerLevelsContent;\n    // getting user permissions in this room\n    roomPermissions: IRoomPermissions;\n    // numbers of operation in progress > 0\n    pendingUpdateCount: number;\n    // true if user is me\n    isMe: boolean;\n    // true if room is a DM for the user\n    isRoomDMForMember: boolean;\n    // Boolean to hide or show the deactivate button\n    showDeactivateButton: boolean;\n    // Method called when a deactivate user action is triggered\n    onSynapseDeactivate: () => void;\n    startUpdating: () => void;\n    stopUpdating: () => void;\n}\n\nexport const getPowerLevels = (room: Room): IPowerLevelsContent =>\n    room?.currentState?.getStateEvents(EventType.RoomPowerLevels, \"\")?.getContent() || {};\n\nexport const useRoomPermissions = (cli: MatrixClient, room: Room, user: RoomMember): IRoomPermissions => {\n    const [roomPermissions, setRoomPermissions] = useState<IRoomPermissions>({\n        // modifyLevelMax is the max PL we can set this user to, typically min(their PL, our PL) && canSetPL\n        modifyLevelMax: -1,\n        canEdit: false,\n        canInvite: false,\n    });\n\n    const updateRoomPermissions = useCallback(() => {\n        const powerLevels = room?.currentState.getStateEvents(EventType.RoomPowerLevels, \"\")?.getContent();\n        if (!powerLevels) return;\n\n        const me = room.getMember(cli.getUserId() || \"\");\n        if (!me) return;\n\n        const them = user;\n        const isMe = me.userId === them.userId;\n        const canAffectUser = them.powerLevel < me.powerLevel || isMe;\n\n        let modifyLevelMax = -1;\n        if (canAffectUser) {\n            const editPowerLevel = powerLevels.events?.[EventType.RoomPowerLevels] ?? powerLevels.state_default ?? 50;\n            if (me.powerLevel >= editPowerLevel) {\n                modifyLevelMax = me.powerLevel;\n            }\n        }\n\n        setRoomPermissions({\n            canInvite: me.powerLevel >= (powerLevels.invite ?? 0),\n            canEdit: modifyLevelMax >= 0,\n            modifyLevelMax,\n        });\n    }, [cli, user, room]);\n\n    useTypedEventEmitter(cli, RoomStateEvent.Update, updateRoomPermissions);\n    useEffect(() => {\n        updateRoomPermissions();\n        return () => {\n            setRoomPermissions({\n                modifyLevelMax: -1,\n                canEdit: false,\n                canInvite: false,\n            });\n        };\n    }, [updateRoomPermissions]);\n\n    return roomPermissions;\n};\n\nconst useIsSynapseAdmin = (cli?: MatrixClient): boolean => {\n    return useAsyncMemo(async () => (cli ? cli.isSynapseAdministrator().catch(() => false) : false), [cli], false);\n};\n\nexport const useRoomPowerLevels = (cli: MatrixClient, room: Room): IPowerLevelsContent => {\n    const [powerLevels, setPowerLevels] = useState<IPowerLevelsContent>(getPowerLevels(room));\n\n    const update = useCallback(\n        (ev?: MatrixEvent) => {\n            if (!room) return;\n            if (ev && ev.getType() !== EventType.RoomPowerLevels) return;\n            setPowerLevels(getPowerLevels(room));\n        },\n        [room],\n    );\n\n    useTypedEventEmitter(cli, RoomStateEvent.Events, update);\n    useEffect(() => {\n        update();\n        return () => {\n            setPowerLevels({});\n        };\n    }, [update]);\n    return powerLevels;\n};\n\nexport const useUserInfoBasicViewModel = (room: Room, member: User | RoomMember): UserInfoBasicState => {\n    const cli = useMatrixClientContext();\n\n    const powerLevels = useRoomPowerLevels(cli, room);\n    // Load whether or not we are a Synapse Admin\n    const isSynapseAdmin = useIsSynapseAdmin(cli);\n\n    // Count of how many operations are currently in progress, if > 0 then show a Spinner\n    const [pendingUpdateCount, setPendingUpdateCount] = useState(0);\n\n    const roomPermissions = useRoomPermissions(cli, room, member as RoomMember);\n\n    // selected member is current user\n    const isMe = member.userId === cli.getUserId();\n\n    // is needed to hide the Roles section for DMs as it doesn't make sense there\n    const isRoomDMForMember = !!DMRoomMap.shared().getUserIdForRoomId((member as RoomMember).roomId);\n\n    // used to check if user can deactivate another member\n    const isMemberSameDomain = member.userId.endsWith(`:${cli.getDomain()}`);\n\n    // We don't need a perfect check here, just something to pass as \"probably not our homeserver\". If\n    // someone does figure out how to bypass this check the worst that happens is an error.\n    const showDeactivateButton = isSynapseAdmin && isMemberSameDomain;\n\n    const startUpdating = useCallback(() => {\n        setPendingUpdateCount(pendingUpdateCount + 1);\n    }, [pendingUpdateCount]);\n\n    const stopUpdating = useCallback(() => {\n        setPendingUpdateCount(pendingUpdateCount - 1);\n    }, [pendingUpdateCount]);\n\n    const onSynapseDeactivate = useCallback(async () => {\n        const { finished } = Modal.createDialog(QuestionDialog, {\n            title: _t(\"user_info|deactivate_confirm_title\"),\n            description: <div>{_t(\"user_info|deactivate_confirm_description\")}</div>,\n            button: _t(\"user_info|deactivate_confirm_action\"),\n            danger: true,\n        });\n\n        const [accepted] = await finished;\n        if (!accepted) return;\n        try {\n            await cli.deactivateSynapseUser(member.userId);\n        } catch (err) {\n            logger.error(\"Failed to deactivate user\");\n            logger.error(err);\n\n            const description = err instanceof Error ? err.message : _t(\"invite|failed_generic\");\n\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"user_info|error_deactivate\"),\n                description,\n            });\n        }\n    }, [cli, member.userId]);\n\n    return {\n        showDeactivateButton,\n        powerLevels,\n        roomPermissions,\n        pendingUpdateCount,\n        isMe,\n        isRoomDMForMember,\n        onSynapseDeactivate,\n        startUpdating,\n        stopUpdating,\n    };\n};\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useContext, useEffect, useState, useCallback } from \"react\";\nimport { logger } from \"@sentry/browser\";\nimport { type RoomMember, type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { _t } from \"../../../languageHandler\";\nimport Modal from \"../../../Modal\";\nimport ErrorDialog from \"../../views/dialogs/ErrorDialog\";\nimport QuestionDialog from \"../../views/dialogs/QuestionDialog\";\nimport { warnSelfDemote } from \"../../views/right_panel/UserInfo\";\n\n/**\n *\n */\nexport interface UserInfoPowerLevelState {\n    /**\n     * default power level value of the selected user\n     */\n    powerLevelUsersDefault: number;\n    /**\n     * The new power level to apply\n     */\n    selectedPowerLevel: number;\n    /**\n     * Method to call When power level selection change\n     */\n    onPowerChange: (powerLevel: number) => void;\n}\n\nexport const useUserInfoPowerlevelViewModel = (user: RoomMember, room: Room): UserInfoPowerLevelState => {\n    const [selectedPowerLevel, setSelectedPowerLevel] = useState(user.powerLevel);\n\n    useEffect(() => {\n        setSelectedPowerLevel(user.powerLevel);\n    }, [user]);\n\n    const cli = useContext(MatrixClientContext);\n    const onPowerChange = useCallback(\n        async (powerLevel: number) => {\n            setSelectedPowerLevel(powerLevel);\n\n            const applyPowerChange = (roomId: string, target: string, powerLevel: number): Promise<unknown> => {\n                return cli.setPowerLevel(roomId, target, powerLevel).then(\n                    function () {\n                        logger.info(\"Power change success\");\n                    },\n                    function (err) {\n                        logger.error(\"Failed to change power level \" + err);\n                        Modal.createDialog(ErrorDialog, {\n                            title: _t(\"common|error\"),\n                            description: _t(\"error|update_power_level\"),\n                        });\n                    },\n                );\n            };\n\n            const roomId = user.roomId;\n            const target = user.userId;\n\n            const powerLevelEvent = room.currentState.getStateEvents(\"m.room.power_levels\", \"\");\n            if (!powerLevelEvent) return;\n\n            const myUserId = cli.getUserId();\n            const myPower = powerLevelEvent.getContent().users[myUserId || \"\"];\n            if (myPower && parseInt(myPower) <= powerLevel && myUserId !== target) {\n                const { finished } = Modal.createDialog(QuestionDialog, {\n                    title: _t(\"common|warning\"),\n                    description: (\n                        <div>\n                            {_t(\"user_info|promote_warning\")}\n                            <br />\n                            {_t(\"common|are_you_sure\")}\n                        </div>\n                    ),\n                    button: _t(\"action|continue\"),\n                });\n\n                const [confirmed] = await finished;\n                if (!confirmed) return;\n            } else if (myUserId === target && myPower && parseInt(myPower) > powerLevel) {\n                // If we are changing our own PL it can only ever be decreasing, which we cannot reverse.\n                try {\n                    if (!(await warnSelfDemote(room?.isSpaceRoom()))) return;\n                } catch (e) {\n                    logger.error(\"Failed to warn about self demotion: \" + e);\n                }\n            }\n\n            await applyPowerChange(roomId, target, powerLevel);\n        },\n        [user.roomId, user.userId, cli, room],\n    );\n\n    const powerLevelEvent = room.currentState.getStateEvents(\"m.room.power_levels\", \"\");\n    const powerLevelUsersDefault = powerLevelEvent ? powerLevelEvent.getContent().users_default : 0;\n\n    return {\n        powerLevelUsersDefault,\n        onPowerChange,\n        selectedPowerLevel,\n    };\n};\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type RoomMember, type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { textualPowerLevel } from \"../../../../Roles\";\nimport PowerSelector from \"../../elements/PowerSelector\";\nimport { type IRoomPermissions } from \"../UserInfo\";\nimport {\n    type UserInfoPowerLevelState,\n    useUserInfoPowerlevelViewModel,\n} from \"../../../viewmodels/right_panel/UserInfoPowerlevelViewModel\";\n\nexport const PowerLevelSection: React.FC<{\n    user: RoomMember;\n    room: Room;\n    roomPermissions: IRoomPermissions;\n}> = ({ user, room, roomPermissions }) => {\n    const vm = useUserInfoPowerlevelViewModel(user, room);\n\n    if (roomPermissions.canEdit) {\n        return <PowerLevelEditor vm={vm} roomPermissions={roomPermissions} />;\n    }\n\n    const powerLevel = user.powerLevel;\n    const role = textualPowerLevel(powerLevel, vm.powerLevelUsersDefault);\n    return (\n        <div className=\"mx_UserInfo_profileField\">\n            <div className=\"mx_UserInfo_roleDescription\">{role}</div>\n        </div>\n    );\n};\n\nexport const PowerLevelEditor: React.FC<{\n    vm: UserInfoPowerLevelState;\n    roomPermissions: IRoomPermissions;\n}> = ({ vm, roomPermissions }) => {\n    return (\n        <div className=\"mx_UserInfo_profileField\">\n            <PowerSelector\n                label={undefined}\n                value={vm.selectedPowerLevel}\n                maxValue={roomPermissions.modifyLevelMax}\n                usersDefault={vm.powerLevelUsersDefault}\n                onChange={vm.onPowerChange}\n            />\n        </div>\n    );\n};\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useContext, useEffect, useState, useCallback } from \"react\";\nimport { type RoomMember, User, ClientEvent, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport MatrixClientContext from \"../../../../contexts/MatrixClientContext\";\nimport { _t } from \"../../../../languageHandler\";\nimport Modal from \"../../../../Modal\";\nimport QuestionDialog from \"../../../views/dialogs/QuestionDialog\";\nimport { useTypedEventEmitter } from \"../../../../hooks/useEventEmitter\";\n\nexport interface UserInfoPowerLevelState {\n    /**\n     * Weither the member is ignored by current user or not\n     */\n    isIgnored: boolean;\n    /**\n     * Trigger the method to ignore or unignore a user\n     * @param ev - The click event\n     */\n    ignoreButtonClick: (ev: Event) => void;\n}\n\nexport const useUserInfoIgnoreButtonViewModel = (member: User | RoomMember): UserInfoPowerLevelState => {\n    const cli = useContext(MatrixClientContext);\n\n    const unignore = useCallback(() => {\n        const ignoredUsers = cli.getIgnoredUsers();\n        const index = ignoredUsers.indexOf(member.userId);\n        if (index !== -1) ignoredUsers.splice(index, 1);\n        cli.setIgnoredUsers(ignoredUsers);\n    }, [cli, member]);\n\n    const ignore = useCallback(async () => {\n        const name = (member instanceof User ? member.displayName : member.name) || member.userId;\n        const { finished } = Modal.createDialog(QuestionDialog, {\n            title: _t(\"user_info|ignore_confirm_title\", { user: name }),\n            description: <div>{_t(\"user_info|ignore_confirm_description\")}</div>,\n            button: _t(\"action|ignore\"),\n        });\n        const [confirmed] = await finished;\n\n        if (confirmed) {\n            const ignoredUsers = cli.getIgnoredUsers();\n            ignoredUsers.push(member.userId);\n            cli.setIgnoredUsers(ignoredUsers);\n        }\n    }, [cli, member]);\n\n    // Check whether the user is ignored\n    const [isIgnored, setIsIgnored] = useState(cli.isUserIgnored(member.userId));\n    // Recheck if the user or client changes\n    useEffect(() => {\n        setIsIgnored(cli.isUserIgnored(member.userId));\n    }, [cli, member.userId]);\n\n    // Recheck also if we receive new accountData m.ignored_user_list\n    const accountDataHandler = useCallback(\n        (ev: MatrixEvent) => {\n            if (ev.getType() === \"m.ignored_user_list\") {\n                setIsIgnored(cli.isUserIgnored(member.userId));\n            }\n        },\n        [cli, member.userId],\n    );\n    useTypedEventEmitter(cli, ClientEvent.AccountData, accountDataHandler);\n\n    const ignoreButtonClick = (ev: Event): void => {\n        ev.preventDefault();\n        if (isIgnored) {\n            unignore();\n        } else {\n            ignore();\n        }\n    };\n\n    return {\n        ignoreButtonClick,\n        isIgnored,\n    };\n};\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type RoomMember, type User } from \"matrix-js-sdk/src/matrix\";\nimport React from \"react\";\nimport { MenuItem } from \"@vector-im/compound-web\";\nimport { BlockIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../../languageHandler\";\nimport { useUserInfoIgnoreButtonViewModel } from \"../../../viewmodels/right_panel/user_info/UserInfoIgnoreButtonViewModel\";\n\nexport const IgnoreToggleButton: React.FC<{\n    member: User | RoomMember;\n}> = ({ member }) => {\n    const vm = useUserInfoIgnoreButtonViewModel(member);\n\n    return (\n        <MenuItem\n            role=\"button\"\n            onSelect={async (ev) => vm.ignoreButtonClick(ev)}\n            label={vm.isIgnored ? _t(\"user_info|unignore_button\") : _t(\"user_info|ignore_button\")}\n            kind=\"critical\"\n            Icon={BlockIcon}\n        />\n    );\n};\n","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction ChatProblemIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M12.713 16.713A.97.97 0 0 1 12 17a.97.97 0 0 1-.713-.288A.97.97 0 0 1 11 16q0-.424.287-.713A.97.97 0 0 1 12 15q.424 0 .713.287.287.288.287.713 0 .424-.287.712m0-3.999A.97.97 0 0 1 12 13a.97.97 0 0 1-.713-.287A.97.97 0 0 1 11 12V8q0-.424.287-.713A.97.97 0 0 1 12 7q.424 0 .713.287Q13 7.576 13 8v4q0 .424-.287.713\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M2.95 16.3a10.2 10.2 0 0 1-.712-2.1A10.2 10.2 0 0 1 2 12q0-2.075.788-3.9a10.1 10.1 0 0 1 2.137-3.175q1.35-1.35 3.175-2.137A9.7 9.7 0 0 1 12 2q2.075 0 3.9.788a10.1 10.1 0 0 1 3.175 2.137q1.35 1.35 2.137 3.175A9.7 9.7 0 0 1 22 12a9.7 9.7 0 0 1-.788 3.9 10.1 10.1 0 0 1-2.137 3.175q-1.35 1.35-3.175 2.137A9.7 9.7 0 0 1 12 22q-1.125 0-2.2-.238a10.2 10.2 0 0 1-2.1-.712L2.75 22.5a.94.94 0 0 1-1-.25.94.94 0 0 1-.25-1zm4.2 2.8a1 1 0 0 1 .275-.062q.15-.013.275-.013.225 0 .438.038.212.036.412.137a7.4 7.4 0 0 0 1.675.6Q11.1 20 12 20q3.35 0 5.675-2.325T20 12t-2.325-5.675T12 4 6.325 6.325 4 12q0 .9.2 1.775t.6 1.675q.176.325.188.688t-.088.712l-.95 3.2z\"\n    })]\n  });\n}\n;\nChatProblemIcon.displayName = \"ChatProblemIcon\";\nexport default forwardRef(ChatProblemIcon);","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ComponentProps, useMemo, useState } from \"react\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\nimport { InfoSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport ConfirmUserActionDialog from \"./ConfirmUserActionDialog\";\nimport SpaceChildrenPicker from \"../spaces/SpaceChildrenPicker\";\nimport { SDKContextClass } from \"../../../contexts/SDKContextClass.ts\";\n\ntype BaseProps = ComponentProps<typeof ConfirmUserActionDialog>;\ninterface IProps extends Omit<BaseProps, \"matrixClient\" | \"children\" | \"onFinished\"> {\n    space: Room;\n    allLabel: string;\n    specificLabel: string;\n    noneLabel?: string;\n    warningMessage?: string;\n    onFinished(this: void, success?: boolean, reason?: string, rooms?: Room[]): void;\n    spaceChildFilter?(this: void, child: Room): boolean;\n}\n\nconst ConfirmSpaceUserActionDialog: React.FC<IProps> = ({\n    space,\n    spaceChildFilter,\n    allLabel,\n    specificLabel,\n    noneLabel,\n    warningMessage,\n    onFinished,\n    ...props\n}) => {\n    const spaceChildren = useMemo(() => {\n        const children = SDKContextClass.instance.spaceStore.getChildren(space.roomId);\n        if (spaceChildFilter) {\n            return children.filter(spaceChildFilter);\n        }\n        return children;\n    }, [space.roomId, spaceChildFilter]);\n\n    const [roomsToLeave, setRoomsToLeave] = useState<Room[]>([]);\n    const selectedRooms = useMemo(() => new Set(roomsToLeave), [roomsToLeave]);\n\n    let warning: JSX.Element | undefined;\n    if (warningMessage) {\n        warning = (\n            <div className=\"mx_ConfirmSpaceUserActionDialog_warning\">\n                <InfoSolidIcon />\n                {warningMessage}\n            </div>\n        );\n    }\n\n    return (\n        <ConfirmUserActionDialog\n            {...props}\n            onFinished={(success?: boolean, reason?: string) => {\n                onFinished(success, reason, roomsToLeave);\n            }}\n            className=\"mx_ConfirmSpaceUserActionDialog\"\n            roomId={space.roomId}\n        >\n            {warning}\n            <SpaceChildrenPicker\n                space={space}\n                spaceChildren={spaceChildren}\n                selected={selectedRooms}\n                allLabel={allLabel}\n                specificLabel={specificLabel}\n                noneLabel={noneLabel}\n                onChange={setRoomsToLeave}\n            />\n        </ConfirmUserActionDialog>\n    );\n};\n\nexport default ConfirmSpaceUserActionDialog;\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"@sentry/browser\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport { useMatrixClientContext } from \"../../../../../contexts/MatrixClientContext\";\nimport { _t } from \"../../../../../languageHandler\";\nimport Modal from \"../../../../../Modal\";\nimport { bulkSpaceBehaviour } from \"../../../../../utils/space\";\nimport ConfirmSpaceUserActionDialog from \"../../../../views/dialogs/ConfirmSpaceUserActionDialog\";\nimport ConfirmUserActionDialog from \"../../../../views/dialogs/ConfirmUserActionDialog\";\nimport ErrorDialog from \"../../../../views/dialogs/ErrorDialog\";\nimport { type RoomAdminToolsProps } from \"./UserInfoAdminToolsContainerViewModel\";\n\nexport interface BanButtonState {\n    /**\n     * The function to call when the button is clicked\n     */\n    onBanOrUnbanClick: () => Promise<void>;\n    /**\n     * The label of the ban button can be ban or unban\n     */\n    banLabel: string;\n}\n/**\n * The view model for the room ban button used in the UserInfoAdminToolsContainer\n * @param {RoomAdminToolsProps} props - the object containing the necceray props for banButton the view model\n * @param {Room} props.room - the room to ban/unban the user in\n * @param {RoomMember} props.member - the member to ban/unban\n * @param {boolean} props.isUpdating - whether the operation is currently in progress\n * @param {function} props.startUpdating - callback function to start the operation\n * @param {function} props.stopUpdating - callback function to stop the operation\n * @returns {BanButtonState} the room ban/unban button state\n */\nexport const useBanButtonViewModel = (props: RoomAdminToolsProps): BanButtonState => {\n    const { isUpdating, startUpdating, stopUpdating, room, member } = props;\n\n    const cli = useMatrixClientContext();\n\n    const isBanned = member.membership === KnownMembership.Ban;\n\n    let banLabel = room.isSpaceRoom() ? _t(\"user_info|ban_button_space\") : _t(\"user_info|ban_button_room\");\n    if (isBanned) {\n        banLabel = room.isSpaceRoom() ? _t(\"user_info|unban_button_space\") : _t(\"user_info|unban_button_room\");\n    }\n\n    const onBanOrUnbanClick = async (): Promise<void> => {\n        if (isUpdating) return; // only allow one operation at a time\n        startUpdating();\n\n        const commonProps = {\n            member,\n            action: room.isSpaceRoom()\n                ? isBanned\n                    ? _t(\"user_info|unban_button_space\")\n                    : _t(\"user_info|ban_button_space\")\n                : isBanned\n                  ? _t(\"user_info|unban_button_room\")\n                  : _t(\"user_info|ban_button_room\"),\n            title: isBanned\n                ? _t(\"user_info|unban_room_confirm_title\", { roomName: room.name })\n                : _t(\"user_info|ban_room_confirm_title\", { roomName: room.name }),\n            askReason: !isBanned,\n            danger: !isBanned,\n        };\n\n        let finished: Promise<[success?: boolean, reason?: string, rooms?: Room[]]>;\n\n        if (room.isSpaceRoom()) {\n            ({ finished } = Modal.createDialog(\n                ConfirmSpaceUserActionDialog,\n                {\n                    ...commonProps,\n                    space: room,\n                    spaceChildFilter: isBanned\n                        ? (child: Room) => {\n                              // Return true if the target member is banned and we have sufficient PL to unban\n                              const myMember = child.getMember(cli.credentials.userId || \"\");\n                              const theirMember = child.getMember(member.userId);\n                              return (\n                                  !!myMember &&\n                                  !!theirMember &&\n                                  theirMember.membership === KnownMembership.Ban &&\n                                  myMember.powerLevel > theirMember.powerLevel &&\n                                  child.currentState.hasSufficientPowerLevelFor(\"ban\", myMember.powerLevel)\n                              );\n                          }\n                        : (child: Room) => {\n                              // Return true if the target member isn't banned and we have sufficient PL to ban\n                              const myMember = child.getMember(cli.credentials.userId || \"\");\n                              const theirMember = child.getMember(member.userId);\n                              return (\n                                  !!myMember &&\n                                  !!theirMember &&\n                                  theirMember.membership !== KnownMembership.Ban &&\n                                  myMember.powerLevel > theirMember.powerLevel &&\n                                  child.currentState.hasSufficientPowerLevelFor(\"ban\", myMember.powerLevel)\n                              );\n                          },\n                    allLabel: isBanned ? _t(\"user_info|unban_space_everything\") : _t(\"user_info|ban_space_everything\"),\n                    specificLabel: isBanned ? _t(\"user_info|unban_space_specific\") : _t(\"user_info|ban_space_specific\"),\n                    warningMessage: isBanned ? _t(\"user_info|unban_space_warning\") : _t(\"user_info|kick_space_warning\"),\n                },\n                \"mx_ConfirmSpaceUserActionDialog_wrapper\",\n            ));\n        } else {\n            ({ finished } = Modal.createDialog(ConfirmUserActionDialog, commonProps));\n        }\n\n        const [proceed, reason, rooms = []] = await finished;\n        if (!proceed) {\n            stopUpdating();\n            return;\n        }\n\n        const fn = (roomId: string): Promise<unknown> => {\n            if (isBanned) {\n                return cli.unban(roomId, member.userId);\n            } else {\n                return cli.ban(roomId, member.userId, reason || undefined);\n            }\n        };\n\n        bulkSpaceBehaviour(room, rooms, (room) => fn(room.roomId))\n            .then(\n                () => {\n                    // NO-OP; rely on the m.room.member event coming down else we could\n                    // get out of sync if we force setState here!\n                    logger.info(\"Ban success\");\n                },\n                function (err) {\n                    logger.error(\"Ban error: \" + err);\n                    Modal.createDialog(ErrorDialog, {\n                        title: _t(\"common|error\"),\n                        description: _t(\"user_info|error_ban_user\"),\n                    });\n                },\n            )\n            .finally(() => {\n                stopUpdating();\n            });\n    };\n\n    return {\n        onBanOrUnbanClick,\n        banLabel,\n    };\n};\n","/*\nCopyright 2024,2025 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useState } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport {\n    type MatrixClient,\n    type RoomMember,\n    type Room,\n    type MatrixEvent,\n    EventTimeline,\n    EventType,\n} from \"matrix-js-sdk/src/matrix\";\n\nimport { _t } from \"../../../languageHandler\";\nimport dis from \"../../../dispatcher/dispatcher\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport BaseDialog from \"../dialogs/BaseDialog\";\nimport InfoDialog from \"../dialogs/InfoDialog\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport StyledCheckbox from \"../elements/StyledCheckbox\";\n\ninterface Props {\n    matrixClient: MatrixClient;\n    room: Room;\n    member: RoomMember;\n    onFinished(this: void, redact?: boolean): void;\n}\n\nconst BulkRedactDialog: React.FC<Props> = (props) => {\n    const { matrixClient: cli, room, member, onFinished } = props;\n    const [keepStateEvents, setKeepStateEvents] = useState(true);\n\n    let timeline: EventTimeline | null = room.getLiveTimeline();\n    let eventsToRedact: MatrixEvent[] = [];\n    while (timeline) {\n        eventsToRedact = [\n            ...eventsToRedact,\n            ...timeline.getEvents().filter(\n                (event) =>\n                    event.getSender() === member.userId &&\n                    !event.isRedacted() &&\n                    !event.isRedaction() &&\n                    event.getType() !== EventType.RoomCreate &&\n                    // Don't redact ACLs because that'll obliterate the room\n                    // See https://github.com/matrix-org/synapse/issues/4042 for details.\n                    event.getType() !== EventType.RoomServerAcl &&\n                    // Redacting encryption events is equally bad\n                    event.getType() !== EventType.RoomEncryption,\n            ),\n        ];\n        timeline = timeline.getNeighbouringTimeline(EventTimeline.BACKWARDS);\n    }\n\n    if (eventsToRedact.length === 0) {\n        return (\n            <InfoDialog\n                onFinished={onFinished}\n                title={_t(\"user_info|redact|no_recent_messages_title\", { user: member.name })}\n                description={\n                    <div>\n                        <p>{_t(\"user_info|redact|no_recent_messages_description\")}</p>\n                    </div>\n                }\n            />\n        );\n    } else {\n        eventsToRedact = eventsToRedact.filter((event) => !(keepStateEvents && event.isState()));\n        const count = eventsToRedact.length;\n        const user = member.name;\n\n        const redact = async (): Promise<void> => {\n            logger.info(`Started redacting recent ${count} messages for ${member.userId} in ${room.roomId}`);\n            dis.dispatch({\n                action: Action.BulkRedactStart,\n                room_id: room.roomId,\n            });\n\n            // Submitting a large number of redactions freezes the UI,\n            // so first yield to allow to rerender after closing the dialog.\n            await Promise.resolve();\n            await Promise.all(\n                eventsToRedact.reverse().map(async (event): Promise<void> => {\n                    try {\n                        await cli.redactEvent(room.roomId, event.getId()!);\n                    } catch (err) {\n                        // log and swallow errors\n                        logger.error(\"Could not redact\", event.getId());\n                        logger.error(err);\n                    }\n                }),\n            );\n\n            logger.info(`Finished redacting recent ${count} messages for ${member.userId} in ${room.roomId}`);\n            dis.dispatch({\n                action: Action.BulkRedactEnd,\n                room_id: room.roomId,\n            });\n        };\n\n        return (\n            <BaseDialog\n                className=\"mx_BulkRedactDialog\"\n                onFinished={onFinished}\n                title={_t(\"user_info|redact|confirm_title\", { user })}\n                contentId=\"mx_Dialog_content\"\n            >\n                <div className=\"mx_Dialog_content\" id=\"mx_Dialog_content\">\n                    <p>{_t(\"user_info|redact|confirm_description_1\", { count, user })}</p>\n                    <p>{_t(\"user_info|redact|confirm_description_2\")}</p>\n                    <StyledCheckbox\n                        description={_t(\"user_info|redact|confirm_keep_state_explainer\")}\n                        checked={keepStateEvents}\n                        onChange={(e) => setKeepStateEvents(e.target.checked)}\n                    >\n                        {_t(\"user_info|redact|confirm_keep_state_label\")}\n                    </StyledCheckbox>\n                </div>\n                <DialogButtons\n                    primaryButton={_t(\"user_info|redact|confirm_button\", { count })}\n                    primaryButtonClass=\"danger\"\n                    primaryDisabled={count === 0}\n                    onPrimaryButtonClick={() => {\n                        setTimeout(redact, 0);\n                        onFinished(true);\n                    }}\n                    onCancel={() => onFinished(false)}\n                />\n            </BaseDialog>\n        );\n    }\n};\n\nexport default BulkRedactDialog;\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ReactNode } from \"react\";\nimport classNames from \"classnames\";\nimport { type RoomMember, type Room } from \"matrix-js-sdk/src/matrix\";\nimport { MenuItem } from \"@vector-im/compound-web\";\nimport CloseIcon from \"@vector-im/compound-design-tokens/assets/web/icons/close\";\nimport ChatProblemIcon from \"@vector-im/compound-design-tokens/assets/web/icons/chat-problem\";\nimport VisibilityOffIcon from \"@vector-im/compound-design-tokens/assets/web/icons/visibility-off\";\nimport LeaveIcon from \"@vector-im/compound-design-tokens/assets/web/icons/leave\";\n\nimport { _t } from \"../../../../languageHandler\";\nimport { type IPowerLevelsContent } from \"../UserInfo\";\nimport { useUserInfoAdminToolsContainerViewModel } from \"../../../viewmodels/right_panel/user_info/admin/UserInfoAdminToolsContainerViewModel\";\nimport { useMuteButtonViewModel } from \"../../../viewmodels/right_panel/user_info/admin/UserInfoMuteButtonViewModel\";\nimport { useBanButtonViewModel } from \"../../../viewmodels/right_panel/user_info/admin/UserInfoBanButtonViewModel\";\nimport { useRoomKickButtonViewModel } from \"../../../viewmodels/right_panel/user_info/admin/UserInfoKickButtonViewModel\";\nimport { useRedactMessagesButtonViewModel } from \"../../../viewmodels/right_panel/user_info/admin/UserInfoRedactButtonViewModel\";\n\nconst Container: React.FC<{\n    children: ReactNode;\n    className?: string;\n}> = ({ children, className }) => {\n    const classes = classNames(\"mx_UserInfo_container\", className);\n    return <div className={classes}>{children}</div>;\n};\n\ninterface IBaseProps {\n    member: RoomMember;\n    isUpdating: boolean;\n    startUpdating(this: void): void;\n    stopUpdating(this: void): void;\n}\n\nexport const RoomKickButton = ({\n    room,\n    member,\n    isUpdating,\n    startUpdating,\n    stopUpdating,\n}: Omit<IBaseRoomProps, \"powerLevels\">): JSX.Element | null => {\n    const vm = useRoomKickButtonViewModel({ room, member, isUpdating, startUpdating, stopUpdating });\n    // check if user can be kicked/disinvited\n    if (!vm.canUserBeKicked) return <></>;\n\n    return (\n        <MenuItem\n            role=\"button\"\n            onSelect={async (ev) => {\n                ev.preventDefault();\n                vm.onKickClick();\n            }}\n            disabled={isUpdating}\n            label={vm.kickLabel}\n            kind=\"critical\"\n            Icon={LeaveIcon}\n        />\n    );\n};\n\nconst RedactMessagesButton: React.FC<IBaseProps> = ({ member }) => {\n    const vm = useRedactMessagesButtonViewModel(member);\n\n    return (\n        <MenuItem\n            role=\"button\"\n            onSelect={async (ev) => {\n                ev.preventDefault();\n                vm.onRedactAllMessagesClick();\n            }}\n            label={_t(\"user_info|redact_button\")}\n            kind=\"critical\"\n            Icon={CloseIcon}\n        />\n    );\n};\n\nexport const BanToggleButton = ({\n    room,\n    member,\n    isUpdating,\n    startUpdating,\n    stopUpdating,\n}: Omit<IBaseRoomProps, \"powerLevels\">): JSX.Element => {\n    const vm = useBanButtonViewModel({ room, member, isUpdating, startUpdating, stopUpdating });\n\n    return (\n        <MenuItem\n            role=\"button\"\n            onSelect={async (ev) => {\n                ev.preventDefault();\n                vm.onBanOrUnbanClick();\n            }}\n            disabled={isUpdating}\n            label={vm.banLabel}\n            kind=\"critical\"\n            Icon={ChatProblemIcon}\n        />\n    );\n};\n\ninterface IBaseRoomProps extends IBaseProps {\n    room: Room;\n    powerLevels: IPowerLevelsContent;\n    children?: ReactNode;\n}\n\n// We do not show a Mute button for ourselves so it doesn't need to handle warning self demotion\nconst MuteToggleButton: React.FC<IBaseRoomProps> = ({\n    member,\n    room,\n    powerLevels,\n    isUpdating,\n    startUpdating,\n    stopUpdating,\n}) => {\n    const vm = useMuteButtonViewModel({ room, member, isUpdating, startUpdating, stopUpdating });\n    // Don't show the mute/unmute option if the user is not in the room\n    if (!vm.isMemberInTheRoom) return null;\n\n    return (\n        <MenuItem\n            role=\"button\"\n            onSelect={async (ev) => {\n                ev.preventDefault();\n                vm.onMuteButtonClick();\n            }}\n            disabled={isUpdating}\n            label={vm.muteLabel}\n            kind=\"critical\"\n            Icon={VisibilityOffIcon}\n        />\n    );\n};\n\nexport const UserInfoAdminToolsContainer: React.FC<IBaseRoomProps> = ({\n    room,\n    children,\n    member,\n    isUpdating,\n    startUpdating,\n    stopUpdating,\n    powerLevels,\n}) => {\n    let kickButton;\n    let banButton;\n    let muteButton;\n    let redactButton;\n\n    const vm = useUserInfoAdminToolsContainerViewModel({ room, member, powerLevels });\n\n    if (!vm.isCurrentUserInTheRoom) {\n        // we aren't in the room, so return no admin tooling\n        return <div />;\n    }\n\n    if (vm.shouldShowKickButton) {\n        kickButton = (\n            <RoomKickButton\n                room={room}\n                member={member}\n                isUpdating={isUpdating}\n                startUpdating={startUpdating}\n                stopUpdating={stopUpdating}\n            />\n        );\n    }\n    if (vm.shouldShowRedactButton) {\n        redactButton = (\n            <RedactMessagesButton\n                member={member}\n                isUpdating={isUpdating}\n                startUpdating={startUpdating}\n                stopUpdating={stopUpdating}\n            />\n        );\n    }\n    if (vm.shouldShowBanButton) {\n        banButton = (\n            <BanToggleButton\n                room={room}\n                member={member}\n                isUpdating={isUpdating}\n                startUpdating={startUpdating}\n                stopUpdating={stopUpdating}\n            />\n        );\n    }\n    if (vm.shouldShowMuteButton) {\n        muteButton = (\n            <MuteToggleButton\n                member={member}\n                room={room}\n                powerLevels={powerLevels}\n                isUpdating={isUpdating}\n                startUpdating={startUpdating}\n                stopUpdating={stopUpdating}\n            />\n        );\n    }\n\n    if (kickButton || banButton || muteButton || redactButton || children) {\n        return (\n            <Container>\n                {muteButton}\n                {redactButton}\n                {kickButton}\n                {banButton}\n                {children}\n            </Container>\n        );\n    }\n\n    return <div />;\n};\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"@sentry/browser\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport { useMatrixClientContext } from \"../../../../../contexts/MatrixClientContext\";\nimport { _t } from \"../../../../../languageHandler\";\nimport Modal from \"../../../../../Modal\";\nimport { bulkSpaceBehaviour } from \"../../../../../utils/space\";\nimport ConfirmSpaceUserActionDialog from \"../../../../views/dialogs/ConfirmSpaceUserActionDialog\";\nimport ConfirmUserActionDialog from \"../../../../views/dialogs/ConfirmUserActionDialog\";\nimport ErrorDialog from \"../../../../views/dialogs/ErrorDialog\";\nimport { type RoomAdminToolsProps } from \"./UserInfoAdminToolsContainerViewModel\";\n\ninterface RoomKickButtonState {\n    /**\n     * The function to call when the button is clicked\n     */\n    onKickClick: () => Promise<void>;\n    /**\n     * Whether the user can be kicked based on membership value. If the user already join or was invited, it can be kicked\n     */\n    canUserBeKicked: boolean;\n    /**\n     * The label of the kick button can be kick or disinvite\n     */\n    kickLabel: string;\n}\n\n/**\n * The view model for the room kick button used in the UserInfoAdminToolsContainer\n * @param {RoomAdminToolsProps} props - the object containing the necceray props for kickButton the view model\n * @param {Room} props.room - the room to kick/disinvite the user from\n * @param {RoomMember} props.member - the member to kick/disinvite\n * @param {boolean} props.isUpdating - whether the operation is currently in progress\n * @param {function} props.startUpdating - callback function to start the operation\n * @param {function} props.stopUpdating - callback function to stop the operation\n * @returns {KickButtonState} the room kick/disinvite button state\n */\nexport function useRoomKickButtonViewModel(props: RoomAdminToolsProps): RoomKickButtonState {\n    const { isUpdating, startUpdating, stopUpdating, room, member } = props;\n\n    const cli = useMatrixClientContext();\n\n    const onKickClick = async (): Promise<void> => {\n        if (isUpdating) return; // only allow one operation at a time\n        startUpdating();\n\n        const commonProps = {\n            member,\n            action: room.isSpaceRoom()\n                ? member.membership === KnownMembership.Invite\n                    ? _t(\"user_info|disinvite_button_space\")\n                    : _t(\"user_info|kick_button_space\")\n                : member.membership === KnownMembership.Invite\n                  ? _t(\"user_info|disinvite_button_room\")\n                  : _t(\"user_info|kick_button_room\"),\n            title:\n                member.membership === KnownMembership.Invite\n                    ? _t(\"user_info|disinvite_button_room_name\", { roomName: room.name })\n                    : _t(\"user_info|kick_button_room_name\", { roomName: room.name }),\n            askReason: member.membership === KnownMembership.Join,\n            danger: true,\n        };\n\n        let finished: Promise<[success?: boolean, reason?: string, rooms?: Room[]]>;\n\n        if (room.isSpaceRoom()) {\n            ({ finished } = Modal.createDialog(\n                ConfirmSpaceUserActionDialog,\n                {\n                    ...commonProps,\n                    space: room,\n                    spaceChildFilter: (child: Room) => {\n                        // Return true if the target member is not banned and we have sufficient PL to ban them\n                        const myMember = child.getMember(cli.credentials.userId || \"\");\n                        const theirMember = child.getMember(member.userId);\n                        return (\n                            !!myMember &&\n                            !!theirMember &&\n                            theirMember.membership === member.membership &&\n                            myMember.powerLevel > theirMember.powerLevel &&\n                            child.currentState.hasSufficientPowerLevelFor(\"kick\", myMember.powerLevel)\n                        );\n                    },\n                    allLabel: _t(\"user_info|kick_button_space_everything\"),\n                    specificLabel: _t(\"user_info|kick_space_specific\"),\n                    warningMessage: _t(\"user_info|kick_space_warning\"),\n                },\n                \"mx_ConfirmSpaceUserActionDialog_wrapper\",\n            ));\n        } else {\n            ({ finished } = Modal.createDialog(ConfirmUserActionDialog, commonProps));\n        }\n\n        const [proceed, reason, rooms = []] = await finished;\n        if (!proceed) {\n            stopUpdating();\n            return;\n        }\n\n        bulkSpaceBehaviour(room, rooms, (room) => cli.kick(room.roomId, member.userId, reason || undefined))\n            .then(\n                () => {\n                    // NO-OP; rely on the m.room.member event coming down else we could\n                    // get out of sync if we force setState here!\n                    logger.info(\"Kick success\");\n                },\n                function (err) {\n                    logger.error(\"Kick error: \" + err);\n                    Modal.createDialog(ErrorDialog, {\n                        title: _t(\"user_info|error_kicking_user\"),\n                        description: err?.message ?? \"Operation failed\",\n                    });\n                },\n            )\n            .finally(() => {\n                stopUpdating();\n            });\n    };\n\n    const canUserBeKicked = member.membership === KnownMembership.Invite || member.membership === KnownMembership.Join;\n\n    const kickLabel = room.isSpaceRoom()\n        ? member.membership === KnownMembership.Invite\n            ? _t(\"user_info|disinvite_button_space\")\n            : _t(\"user_info|kick_button_space\")\n        : member.membership === KnownMembership.Invite\n          ? _t(\"user_info|disinvite_button_room\")\n          : _t(\"user_info|kick_button_room\");\n\n    return {\n        onKickClick,\n        canUserBeKicked,\n        kickLabel,\n    };\n}\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type RoomMember } from \"matrix-js-sdk/src/matrix\";\n\nimport { useMatrixClientContext } from \"../../../../../contexts/MatrixClientContext\";\nimport Modal from \"../../../../../Modal\";\nimport BulkRedactDialog from \"../../../../views/dialogs/BulkRedactDialog\";\n\nexport interface RedactMessagesButtonState {\n    onRedactAllMessagesClick: () => void;\n}\n\n/**\n * The view model for the redact messages button used in the UserInfoAdminToolsContainer\n * @param {RoomMember} member - the selected member to redact messages for\n * @returns {RedactMessagesButtonState} the redact messages button state\n */\nexport const useRedactMessagesButtonViewModel = (member: RoomMember): RedactMessagesButtonState => {\n    const cli = useMatrixClientContext();\n\n    const onRedactAllMessagesClick = (): void => {\n        const room = cli.getRoom(member.roomId);\n        if (!room) return;\n\n        Modal.createDialog(BulkRedactDialog, {\n            matrixClient: cli,\n            room,\n            member,\n        });\n    };\n\n    return {\n        onRedactAllMessagesClick,\n    };\n};\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"@sentry/browser\";\nimport { type RoomMember, type IPowerLevelsContent } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport { useMatrixClientContext } from \"../../../../../contexts/MatrixClientContext\";\nimport { _t } from \"../../../../../languageHandler\";\nimport Modal from \"../../../../../Modal\";\nimport ErrorDialog from \"../../../../views/dialogs/ErrorDialog\";\nimport { type RoomAdminToolsProps } from \"./UserInfoAdminToolsContainerViewModel\";\n\ninterface MuteButtonState {\n    /**\n     * Whether the member is in the roomn based on the membership value\n     */\n    isMemberInTheRoom: boolean;\n    /**\n     * The label of the mute button can be mute or unmute\n     */\n    muteLabel: string;\n    /**\n     * The function to call when the mute button is clicked\n     */\n    onMuteButtonClick: () => Promise<void>;\n}\n\n/**\n * The view model for the room mute button used in the UserInfoAdminToolsContainer\n * @param {RoomAdminToolsProps} props - the object containing the necceray props for muteButton the view model\n * @param {Room} props.room - the room to mute/unmute the user in\n * @param {RoomMember} props.member - the member to mute/unmute\n * @param {boolean} props.isUpdating - whether the operation is currently in progress\n * @param {function} props.startUpdating - callback function to start the operation\n * @param {function} props.stopUpdating - callback function to stop the operation\n * @returns {MuteButtonState} the room mute/unmute button state\n */\nexport const useMuteButtonViewModel = (props: RoomAdminToolsProps): MuteButtonState => {\n    const { isUpdating, startUpdating, stopUpdating, room, member } = props;\n\n    const cli = useMatrixClientContext();\n\n    const isMuted = (member: RoomMember, powerLevelContent: IPowerLevelsContent): boolean => {\n        if (!powerLevelContent || !member) return false;\n\n        const levelToSend =\n            (powerLevelContent.events ? powerLevelContent.events[\"m.room.message\"] : null) ||\n            powerLevelContent.events_default;\n\n        // levelToSend could be undefined as .events_default is optional. Coercing in this case using\n        // Number() would always return false, so this preserves behaviour\n        // FIXME: per the spec, if `events_default` is unset, it defaults to zero. If\n        //   the member has a negative powerlevel, this will give an incorrect result.\n        if (levelToSend === undefined) return false;\n\n        return member.powerLevel < levelToSend;\n    };\n\n    const muted = isMuted(member, room.currentState.getStateEvents(\"m.room.power_levels\", \"\")?.getContent() || {});\n    const muteLabel = muted ? _t(\"common|unmute\") : _t(\"common|mute\");\n\n    const isMemberInTheRoom = member.membership == KnownMembership.Join;\n\n    const onMuteButtonClick = async (): Promise<void> => {\n        if (isUpdating) return; // only allow one operation at a time\n        startUpdating();\n\n        const roomId = member.roomId;\n        const target = member.userId;\n\n        const powerLevelEvent = room.currentState.getStateEvents(\"m.room.power_levels\", \"\");\n        const powerLevels = powerLevelEvent?.getContent();\n        const levelToSend = powerLevels?.events?.[\"m.room.message\"] ?? powerLevels?.events_default;\n\n        let level;\n        if (muted) {\n            // unmute\n            level = levelToSend;\n        } else {\n            // mute\n            level = levelToSend - 1;\n        }\n        level = parseInt(level);\n\n        console.log(\"level\", level);\n        if (isNaN(level)) {\n            stopUpdating();\n            return;\n        }\n\n        cli.setPowerLevel(roomId, target, level)\n            .then(\n                () => {\n                    // NO-OP; rely on the m.room.member event coming down else we could\n                    // get out of sync if we force setState here!\n                    logger.info(\"Mute toggle success\");\n                },\n                function (err) {\n                    logger.error(\"Mute error: \" + err);\n                    Modal.createDialog(ErrorDialog, {\n                        title: _t(\"common|error\"),\n                        description: _t(\"user_info|error_mute_user\"),\n                    });\n                },\n            )\n            .finally(() => {\n                stopUpdating();\n            });\n    };\n\n    return {\n        isMemberInTheRoom,\n        onMuteButtonClick,\n        muteLabel,\n    };\n};\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room, type RoomMember, type IPowerLevelsContent } from \"matrix-js-sdk/src/matrix\";\n\nimport { useMatrixClientContext } from \"../../../../../contexts/MatrixClientContext\";\n\n/**\n * Interface used by admin tools container subcomponents props\n */\nexport interface RoomAdminToolsProps {\n    room: Room;\n    member: RoomMember;\n    isUpdating: boolean;\n    startUpdating: () => void;\n    stopUpdating: () => void;\n}\n\n/**\n * Interface used by admin tools container props\n */\nexport interface RoomAdminToolsContainerProps {\n    room: Room;\n    member: RoomMember;\n    powerLevels: IPowerLevelsContent;\n}\n\ninterface UserInfoAdminToolsContainerState {\n    shouldShowKickButton: boolean;\n    shouldShowBanButton: boolean;\n    shouldShowMuteButton: boolean;\n    shouldShowRedactButton: boolean;\n    isCurrentUserInTheRoom: boolean;\n}\n\n/**\n * The view model for the user info admin tools container\n * @param {RoomAdminToolsContainerProps} props - the object containing the necceray props for the view model\n * @param {Room} props.room - the room that display the admin tools\n * @param {RoomMember} props.member - the selected member\n * @param {IPowerLevelsContent} props.powerLevels - current room power levels\n * @returns {UserInfoAdminToolsContainerState} the user info admin tools container state\n */\nexport const useUserInfoAdminToolsContainerViewModel = (\n    props: RoomAdminToolsContainerProps,\n): UserInfoAdminToolsContainerState => {\n    const cli = useMatrixClientContext();\n    const { room, member, powerLevels } = props;\n\n    const editPowerLevel =\n        (powerLevels.events ? powerLevels.events[\"m.room.power_levels\"] : null) || powerLevels.state_default;\n\n    // if these do not exist in the event then they should default to 50 as per the spec\n    const { ban: banPowerLevel = 50, kick: kickPowerLevel = 50, redact: redactPowerLevel = 50 } = powerLevels;\n\n    const me = room.getMember(cli.getUserId() || \"\");\n    const isCurrentUserInTheRoom = me !== null;\n\n    if (!isCurrentUserInTheRoom) {\n        return {\n            shouldShowKickButton: false,\n            shouldShowBanButton: false,\n            shouldShowMuteButton: false,\n            shouldShowRedactButton: false,\n            isCurrentUserInTheRoom: false,\n        };\n    }\n\n    const isMe = me.userId === member.userId;\n    const canAffectUser = member.powerLevel < me.powerLevel || isMe;\n\n    return {\n        shouldShowKickButton: !isMe && canAffectUser && me.powerLevel >= kickPowerLevel,\n        shouldShowRedactButton: me.powerLevel >= redactPowerLevel && !room.isSpaceRoom(),\n        shouldShowBanButton: !isMe && canAffectUser && me.powerLevel >= banPowerLevel,\n        shouldShowMuteButton: !isMe && canAffectUser && me.powerLevel >= Number(editPowerLevel) && !room.isSpaceRoom(),\n        isCurrentUserInTheRoom,\n    };\n};\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type RoomMember, type User, type Room } from \"matrix-js-sdk/src/matrix\";\nimport React, { type JSX, type ReactNode, useState } from \"react\";\nimport { MenuItem } from \"@vector-im/compound-web\";\nimport { ChatIcon, CheckIcon, MentionIcon, ShareIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\nimport InviteIcon from \"@vector-im/compound-design-tokens/assets/web/icons/user-add\";\n\nimport { _t } from \"../../../../languageHandler\";\nimport { useUserInfoBasicOptionsViewModel } from \"../../../viewmodels/right_panel/user_info/UserInfoBasicOptionsViewModel\";\nimport { Container, type Member } from \"../UserInfo\";\nimport { shouldShowComponent } from \"../../../../customisations/helpers/UIComponents\";\nimport { UIComponent } from \"../../../../settings/UIFeature\";\n\nconst MessageButton = ({\n    member,\n    openDMForUser,\n}: {\n    member: Member;\n    openDMForUser: (user: Member) => Promise<void>;\n}): JSX.Element => {\n    const [busy, setBusy] = useState(false);\n\n    return (\n        <MenuItem\n            role=\"button\"\n            onSelect={async (ev) => {\n                ev.preventDefault();\n                if (busy) return;\n                setBusy(true);\n                await openDMForUser(member);\n                setBusy(false);\n            }}\n            disabled={busy}\n            label={_t(\"user_info|send_message\")}\n            Icon={ChatIcon}\n        />\n    );\n};\n\nexport const UserInfoBasicOptionsView: React.FC<{\n    member: User | RoomMember;\n    room: Room;\n    children?: ReactNode;\n}> = ({ room, member, children }) => {\n    const vm = useUserInfoBasicOptionsViewModel(room, member);\n\n    let insertPillButton: JSX.Element | undefined;\n    let inviteUserButton: JSX.Element | undefined;\n    let readReceiptButton: JSX.Element | undefined;\n\n    if (!vm.isMe) {\n        readReceiptButton = (\n            <MenuItem\n                role=\"button\"\n                onSelect={async (ev) => {\n                    ev.preventDefault();\n                    vm.onReadReceiptButton();\n                }}\n                label={_t(\"user_info|jump_to_rr_button\")}\n                disabled={vm.readReceiptButtonDisabled}\n                Icon={CheckIcon}\n            />\n        );\n\n        if (vm.showInsertPillButton) {\n            insertPillButton = (\n                <MenuItem\n                    role=\"button\"\n                    onSelect={async (ev) => {\n                        ev.preventDefault();\n                        vm.onInsertPillButton();\n                    }}\n                    label={_t(\"action|mention\")}\n                    Icon={MentionIcon}\n                />\n            );\n        }\n\n        if (vm.showInviteButton && shouldShowComponent(UIComponent.InviteUsers)) {\n            inviteUserButton = (\n                <MenuItem\n                    role=\"button\"\n                    onSelect={async (ev) => {\n                        ev.preventDefault();\n                        vm.onInviteUserButton(room.roomId, ev);\n                    }}\n                    label={_t(\"action|invite\")}\n                    Icon={InviteIcon}\n                />\n            );\n        }\n    }\n\n    const shareUserButton = (\n        <MenuItem\n            role=\"button\"\n            onSelect={async (ev) => {\n                ev.preventDefault();\n                vm.onShareUserClick();\n            }}\n            label={_t(\"user_info|share_button\")}\n            Icon={ShareIcon}\n        />\n    );\n\n    const directMessageButton =\n        vm.isMe || !shouldShowComponent(UIComponent.CreateRooms) ? null : (\n            <MessageButton member={member} openDMForUser={vm.onOpenDmForUser} />\n        );\n\n    return (\n        <Container>\n            {children}\n            {directMessageButton}\n            {inviteUserButton}\n            {readReceiptButton}\n            {shareUserButton}\n            {insertPillButton}\n        </Container>\n    );\n};\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useContext } from \"react\";\nimport { RoomMember, User, type Room, KnownMembership } from \"matrix-js-sdk/src/matrix\";\n\nimport Modal from \"../../../../Modal\";\nimport ErrorDialog from \"../../../views/dialogs/ErrorDialog\";\nimport { _t, UserFriendlyError } from \"../../../../languageHandler\";\nimport MatrixClientContext from \"../../../../contexts/MatrixClientContext\";\nimport dis from \"../../../../dispatcher/dispatcher\";\nimport PosthogTrackers from \"../../../../PosthogTrackers\";\nimport { ShareDialog } from \"../../../views/dialogs/ShareDialog\";\nimport { type ComposerInsertPayload } from \"../../../../dispatcher/payloads/ComposerInsertPayload\";\nimport { Action } from \"../../../../dispatcher/actions\";\nimport { TimelineRenderingType } from \"../../../../contexts/RoomContext\";\nimport MultiInviter from \"../../../../utils/MultiInviter\";\nimport { type ViewRoomPayload } from \"../../../../dispatcher/payloads/ViewRoomPayload\";\nimport { useRoomPermissions } from \"./UserInfoBasicViewModel\";\nimport { DirectoryMember, startDmOnFirstMessage } from \"../../../../utils/direct-messages\";\nimport { type Member } from \"../../../views/right_panel/UserInfo\";\n\nexport interface UserInfoBasicOptionsState {\n    // boolean to know if selected user is current user\n    isMe: boolean;\n    // boolean to display/hide invite button\n    showInviteButton: boolean;\n    // boolean to display/hide insert pill button\n    showInsertPillButton: boolean | \"\";\n    // boolean to display/hide read receipt button\n    readReceiptButtonDisabled: boolean;\n    // Method called when a insert pill button is clicked\n    onInsertPillButton: () => void;\n    // Method called when a read receipt button is clicked, will add a pill in the input message field\n    onReadReceiptButton: () => void;\n    // Method called when a share user button is clicked, will display modal with profile to share\n    onShareUserClick: () => void;\n    // Method called when a invite button is clicked, will display modal to invite user\n    onInviteUserButton: (fallbackRoomId: string, evt: Event) => Promise<void>;\n    // Method called when the DM button is clicked, will open a DM with the selected member\n    onOpenDmForUser: (member: Member) => Promise<void>;\n}\n\nexport const useUserInfoBasicOptionsViewModel = (room: Room, member: User | RoomMember): UserInfoBasicOptionsState => {\n    const cli = useContext(MatrixClientContext);\n\n    // selected member is current user\n    const isMe = member.userId === cli.getUserId();\n\n    // Those permissions are updated when a change is done on the room current state and the selected user\n    const roomPermissions = useRoomPermissions(cli, room, member as RoomMember);\n\n    const isSpace = room?.isSpaceRoom();\n\n    // read receipt button stay disable for a room space or if all events where read (null)\n    const readReceiptButtonDisabled = isSpace || !room?.getEventReadUpTo(member.userId);\n\n    // always show exempt when room is a space\n    const showInsertPillButton = member instanceof RoomMember && member.roomId && !isSpace;\n\n    // show invite button only if current user has the permission to invite and the selected user membership is LEAVE\n    const showInviteButton =\n        member instanceof RoomMember &&\n        roomPermissions.canInvite &&\n        (member?.membership ?? KnownMembership.Leave) === KnownMembership.Leave;\n\n    const onReadReceiptButton = function (): void {\n        const room = member instanceof RoomMember ? cli.getRoom(member.roomId) : null;\n        if (!room || readReceiptButtonDisabled) return;\n\n        dis.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            highlighted: true,\n            // this could return null, the default prevents a type error\n            event_id: room.getEventReadUpTo(member.userId) || undefined,\n            room_id: room.roomId,\n            metricsTrigger: undefined, // room doesn't change\n        });\n    };\n\n    const onInsertPillButton = function (): void {\n        dis.dispatch<ComposerInsertPayload>({\n            action: Action.ComposerInsert,\n            userId: member.userId,\n            timelineRenderingType: TimelineRenderingType.Room,\n        });\n    };\n\n    const onInviteUserButton = async (fallbackRoomId: string, ev: Event): Promise<void> => {\n        try {\n            const roomId = member instanceof RoomMember && member.roomId ? member.roomId : fallbackRoomId;\n\n            // We use a MultiInviter to re-use the invite logic, even though we're only inviting one user.\n            const inviter = new MultiInviter(cli, roomId || \"\");\n            await inviter.invite([member.userId]).then(() => {\n                if (inviter.getCompletionState(member.userId) !== \"invited\") {\n                    const errorStringFromInviterUtility = inviter.getErrorText(member.userId);\n                    if (errorStringFromInviterUtility) {\n                        throw new Error(errorStringFromInviterUtility);\n                    } else {\n                        throw new UserFriendlyError(\"slash_command|invite_failed\", {\n                            user: member.userId,\n                            roomId,\n                            cause: undefined,\n                        });\n                    }\n                }\n            });\n        } catch (err) {\n            const description = err instanceof Error ? err.message : _t(\"invite|failed_generic\");\n\n            Modal.createDialog(ErrorDialog, {\n                title: _t(\"invite|failed_title\"),\n                description,\n            });\n        }\n\n        PosthogTrackers.trackInteraction(\"WebRightPanelRoomUserInfoInviteButton\", ev);\n    };\n\n    const onShareUserClick = (): void => {\n        Modal.createDialog(ShareDialog, {\n            target: member,\n        });\n    };\n\n    const onOpenDmForUser = async (user: Member): Promise<void> => {\n        const avatarUrl = user instanceof User ? user.avatarUrl : user.getMxcAvatarUrl();\n        const startDmUser = new DirectoryMember({\n            user_id: user.userId,\n            display_name: user.rawDisplayName,\n            avatar_url: avatarUrl,\n        });\n        await startDmOnFirstMessage(cli, [startDmUser]);\n    };\n\n    return {\n        isMe,\n        showInviteButton,\n        showInsertPillButton,\n        readReceiptButtonDisabled,\n        onReadReceiptButton,\n        onInsertPillButton,\n        onInviteUserButton,\n        onShareUserClick,\n        onOpenDmForUser,\n    };\n};\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type RoomMember, type User, type Room } from \"matrix-js-sdk/src/matrix\";\nimport { MenuItem } from \"@vector-im/compound-web\";\nimport { DeleteIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../../languageHandler\";\nimport { useUserInfoBasicViewModel } from \"../../../viewmodels/right_panel/user_info/UserInfoBasicViewModel\";\nimport { PowerLevelSection } from \"./UserInfoPowerLevels\";\nimport { Container } from \"../UserInfo\";\nimport { IgnoreToggleButton } from \"./UserInfoIgnoreButtonView\";\nimport Spinner from \"../../elements/Spinner\";\nimport { UserInfoAdminToolsContainer } from \"./UserInfoAdminToolsContainer\";\nimport { UserInfoBasicOptionsView } from \"./UserInfoBasicOptionsView\";\n\n/**\n * There are two types of components that can be displayed in the right panel concerning userinfo\n * Basic info or Encryption Panel\n */\nexport const UserInfoBasicView: React.FC<{\n    room: Room;\n    member: User | RoomMember;\n}> = ({ room, member }) => {\n    const vm = useUserInfoBasicViewModel(room, member);\n    let synapseDeactivateButton;\n    let spinner;\n    let memberDetails;\n    let adminToolsContainer;\n\n    if (vm.showDeactivateButton) {\n        synapseDeactivateButton = (\n            <MenuItem\n                role=\"button\"\n                onSelect={async (ev) => {\n                    ev.preventDefault();\n                    vm.onSynapseDeactivate();\n                }}\n                label={_t(\"user_info|deactivate_confirm_action\")}\n                kind=\"critical\"\n                Icon={DeleteIcon}\n            />\n        );\n    }\n\n    if (room && (member as RoomMember).roomId) {\n        // hide the Roles section for DMs as it doesn't make sense there\n        if (!vm.isRoomDMForMember) {\n            memberDetails = (\n                <PowerLevelSection user={member as RoomMember} room={room} roomPermissions={vm.roomPermissions} />\n            );\n        }\n\n        adminToolsContainer = (\n            <UserInfoAdminToolsContainer\n                powerLevels={vm.powerLevels}\n                member={member as RoomMember}\n                room={room}\n                isUpdating={vm.pendingUpdateCount > 0}\n                startUpdating={vm.startUpdating}\n                stopUpdating={vm.stopUpdating}\n            >\n                {synapseDeactivateButton}\n            </UserInfoAdminToolsContainer>\n        );\n    } else if (synapseDeactivateButton) {\n        adminToolsContainer = <Container>{synapseDeactivateButton}</Container>;\n    }\n\n    if (vm.pendingUpdateCount > 0) {\n        spinner = <Spinner />;\n    }\n\n    return (\n        <React.Fragment>\n            <UserInfoBasicOptionsView room={room} member={member}>\n                {memberDetails}\n            </UserInfoBasicOptionsView>\n            {adminToolsContainer}\n            {!vm.isMe && (\n                <Container>\n                    <IgnoreToggleButton member={member} />\n                </Container>\n            )}\n            {spinner}\n        </React.Fragment>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2017, 2018 Vector Creations Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ReactNode, useContext, useEffect, useMemo, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { type MatrixClient, type RoomMember, type Room, type User, type Device } from \"matrix-js-sdk/src/matrix\";\nimport { type UserVerificationStatus, type VerificationRequest, CryptoEvent } from \"matrix-js-sdk/src/crypto-api\";\n\nimport Modal from \"../../../Modal\";\nimport { _t } from \"../../../languageHandler\";\nimport { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { RightPanelPhases } from \"../../../stores/right-panel/RightPanelStorePhases\";\nimport EncryptionPanel from \"./EncryptionPanel\";\nimport { useIsEncrypted } from \"../../../hooks/useIsEncrypted\";\nimport BaseCard from \"./BaseCard\";\nimport QuestionDialog from \"../dialogs/QuestionDialog\";\nimport PosthogTrackers from \"../../../PosthogTrackers\";\nimport { UserInfoHeaderView } from \"./user_info/UserInfoHeaderView\";\nimport { UserInfoBasicView } from \"./user_info/UserInfoBasicView\";\nimport { SDKContext } from \"../../../contexts/SDKContext.ts\";\n\nexport interface IDevice extends Device {\n    ambiguous?: boolean;\n}\n\nexport const disambiguateDevices = (devices: IDevice[]): void => {\n    const names = Object.create(null);\n    for (let i = 0; i < devices.length; i++) {\n        const name = devices[i].displayName ?? \"\";\n        const indexList = names[name] || [];\n        indexList.push(i);\n        names[name] = indexList;\n    }\n    for (const name in names) {\n        if (names[name].length > 1) {\n            names[name].forEach((j: number) => {\n                devices[j].ambiguous = true;\n            });\n        }\n    }\n};\n\nexport const warnSelfDemote = async (isSpace: boolean): Promise<boolean> => {\n    const { finished } = Modal.createDialog(QuestionDialog, {\n        title: _t(\"user_info|demote_self_confirm_title\"),\n        description: (\n            <div>\n                {isSpace\n                    ? _t(\"user_info|demote_self_confirm_description_space\")\n                    : _t(\"user_info|demote_self_confirm_room\")}\n            </div>\n        ),\n        button: _t(\"user_info|demote_button\"),\n    });\n\n    const [confirmed] = await finished;\n    return !!confirmed;\n};\n\nexport const Container: React.FC<{\n    children: ReactNode;\n    className?: string;\n}> = ({ children, className }) => {\n    const classes = classNames(\"mx_UserInfo_container\", className);\n    return <div className={classes}>{children}</div>;\n};\n\nexport interface IPowerLevelsContent {\n    events?: Record<string, number>;\n    // eslint-disable-next-line camelcase\n    users_default?: number;\n    // eslint-disable-next-line camelcase\n    events_default?: number;\n    // eslint-disable-next-line camelcase\n    state_default?: number;\n    ban?: number;\n    kick?: number;\n    redact?: number;\n}\n\nexport interface IRoomPermissions {\n    modifyLevelMax: number;\n    canEdit: boolean;\n    canInvite: boolean;\n}\n\nasync function getUserDeviceInfo(\n    userId: string,\n    cli: MatrixClient,\n    downloadUncached = false,\n): Promise<Device[] | undefined> {\n    const userDeviceMap = await cli.getCrypto()?.getUserDeviceInfo([userId], downloadUncached);\n    const devicesMap = userDeviceMap?.get(userId);\n\n    if (!devicesMap) return;\n\n    return Array.from(devicesMap.values());\n}\n\nexport const useDevices = (userId: string): IDevice[] | undefined | null => {\n    const cli = useContext(MatrixClientContext);\n\n    // undefined means yet to be loaded, null means failed to load, otherwise list of devices\n    const [devices, setDevices] = useState<undefined | null | IDevice[]>(undefined);\n    // Download device lists\n    useEffect(() => {\n        setDevices(undefined);\n\n        let cancelled = false;\n\n        async function downloadDeviceList(): Promise<void> {\n            try {\n                const devices = await getUserDeviceInfo(userId, cli, true);\n\n                if (cancelled || !devices) {\n                    // we got cancelled - presumably a different user now\n                    return;\n                }\n\n                disambiguateDevices(devices);\n                setDevices(devices);\n            } catch {\n                setDevices(null);\n            }\n        }\n        downloadDeviceList();\n\n        // Handle being unmounted\n        return () => {\n            cancelled = true;\n        };\n    }, [cli, userId]);\n\n    // Listen to changes\n    useEffect(() => {\n        let cancel = false;\n        const updateDevices = async (): Promise<void> => {\n            const newDevices = await getUserDeviceInfo(userId, cli);\n            if (cancel || !newDevices) return;\n            setDevices(newDevices);\n        };\n        const onDevicesUpdated = (users: string[]): void => {\n            if (!users.includes(userId)) return;\n            updateDevices();\n        };\n        const onUserTrustStatusChanged = (_userId: string, trustLevel: UserVerificationStatus): void => {\n            if (_userId !== userId) return;\n            updateDevices();\n        };\n        cli.on(CryptoEvent.DevicesUpdated, onDevicesUpdated);\n        cli.on(CryptoEvent.UserTrustStatusChanged, onUserTrustStatusChanged);\n        // Handle being unmounted\n        return () => {\n            cancel = true;\n            cli.removeListener(CryptoEvent.DevicesUpdated, onDevicesUpdated);\n            cli.removeListener(CryptoEvent.UserTrustStatusChanged, onUserTrustStatusChanged);\n        };\n    }, [cli, userId]);\n\n    return devices;\n};\n\nexport type Member = User | RoomMember;\n\ninterface IProps {\n    user: Member;\n    room?: Room;\n    phase: RightPanelPhases.MemberInfo | RightPanelPhases.EncryptionPanel;\n    onClose(this: void): void;\n    verificationRequest?: VerificationRequest;\n    verificationRequestPromise?: Promise<VerificationRequest>;\n}\n\nconst UserInfo: React.FC<IProps> = ({ user, room, onClose, phase = RightPanelPhases.MemberInfo, ...props }) => {\n    const sdkContext = useContext(SDKContext);\n\n    // fetch latest room member if we have a room, so we don't show historical information, falling back to user\n    const member = useMemo(() => (room ? room.getMember(user.userId) || user : user), [room, user]);\n\n    const isRoomEncrypted = useIsEncrypted(sdkContext.client!, room);\n    const devices = useDevices(user.userId) ?? [];\n\n    const classes = [\"mx_UserInfo\"];\n\n    const onEncryptionPanelClose = (): void => {\n        sdkContext.rightPanelStore.popCard();\n    };\n\n    let content: JSX.Element | undefined;\n    switch (phase) {\n        case RightPanelPhases.MemberInfo:\n            content = <UserInfoBasicView room={room as Room} member={member as User} />;\n            break;\n        case RightPanelPhases.EncryptionPanel:\n            classes.push(\"mx_UserInfo_smallAvatar\");\n            content = (\n                <EncryptionPanel\n                    {...(props as React.ComponentProps<typeof EncryptionPanel>)}\n                    member={member as User | RoomMember}\n                    onClose={onEncryptionPanelClose}\n                    isRoomEncrypted={Boolean(isRoomEncrypted)}\n                />\n            );\n            break;\n    }\n\n    let closeLabel: string | undefined;\n    if (phase === RightPanelPhases.EncryptionPanel) {\n        const verificationRequest = (props as React.ComponentProps<typeof EncryptionPanel>).verificationRequest;\n        if (verificationRequest && verificationRequest.pending) {\n            closeLabel = _t(\"action|cancel\");\n        }\n    }\n\n    const header = (\n        <UserInfoHeaderView\n            hideVerificationSection={phase === RightPanelPhases.EncryptionPanel}\n            member={member}\n            devices={devices}\n            roomId={room?.roomId}\n        />\n    );\n\n    return (\n        <BaseCard\n            className={classes.join(\" \")}\n            header={_t(\"common|profile\")}\n            onClose={onClose}\n            closeLabel={closeLabel}\n            onBack={(ev: ButtonEvent) => {\n                if (sdkContext.rightPanelStore.previousCard.phase === RightPanelPhases.MemberList) {\n                    PosthogTrackers.trackInteraction(\"WebRightPanelRoomUserInfoBackButton\", ev);\n                }\n            }}\n        >\n            {header}\n            {content}\n        </BaseCard>\n    );\n};\n\nexport default UserInfo;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nexport const CardContext = React.createContext({ isCard: false });\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport const ReadPinsEventId = \"im.vector.room.read_pins\";\n\ndeclare module \"matrix-js-sdk/src/types\" {\n    interface RoomAccountDataEvents {\n        [ReadPinsEventId]: { event_ids: string[] };\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017-2023 The Matrix.org Foundation C.I.C.\nCopyright 2018 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2016 Aviral Dasgupta\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { sortBy, uniqBy } from \"lodash\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { _t } from \"../languageHandler\";\nimport AutocompleteProvider from \"./AutocompleteProvider\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport QueryMatcher from \"./QueryMatcher\";\nimport { PillCompletion } from \"./Components\";\nimport { makeRoomPermalink } from \"../utils/permalinks/Permalinks\";\nimport { type ICompletion, type ISelectionRange } from \"./Autocompleter\";\nimport RoomAvatar from \"../components/views/avatars/RoomAvatar\";\nimport { type TimelineRenderingType } from \"../contexts/RoomContext\";\nimport SettingsStore from \"../settings/SettingsStore\";\n\nconst ROOM_REGEX = /\\B#\\S*/g;\n\n// Prefer canonical aliases over non-canonical ones\nfunction canonicalScore(displayedAlias: string, room: Room): number {\n    return displayedAlias === room.getCanonicalAlias() ? 0 : 1;\n}\n\nfunction matcherObject(\n    room: Room,\n    displayedAlias: string,\n    matchName = \"\",\n): {\n    room: Room;\n    matchName: string;\n    displayedAlias: string;\n} {\n    return {\n        room,\n        matchName,\n        displayedAlias,\n    };\n}\n\nexport default class RoomProvider extends AutocompleteProvider {\n    protected matcher: QueryMatcher<ReturnType<typeof matcherObject>>;\n\n    public constructor(\n        private readonly room: Room,\n        renderingType?: TimelineRenderingType,\n    ) {\n        super({ commandRegex: ROOM_REGEX, renderingType });\n        this.matcher = new QueryMatcher<ReturnType<typeof matcherObject>>([], {\n            keys: [\"displayedAlias\", \"matchName\"],\n        });\n    }\n\n    protected getRooms(): Room[] {\n        const cli = MatrixClientPeg.safeGet();\n\n        // filter out spaces here as they get their own autocomplete provider\n        return cli\n            .getVisibleRooms(SettingsStore.getValue(\"feature_dynamic_room_predecessors\"))\n            .filter((r) => !r.isSpaceRoom());\n    }\n\n    public async getCompletions(\n        query: string,\n        selection: ISelectionRange,\n        force = false,\n        limit = -1,\n    ): Promise<ICompletion[]> {\n        const { command, range } = this.getCurrentCommand(query, selection, force);\n        if (command) {\n            // the only reason we need to do this is because Fuse only matches on properties\n            let matcherObjects = this.getRooms().reduce<ReturnType<typeof matcherObject>[]>((aliases, room) => {\n                if (room.getCanonicalAlias()) {\n                    aliases = aliases.concat(matcherObject(room, room.getCanonicalAlias()!, room.name));\n                }\n                if (room.getAltAliases().length) {\n                    const altAliases = room.getAltAliases().map((alias) => matcherObject(room, alias));\n                    aliases = aliases.concat(altAliases);\n                }\n                return aliases;\n            }, []);\n            // Filter out any matches where the user will have also autocompleted new rooms\n            matcherObjects = matcherObjects.filter((r) => {\n                const tombstone = r.room.currentState.getStateEvents(\"m.room.tombstone\", \"\");\n                if (tombstone && tombstone.getContent() && tombstone.getContent()[\"replacement_room\"]) {\n                    const hasReplacementRoom = matcherObjects.some(\n                        (r2) => r2.room.roomId === tombstone.getContent()[\"replacement_room\"],\n                    );\n                    return !hasReplacementRoom;\n                }\n                return true;\n            });\n\n            this.matcher.setObjects(matcherObjects);\n            const matchedString = command[0];\n            let completions = this.matcher.match(matchedString, limit);\n            completions = sortBy(completions, [\n                (c) => canonicalScore(c.displayedAlias, c.room),\n                (c) => c.displayedAlias.length,\n            ]);\n            completions = uniqBy(completions, (match) => match.room);\n            return completions\n                .map(\n                    (room): ICompletion => ({\n                        completion: room.displayedAlias,\n                        completionId: room.room.roomId,\n                        type: \"room\",\n                        suffix: \" \",\n                        href: makeRoomPermalink(this.room.client, room.displayedAlias),\n                        component: (\n                            <PillCompletion title={room.room.name} description={room.displayedAlias}>\n                                <RoomAvatar size=\"24px\" room={room.room} />\n                            </PillCompletion>\n                        ),\n                        range: range!,\n                    }),\n                )\n                .filter((completion) => !!completion.completion && completion.completion.length > 0);\n        }\n        return [];\n    }\n\n    public getName(): string {\n        return _t(\"common|rooms\");\n    }\n\n    public renderCompletions(completions: React.ReactNode[]): React.ReactNode {\n        return (\n            <div\n                className=\"mx_Autocomplete_Completion_container_pill mx_Autocomplete_Completion_container_truncate\"\n                role=\"presentation\"\n                aria-label={_t(\"composer|autocomplete|room_a11y\")}\n            >\n                {completions}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 Ryan Browne <code@commonlawfeature.com>\nCopyright 2019 The Matrix.org Foundation C.I.C.\nCopyright 2017, 2018 New Vector Ltd\nCopyright 2017 Vector Creations Ltd\nCopyright 2016 Aviral Dasgupta\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { uniq, sortBy, uniqBy, type ListIteratee } from \"lodash\";\nimport EMOTICON_REGEX from \"emojibase-regex/emoticon\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\nimport { EMOJI, type Emoji, getEmojiFromUnicode } from \"@matrix-org/emojibase-bindings\";\n\nimport { _t } from \"../languageHandler\";\nimport AutocompleteProvider from \"./AutocompleteProvider\";\nimport QueryMatcher from \"./QueryMatcher\";\nimport { PillCompletion } from \"./Components\";\nimport { type ICompletion, type ISelectionRange } from \"./Autocompleter\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { type TimelineRenderingType } from \"../contexts/RoomContext\";\nimport * as recent from \"../emojipicker/recent\";\nimport { filterBoolean } from \"../utils/arrays\";\n\nconst LIMIT = 20;\n\n// Match for ascii-style \";-)\" emoticons or \":wink:\" shortcodes provided by emojibase\n// anchored to only match from the start of parts otherwise it'll show emoji suggestions whilst typing matrix IDs\nconst EMOJI_REGEX = new RegExp(\"(\" + EMOTICON_REGEX.source + \"|(?:^|\\\\s):[+-\\\\w]*:?)$\", \"g\");\n\ninterface ISortedEmoji {\n    emoji: Emoji;\n    _orderBy: number;\n}\n\nconst SORTED_EMOJI: ISortedEmoji[] = EMOJI.sort((a, b) => {\n    if (a.group === b.group) {\n        return a.order! - b.order!;\n    }\n    return a.group! - b.group!;\n}).map((emoji, index) => ({\n    emoji,\n    // Include the index so that we can preserve the original order\n    _orderBy: index,\n}));\n\nfunction score(query: string, space: string[] | string): number {\n    if (Array.isArray(space)) {\n        return Math.min(...space.map((s) => score(query, s)));\n    }\n\n    const index = space.indexOf(query);\n    if (index === -1) {\n        return Infinity;\n    } else {\n        return index;\n    }\n}\n\nfunction colonsTrimmed(str: string): string {\n    // Trim off leading and potentially trailing `:` to correctly match the emoji data as they exist in emojibase.\n    // Notes: The regex is pinned to the start and end of the string so that we can use the lazy-capturing `*?` matcher.\n    // It needs to be lazy so that the trailing `:` is not captured in the replacement group, if it exists.\n    return str.replace(/^:(.*?):?$/, \"$1\");\n}\n\nexport default class EmojiProvider extends AutocompleteProvider {\n    public matcher: QueryMatcher<ISortedEmoji>;\n    public nameMatcher: QueryMatcher<ISortedEmoji>;\n    private readonly recentlyUsed: Emoji[];\n\n    public constructor(room: Room, renderingType?: TimelineRenderingType) {\n        super({ commandRegex: EMOJI_REGEX, renderingType });\n        this.matcher = new QueryMatcher<ISortedEmoji>(SORTED_EMOJI, {\n            keys: [],\n            funcs: [(o) => o.emoji.shortcodes.map((s) => `:${s}:`)],\n            // For matching against ascii equivalents\n            shouldMatchWordsOnly: false,\n        });\n        this.nameMatcher = new QueryMatcher(SORTED_EMOJI, {\n            keys: [\"emoji.label\"],\n            // For removing punctuation\n            shouldMatchWordsOnly: true,\n        });\n\n        this.recentlyUsed = Array.from(new Set(filterBoolean(recent.get().map(getEmojiFromUnicode))));\n    }\n\n    public async getCompletions(\n        query: string,\n        selection: ISelectionRange,\n        force?: boolean,\n        limit = -1,\n    ): Promise<ICompletion[]> {\n        if (!SettingsStore.getValue(\"MessageComposerInput.suggestEmoji\")) {\n            return []; // don't give any suggestions if the user doesn't want them\n        }\n\n        let completions: ISortedEmoji[] = [];\n        const { command, range } = this.getCurrentCommand(query, selection);\n\n        if (command && command[0].length > 2) {\n            const matchedString = command[0];\n            completions = this.matcher.match(matchedString, limit);\n\n            // Do second match with shouldMatchWordsOnly in order to match against 'name'\n            completions = completions.concat(this.nameMatcher.match(matchedString));\n\n            const sorters: ListIteratee<ISortedEmoji>[] = [];\n            // make sure that emoticons come first\n            sorters.push((c) => score(matchedString, c.emoji.emoticon || \"\"));\n\n            // then sort by score (Infinity if matchedString not in shortcode)\n            sorters.push((c) => score(matchedString, c.emoji.shortcodes[0]));\n            // then sort by max score of all shortcodes, trim off the `:`\n            const trimmedMatch = colonsTrimmed(matchedString);\n            sorters.push((c) => Math.min(...c.emoji.shortcodes.map((s) => score(trimmedMatch, s))));\n            // If the matchedString is not empty, sort by length of shortcode. Example:\n            //  matchedString = \":bookmark\"\n            //  completions = [\":bookmark:\", \":bookmark_tabs:\", ...]\n            if (matchedString.length > 1) {\n                sorters.push((c) => c.emoji.shortcodes[0].length);\n            }\n            // Finally, sort by original ordering\n            sorters.push((c) => c._orderBy);\n            completions = sortBy<ISortedEmoji>(uniq(completions), sorters);\n\n            completions = completions.slice(0, LIMIT);\n\n            // Do a second sort to place emoji matching with frequently used one on top\n            const recentlyUsedAutocomplete: ISortedEmoji[] = [];\n            this.recentlyUsed.forEach((emoji) => {\n                if (emoji.shortcodes[0].indexOf(trimmedMatch) === 0) {\n                    recentlyUsedAutocomplete.push({ emoji: emoji, _orderBy: 0 });\n                }\n            });\n\n            //if there is an exact shortcode match in the frequently used emojis, it goes before everything\n            for (let i = 0; i < recentlyUsedAutocomplete.length; i++) {\n                if (recentlyUsedAutocomplete[i].emoji.shortcodes[0] === trimmedMatch) {\n                    const exactMatchEmoji = recentlyUsedAutocomplete[i];\n                    for (let j = i; j > 0; j--) {\n                        recentlyUsedAutocomplete[j] = recentlyUsedAutocomplete[j - 1];\n                    }\n                    recentlyUsedAutocomplete[0] = exactMatchEmoji;\n                    break;\n                }\n            }\n\n            completions = recentlyUsedAutocomplete.concat(completions);\n            completions = uniqBy(completions, \"emoji\");\n\n            return completions.map((c) => ({\n                completion: c.emoji.unicode,\n                component: (\n                    <PillCompletion title={`:${c.emoji.shortcodes[0]}:`} aria-label={c.emoji.unicode}>\n                        <span>{c.emoji.unicode}</span>\n                    </PillCompletion>\n                ),\n                range: range!,\n            }));\n        }\n        return [];\n    }\n\n    public getName(): string {\n        return \"😃 \" + _t(\"common|emoji\");\n    }\n\n    public renderCompletions(completions: React.ReactNode[]): React.ReactNode {\n        return (\n            <div\n                className=\"mx_Autocomplete_Completion_container_pill\"\n                role=\"presentation\"\n                aria-label={_t(\"composer|autocomplete|emoji_a11y\")}\n            >\n                {completions}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2017-2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport AutocompleteProvider from \"./AutocompleteProvider\";\nimport { _t } from \"../languageHandler\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport { PillCompletion } from \"./Components\";\nimport { type ICompletion, type ISelectionRange } from \"./Autocompleter\";\nimport RoomAvatar from \"../components/views/avatars/RoomAvatar\";\nimport { type TimelineRenderingType } from \"../contexts/RoomContext\";\n\nconst AT_ROOM_REGEX = /@\\S*/g;\n\nexport default class NotifProvider extends AutocompleteProvider {\n    public constructor(\n        public room: Room,\n        renderingType?: TimelineRenderingType,\n    ) {\n        super({ commandRegex: AT_ROOM_REGEX, renderingType });\n    }\n\n    public async getCompletions(\n        query: string,\n        selection: ISelectionRange,\n        force = false,\n        limit = -1,\n    ): Promise<ICompletion[]> {\n        const client = MatrixClientPeg.safeGet();\n\n        if (!this.room.currentState.mayTriggerNotifOfType(\"room\", client.getSafeUserId())) return [];\n\n        const { command, range } = this.getCurrentCommand(query, selection, force);\n        if (\n            command?.[0] &&\n            command[0].length > 1 &&\n            [\"@room\", \"@channel\", \"@everyone\", \"@here\"].some((c) => c.startsWith(command![0]))\n        ) {\n            return [\n                {\n                    completion: \"@room\",\n                    completionId: \"@room\",\n                    type: \"at-room\",\n                    suffix: \" \",\n                    component: (\n                        <PillCompletion title=\"@room\" description={_t(\"composer|autocomplete|@room_description\")}>\n                            <RoomAvatar size=\"24px\" room={this.room} />\n                        </PillCompletion>\n                    ),\n                    range: range!,\n                },\n            ];\n        }\n        return [];\n    }\n\n    public getName(): string {\n        return \"❗️ \" + _t(\"composer|autocomplete|notification_description\");\n    }\n\n    public renderCompletions(completions: React.ReactNode[]): React.ReactNode {\n        return (\n            <div\n                className=\"mx_Autocomplete_Completion_container_pill mx_Autocomplete_Completion_container_truncate\"\n                role=\"presentation\"\n                aria-label={_t(\"composer|autocomplete|notification_a11y\")}\n            >\n                {completions}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2017-2024 New Vector Ltd.\nCopyright 2016 Aviral Dasgupta\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type ReactElement, type RefAttributes, type HTMLAttributes } from \"react\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport CommandProvider from \"./CommandProvider\";\nimport RoomProvider from \"./RoomProvider\";\nimport UserProvider from \"./UserProvider\";\nimport EmojiProvider from \"./EmojiProvider\";\nimport NotifProvider from \"./NotifProvider\";\nimport { timeout } from \"../utils/promise\";\nimport { type ICommand } from \"./AutocompleteProvider\";\nimport type AutocompleteProvider from \"./AutocompleteProvider\";\nimport SpaceProvider from \"./SpaceProvider\";\nimport { TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { filterBoolean } from \"../utils/arrays\";\n\nexport interface ISelectionRange {\n    beginning?: boolean; // whether the selection is in the first block of the editor or not\n    start: number; // byte offset relative to the start anchor of the current editor selection.\n    end: number; // byte offset relative to the end anchor of the current editor selection.\n}\n\nexport interface ICompletion {\n    type?: \"at-room\" | \"command\" | \"community\" | \"room\" | \"user\";\n    completion: string;\n    completionId?: string;\n    component: ReactElement<RefAttributes<HTMLElement> & HTMLAttributes<HTMLElement>>;\n    range: ISelectionRange;\n    command?: string;\n    suffix?: string;\n    // If provided, apply a LINK entity to the completion with the\n    // data = { url: href }.\n    href?: string;\n}\n\nconst PROVIDERS = [UserProvider, RoomProvider, EmojiProvider, NotifProvider, CommandProvider, SpaceProvider];\n\n// Providers will get rejected if they take longer than this.\nconst PROVIDER_COMPLETION_TIMEOUT = 3000;\n\nexport interface IProviderCompletions {\n    completions: ICompletion[];\n    provider: AutocompleteProvider;\n    command: Partial<ICommand>;\n}\n\nexport default class Autocompleter {\n    public room: Room;\n    public providers: AutocompleteProvider[];\n\n    public constructor(room: Room, renderingType: TimelineRenderingType = TimelineRenderingType.Room) {\n        this.room = room;\n        this.providers = PROVIDERS.map((Prov) => {\n            return new Prov(room, renderingType);\n        });\n    }\n\n    public destroy(): void {\n        this.providers.forEach((p) => {\n            p.destroy();\n        });\n    }\n\n    public async getCompletions(\n        query: string,\n        selection: ISelectionRange,\n        force = false,\n        limit = -1,\n    ): Promise<IProviderCompletions[]> {\n        /* Note: This intentionally waits for all providers to return,\n         otherwise, we run into a condition where new completions are displayed\n         while the user is interacting with the list, which makes it difficult\n         to predict whether an action will actually do what is intended\n        */\n        // list of results from each provider, each being a list of completions or null if it times out\n        const completionsList: Array<ICompletion[] | null> = await Promise.all(\n            this.providers.map(async (provider): Promise<ICompletion[] | null> => {\n                return timeout(\n                    provider.getCompletions(query, selection, force, limit),\n                    null,\n                    PROVIDER_COMPLETION_TIMEOUT,\n                );\n            }),\n        );\n\n        // map then filter to maintain the index for the map-operation, for this.providers to line up\n        return filterBoolean(\n            completionsList.map((completions, i) => {\n                if (!completions || !completions.length) return;\n\n                return {\n                    completions,\n                    provider: this.providers[i],\n\n                    /* the currently matched \"command\" the completer tried to complete\n                     * we pass this through so that Autocomplete can figure out when to\n                     * re-show itself once hidden.\n                     */\n                    command: this.providers[i].getCurrentCommand(query, selection, force),\n                };\n            }),\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\nimport React from \"react\";\n\nimport { _t } from \"../languageHandler\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport RoomProvider from \"./RoomProvider\";\n\nexport default class SpaceProvider extends RoomProvider {\n    protected getRooms(): Room[] {\n        return MatrixClientPeg.safeGet()\n            .getVisibleRooms(SettingsStore.getValue(\"feature_dynamic_room_predecessors\"))\n            .filter((r) => r.isSpaceRoom());\n    }\n\n    public getName(): string {\n        return _t(\"common|spaces\");\n    }\n\n    public renderCompletions(completions: React.ReactNode[]): React.ReactNode {\n        return (\n            <div\n                className=\"mx_Autocomplete_Completion_container_pill mx_Autocomplete_Completion_container_truncate\"\n                role=\"listbox\"\n                aria-label={_t(\"composer|autocomplete|space_a11y\")}\n            >\n                {completions}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2017-2024 New Vector Ltd.\nCopyright 2016 Aviral Dasgupta\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createRef, type RefObject } from \"react\";\nimport classNames from \"classnames\";\nimport { flatMap } from \"lodash\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport Autocompleter, {\n    type ICompletion,\n    type ISelectionRange,\n    type IProviderCompletions,\n} from \"../../../autocomplete/Autocompleter\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport RoomContext from \"../../../contexts/RoomContext\";\n\nconst MAX_PROVIDER_MATCHES = 20;\n\nexport const generateCompletionDomId = (n: number): string => `mx_Autocomplete_Completion_${n}`;\n\ninterface IProps {\n    // the query string for which to show autocomplete suggestions\n    query: string;\n    // method invoked with range and text content when completion is confirmed\n    onConfirm: (completion: ICompletion) => void;\n    // method invoked when selected (if any) completion changes\n    onSelectionChange?: (partIndex: number) => void;\n    selection: ISelectionRange;\n    // The room in which we're autocompleting\n    room: Room;\n}\n\ninterface IState {\n    completions: IProviderCompletions[];\n    completionList: ICompletion[];\n    selectionOffset: number;\n    shouldShowCompletions: boolean;\n    hide: boolean;\n    forceComplete: boolean;\n}\n\nexport default class Autocomplete extends React.PureComponent<IProps, IState> {\n    public autocompleter?: Autocompleter;\n    public queryRequested?: string;\n    public debounceCompletionsRequest?: number;\n    private containerRef = createRef<HTMLDivElement>();\n    private completionRefs: Record<string, RefObject<HTMLElement | null>> = {};\n\n    public static contextType = RoomContext;\n    declare public context: React.ContextType<typeof RoomContext>;\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            // list of completionResults, each containing completions\n            completions: [],\n\n            // array of completions, so we can look up current selection by offset quickly\n            completionList: [],\n\n            // how far down the completion list we are (THIS IS 1-INDEXED!)\n            selectionOffset: 1,\n\n            // whether we should show completions if they're available\n            shouldShowCompletions: true,\n\n            hide: false,\n\n            forceComplete: false,\n        };\n    }\n\n    public componentDidMount(): void {\n        this.autocompleter = new Autocompleter(this.props.room, this.context.timelineRenderingType);\n        this.applyNewProps();\n    }\n\n    private applyNewProps(oldQuery?: string, oldRoom?: Room): void {\n        if (oldRoom && this.props.room.roomId !== oldRoom.roomId) {\n            this.autocompleter?.destroy();\n            this.autocompleter = new Autocompleter(this.props.room);\n        }\n\n        // Query hasn't changed so don't try to complete it\n        if (oldQuery === this.props.query) {\n            return;\n        }\n\n        this.complete(this.props.query, this.props.selection);\n    }\n\n    public componentWillUnmount(): void {\n        this.autocompleter?.destroy();\n    }\n\n    private complete(query: string, selection: ISelectionRange): Promise<void> {\n        this.queryRequested = query;\n        if (this.debounceCompletionsRequest) {\n            clearTimeout(this.debounceCompletionsRequest);\n        }\n        if (query === \"\") {\n            this.setState({\n                // Clear displayed completions\n                completions: [],\n                completionList: [],\n                // Reset selected completion\n                selectionOffset: 1,\n                // Hide the autocomplete box\n                hide: true,\n            });\n            return Promise.resolve();\n        }\n        let autocompleteDelay = SettingsStore.getValue(\"autocompleteDelay\");\n\n        // Don't debounce if we are already showing completions\n        if (this.state.completions.length > 0 || this.state.forceComplete) {\n            autocompleteDelay = 0;\n        }\n\n        return new Promise((resolve) => {\n            this.debounceCompletionsRequest = window.setTimeout(() => {\n                resolve(this.processQuery(query, selection));\n            }, autocompleteDelay);\n        });\n    }\n\n    private async processQuery(query: string, selection: ISelectionRange): Promise<void> {\n        if (!this.autocompleter) return;\n        const completions = await this.autocompleter.getCompletions(\n            query,\n            selection,\n            this.state.forceComplete,\n            MAX_PROVIDER_MATCHES,\n        );\n        // Only ever process the completions for the most recent query being processed\n        if (query !== this.queryRequested) {\n            return;\n        }\n        await this.processCompletions(completions);\n    }\n\n    private async processCompletions(completions: IProviderCompletions[]): Promise<void> {\n        const completionList = flatMap(completions, (provider) => provider.completions);\n\n        // Reset selection when completion list becomes empty.\n        let selectionOffset = 1;\n        if (completionList.length > 0) {\n            /* If the currently selected completion is still in the completion list,\n             try to find it and jump to it. If not, select composer.\n             */\n            const currentSelection =\n                this.state.selectionOffset <= 1\n                    ? null\n                    : this.state.completionList[this.state.selectionOffset - 1].completion;\n            selectionOffset = completionList.findIndex((completion) => completion.completion === currentSelection);\n            if (selectionOffset === -1) {\n                selectionOffset = 1;\n            } else {\n                selectionOffset++; // selectionOffset is 1-indexed!\n            }\n        }\n\n        let hide = true;\n        // If `completion.command.command` is truthy, then a provider has matched with the query\n        const anyMatches = completions.some((completion) => !!completion.command.command);\n        if (anyMatches) {\n            hide = false;\n            if (this.props.onSelectionChange) {\n                this.props.onSelectionChange(selectionOffset - 1);\n            }\n        }\n\n        const deferred = Promise.withResolvers<void>();\n        this.setState(\n            {\n                completions,\n                completionList,\n                selectionOffset,\n                hide,\n                // Force complete is turned off each time since we can't edit the query in that case\n                forceComplete: false,\n            },\n            deferred.resolve,\n        );\n        await deferred.promise;\n    }\n\n    public hasSelection(): boolean {\n        return this.countCompletions() > 0 && this.state.selectionOffset !== 0;\n    }\n\n    public countCompletions(): number {\n        return this.state.completionList.length;\n    }\n\n    // called from MessageComposerInput\n    public moveSelection(delta: number): void {\n        const completionCount = this.countCompletions();\n        if (completionCount === 0) return; // there are no items to move the selection through\n\n        // Note: selectionOffset 0 represents the unsubstituted text, while 1 means first pill selected\n        const index = (this.state.selectionOffset + delta + completionCount - 1) % completionCount;\n        this.setSelection(1 + index);\n    }\n\n    public onEscape(e: KeyboardEvent | React.KeyboardEvent): boolean | undefined {\n        const completionCount = this.countCompletions();\n        if (completionCount === 0) {\n            // autocomplete is already empty, so don't preventDefault\n            return;\n        }\n\n        e.preventDefault();\n\n        // selectionOffset = 0, so we don't end up completing when autocomplete is hidden\n        this.hide();\n    }\n\n    private hide = (): void => {\n        this.setState({\n            hide: true,\n            selectionOffset: 1,\n            completions: [],\n            completionList: [],\n        });\n    };\n\n    public forceComplete(): Promise<number> {\n        return new Promise((resolve) => {\n            this.setState(\n                {\n                    forceComplete: true,\n                    hide: false,\n                },\n                () => {\n                    this.complete(this.props.query, this.props.selection).then(() => {\n                        resolve(this.countCompletions());\n                    });\n                },\n            );\n        });\n    }\n\n    public onConfirmCompletion = (): void => {\n        this.onCompletionClicked(this.state.selectionOffset);\n    };\n\n    private onCompletionClicked = (selectionOffset: number): boolean => {\n        const count = this.countCompletions();\n        if (count === 0 || selectionOffset < 1 || selectionOffset > count) {\n            return false;\n        }\n\n        this.props.onConfirm(this.state.completionList[selectionOffset - 1]);\n        this.hide();\n\n        return true;\n    };\n\n    private setSelection(selectionOffset: number): void {\n        this.setState({ selectionOffset, hide: false });\n        if (this.props.onSelectionChange) {\n            this.props.onSelectionChange(selectionOffset - 1);\n        }\n    }\n\n    public componentDidUpdate(prevProps: IProps): void {\n        this.applyNewProps(prevProps.query, prevProps.room);\n        // this is the selected completion, so scroll it into view if needed\n        const selectedCompletion = this.completionRefs[`completion${this.state.selectionOffset}`]?.current;\n\n        if (selectedCompletion) {\n            selectedCompletion.scrollIntoView({\n                behavior: \"auto\",\n                block: \"nearest\",\n            });\n        } else if (this.containerRef.current) {\n            this.containerRef.current.scrollTo({ top: 0 });\n        }\n    }\n\n    public render(): React.ReactNode {\n        let position = 1;\n        const renderedCompletions = this.state.completions\n            .map((completionResult, i) => {\n                const completions = completionResult.completions.map((completion, j) => {\n                    const selected = position === this.state.selectionOffset;\n                    const className = classNames(\"mx_Autocomplete_Completion\", { selected });\n                    const componentPosition = position;\n                    position++;\n\n                    const onClick = (): void => {\n                        this.onCompletionClicked(componentPosition);\n                    };\n\n                    const refId = `completion${componentPosition}`;\n                    if (!this.completionRefs[refId]) {\n                        this.completionRefs[refId] = createRef();\n                    }\n                    return React.cloneElement(completion.component, {\n                        \"key\": j,\n                        \"ref\": this.completionRefs[refId],\n                        \"id\": generateCompletionDomId(componentPosition - 1), // 0 index the completion IDs\n                        className,\n                        onClick,\n                        \"aria-selected\": selected,\n                    });\n                });\n\n                return completions.length > 0 ? (\n                    <div key={i} className=\"mx_Autocomplete_ProviderSection\" role=\"presentation\">\n                        <div className=\"mx_Autocomplete_provider_name\">{completionResult.provider.getName()}</div>\n                        {completionResult.provider.renderCompletions(completions)}\n                    </div>\n                ) : null;\n            })\n            .filter((completion) => !!completion);\n\n        return !this.state.hide && renderedCompletions.length > 0 ? (\n            <div id=\"mx_Autocomplete\" className=\"mx_Autocomplete\" ref={this.containerRef} role=\"listbox\">\n                {renderedCompletions}\n            </div>\n        ) : null;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type EditorModel from \"./model\";\nimport { type IDiff } from \"./diff\";\nimport { type SerializedPart } from \"./parts\";\nimport { type Caret } from \"./caret\";\n\nexport interface IHistory {\n    parts: SerializedPart[];\n    caret?: Caret;\n}\n\nexport const MAX_STEP_LENGTH = 10;\n\nexport default class HistoryManager {\n    private stack: IHistory[] = [];\n    private newlyTypedCharCount = 0;\n    private currentIndex = -1;\n    private changedSinceLastPush = false;\n    private lastCaret?: Caret;\n    private nonWordBoundarySinceLastPush = false;\n    private addedSinceLastPush = false;\n    private removedSinceLastPush = false;\n\n    public clear(): void {\n        this.stack = [];\n        this.newlyTypedCharCount = 0;\n        this.currentIndex = -1;\n        this.changedSinceLastPush = false;\n        this.lastCaret = undefined;\n        this.nonWordBoundarySinceLastPush = false;\n        this.addedSinceLastPush = false;\n        this.removedSinceLastPush = false;\n    }\n\n    private shouldPush(inputType?: string, diff?: IDiff): boolean {\n        // right now we can only push a step after\n        // the input has been applied to the model,\n        // so we can't push the state before something happened.\n        // not ideal but changing this would be harder to fit cleanly into\n        // the editor model.\n        const isNonBulkInput =\n            inputType === \"insertText\" || inputType === \"deleteContentForward\" || inputType === \"deleteContentBackward\";\n        if (diff && isNonBulkInput) {\n            if (diff.added) {\n                this.addedSinceLastPush = true;\n            }\n            if (diff.removed) {\n                this.removedSinceLastPush = true;\n            }\n            // as long as you've only been adding or removing since the last push\n            if (this.addedSinceLastPush !== this.removedSinceLastPush) {\n                // add steps by word boundary, up to MAX_STEP_LENGTH characters\n                const str = diff.added ? diff.added : diff.removed!;\n                const isWordBoundary = str === \" \" || str === \"\\t\" || str === \"\\n\";\n                if (this.nonWordBoundarySinceLastPush && isWordBoundary) {\n                    return true;\n                }\n                if (!isWordBoundary) {\n                    this.nonWordBoundarySinceLastPush = true;\n                }\n                this.newlyTypedCharCount += str.length;\n                return this.newlyTypedCharCount > MAX_STEP_LENGTH;\n            } else {\n                // if starting to remove while adding before, or the opposite, push\n                return true;\n            }\n        } else {\n            // bulk input (paste, ...) should be pushed every time\n            return true;\n        }\n    }\n\n    private pushState(model: EditorModel, caret?: Caret): void {\n        // remove all steps after current step\n        while (this.currentIndex < this.stack.length - 1) {\n            this.stack.pop();\n        }\n        const parts = model.serializeParts();\n        this.stack.push({ parts, caret });\n        this.currentIndex = this.stack.length - 1;\n        this.lastCaret = undefined;\n        this.changedSinceLastPush = false;\n        this.newlyTypedCharCount = 0;\n        this.nonWordBoundarySinceLastPush = false;\n        this.addedSinceLastPush = false;\n        this.removedSinceLastPush = false;\n    }\n\n    // needs to persist parts and caret position\n    public tryPush(model: EditorModel, caret?: Caret, inputType?: string, diff?: IDiff): boolean {\n        // ignore state restoration echos.\n        // these respect the inputType values of the input event,\n        // but are actually passed in from MessageEditor calling model.reset()\n        // in the keydown event handler.\n        if (inputType === \"historyUndo\" || inputType === \"historyRedo\") {\n            return false;\n        }\n        const shouldPush = this.shouldPush(inputType, diff);\n        if (shouldPush) {\n            this.pushState(model, caret);\n        } else {\n            this.lastCaret = caret;\n            this.changedSinceLastPush = true;\n        }\n        return shouldPush;\n    }\n\n    public ensureLastChangesPushed(model: EditorModel): void {\n        if (this.changedSinceLastPush && this.lastCaret) {\n            this.pushState(model, this.lastCaret);\n        }\n    }\n\n    public canUndo(): boolean {\n        return this.currentIndex >= 1 || this.changedSinceLastPush;\n    }\n\n    public canRedo(): boolean {\n        return this.currentIndex < this.stack.length - 1;\n    }\n\n    // returns state that should be applied to model\n    public undo(model: EditorModel): IHistory | void {\n        if (this.canUndo()) {\n            this.ensureLastChangesPushed(model);\n            this.currentIndex -= 1;\n            return this.stack[this.currentIndex];\n        }\n    }\n\n    // returns state that should be applied to model\n    public redo(): IHistory | void {\n        if (this.canRedo()) {\n            this.changedSinceLastPush = false;\n            this.currentIndex += 1;\n            return this.stack[this.currentIndex];\n        }\n    }\n}\n","/*\nCopyright 2019-2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { needsCaretNodeBefore, needsCaretNodeAfter } from \"./render\";\nimport Range from \"./range\";\nimport type EditorModel from \"./model\";\nimport { type IPosition } from \"./position\";\nimport type DocumentPosition from \"./position\";\nimport { type Part, Type } from \"./parts\";\n\nexport type Caret = Range | DocumentPosition;\n\nexport function setSelection(editor: HTMLDivElement, model: EditorModel, selection: Range | IPosition): void {\n    if (selection instanceof Range) {\n        setDocumentRangeSelection(editor, model, selection);\n    } else {\n        setCaretPosition(editor, model, selection);\n    }\n}\n\nfunction setDocumentRangeSelection(editor: HTMLDivElement, model: EditorModel, range: Range): void {\n    const sel = document.getSelection()!;\n    sel.removeAllRanges();\n    const selectionRange = document.createRange();\n    const start = getNodeAndOffsetForPosition(editor, model, range.start);\n    selectionRange.setStart(start.node, start.offset);\n    const end = getNodeAndOffsetForPosition(editor, model, range.end);\n    selectionRange.setEnd(end.node, end.offset);\n    sel.addRange(selectionRange);\n}\n\nexport function setCaretPosition(editor: HTMLDivElement, model: EditorModel, caretPosition: IPosition): void {\n    if (model.isEmpty) return; // selection can't possibly be wrong, so avoid a reflow\n\n    const range = document.createRange();\n    const { node, offset } = getNodeAndOffsetForPosition(editor, model, caretPosition);\n    range.setStart(node, offset);\n    range.collapse(true);\n\n    const sel = document.getSelection()!;\n    if (sel.rangeCount === 1) {\n        const existingRange = sel.getRangeAt(0);\n        if (\n            existingRange.startContainer === range.startContainer &&\n            existingRange.startOffset === range.startOffset &&\n            existingRange.collapsed === range.collapsed\n        ) {\n            // If the selection matches, it's important to leave it alone.\n            // Recreating the selection state in at least Chrome can cause\n            // strange side effects, like touch bar flickering on every key.\n            // See https://github.com/vector-im/element-web/issues/9299\n            return;\n        }\n    }\n    sel.removeAllRanges();\n    sel.addRange(range);\n}\n\nfunction getNodeAndOffsetForPosition(\n    editor: HTMLDivElement,\n    model: EditorModel,\n    position: IPosition,\n): {\n    node: Node;\n    offset: number;\n} {\n    const { offset, lineIndex, nodeIndex } = getLineAndNodePosition(model, position);\n    const lineNode = editor.childNodes[lineIndex];\n\n    let focusNode;\n    // empty line with just a <br>\n    if (nodeIndex === -1) {\n        focusNode = lineNode;\n    } else {\n        focusNode = lineNode.childNodes[nodeIndex];\n        // make sure we have a text node\n        if (focusNode.nodeType === Node.ELEMENT_NODE && focusNode.firstChild) {\n            focusNode = focusNode.firstChild;\n        }\n    }\n    return { node: focusNode, offset };\n}\n\nexport function getLineAndNodePosition(\n    model: EditorModel,\n    caretPosition: IPosition,\n): {\n    offset: number;\n    lineIndex: number;\n    nodeIndex: number;\n} {\n    const { parts } = model;\n    const partIndex = caretPosition.index;\n    let { offset } = caretPosition;\n    const lineResult = findNodeInLineForPart(parts, partIndex, offset);\n    const { lineIndex } = lineResult;\n    let { nodeIndex } = lineResult;\n    // we're at an empty line between a newline part\n    // and another newline part or end/start of parts.\n    // set offset to 0 so it gets set to the <br> inside the line container\n    if (nodeIndex === -1) {\n        offset = 0;\n    } else {\n        // move caret out of uneditable part (into caret node, or empty line br) if needed\n        ({ nodeIndex, offset } = moveOutOfUnselectablePart(parts, partIndex, nodeIndex, offset));\n    }\n    return { lineIndex, nodeIndex, offset };\n}\n\nfunction findNodeInLineForPart(\n    parts: Part[],\n    partIndex: number,\n    offset: number,\n): { lineIndex: number; nodeIndex: number } {\n    let lineIndex = 0;\n    let nodeIndex = -1;\n\n    let prevPart: Part | undefined;\n    // go through to parts up till (and including) the index\n    // to find newline parts\n    for (let i = 0; i <= partIndex; ++i) {\n        const part = parts[i];\n        if (part.type === Type.Newline) {\n            // don't jump over the linebreak if the offset is before it\n            if (i == partIndex && offset === 0) {\n                continue;\n            }\n            lineIndex += 1;\n            nodeIndex = -1;\n            prevPart = undefined;\n        } else {\n            nodeIndex += 1;\n            if (needsCaretNodeBefore(part, prevPart)) {\n                nodeIndex += 1;\n            }\n            // only jump over caret node if we're not at our destination node already,\n            // as we'll assume in moveOutOfUnselectablePart that nodeIndex\n            // refers to the node corresponding to the part,\n            // and not an adjacent caret node\n            if (i < partIndex) {\n                const nextPart = parts[i + 1];\n                const isLastOfLine = !nextPart || nextPart.type === Type.Newline;\n                if (needsCaretNodeAfter(part, isLastOfLine)) {\n                    nodeIndex += 1;\n                }\n            }\n            prevPart = part;\n        }\n    }\n\n    return { lineIndex, nodeIndex };\n}\n\nfunction moveOutOfUnselectablePart(\n    parts: Part[],\n    partIndex: number,\n    nodeIndex: number,\n    offset: number,\n): { offset: number; nodeIndex: number } {\n    // move caret before or after unselectable part\n    const part = parts[partIndex];\n    if (part && !part.acceptsCaret) {\n        if (offset === 0) {\n            nodeIndex -= 1;\n            const prevPart = parts[partIndex - 1];\n            // if the previous node is a caret node, it's empty\n            // so the offset can stay at 0\n            // only when it's not, we need to set the offset\n            // at the end of the node\n            if (!needsCaretNodeBefore(part, prevPart)) {\n                offset = prevPart.text.length;\n            }\n        } else {\n            nodeIndex += 1;\n            offset = 0;\n        }\n    }\n    return { nodeIndex, offset };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createRef, type JSX } from \"react\";\nimport classNames from \"classnames\";\nimport {\n    BoldIcon,\n    ItalicIcon,\n    StrikethroughIcon,\n    InlineCodeIcon,\n    QuoteIcon,\n    LinkIcon,\n} from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { RovingAccessibleButton } from \"../../../accessibility/RovingTabIndex\";\nimport Toolbar from \"../../../accessibility/Toolbar\";\n\nexport enum Formatting {\n    Bold = \"bold\",\n    Italics = \"italics\",\n    Strikethrough = \"strikethrough\",\n    Code = \"code\",\n    Quote = \"quote\",\n    InsertLink = \"insert_link\",\n}\n\ninterface IProps {\n    shortcuts: Partial<Record<Formatting, string>>;\n    onAction(action: Formatting): void;\n}\n\ninterface IState {\n    visible: boolean;\n}\n\nexport default class MessageComposerFormatBar extends React.PureComponent<IProps, IState> {\n    private readonly formatBarRef = createRef<HTMLDivElement>();\n    /**\n     * The height of the format bar in pixels.\n     * Height 32px + 2px border\n     * @private\n     */\n    private readonly BAR_HEIGHT = 34;\n\n    public constructor(props: IProps) {\n        super(props);\n        this.state = { visible: false };\n    }\n\n    public render(): React.ReactNode {\n        const classes = classNames(\"mx_MessageComposerFormatBar\", {\n            mx_MessageComposerFormatBar_shown: this.state.visible,\n        });\n        return (\n            <Toolbar className={classes} ref={this.formatBarRef} aria-label={_t(\"composer|formatting_toolbar_label\")}>\n                <FormatButton\n                    label={_t(\"composer|format_bold\")}\n                    onClick={() => this.props.onAction(Formatting.Bold)}\n                    icon={<BoldIcon />}\n                    shortcut={this.props.shortcuts.bold}\n                />\n                <FormatButton\n                    label={_t(\"composer|format_italics\")}\n                    onClick={() => this.props.onAction(Formatting.Italics)}\n                    icon={<ItalicIcon />}\n                    shortcut={this.props.shortcuts.italics}\n                />\n                <FormatButton\n                    label={_t(\"composer|format_strikethrough\")}\n                    onClick={() => this.props.onAction(Formatting.Strikethrough)}\n                    icon={<StrikethroughIcon />}\n                />\n                <FormatButton\n                    label={_t(\"composer|format_code_block\")}\n                    onClick={() => this.props.onAction(Formatting.Code)}\n                    icon={<InlineCodeIcon />}\n                    shortcut={this.props.shortcuts.code}\n                />\n                <FormatButton\n                    label={_t(\"action|quote\")}\n                    onClick={() => this.props.onAction(Formatting.Quote)}\n                    icon={<QuoteIcon />}\n                    shortcut={this.props.shortcuts.quote}\n                />\n                <FormatButton\n                    label={_t(\"composer|format_insert_link\")}\n                    onClick={() => this.props.onAction(Formatting.InsertLink)}\n                    icon={<LinkIcon />}\n                    shortcut={this.props.shortcuts.insert_link}\n                />\n            </Toolbar>\n        );\n    }\n\n    public showAt(selectionRect: DOMRect): void {\n        if (!this.formatBarRef.current?.parentElement) return;\n\n        this.setState({ visible: true });\n        const parentRect = this.formatBarRef.current.parentElement.getBoundingClientRect();\n        this.formatBarRef.current.style.left = `${selectionRect.left - parentRect.left}px`;\n        const halfBarHeight = this.BAR_HEIGHT / 2; // used to center the bar\n        const offset = halfBarHeight + 2; // makes sure the bar won't cover selected text\n        const offsetLimit = halfBarHeight + offset;\n        const position = Math.max(selectionRect.top - parentRect.top - offsetLimit, -offsetLimit);\n        this.formatBarRef.current.style.top = `${position}px`;\n    }\n\n    public hide(): void {\n        this.setState({ visible: false });\n    }\n}\n\ninterface IFormatButtonProps {\n    label: string;\n    icon: JSX.Element;\n    shortcut?: string;\n    onClick(): void;\n}\n\nclass FormatButton extends React.PureComponent<IFormatButtonProps> {\n    public render(): React.ReactNode {\n        // element=\"button\" and type=\"button\" are necessary for the buttons to work on WebKit,\n        // otherwise the text is deselected before onClick can ever be called\n        return (\n            <RovingAccessibleButton\n                element=\"button\"\n                type=\"button\"\n                onClick={this.props.onClick}\n                aria-label={this.props.label}\n                title={this.props.label}\n                caption={this.props.shortcut}\n                className=\"mx_MessageComposerFormatBar_button\"\n            >\n                {this.props.icon}\n            </RovingAccessibleButton>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type Range from \"./range\";\nimport { type Part, Type } from \"./parts\";\nimport { Formatting } from \"../components/views/rooms/MessageComposerFormatBar\";\nimport { longestBacktickSequence } from \"./deserialize\";\n\n/**\n * Some common queries and transformations on the editor model\n */\n\n/**\n * Formats a given range with a given action\n * @param {Range} range the range that should be formatted\n * @param {Formatting} action the action that should be performed on the range\n */\nexport function formatRange(range: Range, action: Formatting): void {\n    // If the selection was empty we select the current word instead\n    if (range.wasInitializedEmpty()) {\n        selectRangeOfWordAtCaret(range);\n    } else {\n        // Remove whitespace or new lines in our selection\n        range.trim();\n    }\n\n    // Edge case when just selecting whitespace or new line.\n    // There should be no reason to format whitespace, so we can just return.\n    if (range.length === 0) {\n        return;\n    }\n\n    switch (action) {\n        case Formatting.Bold:\n            toggleInlineFormat(range, \"**\");\n            break;\n        case Formatting.Italics:\n            toggleInlineFormat(range, \"*\");\n            break;\n        case Formatting.Strikethrough:\n            toggleInlineFormat(range, \"<del>\", \"</del>\");\n            break;\n        case Formatting.Code:\n            formatRangeAsCode(range);\n            break;\n        case Formatting.Quote:\n            formatRangeAsQuote(range);\n            break;\n        case Formatting.InsertLink:\n            formatRangeAsLink(range);\n            break;\n    }\n}\n\nexport function replaceRangeAndExpandSelection(range: Range, newParts: Part[]): void {\n    const { model } = range;\n    model.transform(() => {\n        const oldLen = range.length;\n        const addedLen = range.replace(newParts);\n        const firstOffset = range.start.asOffset(model);\n        const lastOffset = firstOffset.add(oldLen + addedLen);\n        return model.startRange(firstOffset.asPosition(model), lastOffset.asPosition(model));\n    });\n}\n\nexport function replaceRangeAndMoveCaret(range: Range, newParts: Part[], offset = 0, atNodeEnd = false): void {\n    const { model } = range;\n    model.transform(() => {\n        const oldLen = range.length;\n        const addedLen = range.replace(newParts);\n        const firstOffset = range.start.asOffset(model);\n        const lastOffset = firstOffset.add(oldLen + addedLen + offset, atNodeEnd);\n        return lastOffset.asPosition(model);\n    });\n}\n\n/**\n * Replaces a range with formatting or removes existing formatting and\n * positions the cursor with respect to the prefix and suffix length.\n * @param {Range} range the previous value\n * @param {Part[]} newParts the new value\n * @param {boolean} rangeHasFormatting the new value\n * @param {number} prefixLength the length of the formatting prefix\n * @param {number} suffixLength the length of the formatting suffix, defaults to prefix length\n */\nexport function replaceRangeAndAutoAdjustCaret(\n    range: Range,\n    newParts: Part[],\n    rangeHasFormatting = false,\n    prefixLength: number,\n    suffixLength = prefixLength,\n): void {\n    const { model } = range;\n    const lastStartingPosition = range.getLastStartingPosition();\n    const relativeOffset = lastStartingPosition.offset - range.start.offset;\n    const distanceFromEnd = range.length - relativeOffset;\n    // Handle edge case where the caret is located within the suffix or prefix\n    if (rangeHasFormatting) {\n        if (relativeOffset < prefixLength) {\n            // Was the caret at the left format string?\n            replaceRangeAndMoveCaret(range, newParts, -(range.length - 2 * suffixLength));\n            return;\n        }\n        if (distanceFromEnd < suffixLength) {\n            // Was the caret at the right format string?\n            replaceRangeAndMoveCaret(range, newParts, 0, true);\n            return;\n        }\n    }\n    // Calculate new position with respect to the previous position\n    model.transform(() => {\n        const offsetDirection = Math.sign(range.replace(newParts)); // Compensates for shrinkage or expansion\n        const atEnd = distanceFromEnd === suffixLength;\n        return lastStartingPosition\n            .asOffset(model)\n            .add(offsetDirection * prefixLength, atEnd)\n            .asPosition(model);\n    });\n}\n\nconst isFormattable = (_index: number, offset: number, part: Part): boolean => {\n    return part.text[offset] !== \" \" && part.type === Type.Plain;\n};\n\nexport function selectRangeOfWordAtCaret(range: Range): void {\n    // Select right side of word\n    range.expandForwardsWhile(isFormattable);\n    // Select left side of word\n    range.expandBackwardsWhile(isFormattable);\n    // Trim possibly selected new lines\n    range.trim();\n}\n\nexport function rangeStartsAtBeginningOfLine(range: Range): boolean {\n    const { model } = range;\n    const startsWithPartial = range.start.offset !== 0;\n    const isFirstPart = range.start.index === 0;\n    const previousIsNewline = !isFirstPart && model.parts[range.start.index - 1].type === Type.Newline;\n    return !startsWithPartial && (isFirstPart || previousIsNewline);\n}\n\nexport function rangeEndsAtEndOfLine(range: Range): boolean {\n    const { model } = range;\n    const lastPart = model.parts[range.end.index];\n    const endsWithPartial = range.end.offset !== lastPart.text.length;\n    const isLastPart = range.end.index === model.parts.length - 1;\n    const nextIsNewline = !isLastPart && model.parts[range.end.index + 1].type === Type.Newline;\n    return !endsWithPartial && (isLastPart || nextIsNewline);\n}\n\nexport function formatRangeAsQuote(range: Range): void {\n    const { model, parts } = range;\n    const { partCreator } = model;\n    for (let i = 0; i < parts.length; ++i) {\n        const part = parts[i];\n        if (part.type === Type.Newline) {\n            parts.splice(i + 1, 0, partCreator.plain(\"> \"));\n        }\n    }\n    parts.unshift(partCreator.plain(\"> \"));\n    if (!rangeStartsAtBeginningOfLine(range)) {\n        parts.unshift(partCreator.newline());\n    }\n    if (!rangeEndsAtEndOfLine(range)) {\n        parts.push(partCreator.newline());\n    }\n    parts.push(partCreator.newline());\n    replaceRangeAndExpandSelection(range, parts);\n}\n\nexport function formatRangeAsCode(range: Range): void {\n    const { model, parts } = range;\n    const { partCreator } = model;\n\n    const hasBlockFormatting =\n        range.length > 0 && range.text.startsWith(\"```\") && range.text.endsWith(\"```\") && range.text.includes(\"\\n\");\n\n    const needsBlockFormatting = parts.some((p) => p.type === Type.Newline);\n\n    if (hasBlockFormatting) {\n        parts.shift();\n        parts.pop();\n        if (parts[0]?.text === \"\\n\" && parts[parts.length - 1]?.text === \"\\n\") {\n            parts.shift();\n            parts.pop();\n        }\n    } else if (needsBlockFormatting) {\n        parts.unshift(partCreator.plain(\"```\"), partCreator.newline());\n        if (!rangeStartsAtBeginningOfLine(range)) {\n            parts.unshift(partCreator.newline());\n        }\n        parts.push(partCreator.newline(), partCreator.plain(\"```\"));\n        if (!rangeEndsAtEndOfLine(range)) {\n            parts.push(partCreator.newline());\n        }\n    } else {\n        const fenceLen = longestBacktickSequence(range.text);\n        const hasInlineFormatting = range.text.startsWith(\"`\") && range.text.endsWith(\"`\");\n        //if it's already formatted untoggle based on fenceLen which returns the max. num of backtick within a text else increase the fence backticks with a factor of 1.\n        toggleInlineFormat(range, \"`\".repeat(hasInlineFormatting ? fenceLen : fenceLen + 1));\n        return;\n    }\n\n    replaceRangeAndExpandSelection(range, parts);\n}\n\nexport function formatRangeAsLink(range: Range, text?: string): void {\n    const { model } = range;\n    const { partCreator } = model;\n    const linkRegex = /\\[(.*?)]\\(.*?\\)/g;\n    const isFormattedAsLink = linkRegex.test(range.text);\n    if (isFormattedAsLink) {\n        const linkDescription = range.text.replace(linkRegex, \"$1\");\n        const newParts = [partCreator.plain(linkDescription)];\n        replaceRangeAndMoveCaret(range, newParts, 0);\n    } else {\n        // We set offset to -1 here so that the caret lands between the brackets\n        replaceRangeAndMoveCaret(range, [partCreator.plain(\"[\" + range.text + \"]\" + \"(\" + (text ?? \"\") + \")\")], -1);\n    }\n}\n\n// parts helper methods\nconst isBlank = (part: Part): boolean => !part.text || !/\\S/.test(part.text);\nconst isNL = (part: Part): boolean => part.type === Type.Newline;\n\nexport function toggleInlineFormat(range: Range, prefix: string, suffix = prefix): void {\n    const { model, parts } = range;\n    const { partCreator } = model;\n\n    // compute paragraph [start, end] indexes\n    const paragraphIndexes: [number, number][] = [];\n    let startIndex = 0;\n\n    // start at i=2 because we look at i and up to two parts behind to detect paragraph breaks at their end\n    for (let i = 2; i < parts.length; i++) {\n        // paragraph breaks can be denoted in a multitude of ways,\n        // - 2 newline parts in sequence\n        // - newline part, plain(<empty or just spaces>), newline part\n\n        // bump startIndex onto the first non-blank after the paragraph ending\n        if (isBlank(parts[i - 2]) && isNL(parts[i - 1]) && !isNL(parts[i]) && !isBlank(parts[i])) {\n            startIndex = i;\n        }\n\n        // if at a paragraph break, store the indexes of the paragraph\n        if (isNL(parts[i - 1]) && isNL(parts[i])) {\n            paragraphIndexes.push([startIndex, i - 1]);\n            startIndex = i + 1;\n        } else if (isNL(parts[i - 2]) && isBlank(parts[i - 1]) && isNL(parts[i])) {\n            paragraphIndexes.push([startIndex, i - 2]);\n            startIndex = i + 1;\n        }\n    }\n\n    const lastNonEmptyPart = parts.map(isBlank).lastIndexOf(false);\n    // If we have not yet included the final paragraph then add it now\n    if (startIndex <= lastNonEmptyPart) {\n        paragraphIndexes.push([startIndex, lastNonEmptyPart + 1]);\n    }\n\n    // keep track of how many things we have inserted as an offset:=0\n    let offset = 0;\n    paragraphIndexes.forEach(([startIdx, endIdx]) => {\n        // for each paragraph apply the same rule\n        const base = startIdx + offset;\n        const index = endIdx + offset;\n\n        const isFormatted =\n            index - base > 0 && parts[base].text.startsWith(prefix) && parts[index - 1].text.endsWith(suffix);\n\n        if (isFormatted) {\n            // remove prefix and suffix formatting string\n            const partWithoutPrefix = parts[base].serialize();\n            partWithoutPrefix.text = partWithoutPrefix.text.slice(prefix.length);\n            let deserializedPart = partCreator.deserializePart(partWithoutPrefix);\n            if (deserializedPart) {\n                parts[base] = deserializedPart;\n            }\n\n            const partWithoutSuffix = parts[index - 1].serialize();\n            const suffixPartText = partWithoutSuffix.text;\n            partWithoutSuffix.text = suffixPartText.substring(0, suffixPartText.length - suffix.length);\n            deserializedPart = partCreator.deserializePart(partWithoutSuffix);\n            if (deserializedPart) {\n                parts[index - 1] = deserializedPart;\n            }\n        } else {\n            parts.splice(index, 0, partCreator.plain(suffix)); // splice in the later one first to not change offset\n            parts.splice(base, 0, partCreator.plain(prefix));\n            offset += 2; // offset index to account for the two items we just spliced in\n        }\n    });\n\n    // If the user didn't select something initially, we want to just restore\n    // the caret position instead of making a new selection.\n    if (range.wasInitializedEmpty() && prefix === suffix) {\n        // Check if we need to add a offset for a toggle or untoggle\n        const hasFormatting = range.text.startsWith(prefix) && range.text.endsWith(suffix);\n        replaceRangeAndAutoAdjustCaret(range, parts, hasFormatting, prefix.length);\n    } else {\n        replaceRangeAndExpandSelection(range, parts);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport classNames from \"classnames\";\nimport React, { type JSX, createRef, type ClipboardEvent, type SyntheticEvent } from \"react\";\nimport { type Room, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport EMOTICON_REGEX from \"emojibase-regex/emoticon\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { EMOTICON_TO_EMOJI } from \"@matrix-org/emojibase-bindings\";\nimport { isLinkable } from \"@element-hq/web-shared-components\";\n\nimport type EditorModel from \"../../../editor/model\";\nimport HistoryManager from \"../../../editor/history\";\nimport { type Caret, setSelection } from \"../../../editor/caret\";\nimport {\n    formatRange,\n    formatRangeAsLink,\n    replaceRangeAndMoveCaret,\n    toggleInlineFormat,\n} from \"../../../editor/operations\";\nimport { getCaretOffsetAndText, getRangeForSelection } from \"../../../editor/dom\";\nimport Autocomplete, { generateCompletionDomId } from \"../rooms/Autocomplete\";\nimport { getAutoCompleteCreator, type Part, type SerializedPart, Type } from \"../../../editor/parts\";\nimport { parseEvent, parsePlainTextMessage } from \"../../../editor/deserialize\";\nimport { renderModel } from \"../../../editor/render\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { IS_MAC, Key } from \"../../../Keyboard\";\nimport { CommandCategories, CommandMap, parseCommandString } from \"../../../slash-commands/SlashCommands\";\nimport Range from \"../../../editor/range\";\nimport MessageComposerFormatBar, { Formatting } from \"./MessageComposerFormatBar\";\nimport type DocumentOffset from \"../../../editor/offset\";\nimport { type IDiff } from \"../../../editor/diff\";\nimport type AutocompleteWrapperModel from \"../../../editor/autocomplete\";\nimport type DocumentPosition from \"../../../editor/position\";\nimport { type ICompletion } from \"../../../autocomplete/Autocompleter\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport { ALTERNATE_KEY_NAME, KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\nimport { _t } from \"../../../languageHandler\";\nimport { Landmark, LandmarkNavigation } from \"../../../accessibility/LandmarkNavigation\";\nimport { SDKContext } from \"../../../contexts/SDKContext.ts\";\n\n// matches emoticons which follow the start of a line or whitespace\nconst REGEX_EMOTICON_WHITESPACE = new RegExp(\"(?:^|\\\\s)(\" + EMOTICON_REGEX.source + \")\\\\s|:^$\");\nexport const REGEX_EMOTICON = new RegExp(\"(?:^|\\\\s)(\" + EMOTICON_REGEX.source + \")$\");\n\nconst SURROUND_WITH_CHARACTERS = ['\"', \"_\", \"`\", \"'\", \"*\", \"~\", \"$\"];\nconst SURROUND_WITH_DOUBLE_CHARACTERS = new Map([\n    [\"(\", \")\"],\n    [\"[\", \"]\"],\n    [\"{\", \"}\"],\n    [\"<\", \">\"],\n]);\n\nfunction ctrlShortcutLabel(key: string, needsShift = false, needsAlt = false): string {\n    return (\n        (IS_MAC ? \"⌘\" : _t(ALTERNATE_KEY_NAME[Key.CONTROL])) +\n        (needsShift ? \"+\" + _t(ALTERNATE_KEY_NAME[Key.SHIFT]) : \"\") +\n        (needsAlt ? \"+\" + _t(ALTERNATE_KEY_NAME[Key.ALT]) : \"\") +\n        \"+\" +\n        key\n    );\n}\n\nfunction cloneSelection(selection: Selection): Partial<Selection> {\n    return {\n        anchorNode: selection.anchorNode,\n        anchorOffset: selection.anchorOffset,\n        focusNode: selection.focusNode,\n        focusOffset: selection.focusOffset,\n        isCollapsed: selection.isCollapsed,\n        rangeCount: selection.rangeCount,\n        type: selection.type,\n    };\n}\n\nfunction selectionEquals(a: Partial<Selection>, b: Selection): boolean {\n    return (\n        a.anchorNode === b.anchorNode &&\n        a.anchorOffset === b.anchorOffset &&\n        a.focusNode === b.focusNode &&\n        a.focusOffset === b.focusOffset &&\n        a.isCollapsed === b.isCollapsed &&\n        a.rangeCount === b.rangeCount &&\n        a.type === b.type\n    );\n}\n\ninterface IProps {\n    model: EditorModel;\n    room: Room;\n    threadId?: string;\n    placeholder?: string;\n    label?: string;\n    initialCaret?: DocumentOffset;\n    disabled?: boolean;\n\n    onChange?(selection?: Caret, inputType?: string, diff?: IDiff): void;\n    onPaste?(event: Event | SyntheticEvent, data: DataTransfer, model: EditorModel): boolean;\n}\n\ninterface IState {\n    useMarkdown: boolean;\n    showPillAvatar: boolean;\n    query?: string;\n    showVisualBell?: boolean;\n    autoComplete?: AutocompleteWrapperModel;\n    completionIndex?: number;\n    surroundWith: boolean;\n}\n\nexport default class BasicMessageEditor extends React.Component<IProps, IState> {\n    public static contextType = SDKContext;\n    declare public context: React.ContextType<typeof SDKContext>;\n\n    public readonly editorRef = createRef<HTMLDivElement>();\n    private autocompleteRef = createRef<Autocomplete>();\n    private formatBarRef = createRef<MessageComposerFormatBar>();\n\n    private modifiedFlag = false;\n    private isIMEComposing = false;\n    private hasTextSelected = false;\n    private readonly isSafari: boolean;\n\n    private _isCaretAtEnd = false;\n    private lastCaret!: DocumentOffset;\n    private lastSelection: ReturnType<typeof cloneSelection> | null = null;\n\n    private useMarkdownHandle?: string;\n    private emoticonSettingHandle?: string;\n    private shouldShowPillAvatarSettingHandle?: string;\n    private surroundWithHandle?: string;\n    private readonly historyManager = new HistoryManager();\n\n    public constructor(props: IProps) {\n        super(props);\n        this.state = {\n            showPillAvatar: SettingsStore.getValue(\"Pill.shouldShowPillAvatar\"),\n            useMarkdown: SettingsStore.getValue(\"MessageComposerInput.useMarkdown\"),\n            surroundWith: SettingsStore.getValue(\"MessageComposerInput.surroundWith\"),\n            showVisualBell: false,\n        };\n\n        const ua = navigator.userAgent.toLowerCase();\n        this.isSafari = ua.includes(\"safari/\") && !ua.includes(\"chrome/\");\n        this.configureEmoticonAutoReplace();\n    }\n\n    public componentDidUpdate(prevProps: IProps): void {\n        // We need to re-check the placeholder when the enabled state changes because it causes the\n        // placeholder element to remount, which gets rid of the `::before` class. Re-evaluating the\n        // placeholder means we get a proper `::before` with the placeholder.\n        const enabledChange = this.props.disabled !== prevProps.disabled;\n        const placeholderChanged = this.props.placeholder !== prevProps.placeholder;\n        if (this.props.placeholder && (placeholderChanged || enabledChange)) {\n            const { isEmpty } = this.props.model;\n            if (isEmpty) {\n                this.showPlaceholder();\n            } else {\n                this.hidePlaceholder();\n            }\n        }\n    }\n\n    public replaceEmoticon(caretPosition: DocumentPosition, regex: RegExp): number | undefined {\n        const { model } = this.props;\n        const range = model.startRange(caretPosition);\n        // expand range max 9 characters backwards from caretPosition,\n        // as a space to look for an emoticon\n        let n = 9;\n        range.expandBackwardsWhile((index, offset) => {\n            const part = model.parts[index];\n            n -= 1;\n            return n >= 0 && [Type.Plain, Type.PillCandidate, Type.Newline].includes(part.type);\n        });\n        const emoticonMatch = regex.exec(range.text);\n        // ignore matches at start of proper substrings\n        // so xd will not match if the string was \"mixd 123456\"\n        // and we are lookinh at xd 123456 part of the string\n        if (emoticonMatch && (n >= 0 || emoticonMatch.index !== 0)) {\n            const query = emoticonMatch[1];\n            // variations of plaintext emoitcons(E.g. :P vs :p vs :-P) are handled upstream by the emojibase-bindings library\n            const data = EMOTICON_TO_EMOJI.get(query);\n\n            if (data) {\n                const { partCreator } = model;\n                const firstMatch = emoticonMatch[0];\n                const moveStart = firstMatch[0] === \" \" ? 1 : 0;\n\n                // we need the range to only comprise of the emoticon\n                // because we'll replace the whole range with an emoji,\n                // so move the start forward to the start of the emoticon.\n                // Take + 1 because index is reported without the possible preceding space.\n                range.moveStartForwards(emoticonMatch.index + moveStart);\n                // If the end is a trailing space/newline move end backwards, so that we don't replace it\n                if ([\"\\n\", \" \"].includes(firstMatch[firstMatch.length - 1])) {\n                    range.moveEndBackwards(1);\n                }\n\n                // this returns the amount of added/removed characters during the replace\n                // so the caret position can be adjusted.\n                return range.replace([partCreator.emoji(data.unicode)]);\n            }\n        }\n    }\n\n    private updateEditorState = (selection?: Caret, inputType?: string, diff?: IDiff): void => {\n        if (!this.editorRef.current) return;\n        renderModel(this.editorRef.current, this.props.model);\n        if (selection) {\n            // set the caret/selection\n            try {\n                setSelection(this.editorRef.current, this.props.model, selection);\n            } catch (err) {\n                logger.error(err);\n            }\n            // if caret selection is a range, take the end position\n            const position = selection instanceof Range ? selection.end : selection;\n            this.setLastCaretFromPosition(position);\n        }\n        const { isEmpty } = this.props.model;\n        if (this.props.placeholder) {\n            if (isEmpty) {\n                this.showPlaceholder();\n            } else {\n                this.hidePlaceholder();\n            }\n        }\n        if (isEmpty) {\n            this.formatBarRef.current?.hide();\n        }\n        this.setState({\n            autoComplete: this.props.model.autoComplete ?? undefined,\n            // if a change is happening then clear the showVisualBell\n            showVisualBell: diff ? false : this.state.showVisualBell,\n        });\n        this.historyManager.tryPush(this.props.model, selection, inputType, diff);\n\n        // inputType is falsy during initial mount, don't consider re-loading the draft as typing\n        let isTyping = !this.props.model.isEmpty && !!inputType;\n        // If the user is entering a command, only consider them typing if it is one which sends a message into the room\n        if (isTyping && this.props.model.parts[0].type === \"command\") {\n            const { cmd } = parseCommandString(this.props.model.parts[0].text);\n            const command = CommandMap.get(cmd!);\n            if (\n                !command?.isEnabled(this.context.client!, this.props.room.roomId) ||\n                command.category !== CommandCategories.messages\n            ) {\n                isTyping = false;\n            }\n        }\n        this.context.typingStore.setSelfTyping(this.props.room.roomId, this.props.threadId ?? null, isTyping);\n\n        this.props.onChange?.(selection, inputType, diff);\n    };\n\n    private showPlaceholder(): void {\n        this.editorRef.current?.style.setProperty(\"--placeholder\", `'${CSS.escape(this.props.placeholder ?? \"\")}'`);\n        this.editorRef.current?.classList.add(\"mx_BasicMessageComposer_inputEmpty\");\n    }\n\n    private hidePlaceholder(): void {\n        this.editorRef.current?.classList.remove(\"mx_BasicMessageComposer_inputEmpty\");\n        this.editorRef.current?.style.removeProperty(\"--placeholder\");\n    }\n\n    private onCompositionStart = (): void => {\n        this.isIMEComposing = true;\n        // even if the model is empty, the composition text shouldn't be mixed with the placeholder\n        this.hidePlaceholder();\n    };\n\n    private onCompositionEnd = (): void => {\n        this.isIMEComposing = false;\n        // some browsers (Chrome) don't fire an input event after ending a composition,\n        // so trigger a model update after the composition is done by calling the input handler.\n\n        // however, modifying the DOM (caused by the editor model update) from the compositionend handler seems\n        // to confuse the IME in Chrome, likely causing https://github.com/vector-im/element-web/issues/10913 ,\n        // so we do it async\n\n        // however, doing this async seems to break things in Safari for some reason, so browser sniff.\n\n        if (this.isSafari) {\n            this.onInput({ inputType: \"insertCompositionText\" });\n        } else {\n            Promise.resolve().then(() => {\n                this.onInput({ inputType: \"insertCompositionText\" });\n            });\n        }\n    };\n\n    public isComposing(event: React.KeyboardEvent): boolean {\n        // checking the event.isComposing flag just in case any browser out there\n        // emits events related to the composition after compositionend\n        // has been fired\n\n        // From https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/\n        // Safari emits an additional keyDown after compositionend\n        return !!(this.isIMEComposing || (event.nativeEvent && event.nativeEvent.isComposing));\n    }\n\n    private onCutCopy = (event: ClipboardEvent, type: string): void => {\n        const selection = document.getSelection()!;\n        const text = selection.toString();\n        if (text && this.editorRef.current) {\n            const { model } = this.props;\n            const range = getRangeForSelection(this.editorRef.current, model, selection);\n            const selectedParts = range.parts.map((p) => p.serialize());\n            event.clipboardData.setData(\"application/x-element-composer\", JSON.stringify(selectedParts));\n            event.clipboardData.setData(\"text/plain\", text); // so plain copy/paste works\n            if (type === \"cut\") {\n                // Remove the text, updating the model as appropriate\n                this.modifiedFlag = true;\n                replaceRangeAndMoveCaret(range, []);\n            }\n            event.preventDefault();\n        }\n    };\n\n    private onCopy = (event: ClipboardEvent): void => {\n        this.onCutCopy(event, \"copy\");\n    };\n\n    private onCut = (event: ClipboardEvent): void => {\n        this.onCutCopy(event, \"cut\");\n    };\n\n    private onPasteHandler = (event: Event | SyntheticEvent, data: DataTransfer): boolean | undefined => {\n        event.preventDefault(); // we always handle the paste ourselves\n        if (!this.editorRef.current) return;\n        if (this.props.onPaste?.(event, data, this.props.model)) {\n            // to prevent double handling, allow props.onPaste to skip internal onPaste\n            return true;\n        }\n\n        const { model } = this.props;\n        const { partCreator } = model;\n        const plainText = data.getData(\"text/plain\");\n        const partsText = data.getData(\"application/x-element-composer\");\n\n        let parts: Part[];\n        if (partsText) {\n            const serializedTextParts = JSON.parse(partsText);\n            parts = serializedTextParts.map((p: SerializedPart) => partCreator.deserializePart(p));\n        } else {\n            parts = parsePlainTextMessage(plainText, partCreator, { shouldEscape: false });\n        }\n\n        this.modifiedFlag = true;\n        const range = getRangeForSelection(this.editorRef.current, model, document.getSelection()!);\n\n        // If the user is pasting a link, and has a range selected which is not a link, wrap the range with the link\n        if (plainText && range.length > 0 && isLinkable(plainText) && !isLinkable(range.text)) {\n            formatRangeAsLink(range, plainText);\n        } else {\n            replaceRangeAndMoveCaret(range, parts);\n        }\n    };\n\n    private onPaste = (event: ClipboardEvent<HTMLDivElement>): boolean | undefined => {\n        return this.onPasteHandler(event, event.clipboardData);\n    };\n\n    private onBeforeInput = (event: InputEvent): void => {\n        // ignore any input while doing IME compositions\n        if (this.isIMEComposing) {\n            return;\n        }\n\n        if (event.inputType === \"insertFromPaste\" && event.dataTransfer) {\n            this.onPasteHandler(event, event.dataTransfer);\n        }\n    };\n\n    private onInput = (event: Partial<InputEvent>): void => {\n        if (!this.editorRef.current) return;\n        // ignore any input while doing IME compositions\n        if (this.isIMEComposing) {\n            return;\n        }\n        this.modifiedFlag = true;\n        const sel = document.getSelection()!;\n        const { caret, text } = getCaretOffsetAndText(this.editorRef.current, sel);\n        this.props.model.update(text, event.inputType, caret);\n    };\n\n    private insertText(textToInsert: string, inputType = \"insertText\"): void {\n        if (!this.editorRef.current) return;\n        const sel = document.getSelection()!;\n        const { caret, text } = getCaretOffsetAndText(this.editorRef.current, sel);\n        const newText = text.slice(0, caret.offset) + textToInsert + text.slice(caret.offset);\n        caret.offset += textToInsert.length;\n        this.modifiedFlag = true;\n        this.props.model.update(newText, inputType, caret);\n    }\n\n    // this is used later to see if we need to recalculate the caret\n    // on selectionchange. If it is just a consequence of typing\n    // we don't need to. But if the user is navigating the caret without input\n    // we need to recalculate it, to be able to know where to insert content after\n    // losing focus\n    private setLastCaretFromPosition(position: DocumentPosition): void {\n        const { model } = this.props;\n        this._isCaretAtEnd = position.isAtEnd(model);\n        this.lastCaret = position.asOffset(model);\n        this.lastSelection = cloneSelection(document.getSelection()!);\n    }\n\n    private refreshLastCaretIfNeeded(): DocumentOffset | undefined {\n        // XXX: needed when going up and down in editing messages ... not sure why yet\n        // because the editors should stop doing this when when blurred ...\n        // maybe it's on focus and the _editorRef isn't available yet or something.\n        if (!this.editorRef.current) {\n            return;\n        }\n        const selection = document.getSelection()!;\n        if (!this.lastSelection || !selectionEquals(this.lastSelection, selection)) {\n            this.lastSelection = cloneSelection(selection);\n            const { caret, text } = getCaretOffsetAndText(this.editorRef.current, selection);\n            this.lastCaret = caret;\n            this._isCaretAtEnd = caret.offset === text.length;\n        }\n        return this.lastCaret;\n    }\n\n    public clearUndoHistory(): void {\n        this.historyManager.clear();\n    }\n\n    public getCaret(): DocumentOffset {\n        return this.lastCaret;\n    }\n\n    public isSelectionCollapsed(): boolean {\n        return !this.lastSelection || !!this.lastSelection.isCollapsed;\n    }\n\n    public isCaretAtStart(): boolean {\n        return this.getCaret().offset === 0;\n    }\n\n    public isCaretAtEnd(): boolean {\n        return this._isCaretAtEnd;\n    }\n\n    private onBlur = (): void => {\n        document.removeEventListener(\"selectionchange\", this.onSelectionChange);\n    };\n\n    private onFocus = (): void => {\n        document.addEventListener(\"selectionchange\", this.onSelectionChange);\n        // force to recalculate\n        this.lastSelection = null;\n        this.refreshLastCaretIfNeeded();\n    };\n\n    private onSelectionChange = (): void => {\n        if (!this.editorRef.current) return;\n        const { isEmpty } = this.props.model;\n\n        this.refreshLastCaretIfNeeded();\n        const selection = document.getSelection()!;\n        if (this.hasTextSelected && selection.isCollapsed) {\n            this.hasTextSelected = false;\n            this.formatBarRef.current?.hide();\n        } else if (!selection.isCollapsed && !isEmpty) {\n            this.hasTextSelected = true;\n            const range = getRangeForSelection(this.editorRef.current, this.props.model, selection);\n            if (this.formatBarRef.current && this.state.useMarkdown && !!range.text.trim()) {\n                const selectionRect = selection.getRangeAt(0).getBoundingClientRect();\n                this.formatBarRef.current.showAt(selectionRect);\n            }\n        }\n    };\n\n    private onKeyDown = (event: React.KeyboardEvent): void => {\n        if (!this.editorRef.current) return;\n        // Ignore any keypress while doing IME compositions to prevent cursor position issues\n        // This matches the behavior in SendMessageComposer and EditMessageComposer\n        if (this.isComposing(event)) {\n            return;\n        }\n        if (this.isSafari && event.which == 229) {\n            // Swallow the extra keyDown by Safari\n            event.stopPropagation();\n            return;\n        }\n        const model = this.props.model;\n        let handled = false;\n\n        if (this.state.surroundWith && document.getSelection()!.type !== \"Caret\") {\n            // This surrounds the selected text with a character. This is\n            // intentionally left out of the keybinding manager as the keybinds\n            // here shouldn't be changeable\n\n            const selectionRange = getRangeForSelection(\n                this.editorRef.current,\n                this.props.model,\n                document.getSelection()!,\n            );\n            // trim the range as we want it to exclude leading/trailing spaces\n            selectionRange.trim();\n\n            if ([...SURROUND_WITH_DOUBLE_CHARACTERS.keys(), ...SURROUND_WITH_CHARACTERS].includes(event.key)) {\n                this.historyManager.ensureLastChangesPushed(this.props.model);\n                this.modifiedFlag = true;\n                toggleInlineFormat(selectionRange, event.key, SURROUND_WITH_DOUBLE_CHARACTERS.get(event.key));\n                handled = true;\n            }\n        }\n\n        const navAction = getKeyBindingsManager().getNavigationAction(event);\n\n        if (navAction === KeyBindingAction.NextLandmark || navAction === KeyBindingAction.PreviousLandmark) {\n            LandmarkNavigation.findAndFocusNextLandmark(\n                Landmark.MESSAGE_COMPOSER_OR_HOME,\n                navAction === KeyBindingAction.PreviousLandmark,\n            );\n            handled = true;\n        }\n\n        const autocompleteAction = getKeyBindingsManager().getAutocompleteAction(event);\n        const accessibilityAction = getKeyBindingsManager().getAccessibilityAction(event);\n        if (model.autoComplete?.hasCompletions()) {\n            const autoComplete = model.autoComplete;\n            switch (autocompleteAction) {\n                case KeyBindingAction.ForceCompleteAutocomplete:\n                case KeyBindingAction.CompleteAutocomplete:\n                    this.historyManager.ensureLastChangesPushed(this.props.model);\n                    this.modifiedFlag = true;\n                    autoComplete.confirmCompletion();\n                    handled = true;\n                    break;\n                case KeyBindingAction.PrevSelectionInAutocomplete:\n                    autoComplete.selectPreviousSelection();\n                    handled = true;\n                    break;\n                case KeyBindingAction.NextSelectionInAutocomplete:\n                    autoComplete.selectNextSelection();\n                    handled = true;\n                    break;\n                case KeyBindingAction.CancelAutocomplete:\n                    autoComplete.onEscape(event);\n                    handled = true;\n                    break;\n            }\n        } else if (autocompleteAction === KeyBindingAction.ForceCompleteAutocomplete && !this.state.showVisualBell) {\n            // there is no current autocomplete window, try to open it\n            this.tabCompleteName();\n            handled = true;\n        } else if ([KeyBindingAction.Delete, KeyBindingAction.Backspace].includes(accessibilityAction!)) {\n            this.formatBarRef.current?.hide();\n        }\n\n        if (handled) {\n            event.preventDefault();\n            event.stopPropagation();\n            return;\n        }\n\n        const action = getKeyBindingsManager().getMessageComposerAction(event);\n        switch (action) {\n            case KeyBindingAction.FormatBold:\n                this.onFormatAction(Formatting.Bold);\n                handled = true;\n                break;\n            case KeyBindingAction.FormatItalics:\n                this.onFormatAction(Formatting.Italics);\n                handled = true;\n                break;\n            case KeyBindingAction.FormatCode:\n                this.onFormatAction(Formatting.Code);\n                handled = true;\n                break;\n            case KeyBindingAction.FormatQuote:\n                this.onFormatAction(Formatting.Quote);\n                handled = true;\n                break;\n            case KeyBindingAction.FormatLink:\n                this.onFormatAction(Formatting.InsertLink);\n                handled = true;\n                break;\n            case KeyBindingAction.EditRedo: {\n                const history = this.historyManager.redo();\n                if (history) {\n                    const { parts, caret } = history;\n                    // pass matching inputType so historyManager doesn't push echo\n                    // when invoked from rerender callback.\n                    model.reset(parts, caret, \"historyRedo\");\n                }\n                handled = true;\n                break;\n            }\n            case KeyBindingAction.EditUndo: {\n                const history = this.historyManager.undo(this.props.model);\n                if (history) {\n                    const { parts, caret } = history;\n                    // pass matching inputType so historyManager doesn't push echo\n                    // when invoked from rerender callback.\n                    model.reset(parts, caret, \"historyUndo\");\n                }\n                handled = true;\n                break;\n            }\n            case KeyBindingAction.NewLine:\n                this.insertText(\"\\n\");\n                handled = true;\n                break;\n            case KeyBindingAction.MoveCursorToStart:\n                setSelection(this.editorRef.current, model, {\n                    index: 0,\n                    offset: 0,\n                });\n                handled = true;\n                break;\n            case KeyBindingAction.MoveCursorToEnd:\n                setSelection(this.editorRef.current, model, {\n                    index: model.parts.length - 1,\n                    offset: model.parts[model.parts.length - 1].text.length,\n                });\n                handled = true;\n                break;\n        }\n        if (handled) {\n            event.preventDefault();\n            event.stopPropagation();\n        }\n    };\n\n    private async tabCompleteName(): Promise<void> {\n        try {\n            await new Promise<void>((resolve) => this.setState({ showVisualBell: false }, resolve));\n            const { model } = this.props;\n            const caret = this.getCaret();\n            const position = model.positionForOffset(caret.offset, caret.atNodeEnd);\n            const range = model.startRange(position);\n            range.expandBackwardsWhile((index, offset, part) => {\n                return (\n                    part.text[offset] !== \" \" &&\n                    part.text[offset] !== \"+\" &&\n                    (part.type === Type.Plain || part.type === Type.PillCandidate || part.type === Type.Command)\n                );\n            });\n            const { partCreator } = model;\n            // await for auto-complete to be open\n            await model.transform(() => {\n                const addedLen = range.replace([partCreator.pillCandidate(range.text)]);\n                return model.positionForOffset(caret.offset + addedLen, true);\n            });\n\n            // Don't try to do things with the autocomplete if there is none shown\n            if (model.autoComplete) {\n                await model.autoComplete.startSelection();\n                if (!model.autoComplete.hasSelection()) {\n                    this.setState({ showVisualBell: true });\n                    model.autoComplete.close();\n                }\n            } else {\n                this.setState({ showVisualBell: true });\n            }\n        } catch (err) {\n            logger.error(err);\n        }\n    }\n\n    public isModified(): boolean {\n        return this.modifiedFlag;\n    }\n\n    private onAutoCompleteConfirm = (completion: ICompletion): void => {\n        this.modifiedFlag = true;\n        this.props.model.autoComplete?.onComponentConfirm(completion);\n    };\n\n    private onAutoCompleteSelectionChange = (completionIndex: number): void => {\n        this.modifiedFlag = true;\n        this.setState({ completionIndex });\n    };\n\n    private configureUseMarkdown = (): void => {\n        const useMarkdown = SettingsStore.getValue(\"MessageComposerInput.useMarkdown\");\n        this.setState({ useMarkdown });\n        if (!useMarkdown && this.formatBarRef.current) {\n            this.formatBarRef.current.hide();\n        }\n    };\n\n    private configureEmoticonAutoReplace = (): void => {\n        this.props.model.setTransformCallback(this.transform);\n    };\n\n    private configureShouldShowPillAvatar = (): void => {\n        const showPillAvatar = SettingsStore.getValue(\"Pill.shouldShowPillAvatar\");\n        this.setState({ showPillAvatar });\n    };\n\n    private surroundWithSettingChanged = (): void => {\n        const surroundWith = SettingsStore.getValue(\"MessageComposerInput.surroundWith\");\n        this.setState({ surroundWith });\n    };\n\n    private transform = (documentPosition: DocumentPosition): void => {\n        const shouldReplace = SettingsStore.getValue(\"MessageComposerInput.autoReplaceEmoji\");\n        if (shouldReplace) this.replaceEmoticon(documentPosition, REGEX_EMOTICON_WHITESPACE);\n    };\n\n    public componentWillUnmount(): void {\n        document.removeEventListener(\"selectionchange\", this.onSelectionChange);\n        this.editorRef.current?.removeEventListener(\"beforeinput\", this.onBeforeInput, true);\n        this.editorRef.current?.removeEventListener(\"input\", this.onInput, true);\n        this.editorRef.current?.removeEventListener(\"compositionstart\", this.onCompositionStart, true);\n        this.editorRef.current?.removeEventListener(\"compositionend\", this.onCompositionEnd, true);\n        SettingsStore.unwatchSetting(this.useMarkdownHandle);\n        SettingsStore.unwatchSetting(this.emoticonSettingHandle);\n        SettingsStore.unwatchSetting(this.shouldShowPillAvatarSettingHandle);\n        SettingsStore.unwatchSetting(this.surroundWithHandle);\n    }\n\n    public componentDidMount(): void {\n        this.useMarkdownHandle = SettingsStore.watchSetting(\n            \"MessageComposerInput.useMarkdown\",\n            null,\n            this.configureUseMarkdown,\n        );\n        this.emoticonSettingHandle = SettingsStore.watchSetting(\n            \"MessageComposerInput.autoReplaceEmoji\",\n            null,\n            this.configureEmoticonAutoReplace,\n        );\n        this.shouldShowPillAvatarSettingHandle = SettingsStore.watchSetting(\n            \"Pill.shouldShowPillAvatar\",\n            null,\n            this.configureShouldShowPillAvatar,\n        );\n        this.surroundWithHandle = SettingsStore.watchSetting(\n            \"MessageComposerInput.surroundWith\",\n            null,\n            this.surroundWithSettingChanged,\n        );\n\n        const model = this.props.model;\n        model.setUpdateCallback(this.updateEditorState);\n        const partCreator = model.partCreator;\n        // TODO: does this allow us to get rid of EditorStateTransfer?\n        // not really, but we could not serialize the parts, and just change the autoCompleter\n        partCreator.setAutoCompleteCreator(\n            getAutoCompleteCreator(\n                () => this.autocompleteRef.current,\n                (query) => new Promise((resolve) => this.setState({ query }, resolve)),\n            ),\n        );\n        // initial render of model\n        this.updateEditorState(this.getInitialCaretPosition());\n        // attach input listener by hand so React doesn't proxy the events,\n        // as the proxied event doesn't support inputType, which we need.\n        this.editorRef.current?.addEventListener(\"beforeinput\", this.onBeforeInput, true);\n        this.editorRef.current?.addEventListener(\"input\", this.onInput, true);\n        this.editorRef.current?.addEventListener(\"compositionstart\", this.onCompositionStart, true);\n        this.editorRef.current?.addEventListener(\"compositionend\", this.onCompositionEnd, true);\n        this.editorRef.current?.focus();\n    }\n\n    private getInitialCaretPosition(): DocumentPosition {\n        let caretPosition: DocumentPosition;\n        if (this.props.initialCaret) {\n            // if restoring state from a previous editor,\n            // restore caret position from the state\n            const caret = this.props.initialCaret;\n            caretPosition = this.props.model.positionForOffset(caret.offset, caret.atNodeEnd);\n        } else {\n            // otherwise, set it at the end\n            caretPosition = this.props.model.getPositionAtEnd();\n        }\n        return caretPosition;\n    }\n\n    public onFormatAction = (action: Formatting): void => {\n        if (!this.state.useMarkdown || !this.editorRef.current) {\n            return;\n        }\n\n        const range: Range = getRangeForSelection(this.editorRef.current, this.props.model, document.getSelection()!);\n\n        this.historyManager.ensureLastChangesPushed(this.props.model);\n        this.modifiedFlag = true;\n\n        formatRange(range, action);\n    };\n\n    public render(): React.ReactNode {\n        let autoComplete: JSX.Element | undefined;\n        if (this.state.autoComplete && this.state.query) {\n            const query = this.state.query;\n            const queryLen = query.length;\n            autoComplete = (\n                <div className=\"mx_BasicMessageComposer_AutoCompleteWrapper\">\n                    <Autocomplete\n                        ref={this.autocompleteRef}\n                        query={query}\n                        onConfirm={this.onAutoCompleteConfirm}\n                        onSelectionChange={this.onAutoCompleteSelectionChange}\n                        selection={{ beginning: true, end: queryLen, start: queryLen }}\n                        room={this.props.room}\n                    />\n                </div>\n            );\n        }\n        const wrapperClasses = classNames(\"mx_BasicMessageComposer\", {\n            mx_BasicMessageComposer_input_error: this.state.showVisualBell,\n        });\n        const classes = classNames(\"mx_BasicMessageComposer_input\", {\n            mx_BasicMessageComposer_input_shouldShowPillAvatar: this.state.showPillAvatar,\n            mx_BasicMessageComposer_input_disabled: this.props.disabled,\n        });\n\n        const shortcuts = {\n            [Formatting.Bold]: ctrlShortcutLabel(\"B\"),\n            [Formatting.Italics]: ctrlShortcutLabel(\"I\"),\n            [Formatting.Code]: ctrlShortcutLabel(\"E\"),\n            [Formatting.Quote]: ctrlShortcutLabel(\">\", true),\n            [Formatting.InsertLink]: ctrlShortcutLabel(\"L\", true),\n        };\n\n        const { completionIndex } = this.state;\n        const hasAutocomplete = !!this.state.autoComplete;\n        let activeDescendant: string | undefined;\n        if (hasAutocomplete && completionIndex! >= 0) {\n            activeDescendant = generateCompletionDomId(completionIndex!);\n        }\n\n        return (\n            <div className={wrapperClasses}>\n                {autoComplete}\n                <MessageComposerFormatBar\n                    ref={this.formatBarRef}\n                    onAction={this.onFormatAction}\n                    shortcuts={shortcuts}\n                />\n                <div\n                    className={classes}\n                    contentEditable={this.props.disabled ? undefined : true}\n                    tabIndex={0}\n                    onBlur={this.onBlur}\n                    onFocus={this.onFocus}\n                    onCopy={this.onCopy}\n                    onCut={this.onCut}\n                    onPaste={this.onPaste}\n                    onKeyDown={this.onKeyDown}\n                    ref={this.editorRef}\n                    aria-label={this.props.label}\n                    role=\"textbox\"\n                    aria-multiline=\"true\"\n                    aria-autocomplete=\"list\"\n                    aria-haspopup=\"listbox\"\n                    aria-expanded={hasAutocomplete ? !this.autocompleteRef.current?.state.hide : undefined}\n                    aria-owns={hasAutocomplete ? \"mx_Autocomplete\" : undefined}\n                    aria-activedescendant={activeDescendant}\n                    dir=\"auto\"\n                    aria-disabled={this.props.disabled}\n                    data-testid=\"basicmessagecomposer\"\n                    translate=\"no\"\n                />\n            </div>\n        );\n    }\n\n    public focus(): void {\n        this.editorRef.current?.focus();\n    }\n\n    public insertMention(userId: string): void {\n        this.modifiedFlag = true;\n        const { model } = this.props;\n        const { partCreator } = model;\n        const member = this.props.room.getMember(userId);\n        const displayName = member ? member.rawDisplayName : userId;\n        const caret = this.getCaret();\n        const position = model.positionForOffset(caret.offset, caret.atNodeEnd);\n        // Insert suffix only if the caret is at the start of the composer\n        const parts = partCreator.createMentionParts(caret.offset === 0, displayName, userId);\n        model.transform(() => {\n            const addedLen = model.insert(parts, position);\n            return model.positionForOffset(caret.offset + addedLen, true);\n        });\n        // refocus on composer, as we just clicked \"Mention\"\n        this.focus();\n    }\n\n    public insertQuotedMessage(event: MatrixEvent): void {\n        this.modifiedFlag = true;\n        const { model } = this.props;\n        const { partCreator } = model;\n        const quoteParts = parseEvent(event, partCreator, { isQuotedMessage: true });\n        // add two newlines\n        quoteParts.push(partCreator.newline());\n        quoteParts.push(partCreator.newline());\n        model.transform(() => {\n            const addedLen = model.insert(quoteParts, model.positionForOffset(0));\n            return model.positionForOffset(addedLen, true);\n        });\n        // refocus on composer, as we just clicked \"Quote\"\n        this.focus();\n    }\n\n    public insertPlaintext(text: string): void {\n        this.modifiedFlag = true;\n        const { model } = this.props;\n        const { partCreator } = model;\n        const caret = this.getCaret();\n        const position = model.positionForOffset(caret.offset, caret.atNodeEnd);\n        model.transform(() => {\n            const addedLen = model.insert(partCreator.plainWithEmoji(text), position);\n            return model.positionForOffset(caret.offset + addedLen, true);\n        });\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 New Vector Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ComponentProps, type CSSProperties } from \"react\";\nimport classNames from \"classnames\";\nimport { Tooltip } from \"@vector-im/compound-web\";\nimport { ErrorSolidIcon, ShieldIcon, LockSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t, _td } from \"../../../languageHandler\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport { E2EStatus } from \"../../../utils/ShieldUtils\";\n\nexport const crossSigningUserTitles: { [key in E2EStatus]?: TranslationKey } = {\n    [E2EStatus.Warning]: _td(\"encryption|cross_signing_user_warning\"),\n    [E2EStatus.Normal]: _td(\"encryption|cross_signing_user_normal\"),\n    [E2EStatus.Verified]: _td(\"encryption|cross_signing_user_verified\"),\n};\nconst crossSigningRoomTitles: { [key in E2EStatus]?: TranslationKey } = {\n    [E2EStatus.Warning]: _td(\"encryption|cross_signing_room_warning\"),\n    [E2EStatus.Normal]: _td(\"encryption|cross_signing_room_normal\"),\n    [E2EStatus.Verified]: _td(\"encryption|cross_signing_room_verified\"),\n};\n\ninterface Props {\n    className?: string;\n    size?: number;\n    onClick?: () => void;\n    hideTooltip?: boolean;\n    tooltipPlacement?: ComponentProps<typeof Tooltip>[\"placement\"];\n    status: E2EStatus;\n    isUser?: boolean;\n}\n\nconst icons: Record<E2EStatus, JSX.Element> = {\n    [E2EStatus.Warning]: <ErrorSolidIcon color=\"var(--cpd-color-icon-critical-primary)\" />,\n    [E2EStatus.Normal]: <LockSolidIcon color=\"var(--cpd-color-icon-tertiary)\" />,\n    [E2EStatus.Verified]: <ShieldIcon color=\"var(--cpd-color-icon-success-primary)\" />,\n};\n\nconst E2EIcon: React.FC<Props> = ({ isUser, status, className, size, onClick, hideTooltip, tooltipPlacement }) => {\n    const icon = icons[status];\n\n    const classes = classNames(\"mx_E2EIcon\", className);\n\n    let e2eTitle: TranslationKey | undefined;\n    if (isUser) {\n        e2eTitle = crossSigningUserTitles[status];\n    } else {\n        e2eTitle = crossSigningRoomTitles[status];\n    }\n\n    let style: CSSProperties | undefined;\n    if (size) {\n        style = { width: `${size}px`, height: `${size}px` };\n    }\n\n    const label = e2eTitle ? _t(e2eTitle) : \"\";\n\n    let content: JSX.Element;\n    if (onClick) {\n        content = (\n            <AccessibleButton onClick={onClick} className={classes} style={style} data-testid=\"e2e-icon\">\n                {icon}\n            </AccessibleButton>\n        );\n    } else {\n        content = (\n            <div className={classes} style={style} data-testid=\"e2e-icon\">\n                {icon}\n            </div>\n        );\n    }\n\n    if (!e2eTitle || hideTooltip) {\n        return content;\n    }\n\n    return (\n        <Tooltip label={label} placement={tooltipPlacement} isTriggerInteractive={!!onClick}>\n            {content}\n        </Tooltip>\n    );\n};\n\nexport default E2EIcon;\n","/*\nCopyright 2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport classNames from \"classnames\";\nimport OnlineOrUnavailableIcon from \"@vector-im/compound-design-tokens/assets/web/icons/presence-solid-8x8\";\nimport OfflineIcon from \"@vector-im/compound-design-tokens/assets/web/icons/presence-outline-8x8\";\nimport DNDIcon from \"@vector-im/compound-design-tokens/assets/web/icons/presence-strikethrough-8x8\";\nimport { Tooltip } from \"@vector-im/compound-web\";\nimport { UnstableValue } from \"matrix-js-sdk/src/NamespacedValue\";\n\nimport { _t } from \"../../../../../../languageHandler\";\n\ninterface Props {\n    className?: string;\n    presenceState: string;\n}\n\nexport const BUSY_PRESENCE_NAME = new UnstableValue(\"busy\", \"org.matrix.msc3026.busy\");\n\nfunction getIconForPresenceState(state: string): JSX.Element {\n    switch (state) {\n        case \"online\":\n            return <OnlineOrUnavailableIcon height=\"8px\" width=\"8px\" className=\"mx_PresenceIconView_online\" />;\n        case \"offline\":\n            return <OfflineIcon height=\"8px\" width=\"8px\" className=\"mx_PresenceIconView_offline\" />;\n        case \"unavailable\":\n        case \"io.element.unreachable\":\n            return <OnlineOrUnavailableIcon height=\"8px\" width=\"8px\" className=\"mx_PresenceIconView_unavailable\" />;\n        case BUSY_PRESENCE_NAME.name:\n        case BUSY_PRESENCE_NAME.altName:\n            return <DNDIcon height=\"8px\" width=\"8px\" className=\"mx_PresenceIconView_dnd\" />;\n        default:\n            throw new Error(`Presence state \"${state}\" is unknown.`);\n    }\n}\n\nfunction getTooltipText(state: string): string {\n    switch (state) {\n        case \"online\":\n            return _t(\"presence|online\");\n        case \"offline\":\n            return _t(\"presence|offline\");\n        case \"unavailable\":\n        case \"io.element.unreachable\":\n            return _t(\"presence|away\");\n        case BUSY_PRESENCE_NAME.name:\n        case BUSY_PRESENCE_NAME.altName:\n            return _t(\"presence|busy\");\n        default:\n            throw new Error(`Presence state \"${state}\" is unknown.`);\n    }\n}\n\nconst AvatarPresenceIconView: React.FC<Props> = ({ className, presenceState }) => {\n    const names = classNames(\"mx_PresenceIconView\", className);\n    return (\n        <Tooltip label={getTooltipText(presenceState)} placement=\"bottom\" isTriggerInteractive={false}>\n            <div className={names}>{getIconForPresenceState(presenceState)}</div>\n        </Tooltip>\n    );\n};\n\nexport default AvatarPresenceIconView;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ReactNode } from \"react\";\nimport { Tooltip } from \"@vector-im/compound-web\";\n\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { type XOR } from \"../../../@types/common\";\nimport { type NotificationState, NotificationStateEvents } from \"../../../stores/notifications/NotificationState\";\nimport { _t } from \"../../../languageHandler\";\nimport { NotificationLevel } from \"../../../stores/notifications/NotificationLevel\";\nimport { StatelessNotificationBadge } from \"./NotificationBadge/StatelessNotificationBadge\";\n\ninterface IProps {\n    notification: NotificationState;\n\n    /**\n     * If true, show nothing if the notification would only cause a dot to be shown rather than\n     * a badge. That is: only display badges and not dots. Default: false.\n     */\n    hideIfDot?: boolean;\n\n    /**\n     * The room ID, if any, the badge represents.\n     */\n    roomId?: string;\n}\n\ninterface IClickableProps extends IProps, React.InputHTMLAttributes<Element> {\n    showUnsentTooltip?: boolean;\n    /**\n     * If specified will return an AccessibleButton instead of a div.\n     */\n    onClick(ev: React.MouseEvent): void;\n}\n\ninterface IState {\n    showCounts: boolean; // whether to show counts.\n}\n\nexport default class NotificationBadge extends React.PureComponent<XOR<IProps, IClickableProps>, IState> {\n    private countWatcherRef?: string;\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            showCounts: SettingsStore.getValue(\"Notifications.alwaysShowBadgeCounts\", this.roomId),\n        };\n    }\n\n    private get roomId(): string | null {\n        // We should convert this to null for safety with the SettingsStore\n        return this.props.roomId || null;\n    }\n\n    public componentDidMount(): void {\n        this.props.notification.on(NotificationStateEvents.Update, this.onNotificationUpdate);\n\n        this.countWatcherRef = SettingsStore.watchSetting(\n            \"Notifications.alwaysShowBadgeCounts\",\n            this.roomId,\n            this.countPreferenceChanged,\n        );\n    }\n\n    public componentWillUnmount(): void {\n        SettingsStore.unwatchSetting(this.countWatcherRef);\n        this.props.notification.off(NotificationStateEvents.Update, this.onNotificationUpdate);\n    }\n\n    public componentDidUpdate(prevProps: Readonly<IProps>): void {\n        if (prevProps.notification) {\n            prevProps.notification.off(NotificationStateEvents.Update, this.onNotificationUpdate);\n        }\n\n        this.props.notification.on(NotificationStateEvents.Update, this.onNotificationUpdate);\n    }\n\n    private countPreferenceChanged = (): void => {\n        this.setState({ showCounts: SettingsStore.getValue(\"Notifications.alwaysShowBadgeCounts\", this.roomId) });\n    };\n\n    private onNotificationUpdate = (): void => {\n        this.forceUpdate(); // notification state changed - update\n    };\n\n    public render(): ReactNode {\n        /* eslint @typescript-eslint/no-unused-vars: [\"error\", { \"ignoreRestSiblings\": true }] */\n        const { notification, showUnsentTooltip, hideIfDot, onClick, tabIndex } = this.props;\n\n        if (notification.isIdle && !notification.knocked) return null;\n        if (hideIfDot && notification.level < NotificationLevel.Notification) {\n            // This would just be a dot and we've been told not to show dots, so don't show it\n            return null;\n        }\n\n        const commonProps: React.ComponentProps<typeof StatelessNotificationBadge> = {\n            symbol: notification.symbol,\n            count: notification.count,\n            level: notification.level,\n            knocked: notification.knocked,\n        };\n\n        let badge: JSX.Element;\n        if (onClick) {\n            badge = <StatelessNotificationBadge {...commonProps} onClick={onClick} tabIndex={tabIndex} />;\n        } else {\n            badge = <StatelessNotificationBadge {...commonProps} />;\n        }\n\n        if (showUnsentTooltip && notification.level === NotificationLevel.Unsent) {\n            return (\n                <Tooltip label={_t(\"notifications|message_didnt_send\")} placement=\"right\">\n                    {badge}\n                </Tooltip>\n            );\n        }\n\n        return badge;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type Ref, type JSX, type ReactNode } from \"react\";\nimport classNames from \"classnames\";\nimport { AskToJoinIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { formatCount } from \"../../../../utils/FormattingUtils\";\nimport AccessibleButton, { type ButtonEvent } from \"../../elements/AccessibleButton\";\nimport { NotificationLevel } from \"../../../../stores/notifications/NotificationLevel\";\nimport { useSettingValue } from \"../../../../hooks/useSettings\";\nimport { type XOR } from \"../../../../@types/common\";\nimport { _t } from \"../../../../languageHandler.tsx\";\n\ninterface Props {\n    symbol: string | null;\n    count: number;\n    level: NotificationLevel;\n    knocked?: boolean;\n    /**\n     * If true, where we would normally show a badge, we instead show a dot. No numeric count will\n     * be displayed (but may affect whether the the dot is displayed). See class doc\n     * for the difference between the two.\n     */\n    forceDot?: boolean;\n    children?: ReactNode;\n    ref?: Ref<HTMLDivElement>;\n}\n\ninterface ClickableProps extends Props {\n    /**\n     * If specified will return an AccessibleButton instead of a div.\n     */\n    onClick(this: void, ev: ButtonEvent): void;\n    tabIndex?: number;\n}\n\n/**\n * A notification indicator that conveys what activity / notifications the user has in whatever\n * context it is being used.\n *\n * Can either be a 'badge': a small circle with a number in it (the 'count'), or a 'dot': a smaller, empty circle.\n * The two can be used to convey the same meaning but in different contexts, for example: for unread\n * notifications in the room list, it may have a green badge with the number of unread notifications,\n * but somewhere else it may just have a green dot as a more compact representation of the same information.\n */\nexport const StatelessNotificationBadge = ({\n    symbol,\n    count,\n    level,\n    knocked,\n    forceDot = false,\n    ...props\n}: XOR<Props, ClickableProps>): JSX.Element => {\n    const hideBold = useSettingValue(\"feature_hidebold\");\n\n    // Don't show a badge if we don't need to\n    if ((level === NotificationLevel.None || (hideBold && level == NotificationLevel.Activity)) && !knocked) {\n        return <></>;\n    }\n\n    const hasUnreadCount = level >= NotificationLevel.Notification && (!!count || !!symbol);\n\n    const isEmptyBadge = symbol === null && count === 0;\n\n    if (symbol === null && count > 0) {\n        symbol = formatCount(count);\n    }\n\n    let icon: JSX.Element | undefined;\n    if (knocked) {\n        icon = <AskToJoinIcon aria-label={_t(\"room|knock_sent\")} />;\n    }\n\n    // We show a dot if either:\n    // * The props force us to, or\n    // * It's just an activity-level notification or (in theory) lower and the room isn't knocked\n    const badgeType =\n        forceDot || (level <= NotificationLevel.Activity && !icon)\n            ? \"dot\"\n            : !symbol || symbol.length < 3\n              ? \"badge_2char\"\n              : \"badge_3char\";\n\n    const classes = classNames({\n        \"mx_NotificationBadge\": true,\n        \"mx_NotificationBadge_visible\": isEmptyBadge || knocked ? true : hasUnreadCount,\n        \"mx_NotificationBadge_level_notification\": level == NotificationLevel.Notification,\n        \"mx_NotificationBadge_level_highlight\": level >= NotificationLevel.Highlight,\n        \"mx_NotificationBadge_knocked\": knocked,\n\n        // Exactly one of mx_NotificationBadge_dot, mx_NotificationBadge_2char, mx_NotificationBadge_3char\n        \"mx_NotificationBadge_dot\": badgeType === \"dot\",\n        \"mx_NotificationBadge_2char\": badgeType === \"badge_2char\",\n        \"mx_NotificationBadge_3char\": badgeType === \"badge_3char\",\n        // Badges with text should always use light colors\n        \"cpd-theme-light\": badgeType !== \"dot\",\n    });\n\n    const content = icon || <span className=\"mx_NotificationBadge_count\">{symbol}</span>;\n\n    if (props.onClick) {\n        return (\n            <AccessibleButton {...props} className={classes} onClick={props.onClick} ref={props.ref}>\n                {content}\n                {props.children}\n            </AccessibleButton>\n        );\n    }\n\n    return (\n        <div className={classes} ref={props.ref}>\n            {content}\n        </div>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { UnstableValue } from \"matrix-js-sdk/src/NamespacedValue\";\nimport classNames from \"classnames\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { formatDuration } from \"../../../DateUtils\";\n\nexport const BUSY_PRESENCE_NAME = new UnstableValue(\"busy\", \"org.matrix.msc3026.busy\");\n\ninterface IProps {\n    // number of milliseconds ago this user was last active.\n    // zero = unknown\n    activeAgo?: number;\n    // if true, activeAgo is an approximation and \"Now\" should\n    // be shown instead\n    currentlyActive?: boolean;\n    // offline, online, etc\n    presenceState?: string;\n    // whether to apply colouring to the label\n    coloured?: boolean;\n    className?: string;\n}\n\nexport default class PresenceLabel extends React.Component<IProps> {\n    public static defaultProps = {\n        activeAgo: -1,\n    };\n\n    private getPrettyPresence(presence?: string, activeAgo?: number, currentlyActive?: boolean): string {\n        // for busy presence, we ignore the 'currentlyActive' flag: they're busy whether\n        // they're active or not. It can be set while the user is active in which case\n        // the 'active ago' ends up being 0.\n        if (presence && BUSY_PRESENCE_NAME.matches(presence)) return _t(\"presence|busy\");\n\n        if (presence === \"io.element.unreachable\") return _t(\"presence|unreachable\");\n\n        if (!currentlyActive && activeAgo !== undefined && activeAgo > 0) {\n            const duration = formatDuration(activeAgo);\n            if (presence === \"online\") return _t(\"presence|online_for\", { duration: duration });\n            if (presence === \"unavailable\") return _t(\"presence|idle_for\", { duration: duration }); // XXX: is this actually right?\n            if (presence === \"offline\") return _t(\"presence|offline_for\", { duration: duration });\n            return _t(\"presence|unknown_for\", { duration: duration });\n        } else {\n            if (presence === \"online\") return _t(\"presence|online\");\n            if (presence === \"unavailable\") return _t(\"presence|idle\"); // XXX: is this actually right?\n            if (presence === \"offline\") return _t(\"presence|offline\");\n            return _t(\"presence|unknown\");\n        }\n    }\n\n    public render(): React.ReactNode {\n        return (\n            <div\n                className={classNames(\"mx_PresenceLabel\", this.props.className, {\n                    mx_PresenceLabel_online: this.props.coloured && this.props.presenceState === \"online\",\n                })}\n            >\n                {this.getPrettyPresence(this.props.presenceState, this.props.activeAgo, this.props.currentlyActive)}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useContext } from \"react\";\n\nimport { type RightPanelPhases } from \"../../../../../stores/right-panel/RightPanelStorePhases\";\nimport { CurrentRightPanelPhaseContext } from \"../../../../../contexts/CurrentRightPanelPhaseContext\";\n\n/**\n * Hook to easily track whether a given right panel phase is toggled on/off.\n */\nexport function useToggled(phase: RightPanelPhases): boolean {\n    const context = useContext(CurrentRightPanelPhaseContext);\n    if (!context) {\n        return false;\n    }\n    const { currentPhase, isPanelOpen } = context;\n    return !!(isPanelOpen && currentPhase === phase);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ComponentProps, lazy, Suspense } from \"react\";\nimport { type ISendEventResponse } from \"matrix-js-sdk/src/matrix\";\n\n// we need to import the types for TS, but do not import the sendMessage\n// function to avoid importing from \"@vector-im/matrix-wysiwyg\"\nimport { type SendMessageParams } from \"./utils/message\";\n\nconst SendComposer = lazy(() => import(\"./SendWysiwygComposer\"));\nconst EditComposer = lazy(() => import(\"./EditWysiwygComposer\"));\n\nexport const dynamicImportSendMessage = async (\n    message: string,\n    isHTML: boolean,\n    params: SendMessageParams,\n): Promise<ISendEventResponse | undefined> => {\n    const { sendMessage } = await import(\"./utils/message\");\n\n    return sendMessage(message, isHTML, params);\n};\n\nexport const dynamicImportConversionFunctions = async (): Promise<{\n    /**\n     * Creates a rust model from rich text input (html) and uses it to generate the plain text equivalent (which may\n     * contain markdown). The return value must be used to set `.innerHTML` (rather than `.innerText`) to\n     * ensure that HTML entities are correctly interpreted, and to prevent newline characters being turned into `<br>`.\n     *\n     * @param rich - html to convert\n     * @param inMessageFormat - `true` to format the return value for use as a message `formatted_body`.\n     * `false` to format it for writing to an editor element.\n     * @returns a string of plain text that may contain markdown\n     */\n    richToPlain(this: void, rich: string, inMessageFormat: boolean): Promise<string>;\n\n    /**\n     * Creates a rust model from plain text input (interpreted as markdown) and uses it to generate the rich text\n     * equivalent. Output can be formatted for display in the composer or for sending in a Matrix message.\n     *\n     * @param plain - plain text to convert. Note: when reading the plain text from the editor element, be sure to\n     * use `.innerHTML` (rather than `.innerText`) to ensure that punctuation characters are correctly HTML-encoded.\n     * @param inMessageFormat - `true` to format the return value for use as a message `formatted_body`.\n     * `false` to format it for writing to an editor element.\n     * @returns a string of html\n     */\n    plainToRich(this: void, plain: string, inMessageFormat: boolean): Promise<string>;\n}> => {\n    const { richToPlain, plainToRich } = await import(\"@vector-im/matrix-wysiwyg\");\n\n    return { richToPlain, plainToRich };\n};\n\nexport function DynamicImportSendWysiwygComposer(props: ComponentProps<typeof SendComposer>): JSX.Element {\n    return (\n        <Suspense fallback={<div />}>\n            <SendComposer {...props} />\n        </Suspense>\n    );\n}\n\nexport function DynamicImportEditWysiwygComposer(props: ComponentProps<typeof EditComposer>): JSX.Element {\n    return (\n        <Suspense fallback={<div />}>\n            <EditComposer {...props} />\n        </Suspense>\n    );\n}\n","/*\n * Copyright 2024 New Vector Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport React, { type JSX, type PropsWithChildren, type ComponentType, type SVGAttributes } from \"react\";\nimport { BigIcon, Heading } from \"@vector-im/compound-web\";\nimport classNames from \"classnames\";\n\ninterface EncryptionCardProps {\n    /**\n     * CSS class name to apply to the card.\n     */\n    className?: string;\n    /**\n     * The title of the card.\n     */\n    title: string;\n    /**\n     * The description of the card.\n     */\n    description?: string;\n    /**\n     * Whether this icon shows a destructive action.\n     */\n    destructive?: boolean;\n    /**\n     * The icon to display.\n     */\n    Icon: ComponentType<SVGAttributes<SVGElement>>;\n}\n\n/**\n * A styled card for encryption settings.\n */\nexport function EncryptionCard({\n    title,\n    description,\n    className,\n    destructive = false,\n    Icon,\n    children,\n}: PropsWithChildren<EncryptionCardProps>): JSX.Element {\n    return (\n        <div className={classNames(\"mx_EncryptionCard\", className)}>\n            <div className=\"mx_EncryptionCard_header\">\n                <BigIcon kind={destructive ? \"critical\" : \"primary\"}>\n                    <Icon />\n                </BigIcon>\n                <Heading as=\"h2\" size=\"sm\" weight=\"semibold\">\n                    {title}\n                </Heading>\n                {description && <span>{description}</span>}\n            </div>\n            {children}\n        </div>\n    );\n}\n","/*\n * Copyright 2024 New Vector Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport React, { type JSX, type PropsWithChildren } from \"react\";\n\n/**\n * A component to present action buttons at the bottom of an {@link EncryptionCard}\n * (mostly as somewhere for the common CSS to live).\n */\nexport function EncryptionCardButtons({ children }: PropsWithChildren): JSX.Element {\n    return <div className=\"mx_EncryptionCard_buttons\">{children}</div>;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEvent, useRef, useState } from \"react\";\nimport { TakePhotoSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport Field from \"../elements/Field\";\nimport { chromeFileInputFix } from \"../../../utils/BrowserWorkarounds\";\n\ninterface IProps {\n    avatarUrl?: string;\n    avatarDisabled?: boolean;\n    name: string;\n    nameDisabled?: boolean;\n    topic?: string;\n    topicDisabled?: boolean;\n    setAvatar(this: void, avatar?: File): void;\n    setName(this: void, name: string): void;\n    setTopic(this: void, topic: string): void;\n}\n\nexport const SpaceAvatar: React.FC<Pick<IProps, \"avatarUrl\" | \"avatarDisabled\" | \"setAvatar\">> = ({\n    avatarUrl,\n    avatarDisabled = false,\n    setAvatar,\n}) => {\n    const avatarUploadRef = useRef<HTMLInputElement>(null);\n    const [avatar, setAvatarDataUrl] = useState(avatarUrl); // avatar data url cache\n\n    let avatarSection;\n    if (avatarDisabled) {\n        if (avatar) {\n            avatarSection = <img className=\"mx_SpaceBasicSettings_avatar\" src={avatar} alt=\"\" />;\n        } else {\n            avatarSection = <div className=\"mx_SpaceBasicSettings_avatar\" />;\n        }\n    } else {\n        if (avatar) {\n            avatarSection = (\n                <React.Fragment>\n                    <AccessibleButton\n                        className=\"mx_SpaceBasicSettings_avatar\"\n                        onClick={() => avatarUploadRef.current?.click()}\n                        element=\"img\"\n                        src={avatar}\n                        alt=\"\"\n                    />\n                    <AccessibleButton\n                        onClick={() => {\n                            if (avatarUploadRef.current) avatarUploadRef.current.value = \"\";\n                            setAvatarDataUrl(undefined);\n                            setAvatar(undefined);\n                        }}\n                        kind=\"link\"\n                        className=\"mx_SpaceBasicSettings_avatar_remove\"\n                        aria-label={_t(\"room_settings|delete_avatar_label\")}\n                    >\n                        {_t(\"action|delete\")}\n                    </AccessibleButton>\n                </React.Fragment>\n            );\n        } else {\n            avatarSection = (\n                <React.Fragment>\n                    <AccessibleButton\n                        className=\"mx_SpaceBasicSettings_avatar\"\n                        onClick={() => avatarUploadRef.current?.click()}\n                    >\n                        <TakePhotoSolidIcon />\n                    </AccessibleButton>\n                    <AccessibleButton\n                        onClick={() => avatarUploadRef.current?.click()}\n                        kind=\"link\"\n                        aria-label={_t(\"room_settings|upload_avatar_label\")}\n                    >\n                        {_t(\"action|upload\")}\n                    </AccessibleButton>\n                </React.Fragment>\n            );\n        }\n    }\n\n    return (\n        <div className=\"mx_SpaceBasicSettings_avatarContainer\">\n            {avatarSection}\n            <input\n                type=\"file\"\n                ref={avatarUploadRef}\n                onClick={chromeFileInputFix}\n                onChange={(e) => {\n                    if (!e.target.files?.length) return;\n                    const file = e.target.files[0];\n                    setAvatar(file);\n                    const reader = new FileReader();\n                    reader.onload = (ev) => {\n                        setAvatarDataUrl(ev.target?.result as string);\n                    };\n                    reader.readAsDataURL(file);\n                }}\n                accept=\"image/*\"\n            />\n        </div>\n    );\n};\n\nconst SpaceBasicSettings: React.FC<IProps> = ({\n    avatarUrl,\n    avatarDisabled = false,\n    setAvatar,\n    name = \"\",\n    nameDisabled = false,\n    setName,\n    topic = \"\",\n    topicDisabled = false,\n    setTopic,\n}) => {\n    return (\n        <div className=\"mx_SpaceBasicSettings\">\n            <SpaceAvatar avatarUrl={avatarUrl} avatarDisabled={avatarDisabled} setAvatar={setAvatar} />\n\n            <Field\n                name=\"spaceName\"\n                label={_t(\"common|name\")}\n                autoFocus={true}\n                value={name}\n                onChange={(ev: ChangeEvent<HTMLInputElement>) => setName(ev.target.value)}\n                disabled={nameDisabled}\n            />\n\n            <Field\n                name=\"spaceTopic\"\n                element=\"textarea\"\n                label={_t(\"common|description\")}\n                value={topic}\n                onChange={(ev: ChangeEvent<HTMLTextAreaElement>) => setTopic(ev.target.value)}\n                rows={3}\n                disabled={topicDisabled}\n            />\n        </div>\n    );\n};\n\nexport default SpaceBasicSettings;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\nimport { AutoHideScrollbar } from \"@element-hq/web-shared-components\";\n\nimport { _t } from \"../../../languageHandler\";\nimport StyledRadioGroup from \"../elements/StyledRadioGroup\";\nimport QueryMatcher from \"../../../autocomplete/QueryMatcher\";\nimport SearchBox from \"../../structures/SearchBox\";\nimport { Entry } from \"../dialogs/AddExistingToSpaceDialog\";\nimport { filterBoolean } from \"../../../utils/arrays\";\n\nenum Target {\n    All = \"All\",\n    Specific = \"Specific\",\n    None = \"None\",\n}\n\ninterface ISpecificChildrenPickerProps {\n    filterPlaceholder: string;\n    rooms: Room[];\n    selected: Set<Room>;\n    onChange(this: void, selected: boolean, room: Room): void;\n}\n\nconst SpecificChildrenPicker: React.FC<ISpecificChildrenPickerProps> = ({\n    filterPlaceholder,\n    rooms,\n    selected,\n    onChange,\n}) => {\n    const [query, setQuery] = useState(\"\");\n    const lcQuery = query.toLowerCase().trim();\n\n    const filteredRooms = useMemo(() => {\n        if (!lcQuery) {\n            return rooms;\n        }\n\n        const matcher = new QueryMatcher<Room>(rooms, {\n            keys: [\"name\"],\n            funcs: [(r) => filterBoolean([r.getCanonicalAlias(), ...r.getAltAliases()])],\n            shouldMatchWordsOnly: false,\n        });\n\n        return matcher.match(lcQuery);\n    }, [rooms, lcQuery]);\n\n    return (\n        <div className=\"mx_SpaceChildrenPicker\">\n            <SearchBox\n                className=\"mx_textinput_icon mx_textinput_search\"\n                placeholder={filterPlaceholder}\n                onSearch={setQuery}\n                autoFocus={true}\n            />\n            <AutoHideScrollbar className=\"mx_AutoHideScrollbar\">\n                {filteredRooms.map((room) => {\n                    return (\n                        <Entry\n                            key={room.roomId}\n                            room={room}\n                            checked={selected.has(room)}\n                            onChange={(checked) => {\n                                onChange(checked, room);\n                            }}\n                        />\n                    );\n                })}\n                {filteredRooms.length < 1 ? (\n                    <span className=\"mx_SpaceChildrenPicker_noResults\">{_t(\"common|no_results\")}</span>\n                ) : undefined}\n            </AutoHideScrollbar>\n        </div>\n    );\n};\n\ninterface IProps {\n    space: Room;\n    spaceChildren: Room[];\n    selected: Set<Room>;\n    noneLabel?: string;\n    allLabel: string;\n    specificLabel: string;\n    onChange(this: void, rooms: Room[]): void;\n}\n\nconst SpaceChildrenPicker: React.FC<IProps> = ({\n    space,\n    spaceChildren,\n    selected,\n    onChange,\n    noneLabel,\n    allLabel,\n    specificLabel,\n}) => {\n    const [state, setState] = useState<string>(noneLabel ? Target.None : Target.All);\n\n    useEffect(() => {\n        if (state === Target.All) {\n            onChange(spaceChildren);\n        } else {\n            onChange([]);\n        }\n    }, [onChange, state, spaceChildren]);\n\n    return (\n        <>\n            <div className=\"mx_SpaceChildrenPicker\">\n                <StyledRadioGroup\n                    name=\"roomsToLeave\"\n                    value={state}\n                    onChange={setState}\n                    definitions={[\n                        {\n                            value: Target.None,\n                            label: noneLabel,\n                        },\n                        {\n                            value: Target.All,\n                            label: allLabel,\n                        },\n                        {\n                            value: Target.Specific,\n                            label: specificLabel,\n                        },\n                    ].filter((d) => d.label)}\n                />\n            </div>\n\n            {state === Target.Specific && (\n                <SpecificChildrenPicker\n                    filterPlaceholder={_t(\"space|search_children\", { spaceName: space.name })}\n                    rooms={spaceChildren}\n                    selected={selected}\n                    onChange={(isSelected: boolean, room: Room) => {\n                        if (isSelected) {\n                            onChange([room, ...selected]);\n                        } else {\n                            onChange([...selected].filter((r) => r !== room));\n                        }\n                    }}\n                />\n            )}\n        </>\n    );\n};\n\nexport default SpaceChildrenPicker;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, {\n    type ComponentProps,\n    type RefObject,\n    type SyntheticEvent,\n    type KeyboardEvent,\n    useContext,\n    useRef,\n    useState,\n    type ChangeEvent,\n    type ReactNode,\n    useEffect,\n} from \"react\";\nimport {\n    RoomType,\n    HistoryVisibility,\n    Preset,\n    Visibility,\n    type MatrixClient,\n    type ICreateRoomOpts,\n} from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { LockSolidIcon, PublicIcon, ChevronLeftIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport ContextMenu, { ChevronFace } from \"../../structures/ContextMenu\";\nimport createRoom, { type IOpts as ICreateOpts } from \"../../../createRoom\";\nimport MatrixClientContext, { useMatrixClientContext } from \"../../../contexts/MatrixClientContext\";\nimport type SpaceBasicSettings from \"./SpaceBasicSettings\";\nimport { SpaceAvatar } from \"./SpaceBasicSettings\";\nimport AccessibleButton, { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport Field from \"../elements/Field\";\nimport withValidation from \"../elements/Validation\";\nimport RoomAliasField from \"../elements/RoomAliasField\";\nimport { getKeyBindingsManager } from \"../../../KeyBindingsManager\";\nimport { KeyBindingAction } from \"../../../accessibility/KeyboardShortcuts\";\nimport defaultDispatcher from \"../../../dispatcher/dispatcher\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport { Filter } from \"../dialogs/spotlight/Filter\";\nimport { type OpenSpotlightPayload } from \"../../../dispatcher/payloads/OpenSpotlightPayload.ts\";\nimport { useSettingValue } from \"../../../hooks/useSettings.ts\";\nimport { UIFeature } from \"../../../settings/UIFeature.ts\";\nimport SpacePillButton from \"../../structures/SpacePillButton.tsx\";\n\nexport const createSpace = async (\n    client: MatrixClient,\n    name: string,\n    isPublic: boolean,\n    alias?: string,\n    topic?: string,\n    avatar?: string | File,\n    createOpts: Partial<ICreateRoomOpts> = {},\n    otherOpts: Partial<Omit<ICreateOpts, \"createOpts\">> = {},\n): Promise<string | null> => {\n    return createRoom(client, {\n        name,\n        topic,\n        createOpts: {\n            preset: isPublic ? Preset.PublicChat : Preset.PrivateChat,\n            visibility:\n                isPublic && (await client.doesServerSupportUnstableFeature(\"org.matrix.msc3827.stable\"))\n                    ? Visibility.Public\n                    : Visibility.Private,\n            power_level_content_override: {\n                // Only allow Admins to write to the timeline to prevent hidden sync spam\n                events_default: 100,\n                invite: isPublic ? 0 : 50,\n            },\n            room_alias_name: isPublic && alias ? alias.substring(1, alias.indexOf(\":\")) : undefined,\n            ...createOpts,\n        },\n        avatar,\n        roomType: RoomType.Space,\n        historyVisibility: isPublic ? HistoryVisibility.WorldReadable : HistoryVisibility.Invited,\n        spinner: false,\n        encryption: false,\n        andView: true,\n        inlineErrors: true,\n        ...otherOpts,\n    });\n};\n\nconst spaceNameValidator = withValidation({\n    rules: [\n        {\n            key: \"required\",\n            test: async ({ value }) => !!value,\n            invalid: () => _t(\"create_space|name_required\"),\n        },\n    ],\n});\n\nconst nameToLocalpart = (name: string): string => {\n    return name\n        .trim()\n        .toLowerCase()\n        .replace(/\\s+/g, \"-\")\n        .replace(/[^a-z0-9_-]+/gi, \"\");\n};\n\ntype BProps = Omit<ComponentProps<typeof SpaceBasicSettings>, \"nameDisabled\" | \"topicDisabled\" | \"avatarDisabled\">;\ninterface ISpaceCreateFormProps extends BProps {\n    busy: boolean;\n    alias: string;\n    nameFieldRef: RefObject<Field | null>;\n    aliasFieldRef: RefObject<RoomAliasField | null>;\n    showAliasField?: boolean;\n    children?: ReactNode;\n    onSubmit(this: void, e: SyntheticEvent): void;\n    setAlias(this: void, alias: string): void;\n}\n\nexport const SpaceCreateForm: React.FC<ISpaceCreateFormProps> = ({\n    busy,\n    onSubmit,\n    avatarUrl,\n    setAvatar,\n    name,\n    setName,\n    nameFieldRef,\n    alias,\n    aliasFieldRef,\n    setAlias,\n    showAliasField,\n    topic,\n    setTopic,\n    children,\n}) => {\n    const cli = useContext(MatrixClientContext);\n    const domain = cli.getDomain() ?? undefined;\n\n    const onKeyDown = (ev: KeyboardEvent): void => {\n        const action = getKeyBindingsManager().getAccessibilityAction(ev);\n        switch (action) {\n            case KeyBindingAction.Enter:\n                onSubmit(ev);\n                break;\n        }\n    };\n\n    return (\n        <form className=\"mx_SpaceBasicSettings\" onSubmit={onSubmit}>\n            <SpaceAvatar avatarUrl={avatarUrl} setAvatar={setAvatar} avatarDisabled={busy} />\n\n            <Field\n                name=\"spaceName\"\n                label={_t(\"common|name\")}\n                autoFocus={true}\n                value={name}\n                onChange={(ev: ChangeEvent<HTMLInputElement>) => {\n                    const newName = ev.target.value;\n                    if (!alias || alias === `#${nameToLocalpart(name)}:${domain}`) {\n                        setAlias(`#${nameToLocalpart(newName)}:${domain}`);\n                        aliasFieldRef.current?.validate({ allowEmpty: true });\n                    }\n                    setName(newName);\n                }}\n                onKeyDown={onKeyDown}\n                ref={nameFieldRef}\n                onValidate={spaceNameValidator}\n                disabled={busy}\n                autoComplete=\"off\"\n            />\n\n            {showAliasField ? (\n                <RoomAliasField\n                    ref={aliasFieldRef}\n                    onChange={setAlias}\n                    domain={domain}\n                    value={alias}\n                    placeholder={name ? nameToLocalpart(name) : _t(\"create_space|address_placeholder\")}\n                    label={_t(\"create_space|address_label\")}\n                    disabled={busy}\n                    onKeyDown={onKeyDown}\n                />\n            ) : null}\n\n            <Field\n                name=\"spaceTopic\"\n                element=\"textarea\"\n                label={_t(\"common|description\")}\n                value={topic ?? \"\"}\n                onChange={(ev) => setTopic(ev.target.value)}\n                rows={3}\n                disabled={busy}\n            />\n\n            {children}\n        </form>\n    );\n};\n\nconst SpaceCreateMenu: React.FC<{\n    onFinished(this: void): void;\n}> = ({ onFinished }) => {\n    const cli = useMatrixClientContext();\n    const settingAllowPublicSpaces = useSettingValue(UIFeature.AllowCreatingPublicSpaces);\n    const [visibility, setVisibility] = useState<Visibility | null>(\n        settingAllowPublicSpaces === false ? Visibility.Private : null,\n    );\n    const [busy, setBusy] = useState<boolean>(false);\n\n    const [name, setName] = useState(\"\");\n    const spaceNameField = useRef<Field>(null);\n    const [alias, setAlias] = useState(\"\");\n    const spaceAliasField = useRef<RoomAliasField>(null);\n    const [avatar, setAvatar] = useState<File | undefined>(undefined);\n    const [topic, setTopic] = useState<string>(\"\");\n\n    const [supportsSpaceFiltering, setSupportsSpaceFiltering] = useState(true); // assume it does until we find out it doesn't\n    useEffect(() => {\n        cli.isVersionSupported(\"v1.4\")\n            .then((supported) => {\n                return supported || cli.doesServerSupportUnstableFeature(\"org.matrix.msc3827.stable\");\n            })\n            .then((supported) => {\n                setSupportsSpaceFiltering(supported);\n            });\n    }, [cli]);\n\n    const onSpaceCreateClick = async (e: ButtonEvent): Promise<void> => {\n        e.preventDefault();\n        if (busy) return;\n\n        setBusy(true);\n        // require & validate the space name field\n        if (spaceNameField.current && !(await spaceNameField.current.validate({ allowEmpty: false }))) {\n            spaceNameField.current.focus();\n            spaceNameField.current.validate({ allowEmpty: false, focused: true });\n            setBusy(false);\n            return;\n        }\n\n        if (\n            spaceAliasField.current &&\n            visibility === Visibility.Public &&\n            !(await spaceAliasField.current.validate({ allowEmpty: false }))\n        ) {\n            spaceAliasField.current.focus();\n            spaceAliasField.current.validate({ allowEmpty: false, focused: true });\n            setBusy(false);\n            return;\n        }\n\n        try {\n            await createSpace(cli, name, visibility === Visibility.Public, alias, topic, avatar);\n\n            onFinished();\n        } catch (e) {\n            logger.error(e);\n        }\n    };\n\n    const onSearchClick = (): void => {\n        defaultDispatcher.dispatch<OpenSpotlightPayload>({\n            action: Action.OpenSpotlight,\n            initialFilter: Filter.PublicSpaces,\n        });\n    };\n\n    let body;\n    if (visibility === null) {\n        body = (\n            <React.Fragment>\n                <h2>{_t(\"create_space|label\")}</h2>\n                <p>{_t(\"create_space|explainer\")}</p>\n\n                <SpacePillButton\n                    icon={<PublicIcon />}\n                    title={_t(\"common|public\")}\n                    description={_t(\"create_space|public_description\")}\n                    onClick={() => setVisibility(Visibility.Public)}\n                />\n                <SpacePillButton\n                    icon={<LockSolidIcon />}\n                    title={_t(\"common|private\")}\n                    description={_t(\"create_space|private_description\")}\n                    onClick={() => setVisibility(Visibility.Private)}\n                />\n\n                {supportsSpaceFiltering && (\n                    <AccessibleButton kind=\"primary_outline\" onClick={onSearchClick}>\n                        {_t(\"create_space|search_public_button\")}\n                    </AccessibleButton>\n                )}\n            </React.Fragment>\n        );\n    } else {\n        body = (\n            <React.Fragment>\n                {settingAllowPublicSpaces && (\n                    <AccessibleButton\n                        className=\"mx_SpaceCreateMenu_back\"\n                        onClick={() => setVisibility(null)}\n                        title={_t(\"action|go_back\")}\n                    >\n                        <ChevronLeftIcon />\n                    </AccessibleButton>\n                )}\n\n                <h2>\n                    {visibility === Visibility.Public\n                        ? _t(\"create_space|public_heading\")\n                        : settingAllowPublicSpaces\n                          ? _t(\"create_space|private_heading\")\n                          : _t(\"create_space|private_only_heading\")}\n                </h2>\n                <p>\n                    {_t(\"create_space|add_details_prompt\")} {_t(\"create_space|add_details_prompt_2\")}\n                </p>\n\n                <SpaceCreateForm\n                    busy={busy}\n                    onSubmit={onSpaceCreateClick}\n                    setAvatar={setAvatar}\n                    name={name}\n                    setName={setName}\n                    nameFieldRef={spaceNameField}\n                    topic={topic}\n                    setTopic={setTopic}\n                    alias={alias}\n                    setAlias={setAlias}\n                    showAliasField={visibility === Visibility.Public}\n                    aliasFieldRef={spaceAliasField}\n                />\n\n                <AccessibleButton kind=\"primary\" onClick={onSpaceCreateClick} disabled={busy}>\n                    {busy ? _t(\"create_space|creating\") : _t(\"action|create\")}\n                </AccessibleButton>\n            </React.Fragment>\n        );\n    }\n\n    return (\n        <ContextMenu\n            left={72}\n            top={62}\n            chevronOffset={0}\n            chevronFace={ChevronFace.None}\n            onFinished={onFinished}\n            wrapperClassName=\"mx_SpaceCreateMenu_wrapper\"\n            managed={false}\n            focusLock={true}\n        >\n            {body}\n        </ContextMenu>\n    );\n};\n\nexport default SpaceCreateMenu;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021-2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useState } from \"react\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\nimport { sleep } from \"matrix-js-sdk/src/utils\";\nimport { LinkIcon, UserAddIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { copyPlaintext } from \"../../../utils/strings\";\nimport { RoomPermalinkCreator } from \"../../../utils/permalinks/Permalinks\";\nimport { showRoomInviteDialog } from \"../../../RoomInvite\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport { shouldShowComponent } from \"../../../customisations/helpers/UIComponents\";\nimport { UIComponent } from \"../../../settings/UIFeature\";\nimport SpacePillButton from \"../../structures/SpacePillButton.tsx\";\n\ninterface IProps {\n    space: Room;\n    onFinished?(this: void): void;\n}\n\nconst SpacePublicShare: React.FC<IProps> = ({ space, onFinished }) => {\n    const [copiedText, setCopiedText] = useState(_t(\"action|click_to_copy\"));\n\n    return (\n        <div className=\"mx_SpacePublicShare\">\n            <SpacePillButton\n                icon={<LinkIcon />}\n                title={_t(\"space|invite_link\")}\n                description={copiedText}\n                onClick={async (): Promise<void> => {\n                    const permalinkCreator = new RoomPermalinkCreator(space);\n                    permalinkCreator.load();\n                    const success = await copyPlaintext(permalinkCreator.forShareableRoom());\n                    const text = success ? _t(\"common|copied\") : _t(\"error|failed_copy\");\n                    setCopiedText(text);\n                    await sleep(5000);\n                    if (copiedText === text) {\n                        // if the text hasn't changed by another click then clear it after some time\n                        setCopiedText(_t(\"action|click_to_copy\"));\n                    }\n                }}\n            />\n            {space.canInvite(MatrixClientPeg.safeGet().getSafeUserId()) &&\n            shouldShowComponent(UIComponent.InviteUsers) ? (\n                <SpacePillButton\n                    icon={<UserAddIcon />}\n                    title={_t(\"space|invite\")}\n                    description={_t(\"space|invite_description\")}\n                    onClick={() => {\n                        if (onFinished) onFinished();\n                        showRoomInviteDialog(space.roomId);\n                    }}\n                />\n            ) : null}\n        </div>\n    );\n};\n\nexport default SpacePublicShare;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 Vector Creations Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ComponentProps } from \"react\";\nimport { type Device } from \"matrix-js-sdk/src/matrix\";\nimport { type GeneratedSas } from \"matrix-js-sdk/src/crypto-api\";\nimport { SasEmoji } from \"@element-hq/web-shared-components\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { PendingActionSpinner } from \"../right_panel/EncryptionInfo\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\n\ninterface IProps {\n    displayName?: string; // required if pending is true\n\n    /** Details of the other device involved in the verification, if known */\n    otherDeviceDetails?: Device;\n\n    onDone: () => void;\n    onCancel: () => void;\n    sas: GeneratedSas;\n    isSelf?: boolean;\n}\n\ninterface IState {\n    pending: boolean;\n    cancelling?: boolean;\n}\n\nexport default class VerificationShowSas extends React.Component<IProps, IState> {\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            pending: false,\n        };\n    }\n\n    private onMatchClick = (): void => {\n        this.setState({ pending: true });\n        this.props.onDone();\n    };\n\n    private onDontMatchClick = (): void => {\n        this.setState({ cancelling: true });\n        this.props.onCancel();\n    };\n\n    public render(): React.ReactNode {\n        let sasDisplay;\n        let sasCaption;\n        if (this.props.sas.emoji) {\n            sasDisplay = (\n                <SasEmoji\n                    className=\"mx_VerificationShowSas_emojiSas\"\n                    emoji={this.props.sas.emoji.map((e) => e[0]) as ComponentProps<typeof SasEmoji>[\"emoji\"]}\n                />\n            );\n            sasCaption = this.props.isSelf\n                ? _t(\"encryption|verification|confirm_the_emojis\")\n                : _t(\"encryption|verification|sas_emoji_caption_user\");\n        } else if (this.props.sas.decimal) {\n            const numberBlocks = this.props.sas.decimal.map((num, i) => <span key={i}>{num}</span>);\n            sasDisplay = <div className=\"mx_VerificationShowSas_decimalSas\">{numberBlocks}</div>;\n            sasCaption = this.props.isSelf\n                ? _t(\"encryption|verification|sas_caption_self\")\n                : _t(\"encryption|verification|sas_caption_user\");\n        } else {\n            return (\n                <div>\n                    {_t(\"encryption|verification|unsupported_method\")}\n                    <AccessibleButton kind=\"primary\" onClick={this.props.onCancel}>\n                        {_t(\"action|cancel\")}\n                    </AccessibleButton>\n                </div>\n            );\n        }\n\n        let confirm;\n        if (this.state.pending && this.props.isSelf) {\n            let text;\n            // device shouldn't be null in this situation but it can be, eg. if the device is\n            // logged out during verification\n            const otherDevice = this.props.otherDeviceDetails;\n            if (otherDevice) {\n                text = _t(\"encryption|verification|waiting_other_device_details\", {\n                    deviceName: otherDevice.displayName,\n                    deviceId: otherDevice.deviceId,\n                });\n            } else {\n                text = _t(\"encryption|verification|waiting_other_device\");\n            }\n            confirm = <p>{text}</p>;\n        } else if (this.state.pending || this.state.cancelling) {\n            let text;\n            if (this.state.pending) {\n                const { displayName } = this.props;\n                text = _t(\"encryption|verification|waiting_other_user\", { displayName });\n            } else {\n                text = _t(\"encryption|verification|cancelling\");\n            }\n            confirm = <PendingActionSpinner text={text} />;\n        } else {\n            confirm = (\n                <div className=\"mx_VerificationShowSas_buttonRow\">\n                    <AccessibleButton onClick={this.onMatchClick} kind=\"primary\">\n                        {_t(\"encryption|verification|sas_match\")}\n                    </AccessibleButton>\n                    <AccessibleButton onClick={this.onDontMatchClick} kind=\"secondary\">\n                        {_t(\"encryption|verification|sas_no_match\")}\n                    </AccessibleButton>\n                </div>\n            );\n        }\n\n        return (\n            <div className=\"mx_VerificationShowSas\">\n                <p>{sasCaption}</p>\n                {sasDisplay}\n                <p>{this.props.isSelf ? \"\" : _t(\"encryption|verification|in_person\")}</p>\n                {confirm}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\nimport { VoiceCallSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport AccessibleButton, { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport { _t } from \"../../../languageHandler\";\nimport { type XOR } from \"../../../@types/common\";\n\nexport const BUTTONS = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"*\", \"0\", \"#\"];\nexport const BUTTON_LETTERS = [\"\", \"ABC\", \"DEF\", \"GHI\", \"JKL\", \"MNO\", \"PQRS\", \"TUV\", \"WXYZ\", \"\", \"+\", \"\"];\n\nenum DialPadButtonKind {\n    Digit,\n    Dial,\n}\n\ntype DigitButtonProps = {\n    kind: DialPadButtonKind.Digit;\n    digit: string;\n    digitSubtext: string;\n    onButtonPress: (digit: string, ev: ButtonEvent) => void;\n};\n\ntype DialButtonProps = {\n    kind: DialPadButtonKind.Dial;\n    onButtonPress: () => void;\n};\n\nclass DialPadButton extends React.PureComponent<DigitButtonProps | DialButtonProps> {\n    public onClick = (ev: ButtonEvent): void => {\n        switch (this.props.kind) {\n            case DialPadButtonKind.Digit:\n                this.props.onButtonPress(this.props.digit, ev);\n                break;\n            case DialPadButtonKind.Dial:\n                this.props.onButtonPress();\n                break;\n        }\n    };\n\n    public render(): React.ReactNode {\n        switch (this.props.kind) {\n            case DialPadButtonKind.Digit:\n                return (\n                    <AccessibleButton className=\"mx_DialPad_button\" onClick={this.onClick}>\n                        {this.props.digit}\n                        <div className=\"mx_DialPad_buttonSubText\">{this.props.digitSubtext}</div>\n                    </AccessibleButton>\n                );\n            case DialPadButtonKind.Dial:\n                return (\n                    <AccessibleButton\n                        className=\"mx_DialPad_button mx_DialPad_dialButton\"\n                        onClick={this.onClick}\n                        aria-label={_t(\"voip|dial\")}\n                    >\n                        <VoiceCallSolidIcon />\n                    </AccessibleButton>\n                );\n        }\n    }\n}\n\ninterface IBaseProps {\n    onDigitPress: (digit: string, ev: ButtonEvent) => void;\n    onDeletePress?: (ev: ButtonEvent) => void;\n    hasDial: boolean;\n}\n\ninterface IProps extends IBaseProps {\n    hasDial: false;\n}\n\ninterface IDialProps extends IBaseProps {\n    hasDial: true;\n    onDialPress: () => void;\n}\n\nexport default class DialPad extends React.PureComponent<XOR<IProps, IDialProps>> {\n    public render(): React.ReactNode {\n        const buttonNodes: JSX.Element[] = [];\n\n        for (let i = 0; i < BUTTONS.length; i++) {\n            const button = BUTTONS[i];\n            const digitSubtext = BUTTON_LETTERS[i];\n            buttonNodes.push(\n                <DialPadButton\n                    key={button}\n                    kind={DialPadButtonKind.Digit}\n                    digit={button}\n                    digitSubtext={digitSubtext}\n                    onButtonPress={this.props.onDigitPress}\n                />,\n            );\n        }\n\n        if (this.props.hasDial) {\n            buttonNodes.push(\n                <DialPadButton key=\"dial\" kind={DialPadButtonKind.Dial} onButtonPress={this.props.onDialPress} />,\n            );\n        }\n\n        return <div className=\"mx_DialPad\">{buttonNodes}</div>;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { createContext, useMemo } from \"react\";\n\nimport { useCurrentPhase } from \"../hooks/right-panel/useCurrentPhase\";\nimport { type RightPanelPhases } from \"../stores/right-panel/RightPanelStorePhases\";\n\ntype Context = {\n    isPanelOpen: boolean;\n    currentPhase: RightPanelPhases | null;\n};\n\nexport const CurrentRightPanelPhaseContext = createContext<Context | null>(null);\n\ntype Props = {\n    roomId: string;\n};\n\nexport const CurrentRightPanelPhaseContextProvider: React.FC<React.PropsWithChildren<Props>> = ({\n    roomId,\n    children,\n}) => {\n    const { currentPhase, isOpen } = useCurrentPhase(roomId);\n    const context = useMemo(() => ({ currentPhase, isPanelOpen: isOpen }), [currentPhase, isOpen]);\n    return <CurrentRightPanelPhaseContext.Provider value={context}>{children}</CurrentRightPanelPhaseContext.Provider>;\n};\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useContext, useState } from \"react\";\n\nimport { SDKContext } from \"../../contexts/SDKContext\";\nimport { type RightPanelPhases } from \"../../stores/right-panel/RightPanelStorePhases\";\nimport { useEventEmitter } from \"../useEventEmitter\";\nimport { UPDATE_EVENT } from \"../../stores/AsyncStore\";\n\n/**\n * Returns:\n * - state which will always reflect the currently active right panel phase or null.\n * - boolean state representing whether any panel is open or not.\n * @param roomId room id if available.\n */\nexport function useCurrentPhase(roomId?: string): { currentPhase: RightPanelPhases | null; isOpen: boolean } {\n    const sdkContext = useContext(SDKContext);\n\n    const getCurrentPhase = (): RightPanelPhases | null => {\n        const card = roomId\n            ? sdkContext.rightPanelStore.currentCardForRoom(roomId)\n            : sdkContext.rightPanelStore.currentCard;\n        return card.phase;\n    };\n\n    const getIsOpen = (): boolean => {\n        const isOpen = roomId ? sdkContext.rightPanelStore.isOpenForRoom(roomId) : sdkContext.rightPanelStore.isOpen;\n        return isOpen;\n    };\n\n    const [currentPhase, setCurrentPhase] = useState<RightPanelPhases | null>(getCurrentPhase());\n    const [isOpen, setIsOpen] = useState<boolean>(getIsOpen());\n\n    useEventEmitter(sdkContext.rightPanelStore, UPDATE_EVENT, () => {\n        setCurrentPhase(getCurrentPhase());\n        setIsOpen(getIsOpen());\n    });\n\n    return { currentPhase, isOpen };\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { createContext } from \"react\";\n\n/**\n * React context whose value is whether the local device has been verified.\n *\n * (Specifically, this is true if we have done enough verification to confirm that the published public cross-signing\n * keys are genuine -- which normally means that we or another device will have published a signature of this device.)\n */\nexport const LocalDeviceVerificationStateContext = createContext(false);\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room, type RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { type SDKContextClass } from \"../contexts/SDKContextClass\";\nimport SdkConfig from \"../SdkConfig\";\n\n// Regex applied to filter our punctuation in member names before applying sort, to fuzzy it a little\n// matches all ASCII punctuation: !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\nconst SORT_REGEX = /[\\x21-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E]+/g;\n\n/**\n * A class for storing application state for MemberList.\n */\nexport class MemberListStore {\n    // cache of Display Name -> name to sort based on. This strips out special symbols like @.\n    private readonly sortNames = new Map<string, string>();\n    // list of room IDs that have been lazy loaded\n    private readonly loadedRooms = new Set<string>();\n\n    private collator?: Intl.Collator;\n\n    public constructor(private readonly stores: SDKContextClass) {}\n\n    /**\n     * Load the member list. Call this whenever the list may have changed.\n     * @param roomId The room to load the member list in\n     * @param searchQuery Optional search query to filter the list.\n     * @returns A list of filtered and sorted room members, grouped by membership.\n     */\n    public async loadMemberList(\n        roomId: string,\n        searchQuery?: string,\n    ): Promise<Record<\"joined\" | \"invited\", RoomMember[]>> {\n        if (!this.stores.client) {\n            return {\n                joined: [],\n                invited: [],\n            };\n        }\n        const language = SettingsStore.getValue(\"language\");\n        this.collator = new Intl.Collator(language, { sensitivity: \"base\", ignorePunctuation: false });\n        const members = await this.loadMembers(roomId);\n        // Filter then sort as it's more efficient than sorting tons of members we will just filter out later.\n        // Also sort each group, as there's no point comparing invited/joined users when they aren't in the same list!\n        const membersByMembership = this.filterMembers(members, searchQuery);\n        membersByMembership.joined.sort((a: RoomMember, b: RoomMember) => {\n            return this.sortMembers(a, b);\n        });\n        membersByMembership.invited.sort((a: RoomMember, b: RoomMember) => {\n            return this.sortMembers(a, b);\n        });\n        return {\n            joined: membersByMembership.joined,\n            invited: membersByMembership.invited,\n        };\n    }\n\n    private async loadMembers(roomId: string): Promise<Array<RoomMember>> {\n        const room = this.stores.client!.getRoom(roomId);\n        if (!room) {\n            return [];\n        }\n\n        if (this.loadedRooms.has(roomId) || !(await this.isLazyLoadingEnabled(roomId))) {\n            // nice and easy, we must already have all the members so just return them.\n            return this.loadMembersInRoom(room);\n        }\n        // lazy loading is enabled. There are two kinds of lazy loading:\n        // - With storage: most members are in indexedDB, we just need a small delta via /members.\n        //   Valid for normal sync in normal windows.\n        // - Without storage: nothing in indexedDB, we need to load all via /members. Valid for\n        //   Sliding Sync and incognito windows (non-Sliding Sync).\n        if (!this.isLazyMemberStorageEnabled()) {\n            // pull straight from the server. Don't use a since token as we don't have earlier deltas\n            // accumulated.\n            room.currentState.markOutOfBandMembersStarted();\n            const response = await this.stores.client!.members(roomId, undefined, KnownMembership.Leave);\n            const memberEvents = response.chunk.map(this.stores.client!.getEventMapper());\n            room.currentState.setOutOfBandMembers(memberEvents);\n        } else {\n            // load using traditional lazy loading\n            try {\n                await room.loadMembersIfNeeded();\n            } catch {\n                /* already logged in RoomView */\n            }\n        }\n        // remember that we have loaded the members so we don't hit /members all the time. We\n        // will forget this on refresh which is fine as we only store the data in-memory.\n        this.loadedRooms.add(roomId);\n        return this.loadMembersInRoom(room);\n    }\n\n    private loadMembersInRoom(room: Room): Array<RoomMember> {\n        const allMembers = Object.values(room.currentState.members);\n        allMembers.forEach((member) => {\n            // work around a race where you might have a room member object\n            // before the user object exists. This may or may not cause\n            // https://github.com/vector-im/vector-web/issues/186\n            if (!member.user) {\n                member.user = this.stores.client!.getUser(member.userId) || undefined;\n            }\n            // XXX: this user may have no lastPresenceTs value!\n            // the right solution here is to fix the race rather than leave it as 0\n        });\n        return allMembers;\n    }\n\n    /**\n     * Check if this room should be lazy loaded. Lazy loading means fetching the member list in\n     * a delayed or incremental fashion. It means the `Room` object doesn't have all the members.\n     * @param roomId The room to check if lazy loading is enabled\n     * @returns True if enabled\n     */\n    private async isLazyLoadingEnabled(roomId: string): Promise<boolean> {\n        if (SettingsStore.getValue(\"feature_simplified_sliding_sync\")) {\n            // only unencrypted rooms use lazy loading\n            return !(await this.stores.client?.getCrypto()?.isEncryptionEnabledInRoom(roomId));\n        }\n        return this.stores.client!.hasLazyLoadMembersEnabled();\n    }\n\n    /**\n     * Check if lazy member storage is supported.\n     * @returns True if there is storage for lazy loading members\n     */\n    private isLazyMemberStorageEnabled(): boolean {\n        if (SettingsStore.getValue(\"feature_simplified_sliding_sync\")) {\n            return false;\n        }\n        return this.stores.client!.hasLazyLoadMembersEnabled();\n    }\n\n    public isPresenceEnabled(): boolean {\n        if (!this.stores.client) {\n            return true;\n        }\n        const enablePresenceByHsUrl = SdkConfig.get(\"enable_presence_by_hs_url\");\n        return enablePresenceByHsUrl?.[this.stores.client!.baseUrl] ?? true;\n    }\n\n    /**\n     * Filter out members based on an optional search query. Groups by membership state.\n     * @param members The list of members to filter.\n     * @param query The textual query to filter based on.\n     * @returns An object with a list of joined and invited users respectively.\n     */\n    private filterMembers(members: Array<RoomMember>, query?: string): Record<\"joined\" | \"invited\", RoomMember[]> {\n        const result: Record<\"joined\" | \"invited\", RoomMember[]> = {\n            joined: [],\n            invited: [],\n        };\n        members.forEach((m) => {\n            if (m.membership !== KnownMembership.Join && m.membership !== KnownMembership.Invite) {\n                return; // bail early for left/banned users\n            }\n            if (query) {\n                query = query.toLowerCase();\n                const matchesName = m.name.toLowerCase().includes(query);\n                const matchesId = m.userId.toLowerCase().includes(query);\n                if (!matchesName && !matchesId) {\n                    return;\n                }\n            }\n            switch (m.membership) {\n                case KnownMembership.Join:\n                    result.joined.push(m);\n                    break;\n                case KnownMembership.Invite:\n                    result.invited.push(m);\n                    break;\n            }\n        });\n        return result;\n    }\n\n    /**\n     * Sort algorithm for room members.\n     * @param memberA\n     * @param memberB\n     * @returns Negative if A comes before B, 0 if A and B are equivalent, Positive is A comes after B.\n     */\n    private sortMembers(memberA: RoomMember, memberB: RoomMember): number {\n        // order by presence, with \"active now\" first.\n        // ...and then by power level\n        // ...and then by last active\n        // ...and then alphabetically.\n        // We could tiebreak instead by \"last recently spoken in this room\" if we wanted to.\n\n        const userA = memberA.user;\n        const userB = memberB.user;\n\n        if (!userA && !userB) return 0;\n        if (userA && !userB) return -1;\n        if (!userA && userB) return 1;\n\n        const showPresence = this.isPresenceEnabled();\n\n        // First by presence\n        if (showPresence) {\n            const convertPresence = (p: string): string => (p === \"unavailable\" ? \"online\" : p);\n            const presenceIndex = (p: string): number => {\n                const order = [\"active\", \"online\", \"offline\"];\n                const idx = order.indexOf(convertPresence(p));\n                return idx === -1 ? order.length : idx; // unknown states at the end\n            };\n\n            const idxA = presenceIndex(userA!.currentlyActive ? \"active\" : userA!.presence);\n            const idxB = presenceIndex(userB!.currentlyActive ? \"active\" : userB!.presence);\n            if (idxA !== idxB) {\n                return idxA - idxB;\n            }\n        }\n\n        // Second by power level\n        if (memberA.powerLevel !== memberB.powerLevel) {\n            return memberB.powerLevel - memberA.powerLevel;\n        }\n\n        // Third by last active\n        if (showPresence && userA!.getLastActiveTs() !== userB!.getLastActiveTs()) {\n            return userB!.getLastActiveTs() - userA!.getLastActiveTs();\n        }\n\n        // Fourth by name (alphabetical)\n        return this.collator!.compare(this.canonicalisedName(memberA.name), this.canonicalisedName(memberB.name));\n    }\n\n    /**\n     * Calculate the canonicalised name for the input name.\n     * @param name The member display name\n     * @returns The name to sort on\n     */\n    private canonicalisedName(name: string): string {\n        let result = this.sortNames.get(name);\n        if (result) {\n            return result;\n        }\n        result = (name[0] === \"@\" ? name.slice(1) : name).replace(SORT_REGEX, \"\");\n        this.sortNames.set(name, result);\n        return result;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2022 The Matrix.org Foundation C.I.C.\nCopyright 2017, 2018 New Vector Ltd\nCopyright 2017 Vector Creations Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode } from \"react\";\nimport * as utils from \"matrix-js-sdk/src/utils\";\nimport { MatrixError, JoinRule, type Room, type MatrixEvent, type IJoinRoomOpts } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type ViewRoom as ViewRoomEvent } from \"@matrix-org/analytics-events/types/typescript/ViewRoom\";\nimport { type JoinedRoom as JoinedRoomEvent } from \"@matrix-org/analytics-events/types/typescript/JoinedRoom\";\nimport EventEmitter from \"events\";\nimport {\n    RoomViewLifecycle,\n    type ViewRoomOpts,\n} from \"@matrix-org/react-sdk-module-api/lib/lifecycles/RoomViewLifecycle\";\n\nimport { type MatrixDispatcher } from \"../dispatcher/dispatcher\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport Modal from \"../Modal\";\nimport { _t, UserFriendlyError } from \"../languageHandler\";\nimport { getCachedRoomIdForAlias, storeRoomAliasInCache } from \"../RoomAliasCache\";\nimport { Action } from \"../dispatcher/actions\";\nimport { retry } from \"../utils/promise\";\nimport { TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { type ViewRoomPayload } from \"../dispatcher/payloads/ViewRoomPayload\";\nimport DMRoomMap from \"../utils/DMRoomMap\";\nimport { isMetaSpace, MetaSpace } from \"./spaces\";\nimport { type JoinRoomPayload } from \"../dispatcher/payloads/JoinRoomPayload\";\nimport { type JoinRoomReadyPayload } from \"../dispatcher/payloads/JoinRoomReadyPayload\";\nimport { type JoinRoomErrorPayload } from \"../dispatcher/payloads/JoinRoomErrorPayload\";\nimport { type ViewRoomErrorPayload } from \"../dispatcher/payloads/ViewRoomErrorPayload\";\nimport ErrorDialog from \"../components/views/dialogs/ErrorDialog\";\nimport { type ActiveRoomChangedPayload } from \"../dispatcher/payloads/ActiveRoomChangedPayload\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { awaitRoomDownSync } from \"../utils/RoomUpgrade\";\nimport { UPDATE_EVENT } from \"./AsyncStore\";\nimport { type SDKContextClass } from \"../contexts/SDKContextClass\";\nimport { CallStore } from \"./CallStore\";\nimport { type ThreadPayload } from \"../dispatcher/payloads/ThreadPayload\";\nimport { type ActionPayload } from \"../dispatcher/payloads\";\nimport { type CancelAskToJoinPayload } from \"../dispatcher/payloads/CancelAskToJoinPayload\";\nimport { type SubmitAskToJoinPayload } from \"../dispatcher/payloads/SubmitAskToJoinPayload\";\nimport { ModuleRunner } from \"../modules/ModuleRunner\";\nimport { setMarkedUnreadState } from \"../utils/notifications\";\nimport { ConnectionState, ElementCall } from \"../models/Call\";\nimport { isVideoRoom } from \"../utils/video-rooms\";\nimport { ModuleApi } from \"../modules/Api\";\nimport ActiveWidgetStore from \"./ActiveWidgetStore\";\n\nconst NUM_JOIN_RETRY = 5;\n\ninterface State {\n    /**\n     * Whether we're joining the currently viewed (see isJoining())\n     */\n    joining: boolean;\n    /**\n     * Any error that has occurred during joining\n     */\n    joinError: Error | null;\n    /**\n     * The ID of the room currently being viewed\n     */\n    roomId: string | null;\n    /**\n     * The ID of the thread currently being viewed\n     */\n    threadId: string | null;\n    /**\n     * The ID of the room being subscribed to (in Sliding Sync)\n     */\n    subscribingRoomId: string | null;\n    /**\n     * The event to scroll to when the room is first viewed\n     */\n    initialEventId: string | null;\n    initialEventPixelOffset: number | null;\n    /**\n     * Whether to highlight the initial event\n     */\n    isInitialEventHighlighted: boolean;\n    /**\n     * Whether to scroll the initial event into view\n     */\n    initialEventScrollIntoView: boolean;\n    /**\n     * The alias of the room (or null if not originally specified in view_room)\n     */\n    roomAlias: string | null;\n    /**\n     * Whether the current room is loading\n     */\n    roomLoading: boolean;\n    /**\n     * Any error that has occurred during loading\n     */\n    roomLoadError: MatrixError | null;\n    replyingToEvent: MatrixEvent | null;\n    shouldPeek: boolean;\n    viaServers: string[];\n    wasContextSwitch: boolean;\n    /**\n     * Whether we're viewing a call or call lobby in this room\n     */\n    viewingCall: boolean;\n\n    promptAskToJoin: boolean;\n\n    viewRoomOpts: ViewRoomOpts;\n}\n\nconst INITIAL_STATE: State = {\n    joining: false,\n    joinError: null,\n    roomId: null,\n    threadId: null,\n    subscribingRoomId: null,\n    initialEventId: null,\n    initialEventPixelOffset: null,\n    isInitialEventHighlighted: false,\n    initialEventScrollIntoView: true,\n    roomAlias: null,\n    roomLoading: false,\n    roomLoadError: null,\n    replyingToEvent: null,\n    shouldPeek: false,\n    viaServers: [],\n    wasContextSwitch: false,\n    viewingCall: false,\n    promptAskToJoin: false,\n    viewRoomOpts: { buttons: [] },\n};\n\ntype Listener = (isActive: boolean) => void;\n\n/**\n * A class for storing application state for RoomView.\n */\nexport class RoomViewStore extends EventEmitter {\n    // initialize state as a copy of the initial state. We need to copy else one RVS can talk to\n    // another RVS via INITIAL_STATE as they share the same underlying object. Mostly relevant for tests.\n    private state = utils.deepCopy(INITIAL_STATE);\n\n    private dis?: MatrixDispatcher;\n    private dispatchToken?: string;\n\n    public constructor(\n        dis: MatrixDispatcher,\n        private readonly stores: SDKContextClass,\n        private readonly lockedToRoomId?: string,\n    ) {\n        super();\n        this.resetDispatcher(dis);\n    }\n\n    public addRoomListener(roomId: string, fn: Listener): void {\n        this.on(roomId, fn);\n    }\n\n    public removeRoomListener(roomId: string, fn: Listener): void {\n        this.off(roomId, fn);\n    }\n\n    private emitForRoom(roomId: string, isActive: boolean): void {\n        this.emit(roomId, isActive);\n    }\n\n    private setState(newState: Partial<State>): void {\n        // If values haven't changed, there's nothing to do.\n        // This only tries a shallow comparison, so unchanged objects will slip\n        // through, but that's probably okay for now.\n        let stateChanged = false;\n        for (const key of Object.keys(newState)) {\n            if (this.state[key as keyof State] !== newState[key as keyof State]) {\n                stateChanged = true;\n                break;\n            }\n        }\n        if (!stateChanged) {\n            return;\n        }\n\n        const lastRoomId = this.state.roomId;\n        this.state = Object.assign(this.state, newState);\n        if (!this.lockedToRoomId && lastRoomId !== this.state.roomId) {\n            if (lastRoomId) this.emitForRoom(lastRoomId, false);\n            if (this.state.roomId) this.emitForRoom(this.state.roomId, true);\n\n            // Fired so we can reduce dependency on event emitters to this store, which is relatively\n            // central to the application and can easily cause import cycles.\n            this.dis?.dispatch<ActiveRoomChangedPayload>({\n                action: Action.ActiveRoomChanged,\n                oldRoomId: lastRoomId,\n                newRoomId: this.state.roomId,\n            });\n        }\n\n        this.emit(UPDATE_EVENT);\n    }\n\n    private onDispatch(payload: ActionPayload): void {\n        if (this.lockedToRoomId && payload.room_id && this.lockedToRoomId !== payload.room_id) {\n            return;\n        }\n        // eslint-disable-line @typescript-eslint/naming-convention\n        switch (payload.action) {\n            // view_room:\n            //      - room_alias:   '#somealias:matrix.org'\n            //      - room_id:      '!roomid123:matrix.org'\n            //      - event_id:     '$213456782:matrix.org'\n            //      - event_offset: 100\n            //      - highlighted:  true\n            case Action.ViewRoom:\n                this.viewRoom(payload as ViewRoomPayload);\n                break;\n            case Action.ViewThread:\n                this.viewThread(payload as ThreadPayload);\n                break;\n            // for these events blank out the roomId as we are no longer in the RoomView\n            case \"view_welcome_page\":\n            case Action.ViewHomePage:\n                this.setState({\n                    roomId: null,\n                    roomAlias: null,\n                    viaServers: [],\n                    wasContextSwitch: false,\n                    viewingCall: false,\n                });\n                break;\n            case Action.ViewRoomError:\n                this.viewRoomError(payload as ViewRoomErrorPayload);\n                break;\n            case \"will_join\":\n                this.setState({\n                    joining: true,\n                });\n                break;\n            case \"cancel_join\":\n                this.setState({\n                    joining: false,\n                });\n                break;\n            // join_room:\n            //      - opts: options for joinRoom\n            case Action.JoinRoom:\n                this.joinRoom(payload as JoinRoomPayload);\n                break;\n            case Action.JoinRoomError:\n                this.joinRoomError(payload as JoinRoomErrorPayload);\n                break;\n            case Action.JoinRoomReady: {\n                if (this.state.roomId === payload.roomId) {\n                    this.setState({ shouldPeek: false });\n                }\n\n                awaitRoomDownSync(MatrixClientPeg.safeGet(), payload.roomId).then((room) => {\n                    const numMembers = room.getJoinedMemberCount();\n                    const roomSize =\n                        numMembers > 1000\n                            ? \"MoreThanAThousand\"\n                            : numMembers > 100\n                              ? \"OneHundredAndOneToAThousand\"\n                              : numMembers > 10\n                                ? \"ElevenToOneHundred\"\n                                : numMembers > 2\n                                  ? \"ThreeToTen\"\n                                  : numMembers > 1\n                                    ? \"Two\"\n                                    : \"One\";\n\n                    this.stores.posthogAnalytics.trackEvent<JoinedRoomEvent>({\n                        eventName: \"JoinedRoom\",\n                        trigger: payload.metricsTrigger,\n                        roomSize,\n                        isDM: !!DMRoomMap.shared().getUserIdForRoomId(room.roomId),\n                        isSpace: room.isSpaceRoom(),\n                    });\n                });\n\n                break;\n            }\n            case Action.ClientNotViable:\n            case Action.OnLoggedOut:\n                this.reset();\n                break;\n            case \"reply_to_event\":\n                // Thread timeline view handles its own reply-to-state\n                if (TimelineRenderingType.Thread !== payload.context) {\n                    const roomId: string | undefined = payload.event?.getRoomId();\n\n                    // If currently viewed room does not match the room in which we wish to reply then change rooms this\n                    // can happen when performing a search across all rooms. Persist the data from this event for both\n                    // room and search timeline rendering types, search will get auto-closed by RoomView at this time.\n                    if (payload.event && roomId !== this.state.roomId) {\n                        // if the room is displayed in a module, we don't want to change the room view\n                        if (roomId && this.isRoomDisplayedInModule(roomId)) return;\n\n                        this.dis?.dispatch<ViewRoomPayload>({\n                            action: Action.ViewRoom,\n                            room_id: payload.event.getRoomId(),\n                            replyingToEvent: payload.event,\n                            metricsTrigger: undefined, // room doesn't change\n                        });\n                    } else {\n                        this.setState({\n                            replyingToEvent: payload.event,\n                        });\n                    }\n                }\n                break;\n            case Action.PromptAskToJoin: {\n                this.setState({ promptAskToJoin: true });\n                break;\n            }\n            case Action.SubmitAskToJoin: {\n                this.submitAskToJoin(payload as SubmitAskToJoinPayload);\n                break;\n            }\n            case Action.CancelAskToJoin: {\n                this.cancelAskToJoin(payload as CancelAskToJoinPayload);\n                break;\n            }\n            case Action.RoomLoaded: {\n                this.setViewRoomOpts();\n                break;\n            }\n        }\n    }\n\n    public async viewRoom(payload: ViewRoomPayload): Promise<void> {\n        if (payload.room_id) {\n            const room = MatrixClientPeg.safeGet().getRoom(payload.room_id);\n\n            if (payload.metricsTrigger !== null && payload.room_id !== this.state.roomId) {\n                let activeSpace: ViewRoomEvent[\"activeSpace\"];\n                if (this.stores.spaceStore.activeSpace === MetaSpace.Home) {\n                    activeSpace = \"Home\";\n                } else if (isMetaSpace(this.stores.spaceStore.activeSpace)) {\n                    activeSpace = \"Meta\";\n                } else {\n                    activeSpace =\n                        this.stores.spaceStore.activeSpaceRoom?.getJoinRule() === JoinRule.Public\n                            ? \"Public\"\n                            : \"Private\";\n                }\n\n                this.stores.posthogAnalytics.trackEvent<ViewRoomEvent>({\n                    eventName: \"ViewRoom\",\n                    trigger: payload.metricsTrigger,\n                    viaKeyboard: payload.metricsViaKeyboard,\n                    isDM: !!DMRoomMap.shared().getUserIdForRoomId(payload.room_id),\n                    isSpace: room?.isSpaceRoom(),\n                    activeSpace,\n                });\n            }\n\n            let viewingCall = payload.view_call;\n            if (viewingCall === undefined) {\n                // Default behavior: keep the same call state as before if viewing the same room\n                if (payload.room_id === this.state.roomId) viewingCall = this.state.viewingCall;\n                // Always view the call in video rooms\n                else if (room && isVideoRoom(room)) viewingCall = true;\n                // Otherwise, only view if actively connected\n                else viewingCall = CallStore.instance.getActiveCall(payload.room_id) !== null;\n            }\n\n            if (room && viewingCall) {\n                let call = CallStore.instance.getCall(payload.room_id);\n                // Start a call if not already there\n                if (call === null) {\n                    ElementCall.create(room);\n                    call = CallStore.instance.getCall(payload.room_id)!;\n                }\n\n                // Custom case where we start voice calls in pip\n                if (payload.voiceOnly ?? false) {\n                    viewingCall = false;\n                    ActiveWidgetStore.instance.setWidgetPersistence(call.widget.id, room.roomId, true);\n                }\n                call.presented = true;\n                // Immediately start the call. This will connect to all required widget events\n                // and allow the widget to show the lobby.\n                if (call.connectionState === ConnectionState.Disconnected) {\n                    call.start({ skipLobby: payload.skipLobby, voiceOnly: payload.voiceOnly });\n                }\n            }\n            // If we switch to a different room from the call, we are no longer presenting it\n            const prevRoomCall = this.state.roomId ? CallStore.instance.getCall(this.state.roomId) : null;\n            if (prevRoomCall !== null && (!payload.view_call || payload.room_id !== this.state.roomId))\n                prevRoomCall.presented = false;\n\n            if (SettingsStore.getValue(\"feature_simplified_sliding_sync\") && this.state.roomId !== payload.room_id) {\n                this.setState({\n                    subscribingRoomId: payload.room_id,\n                    roomId: payload.room_id,\n                    initialEventId: null,\n                    initialEventPixelOffset: null,\n                    initialEventScrollIntoView: true,\n                    roomAlias: null,\n                    roomLoading: true,\n                    roomLoadError: null,\n                    viaServers: payload.via_servers,\n                    wasContextSwitch: payload.context_switch,\n                    viewingCall,\n                });\n                // set this room as the room subscription. We need to await for it as this will fetch\n                // all room state for this room, which is required before we get the state below.\n                await this.stores.slidingSyncManager.setRoomVisible(payload.room_id);\n\n                // Re-fire the payload: we won't re-process it because the prev room ID == payload room ID now\n                this.dis?.dispatch({\n                    ...payload,\n                });\n                return;\n            }\n\n            const newState: Partial<State> = {\n                roomId: payload.room_id,\n                roomAlias: payload.room_alias ?? null,\n                initialEventId: payload.event_id ?? null,\n                isInitialEventHighlighted: payload.highlighted ?? false,\n                initialEventScrollIntoView: payload.scroll_into_view ?? true,\n                roomLoading: false,\n                roomLoadError: null,\n                // should peek by default\n                shouldPeek: payload.should_peek === undefined ? true : payload.should_peek,\n                // have we sent a join request for this room and are waiting for a response?\n                joining: payload.joining || false,\n                // Reset replyingToEvent because we don't want cross-room because bad UX\n                replyingToEvent: null,\n                viaServers: payload.via_servers ?? [],\n                wasContextSwitch: payload.context_switch ?? false,\n                viewingCall,\n            };\n\n            // Allow being given an event to be replied to when switching rooms but sanity check its for this room\n            if (payload.replyingToEvent?.getRoomId() === payload.room_id) {\n                newState.replyingToEvent = payload.replyingToEvent;\n            } else if (this.state.replyingToEvent?.getRoomId() === payload.room_id) {\n                // if the reply-to matches the desired room, e.g visiting a permalink then maintain replyingToEvent\n                // See https://github.com/vector-im/element-web/issues/21462\n                newState.replyingToEvent = this.state.replyingToEvent;\n            }\n\n            this.setState(newState);\n\n            if (payload.auto_join) {\n                const joinPayload: JoinRoomPayload = {\n                    ...payload,\n                    action: Action.JoinRoom,\n                    roomId: payload.room_id,\n                    metricsTrigger: payload.metricsTrigger as JoinRoomPayload[\"metricsTrigger\"],\n                    canAskToJoin: SettingsStore.getValue(\"feature_ask_to_join\"),\n                };\n                // Explicitly pass viaServers in case state doesn't contain the same due to\n                // some race issues.\n                if (payload.via_servers) {\n                    joinPayload.opts = {\n                        viaServers: payload.via_servers,\n                    };\n                }\n                this.dis?.dispatch<JoinRoomPayload>(joinPayload);\n            }\n\n            if (room) {\n                await setMarkedUnreadState(room, MatrixClientPeg.safeGet(), false);\n            }\n        } else if (payload.room_alias) {\n            let roomId: string;\n            let viaServers: string[] | undefined;\n\n            // Try the room alias to room ID navigation cache first to avoid\n            // blocking room navigation on the homeserver.\n            const cachedResult = getCachedRoomIdForAlias(payload.room_alias);\n            if (cachedResult) {\n                roomId = cachedResult.roomId;\n                viaServers = cachedResult.viaServers;\n            } else {\n                // Room alias cache miss, so let's ask the homeserver. Resolve the alias\n                // and then do a second dispatch with the room ID acquired.\n                this.setState({\n                    roomId: null,\n                    initialEventId: null,\n                    initialEventPixelOffset: null,\n                    isInitialEventHighlighted: false,\n                    initialEventScrollIntoView: true,\n                    roomAlias: payload.room_alias,\n                    roomLoading: true,\n                    roomLoadError: null,\n                    viaServers: payload.via_servers,\n                    wasContextSwitch: payload.context_switch,\n                    viewingCall: payload.view_call ?? false,\n                });\n                try {\n                    const result = await MatrixClientPeg.safeGet().getRoomIdForAlias(payload.room_alias);\n                    storeRoomAliasInCache(payload.room_alias, result.room_id, result.servers);\n                    roomId = result.room_id;\n                    viaServers = result.servers;\n                } catch (err) {\n                    logger.error(\"RVS failed to get room id for alias: \", err);\n                    this.dis?.dispatch<ViewRoomErrorPayload>({\n                        action: Action.ViewRoomError,\n                        room_id: null,\n                        room_alias: payload.room_alias,\n                        err: err instanceof MatrixError ? err : undefined,\n                    });\n                    return;\n                }\n            }\n\n            // Re-fire the payload with the newly found room_id\n            this.dis?.dispatch({\n                ...payload,\n                room_id: roomId,\n                via_servers: viaServers,\n            });\n        }\n    }\n\n    private viewThread(payload: ThreadPayload): void {\n        this.setState({\n            threadId: payload.thread_id,\n        });\n    }\n\n    private viewRoomError(payload: ViewRoomErrorPayload): void {\n        this.setState({\n            roomId: payload.room_id,\n            roomAlias: payload.room_alias,\n            roomLoading: false,\n            roomLoadError: payload.err,\n        });\n    }\n\n    private async joinRoom(payload: JoinRoomPayload): Promise<void> {\n        this.setState({\n            joining: true,\n        });\n\n        // take a copy of roomAlias, roomId & viaServers as they may change by the time the join is complete\n        const { roomAlias, roomId = payload.roomId, viaServers = [] } = this.state;\n        // prefer the room alias if we have one as it allows joining over federation even with no viaServers\n        const address = roomAlias || roomId!;\n\n        const joinOpts: IJoinRoomOpts = {\n            viaServers,\n            acceptSharedHistory: true,\n            ...payload.opts,\n        };\n        try {\n            const cli = MatrixClientPeg.safeGet();\n            await retry<Room, MatrixError>(\n                () => cli.joinRoom(address, joinOpts),\n                NUM_JOIN_RETRY,\n                (err) => {\n                    // if we received a Gateway timeout or Cloudflare timeout then retry\n                    return err.httpStatus === 504 || err.httpStatus === 524;\n                },\n            );\n\n            // We do *not* clear the 'joining' flag because the Room object and/or our 'joined' member event may not\n            // have come down the sync stream yet, and that's the point at which we'd consider the user joined to the\n            // room.\n            this.dis?.dispatch<JoinRoomReadyPayload>({\n                action: Action.JoinRoomReady,\n                roomId: roomId!,\n                metricsTrigger: payload.metricsTrigger,\n            });\n        } catch (err) {\n            logger.error(\"Error thrown while handling joinRoom\", err);\n            this.dis?.dispatch<JoinRoomErrorPayload>({\n                action: Action.JoinRoomError,\n                roomId,\n                err: err instanceof Error ? err : new UserFriendlyError(\"room|error_join_unknown\", { cause: err }),\n                canAskToJoin: payload.canAskToJoin,\n            });\n\n            if (payload.canAskToJoin && err instanceof MatrixError && err.httpStatus === 403) {\n                this.dis?.dispatch({ action: Action.PromptAskToJoin });\n            }\n        }\n    }\n\n    private getInvitingUserId(roomId: string): string | undefined {\n        const cli = MatrixClientPeg.safeGet();\n        const room = cli.getRoom(roomId);\n        if (room?.getMyMembership() === KnownMembership.Invite) {\n            const myMember = room.getMember(cli.getSafeUserId());\n            const inviteEvent = myMember ? myMember.events.member : null;\n            return inviteEvent?.getSender();\n        }\n    }\n\n    public showJoinRoomError(err: unknown, roomId: string | null): void {\n        let description: ReactNode = err instanceof Error && err.message ? err.message : JSON.stringify(err);\n        if (err instanceof MatrixError === false) {\n            // This isn't a MatrixError so just show the error verbatim.\n        } else if (err.name === \"ConnectionError\") {\n            description = _t(\"room|error_join_connection\");\n        } else if (err.errcode === \"M_INCOMPATIBLE_ROOM_VERSION\") {\n            description = (\n                <div>\n                    {_t(\"room|error_join_incompatible_version_1\")}\n                    <br />\n                    {_t(\"room|error_join_incompatible_version_2\")}\n                </div>\n            );\n        } else if (err.httpStatus === 404) {\n            const invitingUserId = roomId && this.getInvitingUserId(roomId);\n            // provide a better error message for invites\n            if (invitingUserId) {\n                // if the inviting user is on the same HS, there can only be one cause: they left.\n                if (invitingUserId.endsWith(`:${MatrixClientPeg.safeGet().getDomain()}`)) {\n                    description = _t(\"room|error_join_404_invite_same_hs\");\n                } else {\n                    description = _t(\"room|error_join_404_invite\");\n                }\n            }\n            // provide a more detailed error than \"No known servers\" when attempting to\n            // join using a room ID and no via servers\n            else if (roomId === this.state.roomId && this.state.viaServers.length === 0) {\n                description = (\n                    <div>\n                        {_t(\"room|error_join_404_1\")}\n                        <br />\n                        <br />\n                        {_t(\"room|error_join_404_2\")}\n                    </div>\n                );\n            }\n        }\n        logger.log(\"Failed to join room:\", description);\n\n        Modal.createDialog(ErrorDialog, {\n            title: _t(\"room|error_join_title\"),\n            description,\n        });\n    }\n\n    private joinRoomError(payload: JoinRoomErrorPayload): void {\n        this.setState({\n            joining: false,\n            joinError: payload.err instanceof Error ? payload.err : null,\n        });\n        if (payload.err && !payload.canAskToJoin) {\n            this.showJoinRoomError(payload.err, payload.roomId);\n        }\n    }\n\n    public reset(): void {\n        this.state = Object.assign({}, INITIAL_STATE);\n    }\n\n    /**\n     * Reset which dispatcher should be used to listen for actions. The old dispatcher will be\n     * unregistered.\n     * @param dis The new dispatcher to use.\n     */\n    public resetDispatcher(dis: MatrixDispatcher): void {\n        if (this.dispatchToken) {\n            this.dis?.unregister(this.dispatchToken);\n        }\n        this.dis = dis;\n        if (dis) {\n            // Some tests mock the dispatcher file resulting in an empty defaultDispatcher\n            // so rather than dying here, just ignore it. When we no longer mock files like this,\n            // we should remove the null check.\n            this.dispatchToken = this.dis.register(this.onDispatch.bind(this));\n        }\n    }\n\n    // The room ID of the room currently being viewed\n    public getRoomId(): string | null {\n        return this.state.roomId;\n    }\n\n    public getThreadId(): string | null {\n        return this.state.threadId;\n    }\n\n    // The event to scroll to when the room is first viewed\n    public getInitialEventId(): string | null {\n        return this.state.initialEventId;\n    }\n\n    // Whether to highlight the initial event\n    public isInitialEventHighlighted(): boolean {\n        return this.state.isInitialEventHighlighted;\n    }\n\n    // Whether to avoid jumping to the initial event\n    public initialEventScrollIntoView(): boolean {\n        return this.state.initialEventScrollIntoView;\n    }\n\n    // The room alias of the room (or null if not originally specified in view_room)\n    public getRoomAlias(): string | null {\n        return this.state.roomAlias;\n    }\n\n    // Whether the current room is loading (true whilst resolving an alias)\n    public isRoomLoading(): boolean {\n        return this.state.roomLoading;\n    }\n\n    // Any error that has occurred during loading\n    public getRoomLoadError(): MatrixError | null {\n        return this.state.roomLoadError;\n    }\n\n    // True if we're expecting the user to be joined to the room currently being\n    // viewed. Note that this is left true after the join request has finished,\n    // since we should still consider a join to be in progress until the room\n    // & member events come down the sync.\n    //\n    // This flag remains true after the room has been successfully joined,\n    // (this store doesn't listen for the appropriate member events)\n    // so you should always observe the joined state from the member event\n    // if a room object is present.\n    // ie. The correct logic is:\n    // if (room) {\n    //     if (myMember.membership == 'joined') {\n    //         // user is joined to the room\n    //     } else {\n    //         // Not joined\n    //     }\n    // } else {\n    //     if (this.stores.roomViewStore.isJoining()) {\n    //         // show spinner\n    //     } else {\n    //         // show join prompt\n    //     }\n    // }\n    public isJoining(): boolean {\n        return this.state.joining;\n    }\n\n    // Any error that has occurred during joining\n    public getJoinError(): Error | null {\n        return this.state.joinError;\n    }\n\n    // The mxEvent if one is currently being replied to/quoted\n    public getQuotingEvent(): MatrixEvent | null {\n        return this.state.replyingToEvent;\n    }\n\n    public shouldPeek(): boolean {\n        return this.state.shouldPeek;\n    }\n\n    public getWasContextSwitch(): boolean {\n        return this.state.wasContextSwitch;\n    }\n\n    public isViewingCall(): boolean {\n        return this.state.viewingCall;\n    }\n\n    /**\n     * Gets the current state of the 'promptForAskToJoin' property.\n     *\n     * @returns {boolean} The value of the 'promptForAskToJoin' property.\n     */\n    public promptAskToJoin(): boolean {\n        return this.state.promptAskToJoin;\n    }\n\n    /**\n     * Submits a request to join a room by sending a knock request.\n     *\n     * @param {SubmitAskToJoinPayload} payload - The payload containing information to submit the request.\n     * @returns {void}\n     */\n    private submitAskToJoin(payload: SubmitAskToJoinPayload): void {\n        MatrixClientPeg.safeGet()\n            .knockRoom(payload.roomId, { viaServers: this.state.viaServers, ...payload.opts })\n            .catch((err: MatrixError) =>\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"room|error_join_title\"),\n                    description: err.httpStatus === 403 ? _t(\"room|error_join_403\") : err.message,\n                }),\n            )\n            .finally(() => this.setState({ promptAskToJoin: false }));\n    }\n\n    /**\n     * Cancels a request to join a room by sending a leave request.\n     *\n     * @param {CancelAskToJoinPayload} payload - The payload containing information to cancel the request.\n     * @returns {void}\n     */\n    private cancelAskToJoin(payload: CancelAskToJoinPayload): void {\n        MatrixClientPeg.safeGet()\n            .leave(payload.roomId)\n            .catch((err: MatrixError) =>\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"room|error_cancel_knock_title\"),\n                    description: err.message,\n                }),\n            );\n    }\n\n    /**\n     * Gets the current state of the 'viewRoomOpts' property.\n     *\n     * @returns {ViewRoomOpts} The value of the 'viewRoomOpts' property.\n     */\n    public getViewRoomOpts(): ViewRoomOpts {\n        return this.state.viewRoomOpts;\n    }\n\n    /**\n     * Invokes the view room lifecycle to set the view room options.\n     *\n     * @returns {void}\n     */\n    private setViewRoomOpts(): void {\n        const viewRoomOpts: ViewRoomOpts = { buttons: [] };\n        ModuleRunner.instance.invoke(RoomViewLifecycle.ViewRoom, viewRoomOpts, this.getRoomId());\n        this.setState({ viewRoomOpts });\n    }\n\n    /**\n     * Checks if a room is already displayed in the current active space module.\n     * @param roomId\n     */\n    public isRoomDisplayedInModule(roomId: string): boolean {\n        const currentSpace = this.stores.spaceStore.activeSpace;\n        const cb = ModuleApi.instance.extras.visibleRoomBySpaceKey.get(currentSpace);\n        if (!cb) return false;\n\n        return cb().includes(roomId);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type SDKContextClass } from \"../contexts/SDKContextClass\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { isLocalRoom } from \"../utils/localRoom/isLocalRoom\";\nimport Timer from \"../utils/Timer\";\n\nconst TYPING_USER_TIMEOUT = 10000;\nconst TYPING_SERVER_TIMEOUT = 30000;\n\n/**\n * Tracks typing state for users.\n */\nexport default class TypingStore {\n    private typingStates: {\n        [roomId: string]: {\n            isTyping: boolean;\n            userTimer: Timer;\n            serverTimer: Timer;\n        };\n    } = {};\n\n    public constructor(private readonly context: SDKContextClass) {\n        this.reset();\n    }\n\n    /**\n     * Clears all cached typing states. Intended to be called when the\n     * MatrixClientPeg client changes.\n     */\n    public reset(): void {\n        this.typingStates = {\n            // \"roomId\": {\n            //     isTyping: bool,     // Whether the user is typing or not\n            //     userTimer: Timer,   // Local timeout for \"user has stopped typing\"\n            //     serverTimer: Timer, // Maximum timeout for the typing state\n            // },\n        };\n    }\n\n    /**\n     * Changes the typing status for the MatrixClientPeg user.\n     * @param {string} roomId The room ID to set the typing state in.\n     * @param {boolean} isTyping Whether the user is typing or not.\n     */\n    public setSelfTyping(roomId: string, threadId: string | null, isTyping: boolean): void {\n        // No typing notifications for local rooms\n        if (isLocalRoom(roomId)) return;\n\n        if (!SettingsStore.getValue(\"sendTypingNotifications\")) return;\n        if (SettingsStore.getValue(\"lowBandwidth\")) return;\n        // Disable typing notification for threads for the initial launch\n        // before we figure out a better user experience for them\n        if (threadId) return;\n\n        let currentTyping = this.typingStates[roomId];\n        if ((!isTyping && !currentTyping) || currentTyping?.isTyping === isTyping) {\n            // No change in state, so don't do anything. We'll let the timer run its course.\n            return;\n        }\n\n        if (!currentTyping) {\n            currentTyping = this.typingStates[roomId] = {\n                isTyping: isTyping,\n                serverTimer: new Timer(TYPING_SERVER_TIMEOUT),\n                userTimer: new Timer(TYPING_USER_TIMEOUT),\n            };\n        }\n\n        currentTyping.isTyping = isTyping;\n\n        if (isTyping) {\n            if (!currentTyping.serverTimer.isRunning()) {\n                currentTyping.serverTimer\n                    .restart()\n                    .finished()\n                    .then(() => {\n                        const currentTyping = this.typingStates[roomId];\n                        if (currentTyping) currentTyping.isTyping = false;\n\n                        // The server will (should) time us out on typing, so we don't\n                        // need to advertise a stop of typing.\n                    });\n            } else currentTyping.serverTimer.restart();\n\n            if (!currentTyping.userTimer.isRunning()) {\n                currentTyping.userTimer\n                    .restart()\n                    .finished()\n                    .then(() => {\n                        this.setSelfTyping(roomId, threadId, false);\n                    });\n            } else currentTyping.userTimer.restart();\n        }\n\n        this.context.client?.sendTyping(roomId, isTyping, TYPING_SERVER_TIMEOUT);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport {\n    type IMatrixProfile,\n    type MatrixClient,\n    type MatrixEvent,\n    type RoomMember,\n    RoomMemberEvent,\n} from \"matrix-js-sdk/src/matrix\";\n\nimport { LruCache } from \"../utils/LruCache\";\n\nconst cacheSize = 500;\n\ntype StoreProfileValue = IMatrixProfile | undefined | null;\n\ninterface GetOptions {\n    /** Whether calling the function shouuld raise an Error. */\n    shouldThrow: boolean;\n}\n\n/**\n * This store provides cached access to user profiles.\n * Listens for membership events and invalidates the cache for a profile on update with different profile values.\n */\nexport class UserProfilesStore {\n    private profiles = new LruCache<string, IMatrixProfile | null>(cacheSize);\n    private knownProfiles = new LruCache<string, IMatrixProfile | null>(cacheSize);\n\n    public constructor(private client: MatrixClient) {\n        client.on(RoomMemberEvent.Membership, this.onRoomMembershipEvent);\n    }\n\n    /**\n     * Synchronously get a profile from the store cache.\n     *\n     * @param userId - User Id of the profile to fetch\n     * @returns The profile, if cached by the store.\n     *          Null if the profile does not exist.\n     *          Undefined if the profile is not cached by the store.\n     *          In this case a profile can be fetched from the API via {@link fetchProfile}.\n     */\n    public getProfile(userId: string): StoreProfileValue {\n        return this.profiles.get(userId);\n    }\n\n    /**\n     * Async shortcut function that returns the profile from cache or\n     * or fetches it on cache miss.\n     *\n     * @param userId - User Id of the profile to get or fetch\n     * @returns The profile, if cached by the store or fetched from the API.\n     *          Null if the profile does not exist or an error occurred during fetch.\n     */\n    public async getOrFetchProfile(userId: string, options?: GetOptions): Promise<IMatrixProfile | null> {\n        const cachedProfile = this.profiles.get(userId);\n\n        if (cachedProfile) return cachedProfile;\n\n        return this.fetchProfile(userId, options);\n    }\n\n    /**\n     * Synchronously get a profile from known users from the store cache.\n     * Known user means that at least one shared room with the user exists.\n     *\n     * @param userId - User Id of the profile to fetch\n     * @returns The profile, if cached by the store.\n     *          Null if the profile does not exist.\n     *          Undefined if the profile is not cached by the store.\n     *          In this case a profile can be fetched from the API via {@link fetchOnlyKnownProfile}.\n     */\n    public getOnlyKnownProfile(userId: string): StoreProfileValue {\n        return this.knownProfiles.get(userId);\n    }\n\n    /**\n     * Asynchronousely fetches a profile from the API.\n     * Stores the result in the cache, so that next time {@link getProfile} returns this value.\n     *\n     * @param userId - User Id for which the profile should be fetched for\n     * @returns The profile, if found.\n     *          Null if the profile does not exist or there was an error fetching it.\n     */\n    public async fetchProfile(userId: string, options?: GetOptions): Promise<IMatrixProfile | null> {\n        const profile = await this.fetchProfileFromApi(userId, options);\n        this.profiles.set(userId, profile);\n        return profile;\n    }\n\n    /**\n     * Asynchronousely fetches a profile from a known user from the API.\n     * Known user means that at least one shared room with the user exists.\n     * Stores the result in the cache, so that next time {@link getOnlyKnownProfile} returns this value.\n     *\n     * @param userId - User Id for which the profile should be fetched for\n     * @returns The profile, if found.\n     *          Undefined if the user is unknown.\n     *          Null if the profile does not exist or there was an error fetching it.\n     */\n    public async fetchOnlyKnownProfile(userId: string): Promise<StoreProfileValue> {\n        // Do not look up unknown users. The test for existence in knownProfiles is a performance optimisation.\n        // If the user Id exists in knownProfiles we know them.\n        if (!this.knownProfiles.has(userId) && !this.isUserIdKnown(userId)) return undefined;\n\n        const profile = await this.fetchProfileFromApi(userId);\n        this.knownProfiles.set(userId, profile);\n        return profile;\n    }\n\n    public flush(): void {\n        this.profiles = new LruCache<string, IMatrixProfile | null>(cacheSize);\n        this.knownProfiles = new LruCache<string, IMatrixProfile | null>(cacheSize);\n    }\n\n    /**\n     * Looks up a user profile via API.\n     *\n     * @param userId - User Id for which the profile should be fetched for\n     * @returns The profile information or null on errors\n     */\n    private async fetchProfileFromApi(userId: string, options?: GetOptions): Promise<IMatrixProfile | null> {\n        try {\n            return (await this.client.getProfileInfo(userId)) ?? null;\n        } catch (e) {\n            logger.warn(`Error retrieving profile for userId ${userId}`, e);\n\n            if (options?.shouldThrow) {\n                throw e;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Whether at least one shared room with the userId exists.\n     *\n     * @param userId\n     * @returns true: at least one room shared with user identified by its Id, else false.\n     */\n    private isUserIdKnown(userId: string): boolean {\n        return this.client.getRooms().some((room) => {\n            return !!room.getMember(userId);\n        });\n    }\n\n    /**\n     * Simple cache invalidation if a room membership event is received and\n     * at least one profile value differs from the cached one.\n     */\n    private onRoomMembershipEvent = (event: MatrixEvent, member: RoomMember): void => {\n        const profile = this.profiles.get(member.userId);\n\n        if (\n            profile &&\n            (profile.displayname !== member.rawDisplayName || profile.avatar_url !== member.getMxcAvatarUrl())\n        ) {\n            this.profiles.delete(member.userId);\n        }\n\n        const knownProfile = this.knownProfiles.get(member.userId);\n\n        if (\n            knownProfile &&\n            (knownProfile.displayname !== member.rawDisplayName || knownProfile.avatar_url !== member.getMxcAvatarUrl())\n        ) {\n            this.knownProfiles.delete(member.userId);\n        }\n    };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n/**\n * Fires when the middle panel has been resized (throttled).\n * @event module:utils~ResizeNotifier#\"middlePanelResized\"\n */\n/**\n * Fires when the middle panel has been resized by a pixel.\n * @event module:utils~ResizeNotifier#\"middlePanelResizedNoisy\"\n */\n\nimport { EventEmitter } from \"events\";\nimport { throttle } from \"lodash\";\n\nexport default class ResizeNotifier extends EventEmitter {\n    private _isResizing = false;\n\n    // with default options, will call fn once at first call, and then every x ms\n    // if there was another call in that timespan\n    private throttledMiddlePanel = throttle(() => this.emit(\"middlePanelResized\"), 200);\n\n    public get isResizing(): boolean {\n        return this._isResizing;\n    }\n\n    public startResizing(): void {\n        this._isResizing = true;\n        this.emit(\"isResizing\", true);\n    }\n\n    public stopResizing(): void {\n        this._isResizing = false;\n        this.emit(\"isResizing\", false);\n    }\n\n    private noisyMiddlePanel(): void {\n        this.emit(\"middlePanelResizedNoisy\");\n    }\n\n    private updateMiddlePanel(): void {\n        this.throttledMiddlePanel();\n        this.noisyMiddlePanel();\n    }\n\n    // can be called in quick succession\n    public notifyLeftHandleResized(): void {\n        // don't emit event for own region\n        this.updateMiddlePanel();\n    }\n\n    // can be called in quick succession\n    public notifyRightHandleResized(): void {\n        this.updateMiddlePanel();\n    }\n\n    public notifyTimelineHeightChanged(): void {\n        this.updateMiddlePanel();\n    }\n\n    // can be called in quick succession\n    public notifyWindowResized(): void {\n        this.updateMiddlePanel();\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { RoomViewStore } from \"./RoomViewStore\";\nimport { type MatrixDispatcher } from \"../dispatcher/dispatcher\";\nimport { type SDKContextClass } from \"../contexts/SDKContextClass\";\nimport { Action } from \"../dispatcher/actions\";\n\n/**\n * Acts as a cache of many RoomViewStore instances, creating them as necessary\n * given a room ID.\n */\nexport class MultiRoomViewStore {\n    /**\n     * Map from room-id to RVS instance.\n     */\n    private stores: Map<string, RoomViewStore> = new Map();\n\n    public constructor(\n        private dispatcher: MatrixDispatcher,\n        private sdkContextClass: SDKContextClass,\n    ) {}\n\n    /**\n     * Get a RVS instance for the room identified by the given roomId.\n     */\n    public getRoomViewStoreForRoom(roomId: string): RoomViewStore {\n        // Get existing store / create new store\n        const store = this.stores.has(roomId)\n            ? this.stores.get(roomId)!\n            : new RoomViewStore(this.dispatcher, this.sdkContextClass, roomId);\n\n        // RoomView component does not render the room unless you call viewRoom\n        store.viewRoom({\n            action: Action.ViewRoom,\n            room_id: roomId,\n            metricsTrigger: undefined,\n        });\n\n        // Cache the store, okay to do even if the store is already in the map\n        this.stores.set(roomId, store);\n\n        return store;\n    }\n\n    /**\n     * Remove a RVS instance that was created by {@link getRoomViewStoreForRoom}.\n     */\n    public removeRoomViewStore(roomId: string): void {\n        const didRemove = this.stores.delete(roomId);\n        if (!didRemove) {\n            logger.warn(`removeRoomViewStore called with ${roomId} but no store exists for this room.`);\n        }\n    }\n\n    public dispose(): void {\n        for (const id of this.stores.keys()) {\n            this.removeRoomViewStore(id);\n        }\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, {\n    type JSX,\n    type ReactNode,\n    type ComponentType,\n    type SVGAttributes,\n    useCallback,\n    useEffect,\n    useRef,\n    useState,\n    useId,\n    useContext,\n} from \"react\";\nimport {\n    type Room,\n    type MatrixEvent,\n    type RoomMember,\n    RoomEvent,\n    EventType,\n    MatrixEventEvent,\n} from \"matrix-js-sdk/src/matrix\";\nimport { AvatarStack, Button, Form, Heading, InlineField, Label, ToggleInput, Tooltip } from \"@vector-im/compound-web\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type IRTCNotificationContent } from \"matrix-js-sdk/src/matrixrtc\";\nimport {\n    CheckIcon,\n    CloseIcon,\n    ExpandIcon,\n    VideoCallSolidIcon,\n    VoiceCallSolidIcon,\n} from \"@vector-im/compound-design-tokens/assets/web/icons\";\nimport { AvatarWithDetails } from \"@element-hq/web-shared-components\";\n\nimport { _t } from \"../languageHandler\";\nimport RoomAvatar from \"../components/views/avatars/RoomAvatar\";\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport { type ViewRoomPayload } from \"../dispatcher/payloads/ViewRoomPayload\";\nimport { Action } from \"../dispatcher/actions\";\nimport ToastStore from \"../stores/ToastStore\";\nimport { useCall, useParticipatingMembers } from \"../hooks/useCall\";\nimport AccessibleButton, { type ButtonEvent } from \"../components/views/elements/AccessibleButton\";\nimport { useDispatcher } from \"../hooks/useDispatcher\";\nimport { type ActionPayload } from \"../dispatcher/payloads\";\nimport { type Call, CallEvent } from \"../models/Call\";\nimport { AudioID } from \"../LegacyCallHandler\";\nimport { useEventEmitter, useTypedEventEmitter } from \"../hooks/useEventEmitter\";\nimport { CallStore, CallStoreEvent } from \"../stores/CallStore\";\nimport DMRoomMap from \"../utils/DMRoomMap\";\nimport MemberAvatar from \"../components/views/avatars/MemberAvatar\";\nimport { SDKContext } from \"../contexts/SDKContext.ts\";\n\n/**\n * Get the key for the incoming call toast. A combination of the call ID and room ID.\n * @param callId The ID of the call.\n * @param roomId The ID of the room.\n * @returns The key for the incoming call toast.\n */\nexport const getIncomingCallToastKey = (callId: string, roomId: string): string => `call_${callId}_${roomId}`;\n\n/**\n * Get the ts when the notification event was sent.\n * This can be either the origin_server_ts or a ts the sender of this event claims as\n * the time they sent it (sender_ts).\n * The origin_server_ts is the fallback if sender_ts seems wrong.\n * @param event The RTCNotification event.\n * @returns The timestamp to use as the expect start time to apply the `lifetime` to.\n */\nexport const getNotificationEventSendTs = (event: MatrixEvent): number => {\n    const content = event.getContent() as Partial<IRTCNotificationContent>;\n    const sendTs = content.sender_ts;\n    if (sendTs && Math.abs(sendTs - event.getTs()) >= 15000) {\n        logger.warn(\n            \"Received RTCNotification event. With large sender_ts origin_server_ts offset -> using origin_server_ts\",\n        );\n        return event.getTs();\n    }\n    return sendTs ?? event.getTs();\n};\nconst MAX_RING_TIME_MS = 90 * 1000;\n\ninterface JoinCallButtonWithCallProps {\n    onClick: (e: ButtonEvent) => void;\n    disabledTooltip: string | undefined;\n}\n\nfunction JoinCallButtonWithCall({ onClick, disabledTooltip }: JoinCallButtonWithCallProps): JSX.Element {\n    const button = (\n        <Button\n            className=\"mx_IncomingCallToast_actionButton\"\n            onClick={onClick}\n            disabled={disabledTooltip != undefined}\n            kind=\"primary\"\n            Icon={CheckIcon}\n            size=\"md\"\n        >\n            {_t(\"action|join\")}\n        </Button>\n    );\n\n    return disabledTooltip === undefined ? (\n        button\n    ) : (\n        <Tooltip description={disabledTooltip ?? _t(\"voip|video_call\")}>{button}</Tooltip>\n    );\n}\n\ninterface DeclineCallButtonWithNotificationEventProps {\n    onDeclined: (e: ButtonEvent) => void;\n    notificationEvent: MatrixEvent;\n    room?: Room;\n}\n\nfunction DeclineCallButtonWithNotificationEvent({\n    notificationEvent,\n    room,\n    onDeclined,\n}: DeclineCallButtonWithNotificationEventProps): JSX.Element {\n    const [declining, setDeclining] = useState(false);\n    const onClick = useCallback(\n        async (e: ButtonEvent) => {\n            e.stopPropagation();\n            setDeclining(true);\n            await room?.client.sendRtcDecline(room.roomId, notificationEvent.getId() ?? \"\");\n            onDeclined(e);\n        },\n        [notificationEvent, onDeclined, room?.client, room?.roomId],\n    );\n    return (\n        <Button\n            className=\"mx_IncomingCallToast_actionButton\"\n            onClick={onClick}\n            kind=\"secondary\"\n            disabled={declining}\n            Icon={CloseIcon}\n            size=\"md\"\n        >\n            {_t(\"action|decline\")}\n        </Button>\n    );\n}\n\ninterface Props {\n    /**\n     * A MatrixRTC notification event which has a content type of `IRTCNotificationContent`\n     */\n    notificationEvent: MatrixEvent;\n    /**\n     * The unique key of the toast notification, used to dismiss the toast if the\n     * notification expires for any reason.\n     */\n    toastKey: string;\n}\n\nexport function IncomingCallToast({ notificationEvent, toastKey }: Props): JSX.Element {\n    const sdkContext = useContext(SDKContext);\n    const roomId = notificationEvent.getRoomId()!;\n    // Use a partial type so ts still helps us to not miss any type checks.\n    const notificationContent = notificationEvent.getContent() as Partial<IRTCNotificationContent>;\n    const room = sdkContext.client?.getRoom(roomId) ?? undefined;\n    const call = useCall(roomId);\n    const [connectedCalls, setConnectedCalls] = useState<Call[]>(Array.from(CallStore.instance.connectedCalls));\n    useEventEmitter(CallStore.instance, CallStoreEvent.ConnectedCalls, () => {\n        setConnectedCalls(Array.from(CallStore.instance.connectedCalls));\n    });\n    const otherCallIsOngoing = connectedCalls.find((call) => call.roomId !== roomId);\n    const soundHasStarted = useRef<boolean>(false);\n    useEffect(() => {\n        // This section can race, so we use a ref to keep track of whether we have started trying to play.\n        // This is because `LegacyCallHandler.play` tries to load the sound and then play it asynchonously\n        // and `LegacyCallHandler.isPlaying` will not be `true` until the sound starts playing.\n        const isRingToast = notificationContent.notification_type === \"ring\";\n        if (isRingToast && !soundHasStarted.current && !sdkContext.legacyCallHandler.isPlaying(AudioID.Ring)) {\n            // Start ringing if not already.\n            soundHasStarted.current = true;\n            void sdkContext.legacyCallHandler.play(AudioID.Ring);\n        }\n    }, [notificationContent.notification_type, soundHasStarted, sdkContext.legacyCallHandler]);\n\n    // Stop ringing on dismiss.\n    const dismissToast = useCallback((): void => {\n        ToastStore.sharedInstance().dismissToast(toastKey);\n        sdkContext.legacyCallHandler.pause(AudioID.Ring);\n    }, [toastKey, sdkContext.legacyCallHandler]);\n\n    // Dismiss if the notification event or call event is redacted\n    useTypedEventEmitter(room, MatrixEventEvent.BeforeRedaction, (ev: MatrixEvent) => {\n        if ([ev.getId(), ev.getRelation()?.event_id].includes(ev.getId())) {\n            dismissToast();\n        }\n    });\n\n    // Dismiss if session got ended remotely.\n    const onCall = useCallback(\n        (call: Call, callRoomId: string): void => {\n            const roomId = notificationEvent.getRoomId();\n            if (!roomId && roomId !== callRoomId) return;\n            if (call === null || call.participants.size === 0) {\n                dismissToast();\n            }\n        },\n        [dismissToast, notificationEvent],\n    );\n\n    // Dismiss if session got declined remotely.\n    const onTimelineChange = useCallback(\n        (ev: MatrixEvent) => {\n            const userId = room?.client.getUserId();\n            if (\n                ev.getType() === EventType.RTCDecline &&\n                userId !== undefined &&\n                ev.getSender() === userId && // It is our decline not someone elses\n                ev.relationEventId === notificationEvent.getId() // The event declines this ringing toast.\n            ) {\n                dismissToast();\n            }\n        },\n        [dismissToast, notificationEvent, room?.client],\n    );\n\n    // Dismiss if another device from this user joins.\n    const onParticipantChange = useCallback(\n        (participants: Map<RoomMember, Set<string>>) => {\n            if (Array.from(participants.keys()).some((p) => p.userId == room?.client.getUserId())) {\n                dismissToast();\n            }\n        },\n        [dismissToast, room?.client],\n    );\n\n    // Dismiss on timeout.\n    useEffect(() => {\n        const lifetime = notificationContent.lifetime ?? MAX_RING_TIME_MS;\n        const timeout = setTimeout(dismissToast, getNotificationEventSendTs(notificationEvent) + lifetime - Date.now());\n        return () => clearTimeout(timeout);\n    });\n\n    // Dismiss on viewing call.\n    useDispatcher(\n        defaultDispatcher,\n        useCallback(\n            (payload: ActionPayload) => {\n                if (payload.action === Action.ViewRoom && payload.room_id === roomId && payload.view_call) {\n                    dismissToast();\n                }\n            },\n            [roomId, dismissToast],\n        ),\n    );\n\n    const [videoToggle, setVideoToggle] = useState(true);\n    const videoToggleId = useId();\n\n    const isVoice = notificationContent[\"m.call.intent\"] === \"audio\";\n\n    const viewCall = useCallback(\n        (skipLobby: boolean) => {\n            // The toast will be automatically dismissed by the dispatcher callback above\n            defaultDispatcher.dispatch<ViewRoomPayload>({\n                action: Action.ViewRoom,\n                room_id: room?.roomId,\n                view_call: true,\n                skipLobby,\n                voiceOnly: isVoice || !videoToggle,\n                metricsTrigger: undefined,\n            });\n        },\n        [room, isVoice, videoToggle],\n    );\n\n    const onJoinClick = useCallback(() => viewCall(true), [viewCall]);\n    const onExpandClick = useCallback(() => viewCall(false), [viewCall]);\n\n    // Dismiss on closing toast.\n    const onCloseClick = useCallback(\n        (e: ButtonEvent): void => {\n            e.stopPropagation();\n            dismissToast();\n        },\n        [dismissToast],\n    );\n\n    useEventEmitter(CallStore.instance, CallStoreEvent.Call, onCall);\n    useEventEmitter(call ?? undefined, CallEvent.Participants, onParticipantChange);\n    useEventEmitter(room, RoomEvent.Timeline, onTimelineChange);\n\n    const otherUserId = DMRoomMap.shared().getUserIdForRoomId(roomId);\n    const members = useParticipatingMembers(call);\n    const avatars = (): ReactNode => (\n        <AvatarStack className=\"mx_IncomingCallToast_avatars\">\n            {members.slice(0, 3).map((m) => (\n                <MemberAvatar key={m.userId} size=\"20px\" member={m} aria-label={m.name} />\n            ))}\n        </AvatarStack>\n    );\n\n    let detailsInformation: ReactNode;\n    if (notificationContent.notification_type === \"ring\") {\n        detailsInformation = <span>{otherUserId}</span>;\n    } else if (members.length > 0) {\n        detailsInformation =\n            members.length > 3\n                ? _t(\n                      \"voip|call_members|overflow\",\n                      { count: members.length, overflowCount: members.length - 3 },\n                      { avatars },\n                  )\n                : _t(\"voip|call_members|exhaustive\", { count: members.length }, { avatars });\n    }\n\n    let title: string;\n    let Icon: ComponentType<SVGAttributes<SVGElement>>;\n    let iconLabel: string;\n    // Special title for group calls\n    if (otherUserId === undefined) title = _t(\"voip|group_call_started\");\n    if (isVoice) {\n        title ??= _t(\"voip|voice_call_incoming\");\n        Icon = VoiceCallSolidIcon;\n        iconLabel = _t(\"voip|voice_call\");\n    } else {\n        title ??= _t(\"voip|video_call_incoming\");\n        Icon = VideoCallSolidIcon;\n        iconLabel = _t(\"voip|video_call\");\n    }\n\n    return (\n        <div className=\"mx_IncomingCallToast_content\">\n            <div className=\"mx_IncomingCallToast_title\">\n                <Icon aria-label={iconLabel} width={20} height={20} />\n                <Heading as=\"h2\" type=\"body\" size=\"lg\" weight=\"semibold\">\n                    {title}\n                </Heading>\n                <AccessibleButton\n                    className=\"mx_IncomingCallToast_expandButton\"\n                    onClick={onExpandClick}\n                    title={_t(\"action|expand\")}\n                >\n                    <ExpandIcon width={16} height={16} aria-hidden />\n                </AccessibleButton>\n            </div>\n            <AvatarWithDetails\n                avatar={<RoomAvatar room={room ?? undefined} size=\"40px\" />}\n                details={detailsInformation}\n                title={room ? room.name : _t(\"voip|call_toast_unknown_room\")}\n                className=\"mx_IncomingCallToast_AvatarWithDetails\"\n            />\n            {!isVoice && (\n                <Form.Root\n                    onSubmit={(evt) => {\n                        evt.preventDefault();\n                        evt.stopPropagation();\n                    }}\n                >\n                    <InlineField\n                        name=\"videoToggle\"\n                        control={\n                            <ToggleInput\n                                id={videoToggleId}\n                                checked={videoToggle}\n                                onChange={(e) => setVideoToggle(e.target.checked)}\n                            />\n                        }\n                    >\n                        <Label htmlFor={videoToggleId}>{_t(\"voip|join_with_video\")}</Label>\n                    </InlineField>\n                </Form.Root>\n            )}\n            <div className=\"mx_IncomingCallToast_buttons\">\n                <DeclineCallButtonWithNotificationEvent\n                    notificationEvent={notificationEvent}\n                    room={room}\n                    onDeclined={onCloseClick}\n                />\n                <JoinCallButtonWithCall\n                    onClick={onJoinClick}\n                    disabledTooltip={otherCallIsOngoing ? \"Ongoing call\" : undefined}\n                />\n            </div>\n        </div>\n    );\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2017 Vector Creations Ltd\nCopyright 2017 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n    MatrixEvent,\n    MatrixEventEvent,\n    type Room,\n    RoomEvent,\n    ClientEvent,\n    MsgType,\n    SyncState,\n    type SyncStateData,\n    type IRoomTimelineData,\n    M_LOCATION,\n    EventType,\n    TypedEventEmitter,\n} from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type PermissionChanged as PermissionChangedEvent } from \"@matrix-org/analytics-events/types/typescript/PermissionChanged\";\nimport { type SessionMembershipData, type IRTCNotificationContent } from \"matrix-js-sdk/src/matrixrtc\";\n\nimport SdkConfig from \"./SdkConfig\";\nimport PlatformPeg from \"./PlatformPeg\";\nimport * as TextForEvent from \"./TextForEvent\";\nimport * as Avatar from \"./Avatar\";\nimport { _t } from \"./languageHandler\";\nimport Modal from \"./Modal\";\nimport SettingsStore from \"./settings/SettingsStore\";\nimport { hideToast as hideNotificationsToast } from \"./toasts/DesktopNotificationsToast\";\nimport { SettingLevel } from \"./settings/SettingLevel\";\nimport { isPushNotifyDisabled } from \"./settings/controllers/NotificationControllers\";\nimport UserActivity from \"./UserActivity\";\nimport { mediaFromMxc } from \"./customisations/Media\";\nimport ErrorDialog from \"./components/views/dialogs/ErrorDialog\";\nimport { type SDKContextClass } from \"./contexts/SDKContextClass.ts\";\nimport { localNotificationsAreSilenced, createLocalNotificationSettingsIfNeeded } from \"./utils/notifications\";\nimport { getIncomingCallToastKey, getNotificationEventSendTs, IncomingCallToast } from \"./toasts/IncomingCallToast\";\nimport ToastStore from \"./stores/ToastStore\";\nimport { stripPlainReply } from \"./utils/Reply\";\nimport { BackgroundAudio } from \"./audio/BackgroundAudio\";\nimport { type MatrixDispatcher } from \"./dispatcher/dispatcher.ts\";\n\n/*\n * Dispatches:\n * {\n *   action: \"notifier_enabled\",\n *   value: boolean\n * }\n */\n\nconst MAX_PENDING_ENCRYPTED = 20;\n\n/**\n * Minimum interval (in milliseconds) between two *audible* notification plays.\n *\n * Coalesces bursts of backlogged notifications into a single sound. This is the\n * in-repo remedy for https://github.com/element-hq/element-web/issues/31996: on\n * macOS Sequoia, waking from sleep delivers the entire sync backlog in one\n * batch, so every backlogged notifying event fires {@link\n * NotifierClass.playAudioNotification} near-simultaneously and the identical\n * audio buffers superimpose into one loud \"stacked\" sound.\n *\n * The throttle is keyed on the resolved sound, so a backlog of identical sounds\n * coalesces to one play while two genuinely *different* sounds (e.g. a custom\n * per-room sound) arriving within the window each still play. A conservative\n * window is intentional: merging a burst of the same sound is preferable to a\n * wall of overlapping audio.\n *\n * NOTE: This only cures the sounds-enabled renderer Web-Audio path (the default\n * config). It does NOT fix the variant where macOS Sequoia ignores the OS\n * banner's `silent: true` and plays its own coalesced banner sound on wake;\n * that is purely OS/Electron behaviour with no in-repo lever.\n */\nexport const NOTIFICATION_SOUND_THROTTLE_MS = 1000;\n\n/**\n * Extracts plain text from a message body, replacing any spoilered content\n * with '[Spoiler]' to prevent spoilers in desktop notifications.\n */\nfunction getNotificationBodyWithoutSpoilers(ev: MatrixEvent): string {\n    const content = ev.getContent();\n    const plainBody = content.body ?? \"\";\n    const formattedBody = content.formatted_body;\n\n    if (typeof formattedBody !== \"string\" || !formattedBody.length) {\n        return plainBody;\n    }\n\n    /** Recursively walks HTML tree to hide spoilers. */\n    function replaceSpoilers(node: Node): Node {\n        if (node.nodeType !== Node.ELEMENT_NODE || !(node instanceof Element)) {\n            return node;\n        }\n\n        if (node.hasAttribute(\"data-mx-spoiler\")) {\n            const e = document.createElement(\"span\");\n            e.appendChild(document.createTextNode(\"[Spoiler]\"));\n            return e;\n        }\n\n        for (const childNode of node.childNodes) {\n            node.replaceChild(replaceSpoilers(childNode), childNode);\n        }\n\n        return node;\n    }\n\n    try {\n        // Dev note: ideally we would reuse more of the existing rendering stack\n        // rather than re-parsing and updating the generated HTML here. However,\n        // that rendering stack is currently quite consolidated and cannot\n        // easily be refactored to allow the call-site to control how spoilers\n        // are rendered. The problem is that we now need two different output\n        // formats:\n        // - The existing format where spoilers are wrapped in html <span> tags\n        // - The new format where the spoilered text is replaced with [Spoiler]\n\n        const parser = new DOMParser();\n        const doc = parser.parseFromString(formattedBody, \"text/html\");\n\n        // Use textContent rather than innerHTML/outerHTML since textContent is\n        // XSS-safe and the input is untrusted.\n        return replaceSpoilers(doc.body).textContent ?? plainBody;\n    } catch {\n        return plainBody;\n    }\n}\n\nexport const enum NotifierEvent {\n    NotificationHiddenChange = \"notification_hidden_change\",\n}\n\ninterface EmittedEvents {\n    [NotifierEvent.NotificationHiddenChange]: (hidden: boolean) => void;\n}\n\n/**\n * Type representing a notification sound setting\n */\nexport type NotificationSound = {\n    url: string;\n    name?: string;\n    type?: string;\n    size?: number;\n};\n\nexport default class Notifier extends TypedEventEmitter<keyof EmittedEvents, EmittedEvents> {\n    private notifsByRoom: Record<string, Notification[]> = {};\n\n    // A list of event IDs that we've received but need to wait until\n    // they're decrypted until we decide whether to notify for them\n    // or not\n    private pendingEncryptedEventIds: string[] = [];\n\n    private toolbarHidden?: boolean;\n    private isSyncing?: boolean;\n\n    private backgroundAudio = new BackgroundAudio();\n\n    /**\n     * Per-sound timestamp (ms, from {@link Date.now}) of the last *audible* notification, keyed by the\n     * resolved sound (custom sound url, or `\"default\"`). Used to throttle a burst of backlogged\n     * notifications of the *same* sound into a single play while letting distinct sounds through -\n     * see {@link NOTIFICATION_SOUND_THROTTLE_MS}.\n     */\n    private readonly lastAudioNotificationMs = new Map<string, number>();\n\n    private msgTypeHandlers: Record<string, (event: MatrixEvent) => string | null>;\n\n    public constructor(\n        private readonly dispatcher: MatrixDispatcher,\n        private readonly sdkContext: SDKContextClass,\n    ) {\n        super();\n\n        /*\n        Override both the content body and the TextForEvent handler for specific msgtypes, in notifications.\n        This is useful when the content body contains fallback text that would explain that the client can't handle a particular\n        type of tile.\n        */\n        this.msgTypeHandlers = {\n            [MsgType.KeyVerificationRequest]: (event: MatrixEvent) => {\n                const name = event.sender?.name;\n                return _t(\"notifier|m.key.verification.request\", { name });\n            },\n            [M_LOCATION.name]: (event: MatrixEvent) => {\n                return TextForEvent.textForLocationEvent(event)();\n            },\n            [M_LOCATION.altName]: (event: MatrixEvent) => {\n                return TextForEvent.textForLocationEvent(event)();\n            },\n            [MsgType.Audio]: (event: MatrixEvent): string | null => {\n                return TextForEvent.textForEvent(event, this.sdkContext.client!);\n            },\n        };\n    }\n\n    public notificationMessageForEvent(ev: MatrixEvent): string | null {\n        if (!this.sdkContext.client) return null;\n        const msgType = ev.getContent().msgtype;\n        if (msgType && this.msgTypeHandlers.hasOwnProperty(msgType)) {\n            return this.msgTypeHandlers[msgType](ev);\n        }\n        return TextForEvent.textForEvent(ev, this.sdkContext.client);\n    }\n\n    // XXX: exported for tests\n    public displayPopupNotification(ev: MatrixEvent, room: Room): void {\n        const plaf = PlatformPeg.get();\n        const cli = this.sdkContext.client;\n        if (!plaf || !cli) {\n            return;\n        }\n        if (!plaf.supportsNotifications() || !plaf.maySendNotifications()) {\n            return;\n        }\n\n        if (localNotificationsAreSilenced(cli)) {\n            return;\n        }\n\n        let msg = this.notificationMessageForEvent(ev);\n        if (!msg) return;\n\n        let title: string | undefined;\n        if (!ev.sender || room.name === ev.sender.name) {\n            title = room.name;\n            // notificationMessageForEvent includes sender, but we already have the sender here\n            const msgType = ev.getContent().msgtype;\n            if (ev.getContent().body && (!msgType || !this.msgTypeHandlers.hasOwnProperty(msgType))) {\n                msg = stripPlainReply(getNotificationBodyWithoutSpoilers(ev));\n            }\n        } else if (ev.getType() === \"m.room.member\") {\n            // context is all in the message here, we don't need\n            // to display sender info\n            title = room.name;\n        } else if (ev.sender) {\n            title = ev.sender.name + \" (\" + room.name + \")\";\n            // notificationMessageForEvent includes sender, but we've just out sender in the title\n            const msgType = ev.getContent().msgtype;\n            if (ev.getContent().body && (!msgType || !this.msgTypeHandlers.hasOwnProperty(msgType))) {\n                msg = stripPlainReply(getNotificationBodyWithoutSpoilers(ev));\n            }\n        }\n\n        if (!title) return;\n\n        if (!this.isBodyEnabled()) {\n            msg = \"\";\n        }\n\n        let avatarUrl: string | null = null;\n        if (ev.sender && !SettingsStore.getValue(\"lowBandwidth\")) {\n            avatarUrl = Avatar.avatarUrlForMember(ev.sender, 40, 40, \"crop\");\n        }\n\n        const notif = plaf.displayNotification(title, msg!, avatarUrl, room, ev);\n\n        // if displayNotification returns non-null,  the platform supports\n        // clearing notifications later, so keep track of this.\n        if (notif) {\n            if (this.notifsByRoom[ev.getRoomId()!] === undefined) this.notifsByRoom[ev.getRoomId()!] = [];\n            this.notifsByRoom[ev.getRoomId()!].push(notif);\n        }\n    }\n\n    public getSoundForRoom(roomId: string): NotificationSound | null {\n        // We do no caching here because the SDK caches setting\n        // and the browser will cache the sound.\n        const content = SettingsStore.getValue(\"notificationSound\", roomId);\n        if (!content) {\n            return null;\n        }\n\n        if (typeof content.url !== \"string\") {\n            logger.warn(`${roomId} has custom notification sound event, but no url string`);\n            return null;\n        }\n\n        if (!content.url.startsWith(\"mxc://\")) {\n            logger.warn(`${roomId} has custom notification sound event, but url is not a mxc url`);\n            return null;\n        }\n\n        // Ideally in here we could use MSC1310 to detect the type of file, and reject it.\n\n        const url = mediaFromMxc(content.url).srcHttp;\n        if (!url) {\n            logger.warn(\"Something went wrong when generating src http url for mxc\");\n            return null;\n        }\n\n        return {\n            url,\n            name: content.name,\n            type: content.type,\n            size: content.size,\n        };\n    }\n\n    // XXX: Exported for tests\n    public async playAudioNotification(ev: MatrixEvent, room: Room): Promise<void> {\n        const cli = this.sdkContext.client;\n        if (!cli || localNotificationsAreSilenced(cli)) {\n            return;\n        }\n\n        // Play notification sound here\n        const sound = this.getSoundForRoom(room.roomId);\n        logger.log(`Got sound ${sound?.name || \"default\"} for ${room.roomId}`);\n\n        // Throttle audible plays so a burst of backlogged notifications - e.g. the whole sync backlog\n        // delivered at once when macOS wakes from sleep - produces at most one sound per distinct sound\n        // within NOTIFICATION_SOUND_THROTTLE_MS, instead of many identical buffers superimposing into one\n        // loud \"stacked\" sound (#31996). Keyed on the resolved sound so two *different* sounds within the\n        // window both still play. Runs only after the silencing gate above, so it suppresses redundant\n        // *audible* plays, never the gating logic. We bail cleanly (no throw).\n        const soundKey = sound?.url ?? \"default\";\n        const now = Date.now();\n        const lastPlayed = this.lastAudioNotificationMs.get(soundKey);\n        if (lastPlayed !== undefined && now - lastPlayed < NOTIFICATION_SOUND_THROTTLE_MS) {\n            return;\n        }\n        this.lastAudioNotificationMs.set(soundKey, now);\n\n        if (sound) {\n            await this.backgroundAudio.play(sound.url);\n        } else {\n            await this.backgroundAudio.pickFormatAndPlay(\"media/message\", [\"mp3\", \"ogg\"]);\n        }\n    }\n\n    public start(): void {\n        this.sdkContext.client!.on(RoomEvent.Timeline, this.onEvent);\n        this.sdkContext.client!.on(RoomEvent.Receipt, this.onRoomReceipt);\n        this.sdkContext.client!.on(MatrixEventEvent.Decrypted, this.onEventDecrypted);\n        this.sdkContext.client!.on(ClientEvent.Sync, this.onSyncStateChange);\n        this.toolbarHidden = false;\n        this.isSyncing = false;\n    }\n\n    public stop(): void {\n        this.sdkContext.client?.removeListener(RoomEvent.Timeline, this.onEvent);\n        this.sdkContext.client?.removeListener(RoomEvent.Receipt, this.onRoomReceipt);\n        this.sdkContext.client?.removeListener(MatrixEventEvent.Decrypted, this.onEventDecrypted);\n        this.sdkContext.client?.removeListener(ClientEvent.Sync, this.onSyncStateChange);\n        this.isSyncing = false;\n    }\n\n    public supportsDesktopNotifications(): boolean {\n        return PlatformPeg.get()?.supportsNotifications() ?? false;\n    }\n\n    public setEnabled(enable: boolean, callback?: () => void): void {\n        const plaf = PlatformPeg.get();\n        if (!plaf) return;\n\n        // Dev note: We don't set the \"notificationsEnabled\" setting to true here because it is a\n        // calculated value. It is determined based upon whether or not the master rule is enabled\n        // and other flags. Setting it here would cause a circular reference.\n\n        // make sure that we persist the current setting audio_enabled setting\n        // before changing anything\n        if (SettingsStore.isLevelSupported(SettingLevel.DEVICE)) {\n            SettingsStore.setValue(\"audioNotificationsEnabled\", null, SettingLevel.DEVICE, this.isEnabled());\n        }\n\n        if (enable) {\n            // Attempt to get permission from user\n            plaf.requestNotificationPermission().then((result) => {\n                if (result !== \"granted\") {\n                    // The permission request was dismissed or denied\n                    // TODO: Support alternative branding in messaging\n                    const brand = SdkConfig.get().brand;\n                    const description =\n                        result === \"denied\"\n                            ? _t(\"settings|notifications|error_permissions_denied\", { brand })\n                            : _t(\"settings|notifications|error_permissions_missing\", {\n                                  brand,\n                              });\n                    Modal.createDialog(ErrorDialog, {\n                        title: _t(\"settings|notifications|error_title\"),\n                        description,\n                    });\n                    return;\n                }\n\n                // oxlint-disable-next-line promise/no-callback-in-promise\n                if (callback) callback();\n\n                this.sdkContext.posthogAnalytics.trackEvent<PermissionChangedEvent>({\n                    eventName: \"PermissionChanged\",\n                    permission: \"Notification\",\n                    granted: true,\n                });\n                this.dispatcher.dispatch({\n                    action: \"notifier_enabled\",\n                    value: true,\n                });\n            });\n        } else {\n            this.sdkContext.posthogAnalytics.trackEvent<PermissionChangedEvent>({\n                eventName: \"PermissionChanged\",\n                permission: \"Notification\",\n                granted: false,\n            });\n            this.dispatcher.dispatch({\n                action: \"notifier_enabled\",\n                value: false,\n            });\n        }\n        // set the notifications_hidden flag, as the user has knowingly interacted\n        // with the setting we shouldn't nag them any further\n        this.setPromptHidden(true);\n    }\n\n    public isEnabled(): boolean {\n        return this.isPossible() && SettingsStore.getValue(\"notificationsEnabled\");\n    }\n\n    public isPossible(): boolean {\n        const plaf = PlatformPeg.get();\n        if (!plaf?.supportsNotifications()) return false;\n        if (!plaf.maySendNotifications()) return false;\n\n        return true; // possible, but not necessarily enabled\n    }\n\n    public isBodyEnabled(): boolean {\n        return this.isEnabled() && SettingsStore.getValue(\"notificationBodyEnabled\");\n    }\n\n    public isAudioEnabled(): boolean {\n        // We don't route Audio via the HTML Notifications API so it is possible regardless of other things\n        return SettingsStore.getValue(\"audioNotificationsEnabled\");\n    }\n\n    public setPromptHidden(hidden: boolean, persistent = true): void {\n        this.toolbarHidden = hidden;\n\n        hideNotificationsToast();\n\n        // update the info to localStorage for persistent settings\n        if (persistent && global.localStorage) {\n            global.localStorage.setItem(\"notifications_hidden\", String(hidden));\n        }\n        this.emit(NotifierEvent.NotificationHiddenChange, hidden);\n    }\n\n    public shouldShowPrompt(): boolean {\n        const client = this.sdkContext.client;\n        if (!client) {\n            return false;\n        }\n        const isGuest = client.isGuest();\n        return (\n            !isGuest &&\n            this.supportsDesktopNotifications() &&\n            !isPushNotifyDisabled() &&\n            !this.isEnabled() &&\n            !this.isPromptHidden()\n        );\n    }\n\n    private isPromptHidden(): boolean {\n        // Check localStorage for any such meta data\n        if (global.localStorage) {\n            return global.localStorage.getItem(\"notifications_hidden\") === \"true\";\n        }\n\n        return !!this.toolbarHidden;\n    }\n\n    // XXX: Exported for tests\n    public onSyncStateChange = (state: SyncState, prevState: SyncState | null, data?: SyncStateData): void => {\n        if (!this.sdkContext.client) return;\n        if (state === SyncState.Syncing) {\n            this.isSyncing = true;\n        } else if (state === SyncState.Stopped || state === SyncState.Error) {\n            this.isSyncing = false;\n        }\n\n        // wait for first non-cached sync to complete\n        if (![SyncState.Stopped, SyncState.Error].includes(state) && !data?.fromCache) {\n            createLocalNotificationSettingsIfNeeded(this.sdkContext.client);\n        }\n    };\n\n    private onEvent = (\n        ev: MatrixEvent,\n        room: Room | undefined,\n        toStartOfTimeline: boolean | undefined,\n        removed: boolean,\n        data: IRoomTimelineData,\n    ): void => {\n        if (!this.sdkContext.client) return;\n        if (removed) return; // only notify for new events, not removed ones\n        if (!data.liveEvent || !!toStartOfTimeline) return; // only notify for new things, not old.\n        if (!this.isSyncing) return; // don't alert for any messages initially\n        if (ev.getSender() === this.sdkContext.client.getUserId()) return;\n        if (data.timeline.getTimelineSet().threadListType !== null) return; // Ignore events on the thread list generated timelines\n\n        this.sdkContext.client.decryptEventIfNeeded(ev);\n\n        // If it's an encrypted event and the type is still 'm.room.encrypted',\n        // it hasn't yet been decrypted, so wait until it is.\n        if (ev.isBeingDecrypted() || ev.isDecryptionFailure()) {\n            this.pendingEncryptedEventIds.push(ev.getId()!);\n            // don't let the list fill up indefinitely\n            while (this.pendingEncryptedEventIds.length > MAX_PENDING_ENCRYPTED) {\n                this.pendingEncryptedEventIds.shift();\n            }\n            return;\n        }\n\n        this.evaluateEvent(ev);\n    };\n\n    private onEventDecrypted = (ev: MatrixEvent): void => {\n        // 'decrypted' means the decryption process has finished: it may have failed,\n        // in which case it might decrypt soon if the keys arrive\n        if (ev.isDecryptionFailure()) return;\n\n        const idx = this.pendingEncryptedEventIds.indexOf(ev.getId()!);\n        if (idx === -1) return;\n\n        this.pendingEncryptedEventIds.splice(idx, 1);\n        this.evaluateEvent(ev);\n    };\n\n    private onRoomReceipt = (ev: MatrixEvent, room: Room): void => {\n        if (room.getUnreadNotificationCount() === 0) {\n            // ideally we would clear each notification when it was read,\n            // but we have no way, given a read receipt, to know whether\n            // the receipt comes before or after an event, so we can't\n            // do this. Instead, clear all notifications for a room once\n            // there are no notifs left in that room., which is not quite\n            // as good but it's something.\n            if (this.notifsByRoom[room.roomId] === undefined) return;\n            for (const notif of this.notifsByRoom[room.roomId]) {\n                notif.close();\n            }\n            delete this.notifsByRoom[room.roomId];\n        }\n    };\n\n    // XXX: exported for tests\n    public evaluateEvent(ev: MatrixEvent): void {\n        if (!this.sdkContext.client) return;\n        const roomId = ev.getRoomId()!;\n        const room = this.sdkContext.client.getRoom(roomId);\n        if (!room) {\n            // e.g we are in the process of joining a room.\n            // Seen in the Playwright lazy-loading test.\n            return;\n        }\n\n        const actions = this.sdkContext.client.getPushActionsForEvent(ev);\n\n        if (actions?.notify) {\n            this.performCustomEventHandling(ev);\n\n            const store = this.sdkContext.roomViewStore;\n            const isViewingRoom = store.getRoomId() === room.roomId;\n            const threadId: string | undefined = ev.getId() !== ev.threadRootId ? ev.threadRootId : undefined;\n            const isViewingThread = store.getThreadId() === threadId;\n\n            const isViewingEventTimeline = isViewingRoom && (!threadId || isViewingThread);\n\n            if (isViewingEventTimeline && UserActivity.sharedInstance().userActiveRecently() && !Modal.hasDialogs()) {\n                // don't bother notifying as user was recently active in this room\n                return;\n            }\n\n            if (this.isEnabled()) {\n                this.displayPopupNotification(ev, room);\n            }\n            if (actions.tweaks.sound && this.isAudioEnabled()) {\n                PlatformPeg.get()?.loudNotification(ev, room);\n                this.playAudioNotification(ev, room);\n            }\n        }\n    }\n\n    /**\n     * Handle `EventType.RTCNotification` notifications.\n     * @param ev The notification event.\n     * @param toaster The toast store.\n     * @param room The room that contains the notification\n     * @returns A promise that will always resolve.\n     */\n    private async handleRTCNotification(ev: MatrixEvent, toaster: ToastStore, room: Room): Promise<void> {\n        // TODO: Use the call_id to get the *correct* call. We assume there is only one call per room here.\n        const rtcSession = room && room.client.matrixRTC.getRoomSession(room);\n        if (\n            rtcSession?.slotDescription?.application == \"m.call\" &&\n            rtcSession.memberships.some((membership) => membership.userId === room.client.getUserId())\n        ) {\n            // If we're already joined to the session, don't notify.\n            return;\n        }\n\n        // XXX: Should use parseCallNotificationContent once the types are exported.\n        const content = ev.getContent() as IRTCNotificationContent;\n        const roomId = ev.getRoomId();\n        const referencedMembershipEventId = ev.getRelation()?.event_id;\n\n        // Check maximum age of a call notification event that will trigger a ringing notification\n        if (Date.now() - getNotificationEventSendTs(ev) > content.lifetime) {\n            logger.warn(\"Received outdated RTCNotification event.\");\n            return;\n        }\n        if (!roomId) {\n            logger.warn(\"Could not get roomId for RTCNotification event\");\n            return;\n        }\n        if (!referencedMembershipEventId) {\n            logger.warn(\"Could not get referenced membership for notification\");\n            return;\n        }\n        if (content[\"m.relates_to\"].rel_type !== \"m.reference\") {\n            logger.warn(\"Ignored RTCNotification due to invalid rel_type\");\n            return;\n        }\n\n        let callMembership = room?.findEventById(referencedMembershipEventId);\n\n        if (!callMembership) {\n            // Attempt to fetch from the homeserver, if we do not have the event locally.\n            // This is a rare case as obviously the referenced event for a m.call notification must\n            // be sent first.\n            try {\n                callMembership = new MatrixEvent(await room.client.fetchRoomEvent(roomId, referencedMembershipEventId));\n            } catch (ex) {\n                logger.warn(`Call membership for notification could not be found`, ex);\n            }\n        }\n        // If the event could not be found even after requesting it from the homeserver.\n        if (!callMembership) {\n            // We will not show a call notification if there is no valid call membership.\n            logger.warn(\n                `Could not find call membership (${referencedMembershipEventId} ${roomId}) for notification event.`,\n            );\n            return;\n        }\n\n        // If we cannot determine the key, we'll accept it but assume it's empty string.\n        // This means if you have malformed notifications or call memberships your notifications\n        // will overwrite, but the solution to that is to use well-formed events.\n        const callId = callMembership.getContent<SessionMembershipData>().call_id ?? \"\";\n        const key = getIncomingCallToastKey(callId, roomId);\n\n        if (toaster.hasToast(key)) {\n            logger.debug(`Detected duplicate notification for call ${key}, ignoring`);\n            return;\n        }\n\n        toaster.addOrReplaceToast({\n            key,\n            priority: 100,\n            component: IncomingCallToast,\n            bodyClassName: \"mx_IncomingCallToast\",\n            props: { notificationEvent: ev },\n        });\n    }\n\n    /**\n     * Some events require special handling such as showing in-app toasts.\n     * This function may either create a toast or ignore the event based\n     * on current app state.\n     */\n    private performCustomEventHandling(ev: MatrixEvent): void {\n        const toaster = ToastStore.sharedInstance();\n        const room = this.sdkContext.client?.getRoom(ev.getRoomId());\n\n        if (room && EventType.RTCNotification === ev.getType()) {\n            // We don't need to await this.\n            void this.handleRTCNotification(ev, toaster, room);\n        }\n    }\n}\n","/*\nCopyright 2026 Element Creations Ltd.\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport LegacyCallHandler from \"../LegacyCallHandler\";\nimport { PosthogAnalytics } from \"../PosthogAnalytics\";\nimport { SlidingSyncManager } from \"../SlidingSyncManager\";\nimport { MemberListStore } from \"../stores/MemberListStore\";\nimport { RoomNotificationStateStore } from \"../stores/notifications/RoomNotificationStateStore\";\nimport RightPanelStore from \"../stores/right-panel/RightPanelStore\";\nimport { RoomViewStore } from \"../stores/RoomViewStore\";\nimport SpaceStore from \"../stores/spaces/SpaceStore\";\nimport TypingStore from \"../stores/TypingStore\";\nimport { UserProfilesStore } from \"../stores/UserProfilesStore\";\nimport { WidgetLayoutStore } from \"../stores/widgets/WidgetLayoutStore\";\nimport { WidgetPermissionStore } from \"../stores/widgets/WidgetPermissionStore\";\nimport WidgetStore from \"../stores/WidgetStore\";\nimport ResizeNotifier from \"../utils/ResizeNotifier\";\nimport { MultiRoomViewStore } from \"../stores/MultiRoomViewStore\";\nimport { type ActionPayload, isAction } from \"../dispatcher/payloads.ts\";\nimport { Action } from \"../dispatcher/actions.ts\";\nimport { type OnLoggedInPayload } from \"../dispatcher/payloads/OnLoggedInPayload.ts\";\nimport Notifier from \"../Notifier.ts\";\nimport SettingController from \"../settings/controllers/SettingController.ts\";\nimport { CallStore } from \"../stores/CallStore\";\nimport { LatestRtcNotificationEventStore } from \"../stores/LatestRtcNotificationEventStore\";\n\n/**\n * A class which (mostly) lazily initialises stores as and when they are requested, ensuring they remain\n * as singletons scoped to this object.\n *\n * Since this does the actual construction of all stores, it is *very* heavy on imports and lives right near\n * the top of the import tree. If anything other than code to set up the app (or tests) are importing this file,\n * it's doing it wrong and should be accessing whatever it needs via the react context.\n */\nexport class SDKContextClass {\n    /**\n     * The global SDKContextClass instance. This is a temporary measure whilst so many stores remain global\n     * as well. Over time, these stores should accept a `SDKContextClass` instance in their constructor.\n     * When all stores do this, this static variable can be deleted.\n     */\n    public static readonly instance = new SDKContextClass();\n\n    // Optional as we don't have a client on initial load if unregistered.\n    // It is only safe to set this once, as updating this value will NOT notify components using\n    // this Context.\n    protected _client?: MatrixClient;\n    public get client(): MatrixClient | undefined {\n        return this._client;\n    }\n\n    // All protected fields to make it easier to derive test stores\n    protected _WidgetPermissionStore?: WidgetPermissionStore;\n    protected _MemberListStore?: MemberListStore;\n    protected _RightPanelStore?: RightPanelStore;\n    protected _RoomNotificationStateStore?: RoomNotificationStateStore;\n    protected _RoomViewStore?: RoomViewStore;\n    protected _WidgetLayoutStore?: WidgetLayoutStore;\n    protected _WidgetStore?: WidgetStore;\n    protected _PosthogAnalytics?: PosthogAnalytics;\n    protected _SlidingSyncManager?: SlidingSyncManager;\n    protected _SpaceStore?: SpaceStore;\n    protected _LegacyCallHandler?: LegacyCallHandler;\n    protected _TypingStore?: TypingStore;\n    protected _UserProfilesStore?: UserProfilesStore;\n    protected _ResizeNotifier?: ResizeNotifier;\n    protected _MultiRoomViewStore?: MultiRoomViewStore;\n    protected _Notifier?: Notifier;\n    protected _CallStore?: CallStore;\n    protected _LatestRtcNotificationEventStore?: LatestRtcNotificationEventStore;\n\n    public constructor() {\n        SettingController.sdkContext = this;\n\n        defaultDispatcher.register(this.onDispatch);\n    }\n\n    private onDispatch = (payload: ActionPayload): void => {\n        if (isAction<OnLoggedInPayload>(payload, Action.OnLoggedIn)) {\n            this._client = payload.client;\n        }\n    };\n\n    /**\n     * Automatically construct stores which need to be created eagerly so they can register with\n     * the dispatcher.\n     */\n    public constructEagerStores(): void {\n        this._RoomViewStore = this.roomViewStore;\n    }\n\n    public get legacyCallHandler(): LegacyCallHandler {\n        if (!this._LegacyCallHandler) {\n            this._LegacyCallHandler = new LegacyCallHandler(this);\n        }\n        return this._LegacyCallHandler;\n    }\n    public get rightPanelStore(): RightPanelStore {\n        if (!this._RightPanelStore) {\n            this._RightPanelStore = RightPanelStore.instance;\n        }\n        return this._RightPanelStore;\n    }\n    public get roomNotificationStateStore(): RoomNotificationStateStore {\n        if (!this._RoomNotificationStateStore) {\n            this._RoomNotificationStateStore = RoomNotificationStateStore.instance;\n        }\n        return this._RoomNotificationStateStore;\n    }\n    public get roomViewStore(): RoomViewStore {\n        if (!this._RoomViewStore) {\n            this._RoomViewStore = new RoomViewStore(defaultDispatcher, this);\n        }\n        return this._RoomViewStore;\n    }\n    public get widgetLayoutStore(): WidgetLayoutStore {\n        if (!this._WidgetLayoutStore) {\n            this._WidgetLayoutStore = WidgetLayoutStore.instance;\n        }\n        return this._WidgetLayoutStore;\n    }\n    public get widgetPermissionStore(): WidgetPermissionStore {\n        if (!this._WidgetPermissionStore) {\n            this._WidgetPermissionStore = new WidgetPermissionStore(this);\n        }\n        return this._WidgetPermissionStore;\n    }\n    public get widgetStore(): WidgetStore {\n        if (!this._WidgetStore) {\n            this._WidgetStore = WidgetStore.instance;\n        }\n        return this._WidgetStore;\n    }\n    public get posthogAnalytics(): PosthogAnalytics {\n        if (!this._PosthogAnalytics) {\n            this._PosthogAnalytics = PosthogAnalytics.instance;\n        }\n        return this._PosthogAnalytics;\n    }\n    public get memberListStore(): MemberListStore {\n        if (!this._MemberListStore) {\n            this._MemberListStore = new MemberListStore(this);\n        }\n        return this._MemberListStore;\n    }\n    public get slidingSyncManager(): SlidingSyncManager {\n        if (!this._SlidingSyncManager) {\n            this._SlidingSyncManager = SlidingSyncManager.instance;\n        }\n        return this._SlidingSyncManager;\n    }\n    public get spaceStore(): SpaceStore {\n        if (!this._SpaceStore) {\n            this._SpaceStore = new SpaceStore(defaultDispatcher, this);\n            this._SpaceStore.start();\n        }\n        return this._SpaceStore;\n    }\n    public get typingStore(): TypingStore {\n        if (!this._TypingStore) {\n            this._TypingStore = new TypingStore(this);\n        }\n        return this._TypingStore;\n    }\n\n    public get userProfilesStore(): UserProfilesStore {\n        if (!this.client) {\n            throw new Error(\"Unable to create UserProfilesStore without a client\");\n        }\n\n        if (!this._UserProfilesStore) {\n            this._UserProfilesStore = new UserProfilesStore(this.client);\n        }\n\n        return this._UserProfilesStore;\n    }\n\n    // This is getting increasingly tenuous to have here but we still have class components so it's\n    // awkward to consume multiple contexts in them. This should be replaced with ResizeObservers\n    // anyway really.\n    public get resizeNotifier(): ResizeNotifier {\n        if (!this._ResizeNotifier) {\n            this._ResizeNotifier = new ResizeNotifier();\n        }\n        return this._ResizeNotifier;\n    }\n\n    public get multiRoomViewStore(): MultiRoomViewStore {\n        if (!this._MultiRoomViewStore) {\n            this._MultiRoomViewStore = new MultiRoomViewStore(defaultDispatcher, this);\n        }\n        return this._MultiRoomViewStore;\n    }\n\n    public get notifier(): Notifier {\n        if (!this._Notifier) {\n            this._Notifier = new Notifier(defaultDispatcher, this);\n        }\n        return this._Notifier;\n    }\n\n    public get callStore(): CallStore {\n        this._CallStore ??= CallStore.instance;\n        return this._CallStore;\n    }\n\n    public get latestRtcNotificationEventStore(): LatestRtcNotificationEventStore {\n        if (!this._LatestRtcNotificationEventStore) {\n            this._LatestRtcNotificationEventStore = new LatestRtcNotificationEventStore(this.callStore);\n            this._LatestRtcNotificationEventStore.start();\n        }\n        return this._LatestRtcNotificationEventStore;\n    }\n\n    public onLoggedOut(): void {\n        this._UserProfilesStore = undefined;\n        this._client = undefined;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { TypedEventEmitter } from \"matrix-js-sdk/src/matrix\";\nimport React, {\n    type JSX,\n    type ContextType,\n    createContext,\n    memo,\n    type ReactNode,\n    useContext,\n    useEffect,\n    useMemo,\n    useState,\n} from \"react\";\n\nimport { objectKeyChanges } from \"../utils/objects.ts\";\nimport { useTypedEventEmitter } from \"../hooks/useEventEmitter.ts\";\nimport RoomContext from \"./RoomContext.ts\";\n\n// React Contexts with frequently changing values (like State where the object reference is changed on every update)\n// cause performance issues by triggering a re-render on every component subscribed to that context.\n// With ScopedRoomContext we're effectively setting up virtual contexts which are a subset of the overall context object\n// and subscribers specify which fields they care about, and they will only be awoken on updates to those specific fields.\n\ntype ContextValue = ContextType<typeof RoomContext>;\n\nexport enum NotificationStateEvents {\n    Update = \"update\",\n}\n\ntype EventHandlerMap<C extends Record<string, any>> = {\n    [NotificationStateEvents.Update]: (keys: Array<keyof C>) => void;\n};\n\nclass EfficientContext<C extends Record<string, any>> extends TypedEventEmitter<\n    NotificationStateEvents,\n    EventHandlerMap<C>\n> {\n    public constructor(public state: C) {\n        super();\n    }\n\n    public setState(state: C): void {\n        const changedKeys = objectKeyChanges(this.state ?? ({} as C), state);\n        this.state = state;\n        this.emit(NotificationStateEvents.Update, changedKeys);\n    }\n}\n\nconst ScopedRoomContext = createContext<EfficientContext<ContextValue> | undefined>(undefined);\n\n// Uses react memo and leverages splatting the value to ensure that the context is only updated when the state changes (shallow compare)\nexport const ScopedRoomContextProvider = memo(\n    ({ children, ...state }: { children: ReactNode } & ContextValue): JSX.Element => {\n        // eslint-disable-next-line react-compiler/react-compiler,react-hooks/exhaustive-deps\n        const context = useMemo(() => new EfficientContext<ContextValue>(state), []);\n        useEffect(() => {\n            context.setState(state);\n        }, [context, state]);\n\n        // Includes the legacy RoomContext provider for backwards compatibility with class components\n        return (\n            <RoomContext.Provider value={state}>\n                <ScopedRoomContext.Provider value={context}>{children}</ScopedRoomContext.Provider>\n            </RoomContext.Provider>\n        );\n    },\n);\n\ntype ScopedRoomContext<K extends Array<keyof ContextValue>> = { [key in K[number]]: ContextValue[key] };\n\nexport function useScopedRoomContext<K extends Array<keyof ContextValue>>(...keys: K): ScopedRoomContext<K> {\n    const context = useContext(ScopedRoomContext);\n    const [state, setState] = useState<ScopedRoomContext<K>>(context?.state ?? ({} as ScopedRoomContext<K>));\n\n    useTypedEventEmitter(context, NotificationStateEvents.Update, (updatedKeys: K): void => {\n        if (context?.state && updatedKeys.some((updatedKey) => keys.includes(updatedKey))) {\n            setState(context.state);\n        }\n    });\n\n    return state;\n}\n","/*\nCopyright 2025 Element Creations Ltd.\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n    type MatrixClient,\n    ClientEvent,\n    type Room,\n    EventType,\n    RoomCreateTypeField,\n    RoomType,\n    type ICreateRoomOpts,\n    HistoryVisibility,\n    JoinRule,\n    Preset,\n    RestrictedAllowType,\n    Visibility,\n    Direction,\n    RoomStateEvent,\n    type RoomState,\n} from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type RoomEncryptionEventContent } from \"matrix-js-sdk/src/types\";\n\nimport Modal, { type IHandle } from \"./Modal\";\nimport { _t, UserFriendlyError } from \"./languageHandler\";\nimport dis from \"./dispatcher/dispatcher\";\nimport * as Rooms from \"./Rooms\";\nimport { getAddressType } from \"./UserAddress\";\nimport { makeSpaceParentEvent } from \"./utils/space\";\nimport { JitsiCall, ElementCall } from \"./models/Call\";\nimport { Action } from \"./dispatcher/actions\";\nimport ErrorDialog from \"./components/views/dialogs/ErrorDialog\";\nimport Spinner from \"./components/views/elements/Spinner\";\nimport { type ViewRoomPayload } from \"./dispatcher/payloads/ViewRoomPayload\";\nimport { findDMForUser } from \"./utils/dm/findDMForUser\";\nimport { privateShouldBeEncrypted } from \"./utils/rooms\";\nimport { shouldForceDisableEncryption } from \"./utils/crypto/shouldForceDisableEncryption\";\nimport { waitForMember } from \"./utils/membership\";\nimport { doesRoomVersionSupport, PreferredRoomVersions } from \"./utils/PreferredRoomVersions\";\nimport { MEGOLM_ENCRYPTION_ALGORITHM } from \"./utils/crypto\";\nimport { ElementCallMemberEventType } from \"./call-types\";\nimport { htmlSerializeFromMdIfNeeded } from \"./editor/serialize\";\nimport { SDKContextClass } from \"./contexts/SDKContextClass.ts\";\nimport SdkConfig from \"./SdkConfig\";\n\n// we define a number of interfaces which take their names from the js-sdk\n/* eslint-disable camelcase */\n\nexport interface IOpts {\n    dmUserId?: string;\n    /**\n     * The name of the room to be created.\n     */\n    name?: string;\n    /**\n     * The topic for the room.\n     */\n    topic?: string;\n    /**\n     * Additional options to pass to the room creation API.\n     * Note: \"name\", \"topic\", and \"avatar\" should be set via their respective properties in IOpts.\n     */\n    createOpts?: Omit<ICreateRoomOpts, \"name\" | \"topic\" | \"avatar\">;\n    spinner?: boolean;\n    guestAccess?: boolean;\n    encryption?: boolean;\n    /**\n     * Encrypt state events as per MSC4362\n     */\n    stateEncryption?: boolean;\n    inlineErrors?: boolean;\n    andView?: boolean;\n    avatar?: File | string; // will upload if given file, else mxcUrl is needed\n    roomType?: RoomType | string;\n    historyVisibility?: HistoryVisibility;\n    parentSpace?: Room;\n    // contextually only makes sense if parentSpace is specified, if true then will be added to parentSpace as suggested\n    suggested?: boolean;\n    joinRule?: JoinRule;\n}\n\n/**\n * The power levels set by synapse as of 30.06.2026.\n * If power_level_content_override is used, these values should be used\n * as a starting point to ensure the expected room power levels.\n *\n * NOTE: power_level_content_override does do a merge but NOT a deep merge.\n * e.g. \"ban\": 50, will still be set by the server when `power_level_content_override = {events: {\"custom\": 0}}`\n * BUT `events` will lose all the other default props listed below.\n * So we have to do: `power_level_content_override = {events: {...POWER_LEVEL_EVENTS_DEFAULT, \"custom\": 0}}`\n * This is very unfortunate if defaults change in synapse we have to keep the sdk in sync... (todo)\n */\nexport const DEFAULT_EVENTS_POWER_LEVEL = {\n    [EventType.RoomAvatar]: 50,\n    [EventType.RoomCanonicalAlias]: 50,\n    [EventType.RoomEncryption]: 100,\n    [EventType.RoomHistoryVisibility]: 100,\n    [EventType.RoomName]: 50,\n    [EventType.RoomPowerLevels]: 100,\n    [EventType.RoomServerAcl]: 100,\n    [EventType.RoomTombstone]: 100,\n};\n\n/**\n * Create a new room, and switch to it.\n *\n * @param client The Matrix Client instance to create the room with\n * @param {object=} opts parameters for creating the room\n * @param {string=} opts.dmUserId If specified, make this a DM room for this user and invite them\n * @param {object=} opts.createOpts set of options to pass to createRoom call.\n * @param {bool=} opts.spinner True to show a modal spinner while the room is created.\n *     Default: True\n * @param {bool=} opts.guestAccess Whether to enable guest access.\n *     Default: True\n * @param {bool=} opts.encryption Whether to enable encryption.\n *     Default: False\n * @param {bool=} opts.inlineErrors True to raise errors off the promise instead of resolving to null.\n *     Default: False\n * @param {bool=} opts.andView True to dispatch an action to view the room once it has been created.\n *\n * @returns {Promise} which resolves to the room id, or null if the\n * action was aborted or failed.\n */\nexport default async function createRoom(client: MatrixClient, opts: IOpts): Promise<string | null> {\n    opts = opts || {};\n    if (opts.spinner === undefined) opts.spinner = true;\n    if (opts.guestAccess === undefined) opts.guestAccess = true;\n    if (opts.encryption === undefined) opts.encryption = false;\n    if (opts.stateEncryption === undefined) opts.stateEncryption = false;\n\n    if (client.isGuest()) {\n        dis.dispatch({ action: \"require_registration\" });\n        return null;\n    }\n\n    const defaultPreset = opts.dmUserId ? Preset.TrustedPrivateChat : Preset.PrivateChat;\n\n    // set some defaults for the creation\n    const createOpts: ICreateRoomOpts = opts.createOpts || {};\n    createOpts.preset = createOpts.preset || defaultPreset;\n    createOpts.visibility = createOpts.visibility || Visibility.Private;\n\n    // We allow UX of DMing ourselves as a form of creating a personal room but the server throws\n    // an error when a user tries to invite themselves so we filter it out\n    if (opts.dmUserId && opts.dmUserId !== client.getUserId() && createOpts.invite === undefined) {\n        switch (getAddressType(opts.dmUserId)) {\n            case \"mx-user-id\":\n                createOpts.invite = [opts.dmUserId];\n                break;\n            case \"email\": {\n                const isUrl = client.getIdentityServerUrl(true);\n                if (!isUrl) {\n                    throw new UserFriendlyError(\"cannot_invite_without_identity_server\");\n                }\n                createOpts.invite_3pid = [\n                    {\n                        id_server: isUrl,\n                        medium: \"email\",\n                        address: opts.dmUserId,\n                    },\n                ];\n                break;\n            }\n        }\n    }\n    if (opts.dmUserId && createOpts.is_direct === undefined) {\n        createOpts.is_direct = true;\n    }\n\n    if (opts.roomType) {\n        createOpts.creation_content = {\n            ...createOpts.creation_content,\n            [RoomCreateTypeField]: opts.roomType,\n        };\n\n        // Video rooms require custom power levels\n        if (opts.roomType === RoomType.ElementVideo || opts.roomType === RoomType.UnstableCall) {\n            createOpts.power_level_content_override = {\n                events: {\n                    ...DEFAULT_EVENTS_POWER_LEVEL,\n                    // Allow all users to send call membership updates\n                    [opts.roomType === RoomType.ElementVideo\n                        ? JitsiCall.MEMBER_EVENT_TYPE\n                        : ElementCallMemberEventType.name]: 0,\n                    // Ensure all but admins can't change widgets\n                    // A previous version of the code prevented even administrators\n                    // from changing this, but this is not possible now that room creators\n                    // have an immutable power level\n                    [\"im.vector.modular.widgets\"]: 100,\n                },\n            };\n        }\n    } else if (!SdkConfig.get(\"element_call\").disable) {\n        createOpts.power_level_content_override = {\n            events: {\n                ...DEFAULT_EVENTS_POWER_LEVEL,\n                // It should always (including non video rooms) be possible to join a group call.\n                [ElementCallMemberEventType.name]: 0,\n            },\n        };\n    }\n\n    // By default, view the room after creating it\n    if (opts.andView === undefined) {\n        opts.andView = true;\n    }\n\n    createOpts.initial_state = createOpts.initial_state || [];\n\n    // Allow guests by default since the room is private and they'd\n    // need an invite. This means clicking on a 3pid invite email can\n    // actually drop you right in to a chat.\n    if (opts.guestAccess) {\n        createOpts.initial_state.push({\n            type: \"m.room.guest_access\",\n            state_key: \"\",\n            content: {\n                guest_access: \"can_join\",\n            },\n        });\n    }\n\n    if (opts.encryption) {\n        const content: RoomEncryptionEventContent = {\n            algorithm: MEGOLM_ENCRYPTION_ALGORITHM,\n        };\n        if (opts.stateEncryption) {\n            content[\"io.element.msc4362.encrypt_state_events\"] = true;\n        }\n        createOpts.initial_state.push({\n            type: \"m.room.encryption\",\n            state_key: \"\",\n            content,\n        });\n    }\n\n    const defaultRoomVersion = (await client.getCapabilities())[\"m.room_versions\"]?.default ?? \"1\";\n\n    if (\n        opts.joinRule === JoinRule.Knock &&\n        !doesRoomVersionSupport(defaultRoomVersion, PreferredRoomVersions.KnockRooms)\n    ) {\n        createOpts.room_version = PreferredRoomVersions.KnockRooms;\n    }\n\n    if (opts.parentSpace) {\n        createOpts.initial_state.push(makeSpaceParentEvent(opts.parentSpace, true));\n\n        if (opts.joinRule === JoinRule.Restricted) {\n            if (!doesRoomVersionSupport(defaultRoomVersion, PreferredRoomVersions.KnockRooms)) {\n                createOpts.room_version = PreferredRoomVersions.RestrictedRooms;\n            }\n\n            createOpts.initial_state.push({\n                type: EventType.RoomJoinRules,\n                content: {\n                    join_rule: JoinRule.Restricted,\n                    allow: [\n                        {\n                            type: RestrictedAllowType.RoomMembership,\n                            room_id: opts.parentSpace.roomId,\n                        },\n                    ],\n                },\n            });\n        }\n    }\n\n    // we handle the restricted join rule in the parentSpace handling block above\n    if (opts.joinRule && opts.joinRule !== JoinRule.Restricted) {\n        createOpts.initial_state.push({\n            type: EventType.RoomJoinRules,\n            content: { join_rule: opts.joinRule },\n        });\n    }\n\n    // If we are not encrypting state, copy name, topic, avatar over to\n    // createOpts so we pass them in when we call Client.createRoom().\n    if (!opts.stateEncryption) {\n        if (opts.name) {\n            createOpts.name = opts.name;\n        }\n\n        if (opts.topic) {\n            createOpts.topic = opts.topic;\n        }\n\n        if (opts.avatar) {\n            let url = opts.avatar;\n            if (opts.avatar instanceof File) {\n                ({ content_uri: url } = await client.uploadContent(opts.avatar));\n            }\n\n            createOpts.initial_state.push({\n                type: EventType.RoomAvatar,\n                content: { url },\n            });\n        }\n    }\n\n    // Set history visibility to \"invited\" for DMs and non-public rooms unless explicitly overridden\n    // This ensures that room history is only visible to invited members by default\n    let historyVisibility = opts.historyVisibility;\n    if (!historyVisibility) {\n        // Determine if the room will be public based on the join rule or preset\n        const isPublicRoom = opts.joinRule === JoinRule.Public || createOpts.preset === Preset.PublicChat;\n\n        // For DMs and non-public rooms, set history visibility to \"invited\"\n        if (opts.dmUserId || !isPublicRoom) {\n            historyVisibility = HistoryVisibility.Invited;\n        }\n    }\n\n    if (historyVisibility) {\n        createOpts.initial_state.push({\n            type: EventType.RoomHistoryVisibility,\n            content: {\n                history_visibility: historyVisibility,\n            },\n        });\n    }\n\n    let modal: IHandle<any> | undefined;\n    if (opts.spinner) modal = Modal.createDialog(Spinner, undefined, \"mx_Dialog_spinner\");\n\n    let roomId: string;\n    let room: Promise<Room>;\n    return client\n        .createRoom(createOpts)\n        .catch(function (err) {\n            // NB This checks for the Synapse-specific error condition of a room creation\n            // having been denied because the requesting user wanted to publish the room,\n            // but the server denies them that permission (via room_list_publication_rules).\n            // The check below responds by retrying without publishing the room.\n            if (\n                err.httpStatus === 403 &&\n                err.errcode === \"M_UNKNOWN\" &&\n                err.data.error === \"Not allowed to publish room\"\n            ) {\n                logger.warn(\"Failed to publish room, try again without publishing it\");\n                createOpts.visibility = Visibility.Private;\n                return client.createRoom(createOpts);\n            } else {\n                return Promise.reject(err);\n            }\n        })\n        .then(async (res): Promise<void> => {\n            roomId = res.room_id;\n\n            room = new Promise((resolve) => {\n                const storedRoom = client.getRoom(roomId);\n                if (storedRoom) {\n                    resolve(storedRoom);\n                } else {\n                    // The room hasn't arrived down sync yet\n                    const onRoom = (emittedRoom: Room): void => {\n                        if (emittedRoom.roomId === roomId) {\n                            resolve(emittedRoom);\n                            client.off(ClientEvent.Room, onRoom);\n                        }\n                    };\n                    client.on(ClientEvent.Room, onRoom);\n                }\n            });\n\n            if (opts.dmUserId) await Rooms.setDMRoom(client, roomId, opts.dmUserId);\n        })\n        .then(async () => {\n            // We need to set up initial state manually if state encryption is enabled, since it needs\n            // to be encrypted.\n            if (opts.encryption && opts.stateEncryption) {\n                await enableStateEventEncryption(client, await room, opts);\n            }\n        })\n        .finally(function () {\n            if (modal) modal.close();\n        })\n        .then(() => {\n            if (opts.parentSpace) {\n                return SDKContextClass.instance.spaceStore.addRoomToSpace(\n                    opts.parentSpace,\n                    roomId,\n                    [client.getDomain()!],\n                    opts.suggested,\n                );\n            }\n        })\n        .then(async (): Promise<void> => {\n            if (opts.roomType === RoomType.ElementVideo) {\n                // Set up this video room with a Jitsi call\n                await JitsiCall.create(await room);\n            } else if (opts.roomType === RoomType.UnstableCall) {\n                // Set up this video room with an Element call\n                ElementCall.create(await room);\n            }\n        })\n        .then(\n            function () {\n                // NB we haven't necessarily blocked on the room promise, so we race\n                // here with the client knowing that the room exists, causing things\n                // like https://github.com/vector-im/vector-web/issues/1813\n                // Even if we were to block on the echo, servers tend to split the room\n                // state over multiple syncs so we can't atomically know when we have the\n                // entire thing.\n                if (opts.andView) {\n                    dis.dispatch<ViewRoomPayload>({\n                        action: Action.ViewRoom,\n                        room_id: roomId,\n                        should_peek: false,\n                        // Creating a room will have joined us to the room,\n                        // so we are expecting the room to come down the sync\n                        // stream, if it hasn't already.\n                        joining: true,\n                        justCreatedOpts: opts,\n                        metricsTrigger: \"Created\",\n                    });\n                }\n                return roomId;\n            },\n            function (err) {\n                // Raise the error if the caller requested that we do so.\n                if (opts.inlineErrors) throw err;\n\n                // We also failed to join the room (this sets joining to false in RoomViewStore)\n                dis.dispatch({\n                    action: Action.JoinRoomError,\n                    roomId,\n                });\n                logger.error(\"Failed to create room \" + roomId + \" \" + err);\n                let description = _t(\"create_room|generic_error\");\n                if (err.errcode === \"M_UNSUPPORTED_ROOM_VERSION\") {\n                    // Technically not possible with the UI as of April 2019 because there's no\n                    // options for the user to change this. However, it's not a bad thing to report\n                    // the error to the user for if/when the UI is available.\n                    description = _t(\"create_room|unsupported_version\");\n                }\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"create_room|error_title\"),\n                    description,\n                });\n                return null;\n            },\n        );\n}\n\nasync function enableStateEventEncryption(client: MatrixClient, room: Room, opts: IOpts): Promise<void> {\n    // Don't send our state events until encryption is enabled. If this times\n    // out after 30 seconds, we throw since we don't want to send the events\n    // unencrypted.\n    await waitForRoomEncryption(room, 30000);\n\n    // Set room name\n    if (opts.name) {\n        await client.setRoomName(room.roomId, opts.name);\n    }\n\n    // Set room topic\n    if (opts.topic) {\n        const htmlTopic = htmlSerializeFromMdIfNeeded(opts.topic, { forceHTML: false });\n        await client.setRoomTopic(room.roomId, opts.topic, htmlTopic);\n    }\n\n    // Set room avatar\n    if (opts.avatar) {\n        let url: string;\n        if (opts.avatar instanceof File) {\n            ({ content_uri: url } = await client.uploadContent(opts.avatar));\n        } else {\n            url = opts.avatar;\n        }\n        await client.sendStateEvent(room.roomId, EventType.RoomAvatar, { url }, \"\");\n    }\n}\n\n/**\n * Wait until the supplied room has an `m.room.encryption` event, or time out\n * after 30 seconds.\n */\nexport async function waitForRoomEncryption(room: Room, waitTimeMs: number): Promise<void> {\n    if (room.hasEncryptionStateEvent()) {\n        return;\n    }\n\n    // Start a 30s timeout and return \"timed_out\" if we hit it\n    const { promise: timeoutPromise, resolve: timeoutResolve } = Promise.withResolvers();\n    const timeout = setTimeout(timeoutResolve, waitTimeMs, \"timed_out\");\n\n    // Listen for a RoomEncryption state update and return\n    // \"received_encryption_state\" if we get it\n    const roomState = room.getLiveTimeline().getState(Direction.Forward)!;\n    const { promise: stateUpdatePromise, resolve: stateUpdateResolve } = Promise.withResolvers();\n    const onRoomStateUpdate = (state: RoomState): void => {\n        if (state.getStateEvents(EventType.RoomEncryption, \"\")) {\n            stateUpdateResolve(\"received_encryption_state\");\n        }\n    };\n    roomState.on(RoomStateEvent.Update, onRoomStateUpdate);\n\n    // Wait for one of the above to happen\n    const resolution = await Promise.race([timeoutPromise, stateUpdatePromise]);\n\n    // Clear the listener and the timeout\n    roomState.off(RoomStateEvent.Update, onRoomStateUpdate);\n    clearTimeout(timeout);\n\n    // Fail if we hit the timeout\n    if (resolution === \"timed_out\") {\n        logger.warn(\"Timed out while waiting for room to enable encryption\");\n        throw new Error(\"Timed out while waiting for room to enable encryption\");\n    }\n}\n\n/*\n * Ensure that for every user in a room, there is at least one device that we\n * can encrypt to.\n */\nexport async function canEncryptToAllUsers(client: MatrixClient, userIds: string[]): Promise<boolean> {\n    try {\n        const usersDeviceMap = await client.getCrypto()?.getUserDeviceInfo(userIds, true);\n        if (!usersDeviceMap) {\n            return false;\n        }\n\n        for (const devices of usersDeviceMap.values()) {\n            if (devices.size === 0) {\n                // This user does not have any encryption-capable devices.\n                return false;\n            }\n        }\n    } catch (e) {\n        logger.error(\"Error determining if it's possible to encrypt to all users: \", e);\n        return false; // assume not\n    }\n\n    return true;\n}\n\nexport async function ensureDMExists(client: MatrixClient, userId: string): Promise<string | null> {\n    const existingDMRoom = findDMForUser(client, userId);\n    let roomId: string | null;\n    if (existingDMRoom) {\n        roomId = existingDMRoom.roomId;\n    } else {\n        let encryption: boolean | undefined;\n        if (privateShouldBeEncrypted(client)) {\n            encryption = await canEncryptToAllUsers(client, [userId]);\n        }\n\n        roomId = await createRoom(client, { encryption, dmUserId: userId, spinner: false, andView: false });\n        if (!roomId) return null;\n        await waitForMember(client, roomId, userId);\n    }\n    return roomId;\n}\n\ninterface AllowedEncryptionSetting {\n    /**\n     * True when the user is allowed to choose whether encryption is enabled\n     */\n    allowChange: boolean;\n    /**\n     * Set when user is not allowed to choose encryption setting\n     * True when encryption is forced to enabled\n     */\n    forcedValue?: boolean;\n}\n/**\n * Check if server configuration supports the user changing encryption for a room\n * First check if server features force enable encryption for the given room type\n * If not, check if server .well-known forces encryption to disabled\n * If either are forced, then do not allow the user to change room's encryption\n * @param client\n * @param chatPreset chat type\n * @returns Promise<boolean>\n */\nexport async function checkUserIsAllowedToChangeEncryption(\n    client: MatrixClient,\n    chatPreset: Preset,\n): Promise<AllowedEncryptionSetting> {\n    const doesServerForceEncryptionForPreset = await client.doesServerForceEncryptionForPreset(chatPreset);\n    const doesWellKnownForceDisableEncryption = shouldForceDisableEncryption(client);\n\n    // server is forcing encryption to ENABLED\n    // while .well-known config is forcing it to DISABLED\n    // server version config overrides wk config\n    if (doesServerForceEncryptionForPreset && doesWellKnownForceDisableEncryption) {\n        console.warn(\n            `Conflicting e2ee settings: server config and .well-known configuration disagree. Using server forced encryption setting for chat type ${chatPreset}`,\n        );\n    }\n\n    if (doesServerForceEncryptionForPreset) {\n        return { allowChange: false, forcedValue: true };\n    }\n    if (doesWellKnownForceDisableEncryption) {\n        return { allowChange: false, forcedValue: false };\n    }\n\n    return { allowChange: true };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type UIComponent } from \"../../settings/UIFeature\";\nimport { ComponentVisibilityCustomisations } from \"../ComponentVisibility\";\nimport { ModuleApi } from \"../../modules/Api.ts\";\n\nexport function shouldShowComponent(component: UIComponent): boolean {\n    return (\n        ModuleApi.instance.customisations.shouldShowComponent(component) ??\n        ComponentVisibilityCustomisations.shouldShowComponent?.(component) ??\n        true\n    );\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { type RoomMessageEventContent } from \"matrix-js-sdk/src/types\";\n\nimport type EditorModel from \"./model\";\nimport { Type } from \"./parts\";\nimport { type Command, CommandCategories, getCommand } from \"../slash-commands/SlashCommands\";\nimport { UserFriendlyError, _t, _td } from \"../languageHandler\";\nimport Modal from \"../Modal\";\nimport ErrorDialog from \"../components/views/dialogs/ErrorDialog\";\nimport QuestionDialog from \"../components/views/dialogs/QuestionDialog\";\n\nexport function isSlashCommand(model: EditorModel): boolean {\n    const parts = model.parts;\n    const firstPart = parts[0];\n    if (firstPart) {\n        if (firstPart.type === Type.Command && firstPart.text.startsWith(\"/\") && !firstPart.text.startsWith(\"//\")) {\n            return true;\n        }\n\n        if (\n            firstPart.text.startsWith(\"/\") &&\n            !firstPart.text.startsWith(\"//\") &&\n            (firstPart.type === Type.Plain || firstPart.type === Type.PillCandidate)\n        ) {\n            return true;\n        }\n    }\n    return false;\n}\n\n/**\n * Get the slash command and its arguments from the editor model\n * @param roomId - The room ID to check whether the command is enabled\n * @param model - The editor model\n * @returns A tuple of the command (or undefined if not found), the arguments (or undefined), and the full command text\n */\nexport function getSlashCommand(roomId: string, model: EditorModel): [Command | undefined, string | undefined, string] {\n    const commandText = model.parts.reduce((text, part) => {\n        // use mxid to textify user pills in a command and room alias/id for room pills\n        if (part.type === Type.UserPill || part.type === Type.RoomPill) {\n            return text + part.resourceId;\n        }\n        return text + part.text;\n    }, \"\");\n    const { cmd, args } = getCommand(roomId, commandText);\n    return [cmd, args, commandText];\n}\n\nexport async function runSlashCommand(\n    matrixClient: MatrixClient,\n    cmd: Command,\n    args: string | undefined,\n    roomId: string,\n    threadId: string | null,\n): Promise<[content: RoomMessageEventContent | null, success: boolean]> {\n    const result = cmd.run(matrixClient, roomId, threadId, args);\n    let messageContent: RoomMessageEventContent | null = null;\n    let error: any = result.error;\n    if (result.promise) {\n        try {\n            if (cmd.category === CommandCategories.messages || cmd.category === CommandCategories.effects) {\n                messageContent = (await result.promise) ?? null;\n            } else {\n                await result.promise;\n            }\n        } catch (err) {\n            error = err;\n        }\n    }\n    if (error) {\n        logger.error(`Command failure: ${error}`);\n        // assume the error is a server error when the command is async\n        const isServerError = !!result.promise;\n        const title = isServerError ? _td(\"slash_command|server_error\") : _td(\"slash_command|command_error\");\n\n        let errText;\n        if (typeof error === \"string\") {\n            errText = error;\n        } else if (error instanceof UserFriendlyError) {\n            errText = error.translatedMessage;\n        } else if (error.message) {\n            errText = error.message;\n        } else {\n            errText = _t(\"slash_command|server_error_detail\");\n        }\n\n        Modal.createDialog(ErrorDialog, {\n            title: _t(title),\n            description: errText,\n        });\n        return [null, false];\n    } else {\n        logger.log(\"Command success.\");\n        return [messageContent, true];\n    }\n}\n\nexport async function shouldSendAnyway(commandText: string): Promise<boolean> {\n    // ask the user if their unknown command should be sent as a message\n    const { finished } = Modal.createDialog(QuestionDialog, {\n        title: _t(\"slash_command|unknown_command\"),\n        description: (\n            <div>\n                <p>{_t(\"slash_command|unknown_command_detail\", { commandText })}</p>\n                <p>\n                    {_t(\n                        \"slash_command|unknown_command_help\",\n                        {},\n                        {\n                            code: (t) => <code>{t}</code>,\n                        },\n                    )}\n                </p>\n                <p>\n                    {_t(\n                        \"slash_command|unknown_command_hint\",\n                        {},\n                        {\n                            code: (t) => <code>{t}</code>,\n                        },\n                    )}\n                </p>\n            </div>\n        ),\n        button: _t(\"slash_command|unknown_command_button\"),\n    });\n    const [sendAnyway] = await finished;\n    return sendAnyway || false;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 New Vector Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, MsgType } from \"matrix-js-sdk/src/matrix\";\n\nimport { checkBlockNode } from \"../HtmlUtils\";\nimport { getPrimaryPermalinkEntity } from \"../utils/permalinks/Permalinks\";\nimport { type Part, type PartCreator, Type } from \"./parts\";\nimport SdkConfig from \"../SdkConfig\";\nimport { textToHtmlRainbow } from \"../utils/colour\";\nimport { stripPlainReply } from \"../utils/Reply\";\n\nconst LIST_TYPES = [\"UL\", \"OL\", \"LI\"];\n\n// Escapes all markup in the given text\nfunction escape(text: string): string {\n    return text.replace(/[\\\\*_[\\]`<]|^>/g, (match) => `\\\\${match}`);\n}\n\n// Finds the length of the longest backtick sequence in the given text, used for\n// escaping backticks in code blocks\nexport function longestBacktickSequence(text: string): number {\n    let length = 0;\n    let currentLength = 0;\n\n    for (const c of text) {\n        if (c === \"`\") {\n            currentLength++;\n        } else {\n            length = Math.max(length, currentLength);\n            currentLength = 0;\n        }\n    }\n\n    return Math.max(length, currentLength);\n}\n\nfunction isListChild(n: Node): boolean {\n    return LIST_TYPES.includes(n.parentNode?.nodeName || \"\");\n}\n\nfunction parseAtRoomMentions(text: string, pc: PartCreator, opts: IParseOptions): Part[] {\n    const ATROOM = \"@room\";\n    const parts: Part[] = [];\n    text.split(ATROOM).forEach((textPart, i, arr) => {\n        if (textPart.length) {\n            parts.push(...pc.plainWithEmoji(opts.shouldEscape ? escape(textPart) : textPart));\n        }\n        // it's safe to never append @room after the last textPart\n        // as split will report an empty string at the end if\n        // `text` ended in @room.\n        const isLast = i === arr.length - 1;\n        if (!isLast) {\n            parts.push(pc.atRoomPill(ATROOM));\n        }\n    });\n    return parts;\n}\n\nfunction parseLink(n: Node, pc: PartCreator, opts: IParseOptions): Part[] {\n    const { href } = n as HTMLAnchorElement;\n    const resourceId = getPrimaryPermalinkEntity(href); // The room/user ID\n\n    switch (resourceId?.[0]) {\n        case \"@\":\n            return [pc.userPill(n.textContent || \"\", resourceId)];\n        case \"#\":\n            return [pc.roomPill(resourceId)];\n    }\n\n    const children = Array.from(n.childNodes);\n    if (href === n.textContent && children.every((c) => c.nodeType === Node.TEXT_NODE)) {\n        return parseAtRoomMentions(n.textContent, pc, opts);\n    } else {\n        return [pc.plain(\"[\"), ...parseChildren(n, pc, opts), pc.plain(`](${href})`)];\n    }\n}\n\nfunction parseImage(n: Node, pc: PartCreator, opts: IParseOptions): Part[] {\n    const { alt, src } = n as HTMLImageElement;\n    return pc.plainWithEmoji(`![${escape(alt)}](${src})`);\n}\n\nfunction parseCodeBlock(n: Node, pc: PartCreator, opts: IParseOptions): Part[] {\n    if (!n.textContent) return [];\n\n    let language = \"\";\n    if (n.firstChild?.nodeName === \"CODE\") {\n        for (const className of (n.firstChild as HTMLElement).classList) {\n            if (className.startsWith(\"language-\") && !className.startsWith(\"language-_\")) {\n                language = className.slice(\"language-\".length);\n                break;\n            }\n        }\n    }\n\n    const text = n.textContent.replace(/\\n$/, \"\");\n    // Escape backticks by using even more backticks for the fence if necessary\n    const fence = \"`\".repeat(Math.max(3, longestBacktickSequence(text) + 1));\n    const parts: Part[] = [...pc.plainWithEmoji(fence + language), pc.newline()];\n\n    text.split(\"\\n\").forEach((line) => {\n        parts.push(...pc.plainWithEmoji(line));\n        parts.push(pc.newline());\n    });\n\n    parts.push(pc.plain(fence));\n    return parts;\n}\n\nfunction parseHeader(n: Node, pc: PartCreator, opts: IParseOptions): Part[] {\n    const depth = parseInt(n.nodeName.slice(1), 10);\n    const prefix = pc.plain(\"#\".repeat(depth) + \" \");\n    return [prefix, ...parseChildren(n, pc, opts)];\n}\n\nfunction checkIgnored(n: Node): boolean {\n    if (n.nodeType === Node.TEXT_NODE) {\n        // Element adds \\n text nodes in a lot of places,\n        // which should be ignored\n        return n.nodeValue === \"\\n\";\n    } else if (n.nodeType === Node.ELEMENT_NODE) {\n        return n.nodeName === \"MX-REPLY\";\n    }\n    return true;\n}\n\nfunction prefixLines(parts: Part[], prefix: string, pc: PartCreator): void {\n    parts.unshift(pc.plain(prefix));\n    for (let i = 0; i < parts.length; i++) {\n        if (parts[i].type === Type.Newline) {\n            parts.splice(i + 1, 0, pc.plain(prefix));\n            i += 1;\n        }\n    }\n}\n\nfunction parseChildren(n: Node, pc: PartCreator, opts: IParseOptions, mkListItem?: (li: Node) => Part[]): Part[] {\n    let prev: ChildNode | undefined;\n    return Array.from(n.childNodes).flatMap((c) => {\n        const parsed = parseNode(c, pc, opts, mkListItem);\n        if (parsed.length && prev && (checkBlockNode(prev) || checkBlockNode(c))) {\n            if (isListChild(c)) {\n                // Use tighter spacing within lists\n                parsed.unshift(pc.newline());\n            } else {\n                parsed.unshift(pc.newline(), pc.newline());\n            }\n        }\n        if (parsed.length) prev = c;\n        return parsed;\n    });\n}\n\nfunction parseNode(n: Node, pc: PartCreator, opts: IParseOptions, mkListItem?: (li: Node) => Part[]): Part[] {\n    if (checkIgnored(n)) return [];\n\n    switch (n.nodeType) {\n        case Node.TEXT_NODE:\n            return parseAtRoomMentions(n.nodeValue || \"\", pc, opts);\n        case Node.ELEMENT_NODE:\n            switch (n.nodeName) {\n                case \"H1\":\n                case \"H2\":\n                case \"H3\":\n                case \"H4\":\n                case \"H5\":\n                case \"H6\":\n                    return parseHeader(n, pc, opts);\n                case \"A\":\n                    return parseLink(n, pc, opts);\n                case \"IMG\":\n                    return parseImage(n, pc, opts);\n                case \"BR\":\n                    return [pc.newline()];\n                case \"HR\":\n                    return [pc.plain(\"---\")];\n                case \"EM\":\n                    return [pc.plain(\"_\"), ...parseChildren(n, pc, opts), pc.plain(\"_\")];\n                case \"STRONG\":\n                    return [pc.plain(\"**\"), ...parseChildren(n, pc, opts), pc.plain(\"**\")];\n                case \"DEL\":\n                    return [pc.plain(\"<del>\"), ...parseChildren(n, pc, opts), pc.plain(\"</del>\")];\n                case \"S\":\n                    return [pc.plain(\"<s>\"), ...parseChildren(n, pc, opts), pc.plain(\"</s>\")];\n                case \"SUB\":\n                    return [pc.plain(\"<sub>\"), ...parseChildren(n, pc, opts), pc.plain(\"</sub>\")];\n                case \"SUP\":\n                    return [pc.plain(\"<sup>\"), ...parseChildren(n, pc, opts), pc.plain(\"</sup>\")];\n                case \"U\":\n                    return [pc.plain(\"<u>\"), ...parseChildren(n, pc, opts), pc.plain(\"</u>\")];\n                case \"PRE\":\n                    return parseCodeBlock(n, pc, opts);\n                case \"CODE\": {\n                    // Escape backticks by using multiple backticks for the fence if necessary\n                    const fence = \"`\".repeat(longestBacktickSequence(n.textContent || \"\") + 1);\n                    return pc.plainWithEmoji(`${fence}${n.textContent}${fence}`);\n                }\n                case \"BLOCKQUOTE\": {\n                    const parts = parseChildren(n, pc, opts);\n                    prefixLines(parts, \"> \", pc);\n                    return parts;\n                }\n                case \"LI\":\n                    return mkListItem?.(n) ?? parseChildren(n, pc, opts);\n                case \"UL\": {\n                    const parts = parseChildren(n, pc, opts, (li) => [pc.plain(\"- \"), ...parseChildren(li, pc, opts)]);\n                    if (isListChild(n)) {\n                        prefixLines(parts, \"    \", pc);\n                    }\n                    return parts;\n                }\n                case \"OL\": {\n                    let counter = (n as HTMLOListElement).start ?? 1;\n                    const parts = parseChildren(n, pc, opts, (li) => {\n                        const parts = [pc.plain(`${counter}. `), ...parseChildren(li, pc, opts)];\n                        counter++;\n                        return parts;\n                    });\n                    if (isListChild(n)) {\n                        prefixLines(parts, \"    \", pc);\n                    }\n                    return parts;\n                }\n                case \"DIV\":\n                case \"SPAN\":\n                    // Math nodes are translated back into delimited latex strings\n                    if ((n as Element).hasAttribute(\"data-mx-maths\")) {\n                        const delims = SdkConfig.get().latex_maths_delims;\n                        const delimLeft =\n                            n.nodeName === \"SPAN\" ? (delims?.inline?.left ?? \"\\\\(\") : (delims?.display?.left ?? \"\\\\[\");\n                        const delimRight =\n                            n.nodeName === \"SPAN\"\n                                ? (delims?.inline?.right ?? \"\\\\)\")\n                                : (delims?.display?.right ?? \"\\\\]\");\n                        const tex = (n as Element).getAttribute(\"data-mx-maths\");\n\n                        return pc.plainWithEmoji(`${delimLeft}${tex}${delimRight}`);\n                    }\n                    // Spoilers are translated back into their slash command form\n                    else if ((n as Element).hasAttribute(\"data-mx-spoiler\")) {\n                        return [pc.plain(\"/spoiler \"), ...parseChildren(n, pc, opts)];\n                    }\n            }\n    }\n\n    return parseChildren(n, pc, opts);\n}\n\ninterface IParseOptions {\n    isQuotedMessage?: boolean;\n    shouldEscape?: boolean;\n}\n\nfunction parseHtmlMessage(html: string, pc: PartCreator, opts: IParseOptions): Part[] {\n    // no nodes from parsing here should be inserted in the document,\n    // as scripts in event handlers, etc would be executed then.\n    // we're only taking text, so that is fine\n    const parts = parseNode(new DOMParser().parseFromString(html, \"text/html\").body, pc, opts);\n    if (opts.isQuotedMessage) {\n        prefixLines(parts, \"> \", pc);\n    }\n    return parts;\n}\n\nexport function parsePlainTextMessage(body: string, pc: PartCreator, opts: IParseOptions): Part[] {\n    const lines = body.split(/\\r\\n|\\r|\\n/g); // split on any new-line combination not just \\n, collapses \\r\\n\n    return lines.reduce((parts, line, i) => {\n        if (opts.isQuotedMessage) {\n            parts.push(pc.plain(\"> \"));\n        }\n        parts.push(...parseAtRoomMentions(line, pc, opts));\n        const isLast = i === lines.length - 1;\n        if (!isLast) {\n            parts.push(pc.newline());\n        }\n        return parts;\n    }, [] as Part[]);\n}\n\nexport function parseEvent(event: MatrixEvent, pc: PartCreator, opts: IParseOptions = { shouldEscape: true }): Part[] {\n    const content = event.getContent();\n    let parts: Part[];\n    const isEmote = content.msgtype === MsgType.Emote;\n    let isRainbow = false;\n\n    if (content.format === \"org.matrix.custom.html\") {\n        parts = parseHtmlMessage(content.formatted_body || \"\", pc, opts);\n        if (content.body && content.formatted_body && textToHtmlRainbow(content.body) === content.formatted_body) {\n            isRainbow = true;\n        }\n    } else {\n        let body = content.body || \"\";\n        if (event.replyEventId) {\n            body = stripPlainReply(body);\n        }\n        parts = parsePlainTextMessage(body, pc, opts);\n    }\n\n    if (isEmote && isRainbow) {\n        parts.unshift(pc.plain(\"/rainbowme \"));\n    } else if (isRainbow) {\n        parts.unshift(pc.plain(\"/rainbow \"));\n    } else if (isEmote) {\n        parts.unshift(pc.plain(\"/me \"));\n    }\n\n    return parts;\n}\n","/*\nCopyright 2019-2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { CARET_NODE_CHAR, isCaretNode } from \"./render\";\nimport DocumentOffset from \"./offset\";\nimport type EditorModel from \"./model\";\nimport type Range from \"./range\";\n\ntype Predicate = (node: Node) => boolean;\ntype Callback = (node: Node) => void;\n\nexport function walkDOMDepthFirst(rootNode: Node, enterNodeCallback: Predicate, leaveNodeCallback: Callback): void {\n    let node = rootNode.firstChild;\n    while (node && node !== rootNode) {\n        const shouldDescend = enterNodeCallback(node);\n        if (shouldDescend && node.firstChild) {\n            node = node.firstChild;\n        } else if (node.nextSibling) {\n            node = node.nextSibling;\n        } else {\n            while (node && !node.nextSibling && node !== rootNode) {\n                node = node.parentElement;\n                if (node && node !== rootNode) {\n                    leaveNodeCallback(node);\n                }\n            }\n            if (node && node !== rootNode) {\n                node = node.nextSibling;\n            }\n        }\n    }\n}\n\nexport function getCaretOffsetAndText(\n    editor: HTMLDivElement,\n    sel: Selection,\n): {\n    caret: DocumentOffset;\n    text: string;\n} {\n    const { offset, text } = getSelectionOffsetAndText(editor, sel.focusNode, sel.focusOffset);\n    return { caret: offset, text };\n}\n\nfunction tryReduceSelectionToTextNode(\n    selectionNode: Node | null,\n    selectionOffset: number,\n): {\n    node: Node | null;\n    characterOffset: number;\n} {\n    // if selectionNode is an element, the selected location comes after the selectionOffset-th child node,\n    // which can point past any childNode, in which case, the end of selectionNode is selected.\n    // we try to simplify this to point at a text node with the offset being\n    // a character offset within the text node\n    // Also see https://developer.mozilla.org/en-US/docs/Web/API/Selection\n    while (selectionNode && selectionNode.nodeType === Node.ELEMENT_NODE) {\n        const childNodeCount = selectionNode.childNodes.length;\n        if (childNodeCount) {\n            if (selectionOffset >= childNodeCount) {\n                selectionNode = selectionNode.lastChild;\n                if (selectionNode?.nodeType === Node.TEXT_NODE) {\n                    selectionOffset = selectionNode.textContent?.length || 0;\n                } else {\n                    // this will select the last child node in the next iteration\n                    selectionOffset = Number.MAX_SAFE_INTEGER;\n                }\n            } else {\n                selectionNode = selectionNode.childNodes[selectionOffset];\n                // this will select the first child node in the next iteration\n                selectionOffset = 0;\n            }\n        } else {\n            // here node won't be a text node,\n            // but characterOffset should be 0,\n            // this happens under some circumstances\n            // when the editor is empty.\n            // In this case characterOffset=0 is the right thing to do\n            break;\n        }\n    }\n    return {\n        node: selectionNode,\n        characterOffset: selectionOffset,\n    };\n}\n\nfunction getSelectionOffsetAndText(\n    editor: HTMLDivElement,\n    selectionNode: Node | null,\n    selectionOffset: number,\n): {\n    offset: DocumentOffset;\n    text: string;\n} {\n    const { node, characterOffset } = tryReduceSelectionToTextNode(selectionNode, selectionOffset);\n    const { text, offsetToNode } = getTextAndOffsetToNode(editor, node);\n    const offset = getCaret(node, offsetToNode, characterOffset);\n    return { offset, text };\n}\n\n// gets the caret position details, ignoring and adjusting to\n// the ZWS if you're typing in a caret node\nfunction getCaret(node: Node | null, offsetToNode: number, offsetWithinNode: number): DocumentOffset {\n    // if no node is selected, return an offset at the start\n    if (!node) {\n        return new DocumentOffset(0, false);\n    }\n    let atNodeEnd = offsetWithinNode === node.textContent?.length;\n    if (node.nodeType === Node.TEXT_NODE && isCaretNode(node.parentElement)) {\n        const nodeValue = node.nodeValue || \"\";\n        const zwsIdx = nodeValue.indexOf(CARET_NODE_CHAR);\n        if (zwsIdx !== -1 && zwsIdx < offsetWithinNode) {\n            offsetWithinNode -= 1;\n        }\n        // if typing in a caret node, you're either typing before or after the ZWS.\n        // In both cases, you should be considered at node end because the ZWS is\n        // not included in the text here, and once the model is updated and rerendered,\n        // that caret node will be removed.\n        atNodeEnd = true;\n    }\n    return new DocumentOffset(offsetToNode + offsetWithinNode, atNodeEnd);\n}\n\n// gets the text of the editor as a string,\n// and the offset in characters where the selectionNode starts in that string\n// all ZWS from caret nodes are filtered out\nfunction getTextAndOffsetToNode(\n    editor: HTMLDivElement,\n    selectionNode: Node | null,\n): { offsetToNode: number; text: string } {\n    let offsetToNode = 0;\n    let foundNode = false;\n    let text = \"\";\n\n    function enterNodeCallback(node: Node): boolean {\n        if (!foundNode) {\n            if (node === selectionNode) {\n                foundNode = true;\n            }\n        }\n        // usually newlines are entered as new DIV elements,\n        // but for example while pasting in some browsers, they are still\n        // converted to BRs, so also take these into account when they\n        // are not the last element in the DIV.\n        if (node instanceof HTMLElement && node.tagName === \"BR\" && node.nextSibling) {\n            if (!foundNode) {\n                offsetToNode += 1;\n            }\n            text += \"\\n\";\n        }\n        const nodeText = node.nodeType === Node.TEXT_NODE && getTextNodeValue(node);\n        if (nodeText) {\n            if (!foundNode) {\n                offsetToNode += nodeText.length;\n            }\n            text += nodeText;\n        }\n        return true;\n    }\n\n    function leaveNodeCallback(node: Node): void {\n        // if this is not the last DIV (which are only used as line containers atm)\n        // we don't just check if there is a nextSibling because sometimes the caret ends up\n        // after the last DIV and it creates a newline if you type then,\n        // whereas you just want it to be appended to the current line\n        if (\n            node instanceof HTMLElement &&\n            node.tagName === \"DIV\" &&\n            (<HTMLElement>node.nextSibling)?.tagName === \"DIV\"\n        ) {\n            text += \"\\n\";\n            if (!foundNode) {\n                offsetToNode += 1;\n            }\n        }\n    }\n\n    walkDOMDepthFirst(editor, enterNodeCallback, leaveNodeCallback);\n\n    return { text, offsetToNode };\n}\n\n// get text value of text node, ignoring ZWS if it's a caret node\nfunction getTextNodeValue(node: Node): string {\n    const nodeText = node.nodeValue;\n    if (!nodeText) return \"\";\n\n    // filter out ZWS for caret nodes\n    if (isCaretNode(node.parentElement)) {\n        // typed in the caret node, so there is now something more in it than the ZWS\n        // so filter out the ZWS, and take the typed text into account\n        if (nodeText.length !== 1) {\n            return nodeText.replace(CARET_NODE_CHAR, \"\");\n        } else {\n            // only contains ZWS, which is ignored, so return empty string\n            return \"\";\n        }\n    }\n\n    return nodeText;\n}\n\nexport function getRangeForSelection(editor: HTMLDivElement, model: EditorModel, selection: Selection): Range {\n    const focusOffset = getSelectionOffsetAndText(editor, selection.focusNode, selection.focusOffset).offset;\n    const anchorOffset = getSelectionOffsetAndText(editor, selection.anchorNode, selection.anchorOffset).offset;\n    const focusPosition = focusOffset.asPosition(model);\n    const anchorPosition = anchorOffset.asPosition(model);\n    return model.startRange(focusPosition, anchorPosition);\n}\n","/*\nCopyright 2019-2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport interface IDiff {\n    removed?: string;\n    added?: string;\n    at?: number;\n}\n\nfunction firstDiff(a: string, b: string): number {\n    const compareLen = Math.min(a.length, b.length);\n    for (let i = 0; i < compareLen; ++i) {\n        if (a[i] !== b[i]) {\n            return i;\n        }\n    }\n    return compareLen;\n}\n\nfunction diffStringsAtEnd(oldStr: string, newStr: string): IDiff {\n    const len = Math.min(oldStr.length, newStr.length);\n    const startInCommon = oldStr.slice(0, len) === newStr.slice(0, len);\n    if (startInCommon && oldStr.length > newStr.length) {\n        return { removed: oldStr.slice(len), at: len };\n    } else if (startInCommon && oldStr.length < newStr.length) {\n        return { added: newStr.slice(len), at: len };\n    } else {\n        const commonStartLen = firstDiff(oldStr, newStr);\n        return {\n            removed: oldStr.slice(commonStartLen),\n            added: newStr.slice(commonStartLen),\n            at: commonStartLen,\n        };\n    }\n}\n\n// assumes only characters have been deleted at one location in the string, and none added\nexport function diffDeletion(oldStr: string, newStr: string): IDiff {\n    if (oldStr === newStr) {\n        return {};\n    }\n    const firstDiffIdx = firstDiff(oldStr, newStr);\n    const amount = oldStr.length - newStr.length;\n    return { at: firstDiffIdx, removed: oldStr.slice(firstDiffIdx, firstDiffIdx + amount) };\n}\n\n/**\n * Calculates which string was added and removed around the caret position\n * @param {String} oldValue the previous value\n * @param {String} newValue the new value\n * @param {Number} caretPosition the position of the caret after `newValue` was applied.\n * @returns {object} an object with `at` as the offset where characters were removed and/or added,\n *                  `added` with the added string (if any), and\n *                  `removed` with the removed string (if any)\n */\nexport function diffAtCaret(oldValue: string, newValue: string, caretPosition: number): IDiff {\n    const diffLen = newValue.length - oldValue.length;\n    const caretPositionBeforeInput = caretPosition - diffLen;\n    const oldValueBeforeCaret = oldValue.substring(0, caretPositionBeforeInput);\n    const newValueBeforeCaret = newValue.substring(0, caretPosition);\n    return diffStringsAtEnd(oldValueBeforeCaret, newValueBeforeCaret);\n}\n","/*\nCopyright 2019-2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { diffAtCaret, diffDeletion, type IDiff } from \"./diff\";\nimport DocumentPosition, { type IPosition } from \"./position\";\nimport Range from \"./range\";\nimport { type SerializedPart, type Part, type PartCreator, Type } from \"./parts\";\nimport { type ICallback } from \"./autocomplete\";\nimport type AutocompleteWrapperModel from \"./autocomplete\";\nimport type DocumentOffset from \"./offset\";\nimport { type Caret } from \"./caret\";\n\n/**\n * @callback ModelCallback\n * @param {DocumentPosition?} caretPosition the position where the caret should be position\n * @param {string?} inputType the inputType of the DOM input event\n * @param {object?} diff an object with `removed` and `added` strings\n */\n\n/**\n * @callback TransformCallback\n * @param {DocumentPosition?} caretPosition the position where the caret should be position\n * @param {string?} inputType the inputType of the DOM input event\n * @param {object?} diff an object with `removed` and `added` strings\n * @returns {Number?} addedLen how many characters were added/removed (-) before the caret during the transformation step.\n *    This is used to adjust the caret position.\n */\n\n/**\n * @callback ManualTransformCallback\n * @returns the caret position\n */\n\ntype TransformCallback = (caretPosition: DocumentPosition, inputType: string | undefined, diff: IDiff) => number | void;\ntype UpdateCallback = (caret?: Caret, inputType?: string, diff?: IDiff) => void;\ntype ManualTransformCallback = () => Caret;\n\nexport default class EditorModel {\n    private _parts: Part[];\n    private readonly _partCreator: PartCreator;\n    private activePartIdx: number | null = null;\n    private _autoComplete: AutocompleteWrapperModel | null = null;\n    private autoCompletePartIdx: number | null = null;\n    private autoCompletePartCount = 0;\n    private transformCallback: TransformCallback | null = null;\n\n    /**\n     * Returns the plain text parts of the editor content only (skipping mentions)\n     */\n    public get contentPlainText(): string {\n        return this.serializeParts()\n            .filter((part) => part.type === Type.Plain)\n            .map((part) => part.text)\n            .join(\" \");\n    }\n\n    public constructor(\n        parts: Part[],\n        partCreator: PartCreator,\n        private updateCallback: UpdateCallback | null = null,\n    ) {\n        this._parts = parts;\n        this._partCreator = partCreator;\n        this.transformCallback = null;\n    }\n\n    /**\n     * Set a callback for the transformation step.\n     * While processing an update, right before calling the update callback,\n     * a transform callback can be called, which serves to do modifications\n     * on the model that can span multiple parts. Also see `startRange()`.\n     * @param {TransformCallback} transformCallback\n     */\n    public setTransformCallback(transformCallback: TransformCallback): void {\n        this.transformCallback = transformCallback;\n    }\n\n    /**\n     * Set a callback for rerendering the model after it has been updated.\n     * @param {ModelCallback} updateCallback\n     */\n    public setUpdateCallback(updateCallback: UpdateCallback): void {\n        this.updateCallback = updateCallback;\n    }\n\n    public get partCreator(): PartCreator {\n        return this._partCreator;\n    }\n\n    public get isEmpty(): boolean {\n        return this._parts.reduce((len, part) => len + part.text.length, 0) === 0;\n    }\n\n    public clone(): EditorModel {\n        const clonedParts = this.parts\n            .map((p) => this.partCreator.deserializePart(p.serialize()))\n            .filter((p): p is Part => Boolean(p));\n        return new EditorModel(clonedParts, this._partCreator, this.updateCallback);\n    }\n\n    private insertPart(index: number, part: Part): void {\n        this._parts.splice(index, 0, part);\n        if (this.activePartIdx !== null && this.activePartIdx >= index) {\n            ++this.activePartIdx;\n        }\n        if (this.autoCompletePartIdx !== null && this.autoCompletePartIdx >= index) {\n            ++this.autoCompletePartIdx;\n        }\n    }\n\n    private removePart(index: number): void {\n        this._parts.splice(index, 1);\n        if (index === this.activePartIdx) {\n            this.activePartIdx = null;\n        } else if (this.activePartIdx !== null && this.activePartIdx > index) {\n            --this.activePartIdx;\n        }\n        if (index === this.autoCompletePartIdx) {\n            this.autoCompletePartIdx = null;\n        } else if (this.autoCompletePartIdx !== null && this.autoCompletePartIdx > index) {\n            --this.autoCompletePartIdx;\n        }\n    }\n\n    private replacePart(index: number, part: Part): void {\n        this._parts.splice(index, 1, part);\n    }\n\n    public get parts(): Part[] {\n        return this._parts;\n    }\n\n    public get autoComplete(): AutocompleteWrapperModel | null {\n        if (this.activePartIdx === this.autoCompletePartIdx) {\n            return this._autoComplete;\n        }\n        return null;\n    }\n\n    public getPositionAtEnd(): DocumentPosition {\n        if (this._parts.length) {\n            const index = this._parts.length - 1;\n            const part = this._parts[index];\n            return new DocumentPosition(index, part.text.length);\n        } else {\n            // part index -1, as there are no parts to point at\n            return new DocumentPosition(-1, 0);\n        }\n    }\n\n    public serializeParts(): SerializedPart[] {\n        return this._parts.map((p) => p.serialize());\n    }\n\n    private diff(newValue: string, inputType: string | undefined, caret: DocumentOffset): IDiff {\n        const previousValue = this.parts.reduce((text, p) => text + p.text, \"\");\n        // can't use caret position with drag and drop\n        if (inputType === \"deleteByDrag\") {\n            return diffDeletion(previousValue, newValue);\n        } else {\n            return diffAtCaret(previousValue, newValue, caret.offset);\n        }\n    }\n\n    public reset(serializedParts: SerializedPart[], caret?: Caret, inputType?: string): void {\n        this._parts = serializedParts\n            .map((p) => this._partCreator.deserializePart(p))\n            .filter((p): p is Part => Boolean(p));\n        if (!caret) {\n            caret = this.getPositionAtEnd();\n        }\n        // close auto complete if open\n        // this would happen when clearing the composer after sending\n        // a message with the autocomplete still open\n        if (this._autoComplete) {\n            this._autoComplete = null;\n            this.autoCompletePartIdx = null;\n        }\n        this.updateCallback?.(caret, inputType);\n    }\n\n    /**\n     * Inserts the given parts at the given position.\n     * Should be run inside a `model.transform()` callback.\n     * @param {Part[]} parts the parts to replace the range with\n     * @param {DocumentPosition} position the position to start inserting at\n     * @returns {Number} the amount of characters added\n     */\n    public insert(parts: Part[], position: IPosition): number {\n        const insertIndex = this.splitAt(position);\n        let newTextLength = 0;\n        for (let i = 0; i < parts.length; ++i) {\n            const part = parts[i];\n            newTextLength += part.text.length;\n            this.insertPart(insertIndex + i, part);\n        }\n        return newTextLength;\n    }\n\n    public update(newValue: string, inputType: string | undefined, caret: DocumentOffset): Promise<void> {\n        const diff = this.diff(newValue, inputType, caret);\n        const position = this.positionForOffset(diff.at || 0, caret.atNodeEnd);\n        let removedOffsetDecrease = 0;\n        if (diff.removed) {\n            removedOffsetDecrease = this.removeText(position, diff.removed.length);\n        }\n        let addedLen = 0;\n        if (diff.added) {\n            addedLen = this.addText(position, diff.added, inputType);\n        }\n        this.mergeAdjacentParts();\n        const caretOffset = (diff.at || 0) - removedOffsetDecrease + addedLen;\n        let newPosition = this.positionForOffset(caretOffset, true);\n        const canOpenAutoComplete = inputType !== \"insertFromPaste\" && inputType !== \"insertFromDrop\";\n        const acPromise = this.setActivePart(newPosition, canOpenAutoComplete);\n        if (this.transformCallback) {\n            const transformAddedLen = this.getTransformAddedLen(newPosition, inputType, diff);\n            newPosition = this.positionForOffset(caretOffset + transformAddedLen, true);\n        }\n        this.updateCallback?.(newPosition, inputType, diff);\n        return acPromise;\n    }\n\n    private getTransformAddedLen(newPosition: DocumentPosition, inputType: string | undefined, diff: IDiff): number {\n        const result = this.transformCallback?.(newPosition, inputType, diff);\n        return Number.isFinite(result) ? (result as number) : 0;\n    }\n\n    private setActivePart(pos: DocumentPosition, canOpenAutoComplete: boolean): Promise<void> {\n        const { index } = pos;\n        const part = this._parts[index];\n        if (part) {\n            if (index !== this.activePartIdx) {\n                this.activePartIdx = index;\n                if (canOpenAutoComplete && this.activePartIdx !== this.autoCompletePartIdx) {\n                    // else try to create one\n                    const ac = part.createAutoComplete(this.onAutoComplete);\n                    if (ac) {\n                        // make sure that react picks up the difference between both acs\n                        this._autoComplete = ac;\n                        this.autoCompletePartIdx = index;\n                        this.autoCompletePartCount = 1;\n                    }\n                }\n            }\n            // not autoComplete, only there if active part is autocomplete part\n            if (this.autoComplete) {\n                return this.autoComplete.onPartUpdate(part, pos);\n            }\n        } else {\n            this.activePartIdx = null;\n            this._autoComplete = null;\n            this.autoCompletePartIdx = null;\n            this.autoCompletePartCount = 0;\n        }\n        return Promise.resolve();\n    }\n\n    private onAutoComplete = ({ replaceParts, close, range }: ICallback): void => {\n        let pos: DocumentPosition | undefined;\n        if (replaceParts) {\n            const autoCompletePartIdx = this.autoCompletePartIdx || 0;\n\n            this.replaceRange(\n                new DocumentPosition(autoCompletePartIdx, range?.start ?? 0),\n                new DocumentPosition(\n                    autoCompletePartIdx + this.autoCompletePartCount - 1,\n                    range?.end ?? this.parts[autoCompletePartIdx + this.autoCompletePartCount - 1].text.length,\n                ),\n                replaceParts,\n            );\n\n            this.autoCompletePartCount = replaceParts.length;\n            const lastPart = replaceParts[replaceParts.length - 1];\n            // `replaceRange` merges adjacent parts so we need to find it in the new parts list\n            const lastPartIndex = this.parts.indexOf(lastPart);\n            pos = new DocumentPosition(lastPartIndex, lastPart.text.length);\n        }\n        if (close) {\n            this._autoComplete = null;\n            this.autoCompletePartIdx = null;\n            this.autoCompletePartCount = 0;\n        }\n        // rerender even if editor contents didn't change\n        // to make sure the MessageEditor checks\n        // model.autoComplete being empty and closes it\n        this.updateCallback?.(pos);\n    };\n\n    private mergeAdjacentParts(): void {\n        let prevPart: Part | undefined;\n        for (let i = 0; i < this._parts.length; ++i) {\n            let part: Part | undefined = this._parts[i];\n            const isEmpty = !part.text.length;\n            const isMerged = !isEmpty && prevPart && prevPart.merge?.(part);\n            if (isEmpty || isMerged) {\n                // remove empty or merged part\n                part = prevPart;\n                this.removePart(i);\n                //repeat this index, as it's removed now\n                --i;\n            }\n            prevPart = part;\n        }\n    }\n\n    /**\n     * removes `len` amount of characters at `pos`.\n     * @param {Object} pos\n     * @param {Number} len\n     * @returns {Number} how many characters before pos were also removed,\n     * usually because of non-editable parts that can only be removed in their entirety.\n     */\n    public removeText(pos: IPosition, len: number): number {\n        let { index, offset } = pos;\n        let removedOffsetDecrease = 0;\n        while (len > 0) {\n            // part might be undefined here\n            let part = this._parts[index];\n            const amount = Math.min(len, part.text.length - offset);\n            // don't allow 0 amount deletions\n            if (amount) {\n                if (part.canEdit) {\n                    const replaceWith = part.remove(offset, amount);\n                    if (typeof replaceWith === \"string\") {\n                        this.replacePart(index, this._partCreator.createDefaultPart(replaceWith));\n                    }\n                    part = this._parts[index];\n                    // remove empty part\n                    if (!part.text.length) {\n                        this.removePart(index);\n                    } else {\n                        index += 1;\n                    }\n                } else {\n                    removedOffsetDecrease += offset;\n                    this.removePart(index);\n                }\n            } else {\n                index += 1;\n            }\n            len -= amount;\n            offset = 0;\n        }\n        return removedOffsetDecrease;\n    }\n\n    // return part index where insertion will insert between at offset\n    private splitAt(pos: IPosition): number {\n        if (pos.index === -1) {\n            return 0;\n        }\n        if (pos.offset === 0) {\n            return pos.index;\n        }\n        const part = this._parts[pos.index];\n        if (pos.offset >= part.text.length) {\n            return pos.index + 1;\n        }\n\n        const secondPart = part.split(pos.offset);\n        this.insertPart(pos.index + 1, secondPart);\n        return pos.index + 1;\n    }\n\n    /**\n     * inserts `str` into the model at `pos`.\n     * @param {Object} pos\n     * @param {string} str\n     * @param {string} inputType the source of the input, see html InputEvent.inputType\n     * @returns {Number} how far from position (in characters) the insertion ended.\n     * This can be more than the length of `str` when crossing non-editable parts, which are skipped.\n     */\n    private addText(pos: IPosition, str: string, inputType: string | undefined): number {\n        let { index } = pos;\n        const { offset } = pos;\n        let addLen = str.length;\n        const part = this._parts[index];\n\n        let it: string | undefined = str;\n\n        if (part) {\n            if (part.canEdit) {\n                if (part.validateAndInsert(offset, str, inputType)) {\n                    it = undefined;\n                } else {\n                    const splitPart = part.split(offset);\n                    index += 1;\n                    this.insertPart(index, splitPart);\n                }\n            } else if (offset !== 0) {\n                // not-editable part, caret is not at start,\n                // so insert str after this part\n                addLen += part.text.length - offset;\n                index += 1;\n            }\n        } else if (index < 0) {\n            // if position was not found (index: -1, as happens for empty editor)\n            // reset it to insert as first part\n            index = 0;\n        }\n\n        while (it) {\n            const newPart = this._partCreator.createPartForInput(it, index, inputType);\n            const oldStr = it;\n            it = newPart.appendUntilRejected(it, inputType);\n            if (it === oldStr) {\n                // nothing changed, break out of this infinite loop and log an error\n                console.error(`Failed to update model for input (str ${it}) (type ${inputType})`);\n                break;\n            }\n            this.insertPart(index, newPart);\n            index += 1;\n        }\n        return addLen;\n    }\n\n    public positionForOffset(totalOffset: number, atPartEnd = false): DocumentPosition {\n        let currentOffset = 0;\n        const index = this._parts.findIndex((part) => {\n            const partLen = part.text.length;\n            if (\n                (atPartEnd && currentOffset + partLen >= totalOffset) ||\n                (!atPartEnd && currentOffset + partLen > totalOffset)\n            ) {\n                return true;\n            }\n            currentOffset += partLen;\n            return false;\n        });\n        if (index === -1) {\n            return this.getPositionAtEnd();\n        } else {\n            return new DocumentPosition(index, totalOffset - currentOffset);\n        }\n    }\n\n    /**\n     * Starts a range, which can span across multiple parts, to find and replace text.\n     * @param {DocumentPosition} positionA a boundary of the range\n     * @param {DocumentPosition?} positionB the other boundary of the range, optional\n     * @returns {Range}\n     */\n    public startRange(positionA: DocumentPosition, positionB = positionA): Range {\n        return new Range(this, positionA, positionB);\n    }\n\n    public replaceRange(startPosition: DocumentPosition, endPosition: DocumentPosition, parts: Part[]): void {\n        // convert end position to offset, so it is independent of how the document is split into parts\n        // which we'll change when splitting up at the start position\n        const endOffset = endPosition.asOffset(this);\n        const newStartPartIndex = this.splitAt(startPosition);\n        // convert it back to position once split at start\n        endPosition = endOffset.asPosition(this);\n        const newEndPartIndex = this.splitAt(endPosition);\n        for (let i = newEndPartIndex - 1; i >= newStartPartIndex; --i) {\n            this.removePart(i);\n        }\n        let insertIdx = newStartPartIndex;\n        for (const part of parts) {\n            this.insertPart(insertIdx, part);\n            insertIdx += 1;\n        }\n        this.mergeAdjacentParts();\n    }\n\n    /**\n     * Performs a transformation not part of an update cycle.\n     * Modifying the model should only happen inside a transform call if not part of an update call.\n     * @param {ManualTransformCallback} callback to run the transformations in\n     * @returns {Promise} a promise when auto-complete (if applicable) is done updating\n     */\n    public transform(callback: ManualTransformCallback): Promise<void> {\n        const pos = callback();\n        let acPromise: Promise<void> | null;\n        if (!(pos instanceof Range)) {\n            acPromise = this.setActivePart(pos, true);\n        } else {\n            acPromise = Promise.resolve();\n        }\n        this.updateCallback?.(pos);\n        return acPromise;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type EditorModel from \"./model\";\nimport type DocumentPosition from \"./position\";\n\nexport default class DocumentOffset {\n    public constructor(\n        public offset: number,\n        public readonly atNodeEnd: boolean,\n    ) {}\n\n    public asPosition(model: EditorModel): DocumentPosition {\n        return model.positionForOffset(this.offset, this.atNodeEnd);\n    }\n\n    public add(delta: number, atNodeEnd = false): DocumentOffset {\n        return new DocumentOffset(this.offset + delta, atNodeEnd);\n    }\n}\n","/*\nCopyright 2019-2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type React from \"react\";\nimport { type Part, type CommandPartCreator, type PartCreator } from \"./parts\";\nimport type DocumentPosition from \"./position\";\nimport { type ICompletion, type ISelectionRange } from \"../autocomplete/Autocompleter\";\nimport type Autocomplete from \"../components/views/rooms/Autocomplete\";\n\nexport interface ICallback {\n    replaceParts?: Part[];\n    range?: ISelectionRange;\n    close?: boolean;\n}\n\nexport type UpdateCallback = (data: ICallback) => void;\nexport type GetAutocompleterComponent = () => Autocomplete | null;\nexport type UpdateQuery = (test: string) => Promise<void>;\n\nexport default class AutocompleteWrapperModel {\n    private partIndex?: number;\n\n    public constructor(\n        private updateCallback: UpdateCallback,\n        private getAutocompleterComponent: GetAutocompleterComponent,\n        private updateQuery: UpdateQuery,\n        private partCreator: PartCreator | CommandPartCreator,\n    ) {}\n\n    public onEscape(e: KeyboardEvent | React.KeyboardEvent): void {\n        this.getAutocompleterComponent()?.onEscape(e);\n    }\n\n    public close(): void {\n        this.updateCallback({ close: true });\n    }\n\n    public hasSelection(): boolean {\n        return !!this.getAutocompleterComponent()?.hasSelection();\n    }\n\n    public hasCompletions(): boolean {\n        const ac = this.getAutocompleterComponent();\n        return !!ac && ac.countCompletions() > 0;\n    }\n\n    public confirmCompletion(): void {\n        this.getAutocompleterComponent()?.onConfirmCompletion();\n        this.updateCallback({ close: true });\n    }\n\n    /**\n     * If there is no current autocompletion, start one and move to the first selection.\n     */\n    public async startSelection(): Promise<void> {\n        const acComponent = this.getAutocompleterComponent();\n        if (acComponent && acComponent.countCompletions() === 0) {\n            // Force completions to show for the text currently entered\n            await acComponent.forceComplete();\n        }\n    }\n\n    public selectPreviousSelection(): void {\n        this.getAutocompleterComponent()?.moveSelection(-1);\n    }\n\n    public selectNextSelection(): void {\n        this.getAutocompleterComponent()?.moveSelection(+1);\n    }\n\n    public onPartUpdate(part: Part, pos: DocumentPosition): Promise<void> {\n        this.partIndex = pos.index;\n        return this.updateQuery(part.text);\n    }\n\n    public onComponentConfirm(completion: ICompletion): void {\n        this.updateCallback({\n            replaceParts: this.partForCompletion(completion),\n            close: true,\n            range: completion.range,\n        });\n    }\n\n    private partForCompletion(completion: ICompletion): Part[] {\n        const { completionId } = completion;\n        const text = completion.completion;\n        switch (completion.type) {\n            case \"room\":\n                return [this.partCreator.roomPill(text, completionId), this.partCreator.plain(completion.suffix || \"\")];\n            case \"at-room\":\n                return [\n                    this.partCreator.atRoomPill(completionId || \"\"),\n                    this.partCreator.plain(completion.suffix || \"\"),\n                ];\n            case \"user\":\n                // Insert suffix only if the pill is the part with index 0 - we are at the start of the composer\n                return this.partCreator.createMentionParts(this.partIndex === 0, text, completionId || \"\");\n            case \"command\":\n                // command needs special handling for auto complete, but also renders as plain texts\n                return [(this.partCreator as CommandPartCreator).command(text)];\n            default:\n                // used for emoji and other plain text completion replacement\n                return this.partCreator.plainWithEmoji(text);\n        }\n    }\n}\n","/*\nCopyright 2019-2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient, type RoomMember, type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport AutocompleteWrapperModel, {\n    type GetAutocompleterComponent,\n    type UpdateCallback,\n    type UpdateQuery,\n} from \"./autocomplete\";\nimport { EMOJI_REGEX, unicodeToShortcode } from \"../HtmlUtils\";\nimport * as Avatar from \"../Avatar\";\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport { Action } from \"../dispatcher/actions\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { getFirstGrapheme, graphemeSegmenter } from \"../utils/strings\";\n\nconst REGIONAL_EMOJI_SEPARATOR = String.fromCodePoint(0x200b);\n\ninterface ISerializedPart {\n    type: Type.Plain | Type.Newline | Type.Emoji | Type.Command | Type.PillCandidate;\n    text: string;\n}\n\ninterface ISerializedPillPart {\n    type: Type.AtRoomPill | Type.RoomPill | Type.UserPill;\n    text: string;\n    resourceId?: string;\n}\n\nexport type SerializedPart = ISerializedPart | ISerializedPillPart;\n\nexport enum Type {\n    Plain = \"plain\",\n    Newline = \"newline\",\n    Emoji = \"emoji\",\n    Command = \"command\",\n    UserPill = \"user-pill\",\n    RoomPill = \"room-pill\",\n    AtRoomPill = \"at-room-pill\",\n    PillCandidate = \"pill-candidate\",\n}\n\ninterface IBasePart {\n    text: string;\n    type: Type.Plain | Type.Newline | Type.Emoji;\n    canEdit: boolean;\n    acceptsCaret: boolean;\n\n    createAutoComplete(updateCallback: UpdateCallback): void;\n\n    serialize(): SerializedPart;\n    remove(offset: number, len: number): string | undefined;\n    split(offset: number): IBasePart;\n    validateAndInsert(offset: number, str: string, inputType: string | undefined): boolean;\n    appendUntilRejected(str: string, inputType: string | undefined): string | undefined;\n    updateDOMNode(node: Node): void;\n    canUpdateDOMNode(node: Node): boolean;\n    toDOMNode(): Node;\n\n    merge?(part: Part): boolean;\n}\n\ninterface IPillCandidatePart extends Omit<IBasePart, \"type\" | \"createAutoComplete\"> {\n    type: Type.PillCandidate | Type.Command;\n    createAutoComplete(updateCallback: UpdateCallback): AutocompleteWrapperModel | undefined;\n}\n\ninterface IPillPart extends Omit<IBasePart, \"type\" | \"resourceId\"> {\n    type: Type.AtRoomPill | Type.RoomPill | Type.UserPill;\n    resourceId: string;\n}\n\nexport type Part = IBasePart | IPillCandidatePart | IPillPart;\n\nabstract class BasePart {\n    protected _text: string;\n\n    public constructor(text = \"\") {\n        this._text = text;\n    }\n\n    // chr can also be a grapheme cluster\n    protected acceptsInsertion(chr: string, offset: number, inputType: string): boolean {\n        return true;\n    }\n\n    protected acceptsRemoval(position: number, chr: string): boolean {\n        return true;\n    }\n\n    public merge(part: Part): boolean {\n        return false;\n    }\n\n    public split(offset: number): IBasePart {\n        const splitText = this.text.slice(offset);\n        this._text = this.text.slice(0, offset);\n        return new PlainPart(splitText);\n    }\n\n    // removes len chars, or returns the plain text this part should be replaced with\n    // if the part would become invalid if it removed everything.\n    public remove(offset: number, len: number): string | undefined {\n        // validate\n        const strWithRemoval = this.text.slice(0, offset) + this.text.slice(offset + len);\n        for (let i = offset; i < len + offset; ++i) {\n            const chr = this.text.charAt(i);\n            if (!this.acceptsRemoval(i, chr)) {\n                return strWithRemoval;\n            }\n        }\n        this._text = strWithRemoval;\n    }\n\n    // append str, returns the remaining string if a character was rejected.\n    public appendUntilRejected(str: string, inputType: string): string | undefined {\n        const offset = this.text.length;\n        // Take a copy as we will be taking chunks off the start of the string as we process them\n        // To only need to grapheme split the bits of the string we're working on.\n        let buffer = str;\n        while (buffer) {\n            const char = getFirstGrapheme(buffer);\n            if (!this.acceptsInsertion(char, offset + str.length - buffer.length, inputType)) {\n                break;\n            }\n            buffer = buffer.slice(char.length);\n        }\n\n        this._text += str.slice(0, str.length - buffer.length);\n        return buffer || undefined;\n    }\n\n    // inserts str at offset if all the characters in str were accepted, otherwise don't do anything\n    // return whether the str was accepted or not.\n    public validateAndInsert(offset: number, str: string, inputType: string): boolean {\n        for (let i = 0; i < str.length; ++i) {\n            const chr = str.charAt(i);\n            if (!this.acceptsInsertion(chr, offset + i, inputType)) {\n                return false;\n            }\n        }\n        const beforeInsert = this._text.slice(0, offset);\n        const afterInsert = this._text.slice(offset);\n        this._text = beforeInsert + str + afterInsert;\n        return true;\n    }\n\n    public createAutoComplete(updateCallback: UpdateCallback): void {}\n\n    protected trim(len: number): string {\n        const remaining = this._text.slice(len);\n        this._text = this._text.slice(0, len);\n        return remaining;\n    }\n\n    public get text(): string {\n        return this._text;\n    }\n\n    public abstract get type(): Type;\n\n    public get canEdit(): boolean {\n        return true;\n    }\n\n    public get acceptsCaret(): boolean {\n        return this.canEdit;\n    }\n\n    public toString(): string {\n        return `${this.type}(${this.text})`;\n    }\n\n    public serialize(): SerializedPart {\n        return {\n            type: this.type as ISerializedPart[\"type\"],\n            text: this.text,\n        };\n    }\n\n    public abstract updateDOMNode(node: Node): void;\n    public abstract canUpdateDOMNode(node: Node): boolean;\n    public abstract toDOMNode(): Node;\n}\n\nabstract class PlainBasePart extends BasePart {\n    protected acceptsInsertion(chr: string, offset: number, inputType: string): boolean {\n        if (chr === \"\\n\" || EMOJI_REGEX.test(chr)) {\n            return false;\n        }\n        // when not pasting or dropping text, reject characters that should start a pill candidate\n        if (inputType !== \"insertFromPaste\" && inputType !== \"insertFromDrop\") {\n            if (chr !== \"@\" && chr !== \"#\" && chr !== \":\" && chr !== \"+\") {\n                return true;\n            }\n\n            // split if we are at the beginning of the part text\n            if (offset === 0) {\n                return false;\n            }\n\n            // or split if the previous character is a space or regional emoji separator\n            // or if it is a + and this is a :\n            return (\n                this._text[offset - 1] !== \" \" &&\n                this._text[offset - 1] !== REGIONAL_EMOJI_SEPARATOR &&\n                (this._text[offset - 1] !== \"+\" || chr !== \":\")\n            );\n        }\n        return true;\n    }\n\n    public toDOMNode(): Node {\n        return document.createTextNode(this.text);\n    }\n\n    public merge(part: Part): boolean {\n        if (part.type === this.type) {\n            this._text = this.text + part.text;\n            return true;\n        }\n        return false;\n    }\n\n    public updateDOMNode(node: Node): void {\n        if (node.textContent !== this.text) {\n            node.textContent = this.text;\n        }\n    }\n\n    public canUpdateDOMNode(node: Node): boolean {\n        return node.nodeType === Node.TEXT_NODE;\n    }\n}\n\n// exported for unit tests, should otherwise only be used through PartCreator\nexport class PlainPart extends PlainBasePart implements IBasePart {\n    public get type(): IBasePart[\"type\"] {\n        return Type.Plain;\n    }\n}\n\nexport abstract class PillPart extends BasePart implements IPillPart {\n    public constructor(\n        public resourceId: string,\n        label: string,\n    ) {\n        super(label);\n    }\n\n    protected acceptsInsertion(chr: string): boolean {\n        return chr !== \" \";\n    }\n\n    protected acceptsRemoval(position: number, chr: string): boolean {\n        return position !== 0; //if you remove initial # or @, pill should become plain\n    }\n\n    public toDOMNode(): Node {\n        const container = document.createElement(\"span\");\n        container.setAttribute(\"spellcheck\", \"false\");\n        container.setAttribute(\"contentEditable\", \"false\");\n        if (this.onClick) container.onclick = this.onClick;\n        container.className = this.className;\n        container.appendChild(document.createTextNode(this.text));\n        this.setAvatar(container);\n        return container;\n    }\n\n    public updateDOMNode(node: HTMLElement): void {\n        const textNode = node.childNodes[0];\n        if (textNode.textContent !== this.text) {\n            textNode.textContent = this.text;\n        }\n        if (node.className !== this.className) {\n            node.className = this.className;\n        }\n        if (this.onClick && node.onclick !== this.onClick) {\n            node.onclick = this.onClick;\n        }\n        this.setAvatar(node);\n    }\n\n    public canUpdateDOMNode(node: HTMLElement): boolean {\n        return (\n            node.nodeType === Node.ELEMENT_NODE &&\n            node.nodeName === \"SPAN\" &&\n            node.childNodes.length === 1 &&\n            node.childNodes[0].nodeType === Node.TEXT_NODE\n        );\n    }\n\n    // helper method for subclasses\n    protected setAvatarVars(\n        node: HTMLElement,\n        avatarUrl: string,\n        initialLetter: string,\n        avatarTextColor?: string,\n    ): void {\n        const avatarBackground = `url('${avatarUrl}')`;\n        const avatarLetter = `'${initialLetter}'`;\n        // check if the value is changing,\n        // otherwise the avatars flicker on every keystroke while updating.\n        if (node.style.getPropertyValue(\"--avatar-background\") !== avatarBackground) {\n            node.style.setProperty(\"--avatar-background\", avatarBackground);\n        }\n        if (node.style.getPropertyValue(\"--avatar-letter\") !== avatarLetter) {\n            node.style.setProperty(\"--avatar-letter\", avatarLetter);\n        }\n        if (avatarTextColor && node.style.getPropertyValue(\"--avatar-color\") !== avatarTextColor) {\n            node.style.setProperty(\"--avatar-color\", avatarTextColor);\n        }\n    }\n\n    public serialize(): ISerializedPillPart {\n        return {\n            type: this.type,\n            text: this.text,\n            resourceId: this.resourceId,\n        };\n    }\n\n    public get canEdit(): boolean {\n        return false;\n    }\n\n    public abstract get type(): IPillPart[\"type\"];\n\n    protected abstract get className(): string;\n\n    protected onClick?: () => void;\n\n    protected abstract setAvatar(node: HTMLElement): void;\n}\n\nclass NewlinePart extends BasePart implements IBasePart {\n    protected acceptsInsertion(chr: string, offset: number): boolean {\n        return offset === 0 && chr === \"\\n\";\n    }\n\n    protected acceptsRemoval(position: number, chr: string): boolean {\n        return true;\n    }\n\n    public toDOMNode(): Node {\n        return document.createElement(\"br\");\n    }\n\n    public merge(): boolean {\n        return false;\n    }\n\n    public updateDOMNode(): void {}\n\n    public canUpdateDOMNode(node: HTMLElement): boolean {\n        return node.tagName === \"BR\";\n    }\n\n    public get type(): IBasePart[\"type\"] {\n        return Type.Newline;\n    }\n\n    // this makes the cursor skip this part when it is inserted\n    // rather than trying to append to it, which is what we want.\n    // As a newline can also be only one character, it makes sense\n    // as it can only be one character long. This caused #9741.\n    public get canEdit(): boolean {\n        return false;\n    }\n}\n\nexport class EmojiPart extends BasePart implements IBasePart {\n    protected acceptsInsertion(chr: string, offset: number): boolean {\n        return EMOJI_REGEX.test(chr);\n    }\n\n    protected acceptsRemoval(position: number, chr: string): boolean {\n        return false;\n    }\n\n    public toDOMNode(): Node {\n        const span = document.createElement(\"span\");\n        span.className = \"mx_Emoji\";\n        span.setAttribute(\"title\", unicodeToShortcode(this.text));\n        span.appendChild(document.createTextNode(this.text));\n        return span;\n    }\n\n    public updateDOMNode(node: HTMLElement): void {\n        const textNode = node.childNodes[0];\n        if (textNode.textContent !== this.text) {\n            node.setAttribute(\"title\", unicodeToShortcode(this.text));\n            textNode.textContent = this.text;\n        }\n    }\n\n    public canUpdateDOMNode(node: HTMLElement): boolean {\n        return node.className === \"mx_Emoji\";\n    }\n\n    public get type(): IBasePart[\"type\"] {\n        return Type.Emoji;\n    }\n\n    public get canEdit(): boolean {\n        return false;\n    }\n\n    public get acceptsCaret(): boolean {\n        return true;\n    }\n}\n\nclass RoomPillPart extends PillPart {\n    public constructor(\n        resourceId: string,\n        label: string,\n        private room?: Room,\n    ) {\n        super(resourceId, label);\n    }\n\n    protected setAvatar(node: HTMLElement): void {\n        let initialLetter = \"\";\n        let avatarUrl = Avatar.avatarUrlForRoom(this.room ?? null, 16, 16, \"crop\");\n        let avatarTextColor: string | undefined;\n        if (!avatarUrl) {\n            initialLetter = Avatar.getInitialLetter(this.room?.name || this.resourceId) ?? \"\";\n            avatarUrl = Avatar.defaultAvatarUrlForString(this.room?.roomId ?? this.resourceId);\n            avatarTextColor = Avatar.getAvatarTextColor(this.room?.roomId ?? this.resourceId);\n        }\n        this.setAvatarVars(node, avatarUrl, initialLetter, avatarTextColor);\n    }\n\n    public get type(): IPillPart[\"type\"] {\n        return Type.RoomPill;\n    }\n\n    protected get className(): string {\n        return \"mx_Pill \" + (this.room?.isSpaceRoom() ? \"mx_SpacePill\" : \"mx_RoomPill\");\n    }\n}\n\nclass AtRoomPillPart extends RoomPillPart {\n    public constructor(text: string, room: Room) {\n        super(text, text, room);\n    }\n\n    public get type(): IPillPart[\"type\"] {\n        return Type.AtRoomPill;\n    }\n\n    public serialize(): ISerializedPillPart {\n        return {\n            type: this.type,\n            text: this.text,\n        };\n    }\n}\n\nclass UserPillPart extends PillPart {\n    public constructor(\n        userId: string,\n        displayName: string,\n        private member?: RoomMember,\n    ) {\n        super(userId, displayName);\n    }\n\n    public get type(): IPillPart[\"type\"] {\n        return Type.UserPill;\n    }\n\n    protected get className(): string {\n        return \"mx_UserPill mx_Pill\";\n    }\n\n    protected setAvatar(node: HTMLElement): void {\n        if (!this.member) {\n            return;\n        }\n        const name = this.member.name || this.member.userId;\n        const defaultAvatarUrl = Avatar.defaultAvatarUrlForString(this.member.userId);\n        const avatarUrl = Avatar.avatarUrlForMember(this.member, 16, 16, \"crop\");\n        let initialLetter = \"\";\n        let avatarTextColor: string | undefined;\n        if (avatarUrl === defaultAvatarUrl) {\n            initialLetter = Avatar.getInitialLetter(name) ?? \"\";\n            avatarTextColor = Avatar.getAvatarTextColor(this.member.userId);\n        }\n        this.setAvatarVars(node, avatarUrl, initialLetter, avatarTextColor);\n    }\n\n    protected onClick = (): void => {\n        defaultDispatcher.dispatch({\n            action: Action.ViewUser,\n            member: this.member,\n        });\n    };\n}\n\nclass PillCandidatePart extends PlainBasePart implements IPillCandidatePart {\n    public constructor(\n        text: string,\n        private autoCompleteCreator: IAutocompleteCreator,\n    ) {\n        super(text);\n    }\n\n    public createAutoComplete(updateCallback: UpdateCallback): AutocompleteWrapperModel | undefined {\n        return this.autoCompleteCreator.create?.(updateCallback);\n    }\n\n    protected acceptsInsertion(chr: string, offset: number, inputType: string): boolean {\n        if (offset === 0) {\n            return true;\n        } else {\n            return super.acceptsInsertion(chr, offset, inputType);\n        }\n    }\n\n    public merge(): boolean {\n        return false;\n    }\n\n    protected acceptsRemoval(position: number, chr: string): boolean {\n        return true;\n    }\n\n    public get type(): IPillCandidatePart[\"type\"] {\n        return Type.PillCandidate;\n    }\n}\n\nexport function getAutoCompleteCreator(getAutocompleterComponent: GetAutocompleterComponent, updateQuery: UpdateQuery) {\n    return (partCreator: PartCreator) => {\n        return (updateCallback: UpdateCallback) => {\n            return new AutocompleteWrapperModel(updateCallback, getAutocompleterComponent, updateQuery, partCreator);\n        };\n    };\n}\n\ntype AutoCompleteCreator = ReturnType<typeof getAutoCompleteCreator>;\n\ninterface IAutocompleteCreator {\n    create: ((updateCallback: UpdateCallback) => AutocompleteWrapperModel) | undefined;\n}\n\nexport class PartCreator {\n    protected readonly autoCompleteCreator: IAutocompleteCreator;\n\n    public constructor(\n        private readonly room: Room,\n        private readonly client: MatrixClient,\n        autoCompleteCreator: AutoCompleteCreator | null = null,\n    ) {\n        // pre-create the creator as an object even without callback so it can already be passed\n        // to PillCandidatePart (e.g. while deserializing) and set later on\n        this.autoCompleteCreator = { create: autoCompleteCreator?.(this) };\n    }\n\n    public setAutoCompleteCreator(autoCompleteCreator: AutoCompleteCreator): void {\n        this.autoCompleteCreator.create = autoCompleteCreator(this);\n    }\n\n    public createPartForInput(input: string, partIndex: number, inputType?: string): Part {\n        switch (input[0]) {\n            case \"#\":\n            case \"@\":\n            case \":\":\n            case \"+\":\n                return this.pillCandidate(\"\");\n            case \"\\n\":\n                return new NewlinePart();\n            default:\n                if (EMOJI_REGEX.test(getFirstGrapheme(input))) {\n                    return new EmojiPart();\n                }\n                return new PlainPart();\n        }\n    }\n\n    public createDefaultPart(text: string): Part {\n        return this.plain(text);\n    }\n\n    public deserializePart(part: SerializedPart): Part | undefined {\n        switch (part.type) {\n            case Type.Plain:\n                return this.plain(part.text);\n            case Type.Newline:\n                return this.newline();\n            case Type.Emoji:\n                return this.emoji(part.text);\n            case Type.AtRoomPill:\n                return this.atRoomPill(part.text);\n            case Type.PillCandidate:\n                return this.pillCandidate(part.text);\n            case Type.RoomPill:\n                return part.resourceId ? this.roomPill(part.resourceId) : undefined;\n            case Type.UserPill:\n                return part.resourceId ? this.userPill(part.text, part.resourceId) : undefined;\n        }\n    }\n\n    public plain(text: string): PlainPart {\n        return new PlainPart(text);\n    }\n\n    public newline(): NewlinePart {\n        return new NewlinePart(\"\\n\");\n    }\n\n    public emoji(text: string): EmojiPart {\n        return new EmojiPart(text);\n    }\n\n    public pillCandidate(text: string): PillCandidatePart {\n        return new PillCandidatePart(text, this.autoCompleteCreator);\n    }\n\n    public roomPill(alias: string, roomId?: string): RoomPillPart {\n        let room: Room | undefined;\n        if (roomId || alias[0] !== \"#\") {\n            room = this.client.getRoom(roomId || alias) ?? undefined;\n        } else {\n            room = this.client.getRooms().find((r) => {\n                return r.getCanonicalAlias() === alias || r.getAltAliases().includes(alias);\n            });\n        }\n        return new RoomPillPart(alias, room ? room.name : alias, room);\n    }\n\n    public atRoomPill(text: string): AtRoomPillPart {\n        return new AtRoomPillPart(text, this.room);\n    }\n\n    public userPill(displayName: string, userId: string): UserPillPart {\n        const member = this.room.getMember(userId);\n        return new UserPillPart(userId, displayName, member || undefined);\n    }\n\n    private static isRegionalIndicator(c: string): boolean {\n        const codePoint = c.codePointAt(0) ?? 0;\n        return codePoint != 0 && c.length == 2 && 0x1f1e6 <= codePoint && codePoint <= 0x1f1ff;\n    }\n\n    public plainWithEmoji(text: string): (PlainPart | EmojiPart)[] {\n        const parts: (PlainPart | EmojiPart)[] = [];\n        let plainText = \"\";\n\n        for (const data of graphemeSegmenter.segment(text)) {\n            if (EMOJI_REGEX.test(data.segment)) {\n                if (plainText) {\n                    parts.push(this.plain(plainText));\n                    plainText = \"\";\n                }\n                parts.push(this.emoji(data.segment));\n                if (PartCreator.isRegionalIndicator(text)) {\n                    parts.push(this.plain(REGIONAL_EMOJI_SEPARATOR));\n                }\n            } else {\n                plainText += data.segment;\n            }\n        }\n        if (plainText) {\n            parts.push(this.plain(plainText));\n        }\n        return parts;\n    }\n\n    public createMentionParts(\n        insertTrailingCharacter: boolean,\n        displayName: string,\n        userId: string,\n    ): [UserPillPart, PlainPart] {\n        const pill = this.userPill(displayName, userId);\n        if (!SettingsStore.getValue(\"MessageComposerInput.insertTrailingColon\")) {\n            insertTrailingCharacter = false;\n        }\n        const postfix = this.plain(insertTrailingCharacter ? \": \" : \" \");\n        return [pill, postfix];\n    }\n}\n\n// part creator that support auto complete for /commands,\n// used in SendMessageComposer\nexport class CommandPartCreator extends PartCreator {\n    public createPartForInput(text: string, partIndex: number): Part {\n        // at beginning and starts with /? create\n        if (partIndex === 0 && text[0] === \"/\") {\n            // text will be inserted by model, so pass empty string\n            return this.command(\"\");\n        } else {\n            return super.createPartForInput(text, partIndex);\n        }\n    }\n\n    public command(text: string): CommandPart {\n        return new CommandPart(text, this.autoCompleteCreator);\n    }\n\n    public deserializePart(part: SerializedPart): Part | undefined {\n        if (part.type === Type.Command) {\n            return this.command(part.text);\n        } else {\n            return super.deserializePart(part);\n        }\n    }\n}\n\nclass CommandPart extends PillCandidatePart {\n    public get type(): IPillCandidatePart[\"type\"] {\n        return Type.Command;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport DocumentOffset from \"./offset\";\nimport type EditorModel from \"./model\";\nimport { type Part } from \"./parts\";\n\nexport interface IPosition {\n    index: number;\n    offset: number;\n}\n\ntype Callback = (part: Part, startIdx: number, endIdx: number) => void;\nexport type Predicate = (index: number, offset: number, part: Part) => boolean;\n\nexport default class DocumentPosition implements IPosition {\n    public constructor(\n        public readonly index: number,\n        public readonly offset: number,\n    ) {}\n\n    public compare(otherPos: DocumentPosition): number {\n        if (this.index === otherPos.index) {\n            return this.offset - otherPos.offset;\n        } else {\n            return this.index - otherPos.index;\n        }\n    }\n\n    public iteratePartsBetween(other: DocumentPosition, model: EditorModel, callback: Callback): void {\n        if (this.index === -1 || other.index === -1) {\n            return;\n        }\n        const [startPos, endPos] = this.compare(other) < 0 ? [this, other] : [other, this];\n        if (startPos.index === endPos.index) {\n            callback(model.parts[this.index], startPos.offset, endPos.offset);\n        } else {\n            const firstPart = model.parts[startPos.index];\n            callback(firstPart, startPos.offset, firstPart.text.length);\n            for (let i = startPos.index + 1; i < endPos.index; ++i) {\n                const part = model.parts[i];\n                callback(part, 0, part.text.length);\n            }\n            const lastPart = model.parts[endPos.index];\n            callback(lastPart, 0, endPos.offset);\n        }\n    }\n\n    public forwardsWhile(model: EditorModel, predicate: Predicate): DocumentPosition {\n        if (this.index === -1) {\n            return this;\n        }\n\n        let { index, offset } = this;\n        const { parts } = model;\n        while (index < parts.length) {\n            const part = parts[index];\n            while (offset < part.text.length) {\n                if (!predicate(index, offset, part)) {\n                    return new DocumentPosition(index, offset);\n                }\n                offset += 1;\n            }\n            // end reached\n            if (index === parts.length - 1) {\n                return new DocumentPosition(index, offset);\n            } else {\n                index += 1;\n                offset = 0;\n            }\n        }\n\n        return this; // impossible but Typescript doesn't believe us\n    }\n\n    public backwardsWhile(model: EditorModel, predicate: Predicate): DocumentPosition {\n        if (this.index === -1) {\n            return this;\n        }\n\n        let { index, offset } = this;\n        const parts = model.parts;\n        while (index >= 0) {\n            const part = parts[index];\n            while (offset > 0) {\n                if (!predicate(index, offset - 1, part)) {\n                    return new DocumentPosition(index, offset);\n                }\n                offset -= 1;\n            }\n            // start reached\n            if (index === 0) {\n                return new DocumentPosition(index, offset);\n            } else {\n                index -= 1;\n                offset = parts[index].text.length;\n            }\n        }\n\n        return this; // impossible but Typescript doesn't believe us\n    }\n\n    public asOffset(model: EditorModel): DocumentOffset {\n        if (this.index === -1) {\n            return new DocumentOffset(0, true);\n        }\n        let offset = 0;\n        for (let i = 0; i < this.index; ++i) {\n            offset += model.parts[i].text.length;\n        }\n        offset += this.offset;\n        const lastPart = model.parts[this.index];\n        const atEnd = !lastPart || offset >= lastPart.text.length; // if no last part, we're at the end\n        return new DocumentOffset(offset, atEnd);\n    }\n\n    public isAtEnd(model: EditorModel): boolean {\n        if (model.parts.length === 0) {\n            return true;\n        }\n        const lastPartIdx = model.parts.length - 1;\n        const lastPart = model.parts[lastPartIdx];\n        return this.index === lastPartIdx && this.offset === lastPart.text.length;\n    }\n\n    public isAtStart(): boolean {\n        return this.index === 0 && this.offset === 0;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type EditorModel from \"./model\";\nimport { type Predicate } from \"./position\";\nimport type DocumentPosition from \"./position\";\nimport { type Part } from \"./parts\";\n\nconst whitespacePredicate: Predicate = (index, offset, part) => {\n    return part.text[offset].trim() === \"\";\n};\n\nexport default class Range {\n    private _start: DocumentPosition;\n    private _end: DocumentPosition;\n    private _lastStart: DocumentPosition;\n    private _initializedEmpty: boolean;\n\n    public constructor(\n        public readonly model: EditorModel,\n        positionA: DocumentPosition,\n        positionB = positionA,\n    ) {\n        const bIsLarger = positionA.compare(positionB) < 0;\n        this._start = bIsLarger ? positionA : positionB;\n        this._end = bIsLarger ? positionB : positionA;\n        this._lastStart = this._start;\n        this._initializedEmpty = this._start.index === this._end.index && this._start.offset == this._end.offset;\n    }\n\n    public moveStartForwards(delta: number): void {\n        this._start = this._start.forwardsWhile(this.model, () => {\n            delta -= 1;\n            return delta >= 0;\n        });\n    }\n\n    public wasInitializedEmpty(): boolean {\n        return this._initializedEmpty;\n    }\n\n    public setWasEmpty(value: boolean): void {\n        this._initializedEmpty = value;\n    }\n\n    public getLastStartingPosition(): DocumentPosition {\n        return this._lastStart;\n    }\n\n    public setLastStartingPosition(position: DocumentPosition): void {\n        this._lastStart = position;\n    }\n\n    public moveEndBackwards(delta: number): void {\n        this._end = this._end.backwardsWhile(this.model, () => {\n            delta -= 1;\n            return delta >= 0;\n        });\n    }\n\n    public trim(): void {\n        if (this.text.trim() === \"\") {\n            this._start = this._end;\n            return;\n        }\n        this._start = this._start.forwardsWhile(this.model, whitespacePredicate);\n        this._end = this._end.backwardsWhile(this.model, whitespacePredicate);\n    }\n\n    public expandBackwardsWhile(predicate: Predicate): void {\n        this._start = this._start.backwardsWhile(this.model, predicate);\n    }\n\n    public expandForwardsWhile(predicate: Predicate): void {\n        this._end = this._end.forwardsWhile(this.model, predicate);\n    }\n\n    public get text(): string {\n        let text = \"\";\n        this._start.iteratePartsBetween(this._end, this.model, (part, startIdx, endIdx) => {\n            const t = part.text.substring(startIdx, endIdx);\n            text = text + t;\n        });\n        return text;\n    }\n\n    /**\n     * Splits the model at the range boundaries and replaces with the given parts.\n     * Should be run inside a `model.transform()` callback.\n     * @param {Part[]} parts the parts to replace the range with\n     * @returns {Number} the net amount of characters added, can be negative.\n     */\n    public replace(parts: Part[]): number {\n        const newLength = parts.reduce((sum, part) => sum + part.text.length, 0);\n        let oldLength = 0;\n        this._start.iteratePartsBetween(this._end, this.model, (part, startIdx, endIdx) => {\n            oldLength += endIdx - startIdx;\n        });\n        this.model.replaceRange(this._start, this._end, parts);\n        return newLength - oldLength;\n    }\n\n    /**\n     * Returns a copy of the (partial) parts within the range.\n     * For partial parts, only the text is adjusted to the part that intersects with the range.\n     */\n    public get parts(): Part[] {\n        const parts: Part[] = [];\n        this._start.iteratePartsBetween(this._end, this.model, (part, startIdx, endIdx) => {\n            const serializedPart = part.serialize();\n            serializedPart.text = part.text.substring(startIdx, endIdx);\n            const newPart = this.model.partCreator.deserializePart(serializedPart);\n            if (newPart) parts.push(newPart);\n        });\n        return parts;\n    }\n\n    public get length(): number {\n        let len = 0;\n        this._start.iteratePartsBetween(this._end, this.model, (part, startIdx, endIdx) => {\n            len += endIdx - startIdx;\n        });\n        return len;\n    }\n\n    public get start(): DocumentPosition {\n        return this._start;\n    }\n\n    public get end(): DocumentPosition {\n        return this._end;\n    }\n}\n","/*\nCopyright 2019-2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Part, Type } from \"./parts\";\nimport type EditorModel from \"./model\";\n\nexport function needsCaretNodeBefore(part: Part, prevPart?: Part): boolean {\n    const isFirst = !prevPart || prevPart.type === Type.Newline;\n    return !part.acceptsCaret && (isFirst || !prevPart.acceptsCaret);\n}\n\nexport function needsCaretNodeAfter(part: Part, isLastOfLine: boolean): boolean {\n    return !part.acceptsCaret && isLastOfLine;\n}\n\nfunction insertAfter(node: ChildNode, nodeToInsert: ChildNode): void {\n    const next = node.nextSibling;\n    if (next) {\n        node.parentElement!.insertBefore(nodeToInsert, next);\n    } else {\n        node.parentElement!.appendChild(nodeToInsert);\n    }\n}\n\n// Use a BOM marker for caret nodes.\n// On a first test, they seem to be filtered out when copying text out of the editor,\n// but this could be platform dependent.\n// As a precautionary measure, I chose the character that slate also uses.\nexport const CARET_NODE_CHAR = \"\\ufeff\";\n// a caret node is a node that allows the caret to be placed\n// where otherwise it wouldn't be possible\n// (e.g. next to a pill span without adjacent text node)\nfunction createCaretNode(): HTMLElement {\n    const span = document.createElement(\"span\");\n    span.className = \"caretNode\";\n    span.appendChild(document.createTextNode(CARET_NODE_CHAR));\n    return span;\n}\n\nfunction updateCaretNode(node: ChildNode): void {\n    // ensure the caret node contains only a zero-width space\n    if (node.textContent !== CARET_NODE_CHAR) {\n        node.textContent = CARET_NODE_CHAR;\n    }\n}\n\nexport function isCaretNode(node?: Node | null): node is HTMLElement {\n    return !!node && node instanceof HTMLElement && node.tagName === \"SPAN\" && node.className === \"caretNode\";\n}\n\nfunction removeNextSiblings(node: ChildNode | null): void {\n    if (!node) {\n        return;\n    }\n    node = node.nextSibling;\n    while (node) {\n        const removeNode = node;\n        node = node.nextSibling;\n        removeNode.remove();\n    }\n}\n\nfunction removeChildren(parent: HTMLElement): void {\n    const firstChild = parent.firstChild;\n    if (firstChild) {\n        removeNextSiblings(firstChild);\n        firstChild.remove();\n    }\n}\n\nfunction reconcileLine(lineContainer: ChildNode, parts: Part[]): void {\n    let currentNode: ChildNode | null = null;\n    let prevPart: Part | undefined;\n    const lastPart = parts[parts.length - 1];\n\n    for (const part of parts) {\n        const isFirst = !prevPart;\n        currentNode = isFirst ? lineContainer.firstChild : currentNode!.nextSibling;\n\n        if (needsCaretNodeBefore(part, prevPart)) {\n            if (isCaretNode(currentNode as Element)) {\n                updateCaretNode(currentNode!);\n                currentNode = currentNode!.nextSibling;\n            } else {\n                lineContainer.insertBefore(createCaretNode(), currentNode);\n            }\n        }\n        // remove nodes until matching current part\n        while (currentNode && !part.canUpdateDOMNode(currentNode)) {\n            const nextNode = currentNode.nextSibling;\n            lineContainer.removeChild(currentNode);\n            currentNode = nextNode;\n        }\n        // update or insert node for current part\n        if (currentNode && part) {\n            part.updateDOMNode(currentNode);\n        } else if (part) {\n            currentNode = part.toDOMNode() as ChildNode;\n            // hooks up nextSibling for next iteration\n            lineContainer.appendChild(currentNode);\n        }\n\n        if (needsCaretNodeAfter(part, part === lastPart)) {\n            if (isCaretNode(currentNode?.nextSibling as Element)) {\n                currentNode = currentNode!.nextSibling;\n                updateCaretNode(currentNode as HTMLElement);\n            } else {\n                const caretNode = createCaretNode();\n                insertAfter(currentNode as HTMLElement, caretNode);\n                currentNode = caretNode;\n            }\n        }\n\n        prevPart = part;\n    }\n\n    removeNextSiblings(currentNode);\n}\n\nfunction reconcileEmptyLine(lineContainer: HTMLElement): void {\n    // empty div needs to have a BR in it to give it height\n    let foundBR = false;\n    let partNode = lineContainer.firstChild;\n    while (partNode) {\n        const nextNode = partNode.nextSibling;\n        if (!foundBR && (partNode as HTMLElement).tagName === \"BR\") {\n            foundBR = true;\n        } else {\n            partNode.remove();\n        }\n        partNode = nextNode;\n    }\n    if (!foundBR) {\n        lineContainer.appendChild(document.createElement(\"br\"));\n    }\n}\n\nexport function renderModel(editor: HTMLDivElement, model: EditorModel): void {\n    const lines = model.parts.reduce<Part[][]>(\n        (linesArr, part) => {\n            if (part.type === Type.Newline) {\n                linesArr.push([]);\n            } else {\n                const lastLine = linesArr[linesArr.length - 1];\n                lastLine.push(part);\n            }\n            return linesArr;\n        },\n        [[]],\n    );\n    lines.forEach((parts, i) => {\n        // find first (and remove anything else) div without className\n        // (as browsers insert these in contenteditable) line container\n        let lineContainer = editor.childNodes[i];\n        while (lineContainer && ((<Element>lineContainer).tagName !== \"DIV\" || !!(<Element>lineContainer).className)) {\n            editor.removeChild(lineContainer);\n            lineContainer = editor.childNodes[i];\n        }\n        if (!lineContainer) {\n            lineContainer = document.createElement(\"div\");\n            editor.appendChild(lineContainer);\n        }\n\n        if (parts.length) {\n            reconcileLine(lineContainer, parts);\n        } else {\n            reconcileEmptyLine(lineContainer as HTMLElement);\n        }\n    });\n    if (lines.length) {\n        removeNextSiblings(editor.children[lines.length - 1]);\n    } else {\n        removeChildren(editor);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 New Vector Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { encode } from \"html-entities\";\nimport escapeHtml from \"escape-html\";\n\nimport Markdown from \"../Markdown\";\nimport { makeGenericPermalink } from \"../utils/permalinks/Permalinks\";\nimport type EditorModel from \"./model\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport SdkConfig from \"../SdkConfig\";\nimport { Type } from \"./parts\";\n\nexport function mdSerialize(model: EditorModel): string {\n    return model.parts.reduce((html, part) => {\n        switch (part.type) {\n            case Type.Newline:\n                return html + \"\\n\";\n            case Type.Plain:\n            case Type.Emoji:\n            case Type.Command:\n            case Type.PillCandidate:\n            case Type.AtRoomPill:\n                return html + part.text;\n            case Type.RoomPill: {\n                const url = makeGenericPermalink(part.resourceId, true);\n                // Escape square brackets and backslashes\n                // Here we use the resourceId for compatibility with non-rich text clients\n                // See https://github.com/vector-im/element-web/issues/16660\n                const title = part.resourceId.replace(/[[\\\\\\]]/g, (c) => \"\\\\\" + c);\n                return html + `[${title}](${url})`;\n            }\n            case Type.UserPill: {\n                const url = makeGenericPermalink(part.resourceId, true);\n                // Escape square brackets and backslashes; convert newlines to HTML\n                const title = part.text.replace(/[[\\\\\\]]/g, (c) => \"\\\\\" + c).replace(/\\n/g, \"<br>\");\n                return html + `[${title}](${url})`;\n            }\n        }\n    }, \"\");\n}\n\ninterface ISerializeOpts {\n    forceHTML?: boolean;\n    useMarkdown?: boolean;\n}\n\nexport function htmlSerializeIfNeeded(\n    model: EditorModel,\n    { forceHTML = false, useMarkdown = true }: ISerializeOpts = {},\n): string | undefined {\n    if (!useMarkdown) {\n        return escapeHtml(textSerialize(model)).replace(/\\n/g, \"<br/>\");\n    }\n\n    const md = mdSerialize(model);\n    return htmlSerializeFromMdIfNeeded(md, { forceHTML });\n}\n\nexport function htmlSerializeFromMdIfNeeded(md: string, { forceHTML = false } = {}): string | undefined {\n    // copy of raw input to remove unwanted math later\n    const orig = md;\n\n    if (SettingsStore.getValue(\"feature_latex_maths\")) {\n        const patternNames = [\"tex\", \"latex\"] as const;\n        const patternTypes = [\"display\", \"inline\"] as const;\n        const patternDefaults = {\n            tex: {\n                // detect math with tex delimiters, inline: $...$, display $$...$$\n                // preferably use negative lookbehinds, not supported in all major browsers:\n                // const displayPattern = \"^(?<!\\\\\\\\)\\\\$\\\\$(?![ \\\\t])(([^$]|\\\\\\\\\\\\$)+?)\\\\$\\\\$$\";\n                // const inlinePattern = \"(?:^|\\\\s)(?<!\\\\\\\\)\\\\$(?!\\\\s)(([^$]|\\\\\\\\\\\\$)+?)(?<!\\\\\\\\|\\\\s)\\\\$\";\n\n                // conditions for display math detection $$...$$:\n                // - pattern starts and ends on a new line\n                // - left delimiter ($$) is not escaped by backslash\n                display: \"(^)\\\\$\\\\$(([^$]|\\\\\\\\\\\\$)+?)\\\\$\\\\$$\",\n\n                // conditions for inline math detection $...$:\n                // - pattern starts at beginning of line, follows whitespace character or punctuation\n                // - pattern is on a single line\n                // - left and right delimiters ($) are not escaped by backslashes\n                // - left delimiter is not followed by whitespace character\n                // - right delimiter is not prefixed with whitespace character\n                inline: \"(^|\\\\s|[.,!?:;])(?!\\\\\\\\)\\\\$(?!\\\\s)(([^$\\\\n]|\\\\\\\\\\\\$)*([^\\\\\\\\\\\\s\\\\$]|\\\\\\\\\\\\$)(?:\\\\\\\\\\\\$)?)\\\\$\",\n            },\n            latex: {\n                // detect math with latex delimiters, inline: \\(...\\), display \\[...\\]\n\n                // conditions for display math detection \\[...\\]:\n                // - pattern starts and ends on a new line\n                // - pattern is not empty\n                display: \"(^)\\\\\\\\\\\\[(?!\\\\\\\\\\\\])(.*?)\\\\\\\\\\\\]$\",\n\n                // conditions for inline math detection \\(...\\):\n                // - pattern starts at beginning of line or is not prefixed with backslash\n                // - pattern is not empty\n                inline: \"(^|[^\\\\\\\\])\\\\\\\\\\\\((?!\\\\\\\\\\\\))(.*?)\\\\\\\\\\\\)\",\n            },\n        };\n\n        patternNames.forEach(function (patternName) {\n            patternTypes.forEach(function (patternType) {\n                // get the regex replace pattern from config or use the default\n                const pattern =\n                    SdkConfig.get(\"latex_maths_delims\")?.[patternType]?.[\"pattern\"]?.[patternName] ||\n                    patternDefaults[patternName][patternType];\n\n                md = md.replace(RegExp(pattern, \"gms\"), function (m, p1, p2) {\n                    const p2e = encode(p2);\n                    switch (patternType) {\n                        case \"display\":\n                            return `${p1}<div data-mx-maths=\"${p2e}\">\\n\\n</div>\\n\\n`;\n                        case \"inline\":\n                            return `${p1}<span data-mx-maths=\"${p2e}\"></span>`;\n                    }\n                });\n            });\n        });\n\n        // make sure div tags always start on a new line, otherwise it will confuse the markdown parser\n        md = md.replace(/(.)<div/g, function (m, p1) {\n            return `${p1}\\n<div`;\n        });\n    }\n\n    const parser = new Markdown(md);\n    if (!parser.isPlainText() || forceHTML) {\n        // feed Markdown output to HTML parser\n        const phtml = new DOMParser().parseFromString(parser.toHTML(), \"text/html\");\n\n        if (SettingsStore.getValue(\"feature_latex_maths\")) {\n            // original Markdown without LaTeX replacements\n            const parserOrig = new Markdown(orig);\n            const phtmlOrig = new DOMParser().parseFromString(parserOrig.toHTML(), \"text/html\");\n\n            // since maths delimiters are handled before Markdown,\n            // code blocks could contain mangled content.\n            // replace code blocks with original content\n            [...phtmlOrig.getElementsByTagName(\"code\")].forEach((e, i) => {\n                phtml.getElementsByTagName(\"code\").item(i)!.textContent = e.textContent;\n            });\n\n            // add fallback output for latex math, which should not be interpreted as markdown\n            [...phtml.querySelectorAll(\"div, span\")].forEach((e, i) => {\n                const tex = e.getAttribute(\"data-mx-maths\");\n                if (tex) {\n                    e.innerHTML = `<code>${tex}</code>`;\n                }\n            });\n        }\n        return phtml.body.innerHTML;\n    }\n    // ensure removal of escape backslashes in non-Markdown messages\n    if (md.indexOf(\"\\\\\") > -1) {\n        return parser.toPlaintext();\n    }\n}\n\nexport function textSerialize(model: EditorModel): string {\n    return model.parts.reduce((text, part) => {\n        switch (part.type) {\n            case Type.Newline:\n                return text + \"\\n\";\n            case Type.Plain:\n            case Type.Emoji:\n            case Type.Command:\n            case Type.PillCandidate:\n            case Type.AtRoomPill:\n                return text + part.text;\n            case Type.RoomPill:\n                // Here we use the resourceId for compatibility with non-rich text clients\n                // See https://github.com/vector-im/element-web/issues/16660\n                return text + `${part.resourceId}`;\n            case Type.UserPill:\n                return text + `${part.text}`;\n        }\n    }, \"\");\n}\n\nexport function containsEmote(model: EditorModel): boolean {\n    const hasCommand = startsWith(model, \"/me \", false);\n    const hasArgument = model.parts[0]?.text?.length > 4 || model.parts.length > 1;\n    return hasCommand && hasArgument;\n}\n\nexport function startsWith(model: EditorModel, prefix: string, caseSensitive = true): boolean {\n    const firstPart = model.parts[0];\n    // part type will be \"plain\" while editing,\n    // and \"command\" while composing a message.\n    let text = firstPart?.text || \"\";\n    if (!caseSensitive) {\n        prefix = prefix.toLowerCase();\n        text = text.toLowerCase();\n    }\n\n    return firstPart && (firstPart.type === Type.Plain || firstPart.type === Type.Command) && text.startsWith(prefix);\n}\n\nexport function stripEmoteCommand(model: EditorModel): EditorModel {\n    // trim \"/me \"\n    return stripPrefix(model, \"/me \");\n}\n\nexport function stripPrefix(model: EditorModel, prefix: string): EditorModel {\n    model = model.clone();\n    model.removeText({ index: 0, offset: 0 }, prefix.length);\n    return model;\n}\n\nexport function unescapeMessage(model: EditorModel): EditorModel {\n    const { parts } = model;\n    if (parts.length) {\n        const firstPart = parts[0];\n        // only unescape \\/ to / at start of editor\n        if (firstPart.type === Type.Plain && firstPart.text.startsWith(\"\\\\/\")) {\n            model = model.clone();\n            model.removeText({ index: 0, offset: 0 }, 1);\n        }\n    }\n    return model;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 Nurjin Jafar\nCopyright 2020 Nordeck IT + Consulting GmbH.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { _t, _td } from \"../languageHandler\";\nimport { type Effect } from \"./effect.ts\";\n\n/**\n * This configuration defines room effects that can be triggered by custom message types and emojis\n */\nexport const CHAT_EFFECTS: Array<Effect> = [\n    {\n        emojis: [\"🎊\", \"🎉\"],\n        msgType: \"nic.custom.confetti\",\n        command: \"confetti\",\n        description: () => _td(\"chat_effects|confetti_description\"),\n        fallbackMessage: () => _t(\"chat_effects|confetti_message\") + \" 🎉\",\n        getRenderer: async () => {\n            const { default: Effect } = await import(\"./confetti/index.ts\");\n            return new Effect({\n                maxCount: 150,\n                speed: 3,\n                frameInterval: 15,\n                alpha: 1.0,\n                gradient: false,\n            });\n        },\n    },\n    {\n        emojis: [\"🎆\"],\n        msgType: \"nic.custom.fireworks\",\n        command: \"fireworks\",\n        description: () => _td(\"chat_effects|fireworks_description\"),\n        fallbackMessage: () => _t(\"chat_effects|fireworks_message\") + \" 🎆\",\n        getRenderer: async () => {\n            const { default: Effect } = await import(\"./fireworks/index.ts\");\n            return new Effect({\n                maxCount: 500,\n                gravity: 0.05,\n            });\n        },\n    },\n    {\n        emojis: [\"🌧️\", \"⛈️\", \"🌦️\"],\n        msgType: \"io.element.effect.rainfall\",\n        command: \"rainfall\",\n        description: () => _td(\"chat_effects|rainfall_description\"),\n        fallbackMessage: () => _t(\"chat_effects|rainfall_message\") + \" 🌧️\",\n        getRenderer: async () => {\n            const { default: Effect } = await import(\"./rainfall/index.ts\");\n            return new Effect({\n                maxCount: 600,\n                speed: 10,\n            });\n        },\n    },\n    {\n        emojis: [\"❄\", \"🌨\"],\n        msgType: \"io.element.effect.snowfall\",\n        command: \"snowfall\",\n        description: () => _td(\"chat_effects|snowfall_description\"),\n        fallbackMessage: () => _t(\"chat_effects|snowfall_message\") + \" ❄\",\n        getRenderer: async () => {\n            const { default: Effect } = await import(\"./snowfall/index.ts\");\n            return new Effect({\n                maxCount: 200,\n                gravity: 0.05,\n                maxDrift: 5,\n            });\n        },\n    },\n    {\n        emojis: [\"👾\", \"🌌\"],\n        msgType: \"io.element.effects.space_invaders\",\n        command: \"spaceinvaders\",\n        description: () => _td(\"chat_effects|spaceinvaders_description\"),\n        fallbackMessage: () => _t(\"chat_effects|spaceinvaders_message\") + \" 👾\",\n        getRenderer: async () => {\n            const { default: Effect } = await import(\"./spaceinvaders/index.ts\");\n            return new Effect({\n                maxCount: 50,\n                gravity: 0.01,\n            });\n        },\n    },\n    {\n        emojis: [\"💝\"],\n        msgType: \"io.element.effect.hearts\",\n        command: \"hearts\",\n        description: () => _td(\"chat_effects|hearts_description\"),\n        fallbackMessage: () => _t(\"chat_effects|hearts_message\") + \" 💝\",\n        getRenderer: async () => {\n            const { default: Effect } = await import(\"./hearts/index.ts\");\n            return new Effect({\n                maxCount: 120,\n                gravity: 3.2,\n            });\n        },\n    },\n];\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 Nurjin Jafar\nCopyright 2020 Nordeck IT + Consulting GmbH.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n */\n\nimport { type IContent } from \"matrix-js-sdk/src/matrix\";\n\n/**\n * Checks a message if it contains one of the provided emojis\n * @param  {Object} content The message\n * @param  {Array<string>} emojis The list of emojis to check for\n */\nexport const containsEmoji = (content: IContent, emojis: Array<string>): boolean => {\n    return emojis.some((emoji) => content.body && content.body.includes(emoji));\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\nCopyright 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n// Regexp based on Simpler Version from https://gist.github.com/gregseth/5582254 - matches RFC2822\nconst EMAIL_ADDRESS_REGEX = new RegExp(\n    \"^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*\" + // localpart\n        \"@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$\",\n    \"i\",\n);\n\nexport function looksValid(email: string): boolean {\n    // short circuit regex with this basic check\n    if (email.indexOf(\"@\") < 1) return false;\n\n    return EMAIL_ADDRESS_REGEX.test(email);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type FC } from \"react\";\nimport classNames from \"classnames\";\nimport { GroupIcon, VideoCallSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\n\ninterface Props {\n    text: string;\n    active: boolean;\n    participantCount: number;\n}\n\n/**\n * Summary line used to call out live, interactive content such as calls.\n */\nexport const LiveContentSummary: FC<Props> = ({ text, active, participantCount }) => (\n    <span className=\"mx_LiveContentSummary\">\n        <span\n            className={classNames(\"mx_LiveContentSummary_text\", {\n                mx_LiveContentSummary_text_active: active,\n            })}\n        >\n            <VideoCallSolidIcon />\n            {text}\n        </span>\n        {participantCount > 0 && (\n            <>\n                {\" • \"}\n                <span\n                    className=\"mx_LiveContentSummary_participants\"\n                    aria-label={_t(\"voip|n_people_joined\", { count: participantCount })}\n                >\n                    <GroupIcon />\n                    {participantCount}\n                </span>\n            </>\n        )}\n    </span>\n);\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type FC, useState, useEffect, memo } from \"react\";\nimport { type MatrixRTCSession } from \"matrix-js-sdk/src/matrixrtc\";\n\nimport { formatPreciseDuration } from \"../../../DateUtils\";\n\ninterface CallDurationProps {\n    delta: number;\n}\n\n/**\n * A call duration counter.\n */\nexport const CallDuration: FC<CallDurationProps> = memo(({ delta }) => {\n    // Clock desync could lead to a negative duration, so just hide it if that happens\n    if (delta <= 0) return null;\n    return <div className=\"mx_CallDuration\">{formatPreciseDuration(delta)}</div>;\n});\n\ninterface SessionDurationProps {\n    session: MatrixRTCSession | undefined;\n}\n\n/**\n * A call duration counter that automatically counts up, given a matrixRTC session\n * object.\n */\nexport const SessionDuration: FC<SessionDurationProps> = ({ session }) => {\n    const [now, setNow] = useState(() => Date.now());\n\n    useEffect(() => {\n        const timer = window.setInterval(() => setNow(Date.now()), 1000);\n        return () => clearInterval(timer);\n    }, []);\n\n    // This is a temporal solution.\n    // Using the oldest membership will update when this user leaves.\n    // This implies that the displayed call duration will also update consequently.\n    const createdTs = session?.getOldestMembership()?.createdTs();\n    return createdTs ? <CallDuration delta={now - createdTs} /> : <CallDuration delta={0} />;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type Ref, useCallback, useContext, useMemo, type JSX } from \"react\";\nimport { VideoCallSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport type { MatrixEvent, RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { ConnectionState, type ElementCall } from \"../../../models/Call\";\nimport { _t } from \"../../../languageHandler\";\nimport { useCall, useConnectionState, useParticipatingMembers } from \"../../../hooks/useCall\";\nimport defaultDispatcher from \"../../../dispatcher/dispatcher\";\nimport type { ViewRoomPayload } from \"../../../dispatcher/payloads/ViewRoomPayload\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport AccessibleButton, { type AccessibleButtonKind, type ButtonEvent } from \"../elements/AccessibleButton\";\nimport MemberAvatar from \"../avatars/MemberAvatar\";\nimport { LiveContentSummary } from \"../rooms/LiveContentSummary\";\nimport FacePile from \"../elements/FacePile\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { CallDuration, SessionDuration } from \"../voip/CallDuration\";\n\nconst MAX_FACES = 8;\n\ninterface ActiveCallEventProps {\n    mxEvent: MatrixEvent;\n    call: ElementCall | null;\n    participatingMembers: RoomMember[];\n    buttonText: string;\n    buttonKind: AccessibleButtonKind;\n    buttonDisabledTooltip?: string;\n    onButtonClick: ((ev: ButtonEvent) => void) | null;\n    ref?: Ref<HTMLDivElement>;\n}\n\nconst ActiveCallEvent = ({\n    mxEvent,\n    call,\n    participatingMembers,\n    buttonText,\n    buttonKind,\n    buttonDisabledTooltip,\n    onButtonClick,\n    ref,\n}: ActiveCallEventProps): JSX.Element => {\n    const senderName = useMemo(() => mxEvent.sender?.name ?? mxEvent.getSender(), [mxEvent]);\n\n    const facePileMembers = useMemo(() => participatingMembers.slice(0, MAX_FACES), [participatingMembers]);\n    const facePileOverflow = participatingMembers.length > facePileMembers.length;\n\n    return (\n        <div className=\"mx_CallEvent_wrapper\" ref={ref}>\n            <div className=\"mx_CallEvent mx_CallEvent_active\">\n                <MemberAvatar\n                    member={mxEvent.sender}\n                    fallbackUserId={mxEvent.getSender()}\n                    viewUserOnClick\n                    size=\"24px\"\n                />\n                <div className=\"mx_CallEvent_columns\">\n                    <div className=\"mx_CallEvent_details\">\n                        <span className=\"mx_CallEvent_title\">\n                            {_t(\"timeline|m.call|video_call_started_text\", { name: senderName })}\n                        </span>\n                        <LiveContentSummary\n                            text={_t(\"voip|video_call\")}\n                            active={false}\n                            participantCount={participatingMembers.length}\n                        />\n                        <FacePile members={facePileMembers} size=\"24px\" overflow={facePileOverflow} />\n                    </div>\n                    {call && <SessionDuration session={call.session} />}\n                    <AccessibleButton\n                        className=\"mx_CallEvent_button\"\n                        kind={buttonKind}\n                        disabled={onButtonClick === null || buttonDisabledTooltip !== undefined}\n                        onClick={onButtonClick}\n                        title={buttonDisabledTooltip}\n                    >\n                        {buttonText}\n                    </AccessibleButton>\n                </div>\n            </div>\n        </div>\n    );\n};\n\ninterface ActiveLoadedCallEventProps {\n    mxEvent: MatrixEvent;\n    call: ElementCall;\n    ref?: Ref<HTMLDivElement>;\n}\n\nconst ActiveLoadedCallEvent = ({ mxEvent, call, ref }: ActiveLoadedCallEventProps): JSX.Element => {\n    const connectionState = useConnectionState(call);\n    const participatingMembers = useParticipatingMembers(call);\n\n    const connect = useCallback(\n        (ev: ButtonEvent) => {\n            ev.preventDefault();\n            defaultDispatcher.dispatch<ViewRoomPayload>({\n                action: Action.ViewRoom,\n                room_id: mxEvent.getRoomId()!,\n                view_call: true,\n                metricsTrigger: undefined,\n            });\n        },\n        [mxEvent],\n    );\n\n    const disconnect = useCallback(\n        (ev: ButtonEvent) => {\n            ev.preventDefault();\n            call.disconnect();\n        },\n        [call],\n    );\n\n    const [buttonText, buttonKind, onButtonClick] = useMemo<\n        [string, AccessibleButtonKind, null | ((ev: ButtonEvent) => void)]\n    >(() => {\n        switch (connectionState) {\n            case ConnectionState.Disconnected:\n                return [_t(\"action|join\"), \"primary\", connect];\n            case ConnectionState.Connected:\n                return [_t(\"action|leave\"), \"danger\", disconnect];\n            case ConnectionState.Disconnecting:\n                return [_t(\"action|leave\"), \"danger\", null];\n        }\n    }, [connectionState, connect, disconnect]);\n\n    return (\n        <ActiveCallEvent\n            ref={ref}\n            mxEvent={mxEvent}\n            call={call}\n            participatingMembers={participatingMembers}\n            buttonText={buttonText}\n            buttonKind={buttonKind}\n            onButtonClick={onButtonClick}\n        />\n    );\n};\n\ninterface CallEventProps {\n    mxEvent: MatrixEvent;\n    ref?: Ref<HTMLDivElement>;\n}\n\n/**\n * An event tile representing an active or historical Element call.\n */\nexport const CallEvent = ({ mxEvent, ref }: CallEventProps): JSX.Element => {\n    const client = useContext(MatrixClientContext);\n    const call = useCall(mxEvent.getRoomId()!);\n    const latestEvent = client\n        .getRoom(mxEvent.getRoomId())!\n        .currentState.getStateEvents(mxEvent.getType(), mxEvent.getStateKey()!)!;\n\n    if (\"m.terminated\" in latestEvent.getContent() || latestEvent.isRedacted()) {\n        // The call is terminated\n        return (\n            <div className=\"mx_CallEvent_wrapper\" ref={ref}>\n                <div className=\"mx_CallEvent mx_CallEvent_inactive\">\n                    <div className=\"mx_CallEvent_columns\">\n                        <span className=\"mx_CallEvent_title\">\n                            <VideoCallSolidIcon />\n                            {_t(\"timeline|m.call|video_call_ended\")}\n                        </span>\n                        <CallDuration delta={latestEvent.getTs() - mxEvent.getTs()} />\n                    </div>\n                </div>\n            </div>\n        );\n    }\n\n    if (call === null) {\n        // There should be a call, but it hasn't loaded yet\n        return (\n            <ActiveCallEvent\n                ref={ref}\n                mxEvent={mxEvent}\n                call={null}\n                participatingMembers={[]}\n                buttonText={_t(\"action|join\")}\n                buttonKind=\"primary\"\n                onButtonClick={null}\n            />\n        );\n    }\n\n    return <ActiveLoadedCallEvent mxEvent={mxEvent} call={call as ElementCall} ref={ref} />;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2023 The Matrix.org Foundation C.I.C.\nCopyright 2018 New Vector Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, useCallback } from \"react\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type MatrixEvent, type Room, type RoomState } from \"matrix-js-sdk/src/matrix\";\nimport { ChatSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\nimport { EventTileBubble } from \"@element-hq/web-shared-components\";\n\nimport dis from \"../../../dispatcher/dispatcher\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport { RoomPermalinkCreator } from \"../../../utils/permalinks/Permalinks\";\nimport { _t } from \"../../../languageHandler\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport { type ViewRoomPayload } from \"../../../dispatcher/payloads/ViewRoomPayload\";\nimport { useRoomState } from \"../../../hooks/useRoomState\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport MatrixToPermalinkConstructor from \"../../../utils/permalinks/MatrixToPermalinkConstructor\";\nimport { useScopedRoomContext } from \"../../../contexts/ScopedRoomContext.tsx\";\n\ninterface IProps {\n    /** The m.room.create MatrixEvent that this tile represents */\n    mxEvent: MatrixEvent;\n    timestamp?: JSX.Element;\n}\n\n/**\n * A message tile showing that this room was created as an upgrade of a previous\n * room.\n */\nexport const RoomPredecessorTile: React.FC<IProps> = ({ mxEvent, timestamp }) => {\n    const msc3946ProcessDynamicPredecessor = SettingsStore.getValue(\"feature_dynamic_room_predecessors\");\n\n    // Note: we ask the room for its predecessor here, instead of directly using\n    // the information inside mxEvent. This allows us the flexibility later to\n    // use a different predecessor (e.g. through MSC3946) and still display it\n    // in the timeline location of the create event.\n    const roomContext = useScopedRoomContext(\"room\");\n    const predecessor = useRoomState(\n        roomContext.room,\n        useCallback(\n            (state: RoomState) => state.findPredecessor(msc3946ProcessDynamicPredecessor),\n            [msc3946ProcessDynamicPredecessor],\n        ),\n    );\n\n    const onLinkClicked = useCallback(\n        (e: React.MouseEvent): void => {\n            e.preventDefault();\n\n            dis.dispatch<ViewRoomPayload>({\n                action: Action.ViewRoom,\n                event_id: predecessor?.eventId,\n                highlighted: true,\n                room_id: predecessor?.roomId,\n                metricsTrigger: \"Predecessor\",\n                metricsViaKeyboard: e.type !== \"click\",\n            });\n        },\n        [predecessor?.eventId, predecessor?.roomId],\n    );\n\n    if (!roomContext.room || roomContext.room.roomId !== mxEvent.getRoomId()) {\n        logger.warn(\n            \"RoomPredecessorTile unexpectedly used outside of the context of the\" +\n                \"room containing this m.room.create event.\",\n        );\n        return <></>;\n    }\n\n    if (!predecessor) {\n        logger.warn(\"RoomPredecessorTile unexpectedly used in a room with no predecessor.\");\n        return <div />;\n    }\n\n    const prevRoom = MatrixClientPeg.safeGet().getRoom(predecessor.roomId);\n\n    // We need either the previous room, or some servers to find it with.\n    // Otherwise, we must bail out here\n    if (!prevRoom && !predecessor.viaServers) {\n        logger.warn(`Failed to find predecessor room with id ${predecessor.roomId}`);\n\n        const guessedLink = guessLinkForRoomId(predecessor.roomId);\n\n        return (\n            <EventTileBubble\n                icon={<ChatSolidIcon />}\n                className=\"mx_EventTileBubble mx_CreateEvent\"\n                title={_t(\"timeline|m.room.create|continuation\")}\n            >\n                <>\n                    <div className=\"mx_EventTile_body\">\n                        <span className=\"mx_EventTile_tileError\">\n                            {!!guessedLink ? (\n                                <>\n                                    {_t(\"timeline|m.room.create|unknown_predecessor_guess_server\", {\n                                        roomId: predecessor.roomId,\n                                    })}\n                                    <a href={guessedLink}>{guessedLink}</a>\n                                </>\n                            ) : (\n                                _t(\"timeline|m.room.create|unknown_predecessor\", {\n                                    roomId: predecessor.roomId,\n                                })\n                            )}\n                        </span>\n                    </div>\n                    {timestamp}\n                </>\n            </EventTileBubble>\n        );\n    }\n    // Otherwise, we expect to be able to find this room either because it is\n    // already loaded, or because we have via_servers that we can use.\n    // So we go ahead with rendering the tile.\n\n    const predecessorPermalink = prevRoom\n        ? createLinkWithRoom(prevRoom, predecessor.roomId, predecessor.eventId)\n        : createLinkWithoutRoom(predecessor.roomId, predecessor?.viaServers ?? [], predecessor.eventId);\n\n    const link = (\n        <a href={predecessorPermalink} onClick={onLinkClicked}>\n            {_t(\"timeline|m.room.create|see_older_messages\")}\n        </a>\n    );\n\n    return (\n        <EventTileBubble\n            icon={<ChatSolidIcon />}\n            className=\"mx_EventTileBubble mx_CreateEvent\"\n            title={_t(\"timeline|m.room.create|continuation\")}\n            subtitle={link}\n        >\n            {timestamp}\n        </EventTileBubble>\n    );\n\n    function createLinkWithRoom(room: Room, roomId: string, eventId?: string): string {\n        const permalinkCreator = new RoomPermalinkCreator(room, roomId);\n        permalinkCreator.load();\n        if (eventId) {\n            return permalinkCreator.forEvent(eventId);\n        } else {\n            return permalinkCreator.forRoom();\n        }\n    }\n\n    function createLinkWithoutRoom(roomId: string, viaServers: string[], eventId?: string): string {\n        const matrixToPermalinkConstructor = new MatrixToPermalinkConstructor();\n        if (eventId) {\n            return matrixToPermalinkConstructor.forEvent(roomId, eventId, viaServers);\n        } else {\n            return matrixToPermalinkConstructor.forRoom(roomId, viaServers);\n        }\n    }\n\n    /**\n     * Guess the permalink for a room based on its room ID.\n     *\n     * The spec says that Room IDs are opaque [1] so this can only ever be a\n     * guess. There is no guarantee that this room exists on this server.\n     *\n     * [1] https://spec.matrix.org/v1.5/appendices/#room-ids-and-event-ids\n     */\n    function guessLinkForRoomId(roomId: string): string | null {\n        const serverName = guessServerNameFromRoomId(roomId);\n        if (serverName) {\n            return new MatrixToPermalinkConstructor().forRoom(roomId, [serverName]);\n        } else {\n            return null;\n        }\n    }\n};\n\n/**\n * @internal Public for test only\n *\n * Guess the server name for a room based on its room ID.\n *\n * The spec says that Room IDs are opaque [1] so this can only ever be a\n * guess. There is no guarantee that this room exists on this server.\n *\n * [1] https://spec.matrix.org/v1.5/appendices/#room-ids-and-event-ids\n */\nexport function guessServerNameFromRoomId(roomId: string): string | null {\n    const m = roomId.match(/^[^:]*:(.*)/);\n    if (m) {\n        return m[1];\n    } else {\n        return null;\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type JSX } from \"react\";\nimport { type MatrixClient, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport {\n    BaseViewModel,\n    type MJitsiWidgetEventViewModel as MJitsiWidgetEventViewModelInterface,\n    type MJitsiWidgetEventViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\nimport { _t } from \"../../../../languageHandler\";\nimport WidgetStore, { type IApp } from \"../../../../stores/WidgetStore\";\nimport { UPDATE_EVENT } from \"../../../../stores/AsyncStore\";\nimport { WidgetLayoutStore } from \"../../../../stores/widgets/WidgetLayoutStore\";\n\nexport interface MJitsiWidgetEventViewModelProps {\n    /**\n     * Caller-provided client.\n     */\n    cli: MatrixClient;\n    /**\n     * Jitsi widget state event to derive tile state from.\n     */\n    mxEvent: MatrixEvent;\n    /**\n     * Optional timestamp element rendered in the tile footer slot.\n     */\n    timestamp?: JSX.Element;\n    /**\n     * Widget store used to resolve the widget referenced by the state event.\n     */\n    widgetStore?: WidgetStore;\n    /**\n     * Widget layout store used to resolve the current join prompt.\n     */\n    widgetLayoutStore?: WidgetLayoutStore;\n}\n\ntype InternalProps = Required<Pick<MJitsiWidgetEventViewModelProps, \"widgetStore\" | \"widgetLayoutStore\">> &\n    Omit<MJitsiWidgetEventViewModelProps, \"widgetStore\" | \"widgetLayoutStore\">;\n\n/**\n * ViewModel for Jitsi widget events.\n */\nexport class MJitsiWidgetEventViewModel\n    extends BaseViewModel<MJitsiWidgetEventViewSnapshot, InternalProps>\n    implements MJitsiWidgetEventViewModelInterface\n{\n    public constructor(props: MJitsiWidgetEventViewModelProps) {\n        const internalProps = {\n            ...props,\n            widgetStore: props.widgetStore ?? WidgetStore.instance,\n            widgetLayoutStore: props.widgetLayoutStore ?? WidgetLayoutStore.instance,\n        };\n\n        super(internalProps, MJitsiWidgetEventViewModel.computeSnapshot(internalProps));\n        this.trackStoreUpdates();\n    }\n\n    public setEvent(mxEvent: MatrixEvent): void {\n        this.props = { ...this.props, mxEvent };\n        this.updateSnapshotFromProps();\n    }\n\n    private trackStoreUpdates(): void {\n        const roomId = this.props.mxEvent.getRoomId();\n        const room = roomId ? this.props.cli.getRoom(roomId) : null;\n\n        this.disposables.trackListener(this.props.widgetStore, UPDATE_EVENT, (updatedRoomId?: unknown) => {\n            if (typeof updatedRoomId === \"string\" && updatedRoomId !== this.props.mxEvent.getRoomId()) return;\n            this.updateSnapshotFromProps();\n        });\n\n        if (roomId) {\n            this.disposables.trackListener(this.props.widgetStore, roomId, () => this.updateSnapshotFromProps());\n        }\n\n        if (room) {\n            this.disposables.trackListener(this.props.widgetLayoutStore, WidgetLayoutStore.emissionForRoom(room), () =>\n                this.updateSnapshotFromProps(),\n            );\n        }\n    }\n\n    private updateSnapshotFromProps(): void {\n        this.snapshot.merge(MJitsiWidgetEventViewModel.computeSnapshot(this.props));\n    }\n\n    private static computeSnapshot(props: InternalProps): MJitsiWidgetEventViewSnapshot {\n        const { mxEvent, timestamp } = props;\n        const roomId = mxEvent.getRoomId();\n        const room = roomId ? props.cli.getRoom(roomId) : null;\n\n        if (!room) {\n            return {\n                isVisible: false,\n                title: \"\",\n                subtitle: null,\n                timestamp,\n            };\n        }\n\n        const content = mxEvent.getContent<{ url?: string }>();\n        const prevContent = mxEvent.getPrevContent() as { url?: string };\n        const senderName = mxEvent.sender?.name || mxEvent.getSender() || \"\";\n        const widget = MJitsiWidgetEventViewModel.getWidget(props);\n        let subtitle: string | null = null;\n\n        if (content.url && widget) {\n            subtitle = props.widgetLayoutStore.isInContainer(room, widget, \"right\")\n                ? _t(\"timeline|m.widget|jitsi_join_right_prompt\")\n                : _t(\"timeline|m.widget|jitsi_join_top_prompt\");\n        }\n\n        if (!content.url) {\n            return {\n                isVisible: true,\n                title: _t(\"timeline|m.widget|jitsi_ended\", { senderName }),\n                subtitle: null,\n                timestamp,\n            };\n        }\n\n        if (prevContent.url) {\n            return {\n                isVisible: true,\n                title: _t(\"timeline|m.widget|jitsi_updated\", { senderName }),\n                subtitle,\n                timestamp,\n            };\n        }\n\n        return {\n            isVisible: true,\n            title: _t(\"timeline|m.widget|jitsi_started\", { senderName }),\n            subtitle,\n            timestamp,\n        };\n    }\n\n    private static getWidget(props: InternalProps): IApp | undefined {\n        const roomId = props.mxEvent.getRoomId();\n        const widgetId = props.mxEvent.getStateKey();\n\n        if (!roomId || widgetId === undefined) return undefined;\n\n        return props.widgetStore.getRoom(roomId, true).widgets.find((widget) => widget.id === widgetId);\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type JSX } from \"react\";\nimport { type MatrixClient, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport {\n    BaseViewModel,\n    type MKeyVerificationRequestViewModel as MKeyVerificationRequestViewModelInterface,\n    type MKeyVerificationRequestViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\nimport { _t } from \"../../../../languageHandler\";\nimport { getNameForEventRoom, userLabelForEventRoom } from \"../../../../utils/KeyVerificationStateObserver\";\n\ninterface MKeyVerificationRequestContent {\n    body?: string;\n    format?: string;\n    formatted_body?: string;\n    from_device: string;\n    methods: string[];\n    msgtype: \"m.key.verification.request\";\n    to: string;\n}\n\nexport interface MKeyVerificationRequestViewModelProps {\n    /**\n     * Caller-provided client.\n     */\n    cli: MatrixClient;\n    /**\n     * Verification request message event.\n     */\n    mxEvent: MatrixEvent;\n    /**\n     * Optional timestamp element rendered in the tile footer slot.\n     */\n    timestamp?: JSX.Element;\n}\n\n/**\n * ViewModel for key verification request message events.\n */\nexport class MKeyVerificationRequestViewModel\n    extends BaseViewModel<MKeyVerificationRequestViewSnapshot, MKeyVerificationRequestViewModelProps>\n    implements MKeyVerificationRequestViewModelInterface\n{\n    public constructor(props: MKeyVerificationRequestViewModelProps) {\n        super(props, MKeyVerificationRequestViewModel.computeSnapshot(props));\n    }\n\n    public setEvent(mxEvent: MatrixEvent): void {\n        this.props = { ...this.props, mxEvent };\n        this.updateSnapshotFromProps();\n    }\n\n    public setTimestamp(timestamp: JSX.Element | undefined): void {\n        this.props = { ...this.props, timestamp };\n        this.snapshot.merge({ timestamp });\n    }\n\n    private updateSnapshotFromProps(): void {\n        this.snapshot.merge(MKeyVerificationRequestViewModel.computeSnapshot(this.props));\n    }\n\n    private static computeSnapshot({\n        cli,\n        mxEvent,\n        timestamp,\n    }: MKeyVerificationRequestViewModelProps): MKeyVerificationRequestViewSnapshot {\n        const myUserId = cli.getSafeUserId();\n        const content = mxEvent.getContent<MKeyVerificationRequestContent>();\n        const sender = mxEvent.getSender();\n        const roomId = mxEvent.getRoomId();\n\n        if (!sender) {\n            throw new Error(\"Verification request did not include a sender!\");\n        }\n        if (!roomId) {\n            throw new Error(\"Verification request did not include a room ID!\");\n        }\n\n        if (sender === myUserId) {\n            return {\n                title: _t(\"timeline|m.key.verification.request|you_started\"),\n                subtitle: userLabelForEventRoom(cli, content.to, roomId),\n                timestamp,\n            };\n        }\n\n        const name = getNameForEventRoom(cli, sender, roomId);\n        return {\n            title: _t(\"timeline|m.key.verification.request|user_wants_to_verify\", { name }),\n            subtitle: userLabelForEventRoom(cli, sender, roomId),\n            timestamp,\n        };\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type MatrixClient, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { type RoomAvatarEventContent } from \"matrix-js-sdk/src/types\";\nimport {\n    BaseViewModel,\n    type RoomAvatarEventViewModel as RoomAvatarEventViewModelInterface,\n    type RoomAvatarEventViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\nimport { mediaFromMxc } from \"../../../../customisations/Media\";\nimport { _t } from \"../../../../languageHandler\";\nimport Modal from \"../../../../Modal\";\nimport ImageView from \"../../../../components/views/elements/ImageView\";\n\nexport interface RoomAvatarEventViewModelProps {\n    /**\n     * Caller-provided client.\n     */\n    cli: MatrixClient;\n    /**\n     * Room avatar state event.\n     */\n    mxEvent: MatrixEvent;\n}\n\n/**\n * ViewModel for room avatar state events.\n */\nexport class RoomAvatarEventViewModel\n    extends BaseViewModel<RoomAvatarEventViewSnapshot, RoomAvatarEventViewModelProps>\n    implements RoomAvatarEventViewModelInterface\n{\n    public constructor(props: RoomAvatarEventViewModelProps) {\n        super(props, RoomAvatarEventViewModel.computeSnapshot(props));\n    }\n\n    public setEvent(mxEvent: MatrixEvent): void {\n        this.props = { ...this.props, mxEvent };\n        this.updateSnapshotFromProps();\n    }\n\n    public onAvatarClick = (): void => {\n        const avatarUrl = RoomAvatarEventViewModel.getAvatarUrl(this.props.mxEvent);\n        if (!avatarUrl) return;\n\n        const httpUrl = mediaFromMxc(avatarUrl, this.props.cli).srcHttp;\n        if (!httpUrl) return;\n\n        Modal.createDialog(\n            ImageView,\n            {\n                src: httpUrl,\n                name: RoomAvatarEventViewModel.computeLightboxLabel(this.props),\n            },\n            \"mx_Dialog_lightbox\",\n            undefined,\n            true,\n        );\n    };\n\n    private updateSnapshotFromProps(): void {\n        this.snapshot.merge(RoomAvatarEventViewModel.computeSnapshot(this.props));\n    }\n\n    private static computeSnapshot(props: RoomAvatarEventViewModelProps): RoomAvatarEventViewSnapshot {\n        const avatarUrl = RoomAvatarEventViewModel.getAvatarUrl(props.mxEvent);\n        const senderDisplayName = RoomAvatarEventViewModel.getSenderDisplayName(props.mxEvent);\n        const roomName = RoomAvatarEventViewModel.getRoomName(props);\n\n        return {\n            senderDisplayName,\n            roomName,\n            avatarUrl,\n            lightboxLabel: RoomAvatarEventViewModel.computeLightboxLabel(props),\n            isRemoved: !avatarUrl,\n        };\n    }\n\n    private static computeLightboxLabel(props: RoomAvatarEventViewModelProps): string {\n        return _t(\"timeline|m.room.avatar|lightbox_title\", {\n            senderDisplayName: RoomAvatarEventViewModel.getSenderDisplayName(props.mxEvent),\n            roomName: RoomAvatarEventViewModel.getRoomName(props),\n        });\n    }\n\n    private static getSenderDisplayName(mxEvent: MatrixEvent): string {\n        return mxEvent.sender?.name || mxEvent.getSender() || \"\";\n    }\n\n    private static getRoomName({ cli, mxEvent }: RoomAvatarEventViewModelProps): string {\n        const roomId = mxEvent.getRoomId();\n        if (!roomId) return \"\";\n\n        return cli.getRoom(roomId)?.name ?? \"\";\n    }\n\n    private static getAvatarUrl(mxEvent: MatrixEvent): string | undefined {\n        const avatarUrl = mxEvent.getContent<RoomAvatarEventContent>().url;\n        if (!avatarUrl || avatarUrl.trim().length === 0) return undefined;\n\n        return avatarUrl;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { MatrixEventEvent } from \"matrix-js-sdk/src/matrix\";\nimport { type TextualEventViewSnapshot, BaseViewModel } from \"@element-hq/web-shared-components\";\n\nimport { type EventTileTypeProps } from \"../../../../events/EventTileFactory\";\nimport { MatrixClientPeg } from \"../../../../MatrixClientPeg\";\nimport { textForEvent } from \"../../../../TextForEvent\";\n\nexport class TextualEventViewModel extends BaseViewModel<TextualEventViewSnapshot, EventTileTypeProps> {\n    public constructor(props: EventTileTypeProps) {\n        super(props, { content: \"\" });\n        this.setTextFromEvent();\n        this.disposables.trackListener(this.props.mxEvent, MatrixEventEvent.SentinelUpdated, this.setTextFromEvent);\n    }\n\n    private setTextFromEvent = (): void => {\n        const content = textForEvent(this.props.mxEvent, MatrixClientPeg.safeGet(), true, this.props.showHiddenEvents);\n        this.snapshot.set({ content });\n    };\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport {\n    BaseViewModel,\n    type HiddenBodyViewModel as HiddenBodyViewModelInterface,\n    type HiddenBodyViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\nexport interface HiddenBodyViewModelProps {\n    /**\n     * The hidden event being rendered.\n     */\n    mxEvent: MatrixEvent;\n}\n\n/**\n * ViewModel for messages hidden pending moderation.\n */\nexport class HiddenBodyViewModel\n    extends BaseViewModel<HiddenBodyViewSnapshot, HiddenBodyViewModelProps>\n    implements HiddenBodyViewModelInterface\n{\n    private static readonly computeSnapshot = ({ mxEvent }: HiddenBodyViewModelProps): HiddenBodyViewSnapshot => {\n        const visibility = mxEvent.messageVisibility();\n\n        if (visibility.visible) {\n            throw new Error(\"HiddenBodyViewModel should only be applied to hidden messages\");\n        }\n\n        return {\n            reason: visibility.reason || undefined,\n        };\n    };\n\n    public constructor(props: HiddenBodyViewModelProps) {\n        super(props, HiddenBodyViewModel.computeSnapshot(props));\n    }\n\n    public setEvent(mxEvent: MatrixEvent): void {\n        this.props.mxEvent = mxEvent;\n        this.snapshot.merge(HiddenBodyViewModel.computeSnapshot(this.props));\n    }\n}\n","/*\nCopyright 2026 Element Creations Ltd.\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MouseEvent } from \"react\";\nimport { type MatrixClient, type MatrixEvent, MatrixEventEvent } from \"matrix-js-sdk/src/matrix\";\nimport {\n    BaseViewModel,\n    Disposables,\n    type ViewSourceEventViewModel as ViewSourceEventViewModelInterface,\n    type ViewSourceEventViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\nexport interface ViewSourceEventViewModelProps {\n    /**\n     * The hidden event whose source is being rendered.\n     */\n    mxEvent: MatrixEvent;\n    /**\n     * Matrix client used to request decryption before rendering event source.\n     */\n    cli: MatrixClient;\n}\n\n/**\n * ViewModel for hidden event source rendering.\n */\nexport class ViewSourceEventViewModel\n    extends BaseViewModel<ViewSourceEventViewSnapshot, ViewSourceEventViewModelProps>\n    implements ViewSourceEventViewModelInterface\n{\n    private decryptionListenerDisposables?: Disposables;\n\n    private static computeSnapshot(\n        { mxEvent }: ViewSourceEventViewModelProps,\n        expanded: boolean,\n    ): ViewSourceEventViewSnapshot {\n        return {\n            expanded,\n            preview: `{ \"type\": ${mxEvent.getType()} }`,\n            source: expanded ? ViewSourceEventViewModel.computeSource(mxEvent) : \"\",\n        };\n    }\n\n    private static computeSource(mxEvent: MatrixEvent): string {\n        return JSON.stringify(mxEvent, null, 4) ?? \"\";\n    }\n\n    public constructor(props: ViewSourceEventViewModelProps) {\n        super(props, ViewSourceEventViewModel.computeSnapshot(props, false));\n        this.disposables.track(() => this.removeDecryptionListener());\n        this.setupDecryptionListener();\n    }\n\n    public setProps(newProps: Partial<ViewSourceEventViewModelProps>): void {\n        const nextProps = { ...this.props, ...newProps };\n        const eventChanged = this.props.mxEvent !== nextProps.mxEvent;\n        const clientChanged = this.props.cli !== nextProps.cli;\n\n        if (!eventChanged && !clientChanged) return;\n\n        this.props = nextProps;\n\n        this.setupDecryptionListener();\n\n        if (eventChanged) {\n            this.updateSnapshotFromProps();\n        }\n    }\n\n    public onToggle = (event: MouseEvent<HTMLButtonElement>): void => {\n        event.preventDefault();\n\n        const expanded = !this.snapshot.current.expanded;\n        this.snapshot.merge({\n            expanded,\n            source: expanded ? ViewSourceEventViewModel.computeSource(this.props.mxEvent) : \"\",\n        });\n    };\n\n    private updateSnapshotFromProps(): void {\n        this.snapshot.merge(ViewSourceEventViewModel.computeSnapshot(this.props, this.snapshot.current.expanded));\n    }\n\n    private setupDecryptionListener(): void {\n        this.removeDecryptionListener();\n\n        const { cli, mxEvent } = this.props;\n        cli.decryptEventIfNeeded(mxEvent);\n\n        if (!mxEvent.isBeingDecrypted()) return;\n\n        const onDecrypted = (): void => {\n            this.removeDecryptionListener();\n            if (this.props.mxEvent !== mxEvent) return;\n\n            this.updateSnapshotFromProps();\n        };\n\n        this.decryptionListenerDisposables = new Disposables();\n        this.decryptionListenerDisposables.trackListener(mxEvent, MatrixEventEvent.Decrypted, onDecrypted);\n    }\n\n    private removeDecryptionListener(): void {\n        this.decryptionListenerDisposables?.dispose();\n        this.decryptionListenerDisposables = undefined;\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { BaseViewModel, type MemberAvatarViewSnapshot } from \"@element-hq/web-shared-components\";\nimport { type MatrixClient, RoomStateEvent, type RoomMember } from \"matrix-js-sdk/src/matrix\";\n\nimport UserIdentifierCustomisations from \"../../../customisations/UserIdentifier\";\nimport { mediaFromMxc } from \"../../../customisations/Media\";\n\ninterface Props {\n    /**\n     * The size of the avatar in pixels, eg: 20.\n     */\n    size: number;\n    /**\n     * The room member for this avatar.\n     */\n    member: RoomMember;\n\n    /**\n     * MatrixClient object to access js-sdk.\n     */\n    cli: MatrixClient;\n}\n\nfunction computeSnapshot(props: Props): MemberAvatarViewSnapshot {\n    const size = props.size;\n    const member = props.member;\n    const id = member.userId;\n    const name = member.name ?? member.userId;\n    const title =\n        UserIdentifierCustomisations.getDisplayUserIdentifier(member.userId ?? \"\", {\n            roomId: member.roomId ?? \"\",\n        }) ?? member.userId;\n    let url: string | undefined;\n    if (member.getMxcAvatarUrl()) {\n        url =\n            mediaFromMxc(member.getMxcAvatarUrl() ?? \"\", props.cli).getThumbnailOfSourceHttp(size, size, \"crop\") ??\n            undefined;\n    }\n    return {\n        name,\n        id,\n        url,\n        size: `${size}px`,\n        title,\n    };\n}\n\n/**\n * A view-model for rendering the avatar for a given room member.\n */\nexport class MemberAvatarViewModel extends BaseViewModel<MemberAvatarViewSnapshot, Props> {\n    public constructor(props: Props) {\n        super(props, computeSnapshot(props));\n        const roomId = props.member.roomId;\n        const room = props.cli.getRoom(roomId);\n        if (room) {\n            this.disposables.trackListener(room, RoomStateEvent.Members, this.onUpdate as (...args: unknown[]) => void);\n        }\n    }\n\n    private onUpdate = (event: unknown, state: unknown, member: RoomMember): void => {\n        if (member.userId === this.props.member.userId) {\n            const newSnapshot = computeSnapshot(this.props);\n            this.snapshot.set(newSnapshot);\n        }\n    };\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { BaseViewModel, type FacePileViewSnapshot } from \"@element-hq/web-shared-components\";\nimport { type MatrixClient, type RoomMember } from \"matrix-js-sdk/src/matrix\";\n\nimport { MemberAvatarViewModel } from \"./MemberAvatarViewModel\";\n\ninterface Props {\n    /**\n     * The size of each avatar in the face-pile in pixels, eg: 20.\n     */\n    size: number;\n    /**\n     * List of room-members from which to render the face-pile..\n     */\n    members: RoomMember[];\n\n    /**\n     * MatrixClient object to access js-sdk.\n     */\n    cli: MatrixClient;\n}\n\n/**\n * View model for rendering face-piles.\n */\nexport class FacePileViewModel extends BaseViewModel<FacePileViewSnapshot, Props> {\n    private viewModelMap: Set<MemberAvatarViewModel> = new Set();\n\n    public constructor(props: Props) {\n        super(props, { memberAvatarViewModels: [] });\n        this.computeSnapshot();\n    }\n\n    private computeSnapshot(): void {\n        for (const vm of this.viewModelMap.values()) {\n            vm.dispose();\n        }\n        this.viewModelMap = new Set();\n        const members = this.props.members.slice(0, 3);\n        for (const member of members) {\n            const vm = this.disposables.track(\n                new MemberAvatarViewModel({ size: this.props.size, member, cli: this.props.cli }),\n            );\n            this.viewModelMap.add(vm);\n        }\n        this.snapshot.set({ memberAvatarViewModels: Array.from(this.viewModelMap.values()) });\n    }\n\n    /**\n     * Update the room-members from which the face-pile is rendered.\n     * @param newMembers The list of new room members\n     */\n    public updateMembers(newMembers: RoomMember[]): void {\n        this.props.members = newMembers;\n        this.computeSnapshot();\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { CallType } from \"@element-hq/web-shared-components\";\nimport { EventType, RelationType, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { type IRTCNotificationContent } from \"matrix-js-sdk/src/matrixrtc\";\n\nimport { type GetRelationsForEvent } from \"../../../../../components/views/rooms/EventTile\";\n\n/**\n * Find the call intent from a given rtc notification event.\n * @param event Rtc notification event\n */\nexport function getIntentFromEvent(event: MatrixEvent): CallType {\n    const content = event.getContent<IRTCNotificationContent>();\n    const intentInContent = content[\"m.call.intent\"];\n    switch (intentInContent) {\n        case \"audio\":\n            return CallType.Voice;\n        case \"video\":\n        default:\n            return CallType.Video;\n    }\n}\n\n/**\n * Get all declined events that is related to the given rtc notification event.\n * @param event rtc notification event\n */\nexport function getDeclinedEvents(\n    event: MatrixEvent,\n    getRelationsForEvent?: GetRelationsForEvent,\n): MatrixEvent[] | null {\n    const eventId = event.getId();\n    if (eventId && getRelationsForEvent) {\n        const relations = getRelationsForEvent(eventId, RelationType.Reference, EventType.RTCDecline)?.getRelations();\n        if (relations) return relations;\n    }\n    return null;\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { BaseViewModel, type DurationViewSnapshot } from \"@element-hq/web-shared-components\";\n\ninterface Props {\n    /**\n     * The timestamp of when this call started.\n     */\n    callStartTs: number;\n}\n\n/**\n * Get the duration of the call in seconds\n * @param timestamp The timestamp at which the call started\n */\nfunction getDurationInSeconds(timestamp: number): number {\n    const durationInMs = Date.now() - timestamp;\n    const durationInSeconds = Math.floor(durationInMs * 0.001);\n    return durationInSeconds;\n}\n\n/**\n * View model for showing the duration of an ongoing call.\n */\nexport class DurationViewModel extends BaseViewModel<DurationViewSnapshot, Props> {\n    public constructor(props: Props) {\n        super(props, { duration: getDurationInSeconds(props.callStartTs) });\n        this.setupInterval();\n    }\n\n    /**\n     * Update the duration every second.\n     */\n    private setupInterval(): void {\n        const intervalRef = setInterval(() => {\n            this.snapshot.set({ duration: getDurationInSeconds(this.props.callStartTs) });\n        }, 1000);\n        this.disposables.track(() => {\n            clearInterval(intervalRef);\n        });\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport {\n    BaseViewModel,\n    CallDirection,\n    CallType as SharedComponentsCallType,\n    type CommonOngoingCallTileViewSnapshot,\n} from \"@element-hq/web-shared-components\";\nimport {\n    EventTimeline,\n    EventType,\n    type RoomMember,\n    type MatrixEvent,\n    type MatrixClient,\n} from \"matrix-js-sdk/src/matrix\";\nimport { CallType } from \"matrix-js-sdk/src/webrtc/call\";\n\nimport { type CallStore } from \"../../../../../../../stores/CallStore\";\nimport { MemberAvatarViewModel } from \"../../../../../../../components/viewmodels/avatars/MemberAvatarViewModel\";\nimport { FacePileViewModel } from \"../../../../../../../components/viewmodels/avatars/FacePileViewModel\";\nimport { CallEvent, type ElementCall } from \"../../../../../../../models/Call\";\nimport { placeCall } from \"../../../../../../../utils/room/placeCall\";\nimport { PlatformCallType } from \"../../../../../../../hooks/room/useRoomCall\";\nimport { type GetRelationsForEvent } from \"../../../../../../../components/views/rooms/EventTile\";\nimport { getIntentFromEvent } from \"../../common\";\nimport { DurationViewModel } from \"./components/DurationViewModel\";\nimport type LegacyCallHandler from \"../../../../../../../LegacyCallHandler.tsx\";\n\nexport interface Props {\n    /**\n     * The id of the room.\n     */\n    roomId: string;\n    /**\n     * Event of type `org.matrix.msc4075.rtc.notification`.\n     */\n    mxEvent: MatrixEvent;\n    /**\n     * Helper to fetch related events from a given event.\n     */\n    getRelationsForEvent?: GetRelationsForEvent;\n    /**\n     * The {@link MatrixClient} object to access js-sdk API.\n     */\n    cli: MatrixClient;\n    /**\n     * {@link CallStore} to access calls in a room.\n     */\n    callStore: CallStore;\n    /**\n     * {@link LegacyCallHandler} to handle calls in a room.\n     */\n    legacyCallHandler: LegacyCallHandler;\n}\n\nfunction getCallOrThrow(store: CallStore, roomId: string): ElementCall {\n    const call = store.getCall(roomId);\n    if (!call) {\n        throw new Error(`No call in room ${roomId}`);\n    }\n    return call as ElementCall;\n}\n\n/**\n * Whether this call has participants other than who started the call.\n */\nfunction doesCallHaveOtherParticipants(notificationEvent: MatrixEvent, participants: RoomMember[]): boolean {\n    return Array.from(participants).some((participant) => participant.userId !== notificationEvent.sender?.userId);\n}\n\nfunction computeSnapshot(props: Props): CommonOngoingCallTileViewSnapshot {\n    const mxEvent = props.mxEvent;\n    const callStore = props.callStore;\n    const cli = props.cli;\n    const roomId = mxEvent.getRoomId();\n    if (!roomId) {\n        throw new Error(\"RTCNotification event has no room associated with it!\");\n    }\n\n    // Get the call in the room\n    const call = getCallOrThrow(callStore, roomId);\n\n    // Find the mx-id of the user who started this call\n    const startedUserId = mxEvent.getSender();\n    if (!startedUserId) {\n        throw new Error(\"RTCNotification event has no sender associated with it!\");\n    }\n\n    // Get room-member from mx-id\n    const participants = Array.from(call.participants.keys());\n    const callHasOtherParticipants = doesCallHaveOtherParticipants(props.mxEvent, participants);\n\n    const room = cli.getRoom(roomId);\n    if (!room) {\n        throw new Error(`Cannot find room ${roomId}`);\n    }\n\n    const startedMember = mxEvent.sender;\n    if (!startedMember) {\n        // This should never happen but just to be safe ...\n        throw new Error(\"Event does not have a sender!\");\n    }\n    const startedByDisplayName = startedMember.name;\n\n    // We know we're joined to this call if there's an active call in the room\n    const isJoined = !!callStore.getActiveCall(roomId);\n\n    const callDirection = cli.getUserId() === startedUserId ? CallDirection.Outgoing : CallDirection.Incoming;\n\n    // Create the avatar vms\n    const facePileViewModel = new FacePileViewModel({ size: 20, members: participants, cli });\n    const memberAvatarViewModel = new MemberAvatarViewModel({ member: startedMember, size: 20, cli });\n\n    const isJoinable = !!room\n        .getLiveTimeline()\n        .getState(EventTimeline.FORWARDS)\n        ?.mayClientSendStateEvent(EventType.GroupCallMemberPrefix, room.client);\n\n    const callStartTs = call.session.getOldestMembership()?.createdTs();\n    let durationViewModel: DurationViewModel | undefined;\n    if (callStartTs) {\n        durationViewModel = new DurationViewModel({ callStartTs });\n    }\n\n    return {\n        startedByDisplayName,\n        isJoined,\n        isJoinable,\n        facePileViewModel,\n        memberAvatarViewModel,\n        callDirection,\n        durationViewModel,\n        callHasOtherParticipants,\n    };\n}\n\n/**\n * A base view model for an ongoing call in the timeline.\n */\nexport class BaseOngoingCallViewModel<\n    T extends CommonOngoingCallTileViewSnapshot = CommonOngoingCallTileViewSnapshot,\n> extends BaseViewModel<T, Props> {\n    public constructor(props: Props, extraSnapshot: Partial<T> = {}) {\n        const snapshot = { ...computeSnapshot(props), ...extraSnapshot };\n        super(props, snapshot as T);\n        this.disposables.track(snapshot.facePileViewModel as BaseViewModel<unknown, unknown>);\n        this.disposables.track(snapshot.memberAvatarViewModel as BaseViewModel<unknown, unknown>);\n        this.setupListener();\n    }\n\n    private setupListener(): void {\n        const call = getCallOrThrow(this.props.callStore, this.props.roomId);\n        this.disposables.trackListener(call, CallEvent.Participants, ((participants: Map<RoomMember, Set<string>>) => {\n            this.onParticipantsChange(participants);\n        }) as (...args: unknown[]) => void);\n    }\n\n    /**\n     * Join the call associated with this tile.\n     * @param event The button click event\n     */\n    public join(event?: React.MouseEvent<HTMLButtonElement>): void {\n        const roomId = this.props.roomId;\n        const room = this.props.cli.getRoom(roomId);\n        if (!room) {\n            throw new Error(`Cannot find room ${roomId}`);\n        }\n        const callType = getIntentFromEvent(this.props.mxEvent);\n        const type = callType === SharedComponentsCallType.Voice ? CallType.Voice : CallType.Video;\n        placeCall(\n            this.props.legacyCallHandler,\n            room,\n            type,\n            PlatformCallType.ElementCall,\n            event?.shiftKey || undefined,\n            type === CallType.Voice,\n        );\n    }\n\n    /**\n     * Recomputes the snapshot when the call participants are updated.\n     */\n    protected onParticipantsChange(participants: Map<RoomMember, Set<string>>, extraSnapshot: Partial<T> = {}): void {\n        const roomId = this.props.roomId;\n        const isJoined = !!this.props.callStore.getActiveCall(roomId);\n        const members = Array.from(participants.keys());\n        const callHasOtherParticipants = doesCallHaveOtherParticipants(this.props.mxEvent, members);\n        (this.getSnapshot().facePileViewModel as FacePileViewModel).updateMembers(members);\n        this.snapshot.merge({ isJoined, callHasOtherParticipants, ...extraSnapshot } as Partial<T>);\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport {\n    type CommonOngoingCallTileViewAction,\n    type RoomOngoingCallTileViewSnapshot,\n} from \"@element-hq/web-shared-components\";\nimport { MatrixEventEvent, type MatrixEvent, type RoomMember, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { type Props, BaseOngoingCallViewModel } from \"./BaseOngoingCallTileViewModel\";\nimport { getDeclinedEvents } from \"../../common\";\nimport { type GetRelationsForEvent } from \"../../../../../../../components/views/rooms/EventTile\";\n\n/**\n * Check if this call is declined by our user.\n */\nfunction isCallDeclinedByOwnUser(\n    notificationEvent: MatrixEvent,\n    getRelationsForEvent: GetRelationsForEvent | undefined,\n    cli: MatrixClient,\n): boolean {\n    const declinedEvents = getDeclinedEvents(notificationEvent, getRelationsForEvent);\n    const ownUserId = cli.getUserId();\n    return declinedEvents?.some((event) => event.getSender() === ownUserId) ?? false;\n}\n\n/**\n * View model for an ongoing call in a non DM room.\n */\nexport class RoomOngoingCallTileViewModel\n    extends BaseOngoingCallViewModel<RoomOngoingCallTileViewSnapshot>\n    implements CommonOngoingCallTileViewAction\n{\n    public constructor(props: Props) {\n        // Get the call in the room\n        const call = props.callStore.getCall(props.roomId);\n        if (!call) {\n            throw new Error(`No call in room ${props.roomId}`);\n        }\n        const totalParticipants = call.participants.size;\n        const isCallDeclined = isCallDeclinedByOwnUser(props.mxEvent, props.getRelationsForEvent, props.cli);\n        super(props, { totalParticipants, isCallIgnored: isCallDeclined });\n\n        // When a relation is added to the event, recompute the state.\n        this.disposables.trackListener(props.mxEvent, MatrixEventEvent.RelationsCreated, () => {\n            this.onRelationsCreated();\n        });\n    }\n\n    /**\n     * Recompute the snapshot when a relation is added to the notification event.\n     * We do this so that we know if our user has declined (ignored) this call.\n     */\n    private onRelationsCreated(): void {\n        const isCallIgnored = isCallDeclinedByOwnUser(\n            this.props.mxEvent,\n            this.props.getRelationsForEvent,\n            this.props.cli,\n        );\n        this.snapshot.merge({ isCallIgnored });\n    }\n\n    protected onParticipantsChange(participants: Map<RoomMember, Set<string>>): void {\n        const totalParticipants = participants.size;\n        super.onParticipantsChange(participants, { totalParticipants });\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport {\n    type CommonOngoingCallTileViewAction,\n    type DmOngoingCallTileViewSnapshot,\n} from \"@element-hq/web-shared-components\";\n\nimport { type Props, BaseOngoingCallViewModel } from \"./BaseOngoingCallTileViewModel\";\nimport { getIntentFromEvent } from \"../../common\";\n\n/**\n * View model for an ongoing call in a DM room.\n */\nexport class DmOngoingCallTileViewModel\n    extends BaseOngoingCallViewModel<DmOngoingCallTileViewSnapshot>\n    implements CommonOngoingCallTileViewAction\n{\n    public constructor(props: Props) {\n        const callType = getIntentFromEvent(props.mxEvent);\n        super(props, { callType });\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\nimport { EventType, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { type IRTCNotificationContent } from \"matrix-js-sdk/src/matrixrtc\";\n\nimport { formatTime } from \"../../../../../../../DateUtils\";\n\nfunction getTs(event: MatrixEvent): number {\n    if (event.getType() === EventType.RTCNotification) {\n        /**\n         * According to the spec:\n         * Receivers SHOULD use origin_server_ts if |sender_ts - origin_server_ts| > 20000 ms.\n         */\n        const content = event.getContent<IRTCNotificationContent>();\n        const senderTs = content[\"sender_ts\"];\n        const originServerTs = event.getTs();\n        const ts = Math.abs(senderTs - originServerTs) > 20000 ? originServerTs : senderTs;\n        return ts;\n    } else return event.getTs();\n}\n\n/**\n * Get the time at which a call took place from a given rtc notification event.\n * @param event The notification event\n * @param showTwelveHour Whether the time is to be shown in 12 hour format\n * @returns A formatted time string\n */\nexport function getTimeFromEvent(event: MatrixEvent, showTwelveHour: boolean): string {\n    const ts = getTs(event);\n    const date = new Date(ts);\n    const timestamp = formatTime(date, showTwelveHour);\n    return timestamp;\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { BaseViewModel, type RoomTombstoneCallTileViewSnapshot } from \"@element-hq/web-shared-components\";\nimport { type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport SettingsStore from \"../../../../../../../settings/SettingsStore\";\nimport defaultDispatcher from \"../../../../../../../dispatcher/dispatcher\";\nimport type { SettingUpdatedPayload } from \"../../../../../../../dispatcher/payloads/SettingUpdatedPayload\";\nimport type { ActionPayload } from \"../../../../../../../dispatcher/payloads\";\nimport { Action } from \"../../../../../../../dispatcher/actions\";\nimport type { GetRelationsForEvent } from \"../../../../../../../components/views/rooms/EventTile\";\nimport { getTimeFromEvent } from \"./common\";\n\nexport interface RoomTombstoneCallTileViewModelProps {\n    /**\n     * Event of type `org.matrix.msc4075.rtc.notification`.\n     */\n    mxEvent: MatrixEvent;\n    /**\n     * Helper to fetch related events from a given event.\n     */\n    getRelationsForEvent?: GetRelationsForEvent;\n}\n\nfunction generateSnapshot(event: MatrixEvent): RoomTombstoneCallTileViewSnapshot {\n    const showTwelveHour = SettingsStore.getValue(\"showTwelveHourTimestamps\");\n    const timestamp = getTimeFromEvent(event, showTwelveHour);\n    return { timestamp };\n}\n\nfunction isSettingsChangedPayload(payload: ActionPayload): payload is SettingUpdatedPayload {\n    return payload.action === Action.SettingUpdated;\n}\n\n/**\n * View model for a tombstone call in a room.\n */\nexport class RoomTombstoneCallTileViewModel<\n    T extends RoomTombstoneCallTileViewSnapshot = RoomTombstoneCallTileViewSnapshot,\n    P extends RoomTombstoneCallTileViewModelProps = RoomTombstoneCallTileViewModelProps,\n> extends BaseViewModel<T, P> {\n    public constructor(props: P, extraSnapshot: Partial<T> = {}) {\n        const snapshot = { ...generateSnapshot(props.mxEvent), ...extraSnapshot };\n        super(props, snapshot as T);\n\n        // Listen to the changes on settings so that we can update the timestamp format (12H vs 24H).\n        SettingsStore.monitorSetting(\"showTwelveHourTimestamps\", null);\n        const token = defaultDispatcher.register(this.onAction);\n        this.disposables.track(() => {\n            defaultDispatcher.unregister(token);\n        });\n    }\n\n    private onAction = (payload: ActionPayload): void => {\n        if (!isSettingsChangedPayload(payload) || payload.settingName !== \"showTwelveHourTimestamps\") return;\n        const showTwelveHour = (payload.newValue as boolean) ?? false;\n        const timestamp = this.getTimestamp(showTwelveHour);\n        this.snapshot.merge({ timestamp } as Partial<T>);\n    };\n\n    protected getTimestamp(showTwelveHour: boolean): string {\n        return getTimeFromEvent(this.props.mxEvent, showTwelveHour);\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { CallDirection, type DmTombstoneCallTileViewSnapshot } from \"@element-hq/web-shared-components\";\nimport { type MatrixClient, type MatrixEvent, MatrixEventEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport SettingsStore from \"../../../../../../../settings/SettingsStore\";\nimport type { GetRelationsForEvent } from \"../../../../../../../components/views/rooms/EventTile\";\nimport { getTimeFromEvent } from \"./common\";\nimport {\n    RoomTombstoneCallTileViewModel,\n    type RoomTombstoneCallTileViewModelProps,\n} from \"./RoomTombstoneCallTileViewModel\";\nimport { getDeclinedEvents, getIntentFromEvent } from \"../../common\";\n\nexport interface DmTombstoneCallTileViewModelProps extends RoomTombstoneCallTileViewModelProps {\n    /**\n     * Helper to fetch related events from a given event.\n     */\n    getRelationsForEvent?: GetRelationsForEvent;\n    /**\n     * The {@link MatrixClient} object to access js-sdk API.\n     */\n    cli: MatrixClient;\n}\n\nfunction generateSnapshot(props: DmTombstoneCallTileViewModelProps): {\n    snapshot: DmTombstoneCallTileViewSnapshot;\n    declineEvent: MatrixEvent | null;\n} {\n    const { mxEvent, getRelationsForEvent, cli } = props;\n    const type = getIntentFromEvent(mxEvent);\n\n    // Find the mx-id of the user who started this call\n    const startedUserId = mxEvent.getSender();\n    if (!startedUserId) {\n        throw new Error(\"RTCNotification event has no sender associated with it!\");\n    }\n    const callDirection = cli.getUserId() === startedUserId ? CallDirection.Outgoing : CallDirection.Incoming;\n\n    const declineEvent = getDeclinedEvents(mxEvent, getRelationsForEvent)?.[0] ?? null;\n    const showTwelveHour = SettingsStore.getValue(\"showTwelveHourTimestamps\");\n    const timestamp = getTimeFromEvent(declineEvent ?? mxEvent, showTwelveHour);\n    return { snapshot: { timestamp, type, callDirection, isCallDeclined: !!declineEvent }, declineEvent };\n}\n\n/**\n * View model for a tombstone call in a DM.\n */\nexport class DmTombstoneCallTileViewModel extends RoomTombstoneCallTileViewModel<\n    DmTombstoneCallTileViewSnapshot,\n    DmTombstoneCallTileViewModelProps\n> {\n    /**\n     * The decline event associated with this call, if any.\n     */\n    private declineEvent: MatrixEvent | null;\n\n    public constructor(props: DmTombstoneCallTileViewModelProps) {\n        const { snapshot, declineEvent } = generateSnapshot(props);\n        super(props, snapshot);\n        this.declineEvent = declineEvent;\n\n        // When a relation is added to the event, recompute the state.\n        this.disposables.trackListener(props.mxEvent, MatrixEventEvent.RelationsCreated, () => {\n            const { declineEvent, snapshot } = generateSnapshot(props);\n            this.declineEvent = declineEvent;\n            this.snapshot.set(snapshot);\n        });\n    }\n\n    protected getTimestamp(showTwelveHour: boolean): string {\n        return getTimeFromEvent(this.declineEvent ?? this.props.mxEvent, showTwelveHour);\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type MatrixClient, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { BaseViewModel, type ViewModel, type RootCallTileViewSnapshot } from \"@element-hq/web-shared-components\";\n\nimport type { GetRelationsForEvent } from \"../../../../../components/views/rooms/EventTile\";\nimport { type CallStore, CallStoreEvent } from \"../../../../../stores/CallStore\";\nimport { RoomOngoingCallTileViewModel } from \"./tiles/ongoing/RoomOngoingCallTileViewModel\";\nimport { DmOngoingCallTileViewModel } from \"./tiles/ongoing/DmOngoingCallTileViewModel\";\nimport { DmTombstoneCallTileViewModel } from \"./tiles/tombstone/DmTombstoneCallTileViewModel\";\nimport { RoomTombstoneCallTileViewModel } from \"./tiles/tombstone/RoomTombstoneCallTileViewModel\";\nimport {\n    LatestRtcNotificationEventUpdate,\n    type LatestRtcNotificationEventStore,\n} from \"../../../../../stores/LatestRtcNotificationEventStore\";\nimport { JitsiCall } from \"../../../../../models/Call\";\nimport type LegacyCallHandler from \"../../../../../LegacyCallHandler.tsx\";\n\ninterface Props {\n    /**\n     * Event of type `org.matrix.msc4075.rtc.notification`.\n     */\n    mxEvent: MatrixEvent;\n\n    /**\n     * Helper to fetch related events from a given event.\n     */\n    getRelationsForEvent?: GetRelationsForEvent;\n\n    /**\n     * The {@link MatrixClient} object to access js-sdk API.\n     */\n    cli: MatrixClient;\n\n    /**\n     * {@link CallStore} to access calls in a room.\n     */\n    callStore: CallStore;\n\n    /**\n     * {@link LegacyCallHandler} to handle calls in a room.\n     */\n    legacyCallHandler: LegacyCallHandler;\n\n    /**\n     * {@link LatestRtcNotificationEventStore} to track the latest notification event id.\n     */\n    latestRtcNotificationEventStore: LatestRtcNotificationEventStore;\n}\n\nfunction computeSnapshot(props: Props): RootCallTileViewSnapshot {\n    const cli = props.cli;\n    const notificationEvent = props.mxEvent;\n\n    // Get the room where this call is taking place\n    const roomId = props.mxEvent.getRoomId();\n    if (!roomId) throw new Error(\"Notification event does not have associated room-id\");\n    const room = cli.getRoom(roomId);\n    if (!room) throw new Error(`No room with id ${roomId}`);\n\n    const lastId = props.latestRtcNotificationEventStore.getLatestEventId(roomId);\n    const isLastNotificationEvent = lastId === notificationEvent.getId();\n    const isLocalEvent = notificationEvent.getId()?.startsWith(\"~\");\n\n    // Check if there's an ongoing call\n    const call = props.callStore.getCall(roomId);\n    const hasOngoingCall = !!call && !(call instanceof JitsiCall);\n\n    // This is the same logic used for hiding/showing the voice call button.\n    const isDmRoom = room.getMembers().length <= 2;\n\n    /**\n     * We know we should render the ongoing tile if:\n     * - There's an ongoing call in this room\n     * - This is the last call tile in the room or a local call tile.\n     */\n    if ((isLastNotificationEvent || isLocalEvent) && hasOngoingCall) {\n        if (isDmRoom) {\n            return {\n                tileType: \"ongoing-call-dm\",\n                tileViewModel: new DmOngoingCallTileViewModel({\n                    mxEvent: notificationEvent,\n                    roomId,\n                    getRelationsForEvent: props.getRelationsForEvent,\n                    callStore: props.callStore,\n                    cli: props.cli,\n                    legacyCallHandler: props.legacyCallHandler,\n                }),\n            };\n        }\n        return {\n            tileType: \"ongoing-call-room\",\n            tileViewModel: new RoomOngoingCallTileViewModel({\n                roomId,\n                mxEvent: notificationEvent,\n                getRelationsForEvent: props.getRelationsForEvent,\n                callStore: props.callStore,\n                cli: props.cli,\n                legacyCallHandler: props.legacyCallHandler,\n            }),\n        };\n    }\n\n    if (isDmRoom) {\n        return {\n            tileType: \"tombstone-call-dm\",\n            tileViewModel: new DmTombstoneCallTileViewModel({\n                mxEvent: notificationEvent,\n                getRelationsForEvent: props.getRelationsForEvent,\n                cli: props.cli,\n            }),\n        };\n    } else\n        return {\n            tileType: \"tombstone-call-room\",\n            tileViewModel: new RoomTombstoneCallTileViewModel({ mxEvent: notificationEvent }),\n        };\n}\n\n/**\n * The root call tile view model which decides what call tile should be rendered.\n */\nexport class RootCallTileViewModel extends BaseViewModel<RootCallTileViewSnapshot, Props> {\n    public constructor(props: Props) {\n        const snapshot = computeSnapshot(props);\n        super(props, snapshot);\n        this.trackViewModel(snapshot.tileViewModel);\n        this.addListener();\n    }\n\n    private addListener(): void {\n        // Recompute the state on changes to the call in this room\n        this.disposables.trackListener(\n            this.props.callStore,\n            CallStoreEvent.Call,\n            this.onCallStoreEvent as (...args: unknown[]) => void,\n        );\n\n        // Recompute the state when the latest rtc notification event in this room changes\n        this.disposables.trackListener(this.props.latestRtcNotificationEventStore, LatestRtcNotificationEventUpdate, ((\n            roomId: string,\n            eventId: string,\n        ) => {\n            if (roomId === this.props.mxEvent.getRoomId() && eventId === this.props.mxEvent.getId()) {\n                this.recomputeSnapshot();\n            }\n        }) as (...args: unknown[]) => void);\n    }\n\n    private onCallStoreEvent = (_: unknown, roomId: string): void => {\n        if (roomId === this.props.mxEvent.getRoomId()) {\n            this.recomputeSnapshot();\n        }\n    };\n\n    private recomputeSnapshot(): void {\n        const snapshot = computeSnapshot(this.props);\n        const currentTileType = this.getSnapshot().tileType;\n        if (currentTileType === snapshot.tileType) {\n            /**\n             * We're already rendering the correct vm if the tile type did not change.\n             * So dispose thew new vm and return.\n             */\n            (snapshot.tileViewModel as BaseViewModel<unknown, unknown>).dispose();\n            return;\n        }\n\n        this.trackViewModel(snapshot.tileViewModel);\n        this.snapshot.set(snapshot);\n    }\n\n    private trackViewModel(vm: ViewModel<unknown>): void {\n        // ViewModel type has no dispose method, so this needs a type assertion.\n        this.disposables.track(vm as BaseViewModel<unknown, unknown>);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, useContext, useEffect } from \"react\";\nimport {\n    type MatrixEvent,\n    EventType,\n    MsgType,\n    RelationType,\n    type MatrixClient,\n    GroupCallIntent,\n    M_POLL_END,\n    M_POLL_START,\n} from \"matrix-js-sdk/src/matrix\";\nimport {\n    EncryptionEventView,\n    HiddenBodyView,\n    MJitsiWidgetEventView,\n    MKeyVerificationRequestView,\n    RoomAvatarEventView,\n    RootCallTileView,\n    TextualEventView,\n    ViewSourceEventView,\n    useCreateAutoDisposedViewModel,\n} from \"@element-hq/web-shared-components\";\n\nimport SettingsStore from \"../settings/SettingsStore\";\nimport type LegacyCallEventGrouper from \"../components/structures/LegacyCallEventGrouper\";\nimport { type IEventTileType, type EventTileProps } from \"../components/views/rooms/EventTile\";\nimport { TimelineRenderingType } from \"../contexts/RoomContext\";\nimport MessageEvent from \"../components/views/messages/MessageEvent\";\nimport LegacyCallEvent from \"../components/views/messages/LegacyCallEvent\";\nimport { CallEvent } from \"../components/views/messages/CallEvent\";\nimport { RoomPredecessorTile } from \"../components/views/messages/RoomPredecessorTile\";\nimport RoomAvatar from \"../components/views/avatars/RoomAvatar\";\nimport { WIDGET_LAYOUT_EVENT_TYPE } from \"../stores/widgets/WidgetLayoutStore\";\nimport { ALL_RULE_TYPES } from \"../mjolnir/BanList\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport { useMatrixClientContext } from \"../contexts/MatrixClientContext\";\nimport { WidgetType } from \"../widgets/WidgetType\";\nimport { hasText } from \"../TextForEvent\";\nimport { getMessageModerationState, MessageModerationState } from \"../utils/EventUtils\";\nimport { shouldDisplayAsBeaconTile } from \"../utils/beacon/timeline\";\nimport { type IBodyProps } from \"../components/views/messages/IBodyProps\";\nimport { ModuleApi } from \"../modules/Api\";\nimport { EncryptionEventViewModel } from \"../viewmodels/room/timeline/event-tile/EncryptionEventViewModel\";\nimport { MJitsiWidgetEventViewModel } from \"../viewmodels/room/timeline/event-tile/MJitsiWidgetEventViewModel\";\nimport { MKeyVerificationRequestViewModel } from \"../viewmodels/room/timeline/event-tile/MKeyVerificationRequestViewModel\";\nimport { RoomAvatarEventViewModel } from \"../viewmodels/room/timeline/event-tile/RoomAvatarEventViewModel\";\nimport { TextualEventViewModel } from \"../viewmodels/room/timeline/event-tile/TextualEventViewModel\";\nimport { HiddenBodyViewModel } from \"../viewmodels/room/timeline/event-tile/body/HiddenBodyViewModel\";\nimport { ViewSourceEventViewModel } from \"../viewmodels/room/timeline/event-tile/body/ViewSourceEventViewModel\";\nimport { ElementCallEventType } from \"../call-types\";\nimport { RootCallTileViewModel } from \"../viewmodels/room/timeline/event-tile/call/RootCallTileViewModel\";\nimport { SDKContext } from \"../contexts/SDKContext\";\n\n// Subset of EventTile's IProps plus some mixins\nexport interface EventTileTypeProps extends Pick<\n    EventTileProps,\n    | \"mxEvent\"\n    | \"highlights\"\n    | \"highlightLink\"\n    | \"showUrlPreview\"\n    | \"forExport\"\n    | \"getRelationsForEvent\"\n    | \"editState\"\n    | \"replacingEventId\"\n    | \"permalinkCreator\"\n    | \"callEventGrouper\"\n    | \"isSeeingThroughMessageHiddenForModeration\"\n    | \"inhibitInteraction\"\n> {\n    ref?: React.RefObject<IEventTileType | null>;\n    maxImageHeight?: number; // pixels\n    overrideBodyTypes?: Record<string, React.ComponentType<IBodyProps>>;\n    overrideEventTypes?: Record<string, React.ComponentType<IBodyProps>>;\n    showHiddenEvents: boolean;\n}\n\ntype FactoryProps = Omit<EventTileTypeProps, \"ref\">;\ntype Factory<X = FactoryProps> = (ref: React.RefObject<any> | undefined, props: X) => JSX.Element;\n\nexport const MessageEventFactory: Factory = (ref, props) => <MessageEvent ref={ref} {...props} />;\nconst LegacyCallEventFactory: Factory<FactoryProps & { callEventGrouper: LegacyCallEventGrouper }> = (ref, props) => (\n    <LegacyCallEvent ref={ref} {...props} />\n);\nconst CallEventFactory: Factory = (ref, props) => <CallEvent ref={ref} {...props} />;\nexport const TextualEventFactory: Factory = (ref, props) => {\n    const vm = new TextualEventViewModel(props);\n    return <TextualEventView vm={vm} className=\"mx_TextualEvent\" />;\n};\nfunction EncryptionEventWrappedView({ mxEvent, ref }: IBodyProps): JSX.Element {\n    const cli = useMatrixClientContext();\n    const vm = useCreateAutoDisposedViewModel(() => new EncryptionEventViewModel({ mxEvent, cli }));\n\n    return <EncryptionEventView vm={vm} ref={ref} className=\"mx_EventTileBubble mx_cryptoEvent\" />;\n}\nconst EncryptionEventFactory: Factory = (ref, props) => {\n    return <EncryptionEventWrappedView ref={ref} {...props} />;\n};\nfunction MKeyVerificationRequestWrappedView({ mxEvent, ref }: IBodyProps): JSX.Element {\n    const cli = useMatrixClientContext();\n    if (!cli) {\n        throw new Error(\"Attempting to render verification request without a client context!\");\n    }\n\n    const vm = useCreateAutoDisposedViewModel(() => new MKeyVerificationRequestViewModel({ mxEvent, cli }));\n\n    useEffect(() => {\n        vm.setEvent(mxEvent);\n    }, [mxEvent, vm]);\n\n    return <MKeyVerificationRequestView vm={vm} ref={ref} className=\"mx_EventTileBubble mx_cryptoEvent\" />;\n}\nconst VerificationReqFactory: Factory = (ref, props) => <MKeyVerificationRequestWrappedView ref={ref} {...props} />;\nfunction HiddenBodyWrappedView({ mxEvent, ref }: IBodyProps): JSX.Element {\n    const vm = useCreateAutoDisposedViewModel(() => new HiddenBodyViewModel({ mxEvent }));\n\n    useEffect(() => {\n        vm.setEvent(mxEvent);\n    }, [mxEvent, vm]);\n\n    return <HiddenBodyView vm={vm} ref={ref} className=\"mx_HiddenBody\" />;\n}\nconst HiddenEventFactory: Factory = (ref, props) => <HiddenBodyWrappedView ref={ref} {...props} />;\n\nfunction ViewSourceEventWrappedView({ mxEvent, ref }: IBodyProps): JSX.Element {\n    const cli = useMatrixClientContext();\n    const vm = useCreateAutoDisposedViewModel(() => new ViewSourceEventViewModel({ mxEvent, cli }));\n\n    useEffect(() => {\n        vm.setProps({ cli, mxEvent });\n    }, [cli, mxEvent, vm]);\n\n    return (\n        <ViewSourceEventView\n            vm={vm}\n            ref={ref}\n            className=\"mx_ViewSourceEvent mx_EventTile_content\"\n            expandedClassName=\"mx_ViewSourceEvent_expanded\"\n        />\n    );\n}\n\nfunction MJitsiWidgetEventWrappedView({ mxEvent, ref }: IBodyProps): JSX.Element {\n    const cli = useMatrixClientContext();\n    const vm = useCreateAutoDisposedViewModel(() => new MJitsiWidgetEventViewModel({ mxEvent, cli }));\n\n    useEffect(() => {\n        vm.setEvent(mxEvent);\n    }, [mxEvent, vm]);\n\n    return <MJitsiWidgetEventView vm={vm} ref={ref} className=\"mx_EventTileBubble\" />;\n}\n\nfunction RoomAvatarEventWrappedView({ mxEvent, ref }: IBodyProps): JSX.Element {\n    const cli = useMatrixClientContext() ?? MatrixClientPeg.safeGet();\n    const vm = useCreateAutoDisposedViewModel(() => new RoomAvatarEventViewModel({ mxEvent, cli }));\n\n    useEffect(() => {\n        vm.setEvent(mxEvent);\n    }, [mxEvent, vm]);\n\n    const roomId = mxEvent.getRoomId();\n    const room = roomId ? cli.getRoom(roomId) : null;\n\n    return (\n        <RoomAvatarEventView\n            vm={vm}\n            ref={ref}\n            renderAvatar={(snapshot) => (\n                <RoomAvatar\n                    room={room ?? undefined}\n                    size=\"14px\"\n                    oobData={{\n                        avatarUrl: snapshot.avatarUrl,\n                        name: snapshot.roomName,\n                    }}\n                />\n            )}\n        />\n    );\n}\nconst RoomAvatarEventFactory: Factory = (ref, props) => <RoomAvatarEventWrappedView ref={ref} {...props} />;\n\nfunction CallStartedTileViewWrapped({ mxEvent, getRelationsForEvent }: IBodyProps): JSX.Element {\n    const sdkContext = useContext(SDKContext);\n    const cli = useMatrixClientContext();\n    const vm = useCreateAutoDisposedViewModel(\n        () =>\n            new RootCallTileViewModel({\n                mxEvent,\n                getRelationsForEvent,\n                cli,\n                callStore: sdkContext.callStore,\n                latestRtcNotificationEventStore: sdkContext.latestRtcNotificationEventStore,\n                legacyCallHandler: sdkContext.legacyCallHandler,\n            }),\n    );\n    return <RootCallTileView vm={vm} />;\n}\n\nexport const CallStartedEventFactory: Factory = (ref, props) => {\n    return <CallStartedTileViewWrapped {...props} />;\n};\n\n// These factories are exported for reference comparison against pickFactory()\nexport const JSONEventFactory: Factory = (ref, props) => <ViewSourceEventWrappedView ref={ref} {...props} />;\nexport const JitsiEventFactory: Factory = (ref, props) => <MJitsiWidgetEventWrappedView ref={ref} {...props} />;\nexport const RoomCreateEventFactory: Factory = (_ref, props) => <RoomPredecessorTile {...props} />;\n\nconst EVENT_TILE_TYPES = new Map<string, Factory>([\n    [EventType.RoomMessage, MessageEventFactory], // note that verification requests are handled in pickFactory()\n    [EventType.Sticker, MessageEventFactory],\n    [M_POLL_START.name, MessageEventFactory],\n    [M_POLL_START.altName, MessageEventFactory],\n    [M_POLL_END.name, MessageEventFactory],\n    [M_POLL_END.altName, MessageEventFactory],\n    [EventType.CallInvite, LegacyCallEventFactory as Factory], // note that this requires a special factory type\n    [EventType.RTCNotification, CallStartedEventFactory],\n]);\n\nconst STATE_EVENT_TILE_TYPES = new Map<string, Factory>([\n    [EventType.RoomEncryption, EncryptionEventFactory],\n    [EventType.RoomCanonicalAlias, TextualEventFactory],\n    [EventType.RoomCreate, RoomCreateEventFactory],\n    [EventType.RoomMember, TextualEventFactory],\n    [EventType.RoomName, TextualEventFactory],\n    [EventType.RoomAvatar, RoomAvatarEventFactory],\n    [EventType.RoomThirdPartyInvite, TextualEventFactory],\n    [EventType.RoomHistoryVisibility, TextualEventFactory],\n    [EventType.RoomTopic, TextualEventFactory],\n    [EventType.RoomPowerLevels, TextualEventFactory],\n    [EventType.RoomPinnedEvents, TextualEventFactory],\n    [EventType.RoomServerAcl, TextualEventFactory],\n    // TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)\n    [\"im.vector.modular.widgets\", TextualEventFactory], // note that Jitsi widgets are special in pickFactory()\n    [WIDGET_LAYOUT_EVENT_TYPE, TextualEventFactory],\n    [EventType.RoomTombstone, TextualEventFactory],\n    [EventType.RoomJoinRules, TextualEventFactory],\n    [EventType.RoomGuestAccess, TextualEventFactory],\n]);\n\nfor (const evType of ElementCallEventType.names) {\n    STATE_EVENT_TILE_TYPES.set(evType, CallEventFactory);\n}\n\n// Add all the Mjolnir stuff to the renderer too\nfor (const evType of ALL_RULE_TYPES) {\n    STATE_EVENT_TILE_TYPES.set(evType, TextualEventFactory);\n}\n\n// These events should be recorded in the STATE_EVENT_TILE_TYPES\nconst SINGULAR_STATE_EVENTS = new Set([\n    EventType.RoomEncryption,\n    EventType.RoomCanonicalAlias,\n    EventType.RoomCreate,\n    EventType.RoomName,\n    EventType.RoomAvatar,\n    EventType.RoomHistoryVisibility,\n    EventType.RoomTopic,\n    EventType.RoomPowerLevels,\n    EventType.RoomPinnedEvents,\n    EventType.RoomServerAcl,\n    WIDGET_LAYOUT_EVENT_TYPE,\n    EventType.RoomTombstone,\n    EventType.RoomJoinRules,\n    EventType.RoomGuestAccess,\n]);\n\n/**\n * Find an event tile factory for the given conditions.\n * @param mxEvent The event.\n * @param cli The matrix client to reference when needed.\n * @param showHiddenEvents Whether hidden events should be shown.\n * @param asHiddenEv When true, treat the event as always hidden.\n * @returns The factory, or undefined if not possible.\n */\nexport function pickFactory(\n    mxEvent: MatrixEvent,\n    cli: MatrixClient,\n    showHiddenEvents: boolean,\n    asHiddenEv?: boolean,\n): Factory | undefined {\n    const evType = mxEvent.getType(); // cache this to reduce call stack execution hits\n\n    // Note: we avoid calling SettingsStore unless absolutely necessary - this code is on the critical path.\n\n    if (asHiddenEv && showHiddenEvents) {\n        return JSONEventFactory;\n    }\n\n    const noEventFactoryFactory: () => Factory | undefined = () => (showHiddenEvents ? JSONEventFactory : undefined); // just don't render things that we shouldn't render\n\n    // We run all the event type checks first as they might override the factory entirely.\n\n    const moderationState = getMessageModerationState(mxEvent, cli);\n    if (moderationState === MessageModerationState.HIDDEN_TO_CURRENT_USER) {\n        return HiddenEventFactory;\n    }\n\n    if (evType === EventType.RoomMessage) {\n        // don't show verification requests we're not involved in,\n        // not even when showing hidden events\n        const content = mxEvent.getContent();\n        if (content?.msgtype === MsgType.KeyVerificationRequest) {\n            const me = cli.getUserId();\n            if (mxEvent.getSender() !== me && content[\"to\"] !== me) {\n                return noEventFactoryFactory(); // not for/from us\n            } else {\n                // override the factory\n                return VerificationReqFactory;\n            }\n        }\n    }\n\n    if (evType === EventType.RoomCreate) {\n        const dynamicPredecessorsEnabled = SettingsStore.getValue(\"feature_dynamic_room_predecessors\");\n        const predecessor = cli.getRoom(mxEvent.getRoomId())?.findPredecessor(dynamicPredecessorsEnabled);\n        if (!predecessor) {\n            return noEventFactoryFactory();\n        }\n    }\n\n    // TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)\n    if (evType === \"im.vector.modular.widgets\") {\n        let type = mxEvent.getContent()[\"type\"];\n        if (!type) {\n            // deleted/invalid widget - try the past widget type\n            type = mxEvent.getPrevContent()[\"type\"];\n        }\n\n        if (WidgetType.JITSI.matches(type)) {\n            // override the factory\n            return JitsiEventFactory;\n        }\n    }\n\n    // Try and pick a state event factory, if we can.\n    if (mxEvent.isState()) {\n        if (shouldDisplayAsBeaconTile(mxEvent)) {\n            return MessageEventFactory;\n        }\n\n        if (SINGULAR_STATE_EVENTS.has(evType) && mxEvent.getStateKey() !== \"\") {\n            return noEventFactoryFactory(); // improper event type to render\n        }\n\n        if (STATE_EVENT_TILE_TYPES.get(evType) === TextualEventFactory && !hasText(mxEvent, cli, showHiddenEvents)) {\n            return noEventFactoryFactory();\n        }\n\n        return STATE_EVENT_TILE_TYPES.get(evType) ?? noEventFactoryFactory();\n    }\n\n    // Blanket override for all events. The MessageEvent component handles redacted states for us.\n    if (mxEvent.isRedacted()) {\n        return MessageEventFactory;\n    }\n\n    if (mxEvent.isRelation(RelationType.Replace)) {\n        return noEventFactoryFactory();\n    }\n\n    return EVENT_TILE_TYPES.get(evType) ?? noEventFactoryFactory();\n}\n\n/**\n * Render an event as a tile\n * @param renderType The render type. Used to inform properties given to the eventual component.\n * @param props The properties to provide to the eventual component.\n * @param cli Optional client instance to use, otherwise the default MatrixClientPeg will be used.\n * @returns The tile as JSX, or null if unable to render.\n */\nexport function renderTile(\n    renderType: TimelineRenderingType,\n    props: EventTileTypeProps,\n    cli?: MatrixClient,\n): JSX.Element | null {\n    cli = cli ?? MatrixClientPeg.safeGet(); // because param defaults don't do the correct thing\n\n    const factory = pickFactory(props.mxEvent, cli, props.showHiddenEvents);\n    if (!factory) {\n        // If we don't have a factory for this event, attempt\n        // to find a custom component that can render it.\n        // Will return null if no custom component can render it.\n        return ModuleApi.instance.customComponents.renderMessage({\n            mxEvent: props.mxEvent,\n        });\n    }\n\n    // Note that we split off the ones we actually care about here just to be sure that we're\n    // not going to accidentally send things we shouldn't from lazy callers. Eg: EventTile's\n    // lazy calls of `renderTile(..., this.props)` will have a lot more than we actually care\n    // about.\n    const {\n        ref,\n        mxEvent,\n        forExport,\n        replacingEventId,\n        editState,\n        highlights,\n        highlightLink,\n        showUrlPreview,\n        permalinkCreator,\n        callEventGrouper,\n        getRelationsForEvent,\n        isSeeingThroughMessageHiddenForModeration,\n        inhibitInteraction,\n        showHiddenEvents,\n    } = props;\n\n    switch (renderType) {\n        case TimelineRenderingType.File:\n        case TimelineRenderingType.Notification:\n        case TimelineRenderingType.Thread:\n            return ModuleApi.instance.customComponents.renderMessage(\n                {\n                    mxEvent: props.mxEvent,\n                },\n                (origProps) =>\n                    factory(props.ref, {\n                        // We only want a subset of props, so we don't end up causing issues for downstream components.\n                        mxEvent,\n                        highlights,\n                        highlightLink,\n                        showUrlPreview: origProps?.showUrlPreview ?? showUrlPreview,\n                        editState,\n                        replacingEventId,\n                        getRelationsForEvent,\n                        isSeeingThroughMessageHiddenForModeration,\n                        permalinkCreator,\n                        inhibitInteraction,\n                        showHiddenEvents,\n                    }),\n            );\n        default:\n            return ModuleApi.instance.customComponents.renderMessage(\n                {\n                    mxEvent: props.mxEvent,\n                },\n                (origProps) =>\n                    factory(ref, {\n                        // NEARLY ALL THE OPTIONS!\n                        mxEvent,\n                        forExport,\n                        replacingEventId,\n                        editState,\n                        highlights,\n                        highlightLink,\n                        showUrlPreview: origProps?.showUrlPreview ?? showUrlPreview,\n                        permalinkCreator,\n                        callEventGrouper,\n                        getRelationsForEvent,\n                        isSeeingThroughMessageHiddenForModeration,\n                        inhibitInteraction,\n                        showHiddenEvents,\n                    }),\n            );\n    }\n}\n\n/**\n * A version of renderTile() specifically for replies.\n * @param props The properties to specify on the eventual object.\n * @param showHiddenEvents Whether hidden events should be shown.\n * @param cli Optional client instance to use, otherwise the default MatrixClientPeg will be used.\n * @returns The tile as JSX, or falsy if unable to render.\n */\nexport function renderReplyTile(\n    props: EventTileTypeProps,\n    showHiddenEvents: boolean,\n    cli?: MatrixClient,\n): JSX.Element | null {\n    cli = cli ?? MatrixClientPeg.safeGet(); // because param defaults don't do the correct thing\n\n    const factory = pickFactory(props.mxEvent, cli, showHiddenEvents);\n    if (!factory) {\n        // If we don't have a factory for this event, attempt\n        // to find a custom component that can render it.\n        // Will return null if no custom component can render it.\n        return ModuleApi.instance.customComponents.renderMessage({\n            mxEvent: props.mxEvent,\n        });\n    }\n\n    // See renderTile() for why we split off so much\n    const {\n        ref,\n        mxEvent,\n        highlights,\n        highlightLink,\n        showUrlPreview,\n        overrideBodyTypes,\n        overrideEventTypes,\n        replacingEventId,\n        maxImageHeight,\n        getRelationsForEvent,\n        isSeeingThroughMessageHiddenForModeration,\n        permalinkCreator,\n    } = props;\n\n    return ModuleApi.instance.customComponents.renderMessage(\n        {\n            mxEvent: props.mxEvent,\n        },\n        (origProps) =>\n            factory(ref, {\n                mxEvent,\n                highlights,\n                highlightLink,\n                showUrlPreview: origProps?.showUrlPreview ?? showUrlPreview,\n                overrideBodyTypes,\n                overrideEventTypes,\n                replacingEventId,\n                maxImageHeight,\n                getRelationsForEvent,\n                isSeeingThroughMessageHiddenForModeration,\n                permalinkCreator,\n                showHiddenEvents,\n            }),\n    );\n}\n\n// XXX: this'll eventually be dynamic based on the fields once we have extensible event types\nconst messageTypes = [EventType.RoomMessage, EventType.Sticker];\nexport function isMessageEvent(ev: MatrixEvent): boolean {\n    return (\n        messageTypes.includes(ev.getType() as EventType) ||\n        M_POLL_START.matches(ev.getType()) ||\n        M_POLL_END.matches(ev.getType())\n    );\n}\n\nexport function haveRendererForEvent(\n    mxEvent: MatrixEvent,\n    matrixClient: MatrixClient,\n    showHiddenEvents: boolean,\n): boolean {\n    // Only show \"Message deleted\" tile for plain message events, encrypted events,\n    // and state events as they'll likely still contain enough keys to be relevant.\n    if (mxEvent.isRedacted() && !mxEvent.isEncrypted() && !isMessageEvent(mxEvent) && !mxEvent.isState()) {\n        return false;\n    }\n\n    // Check to see if we have any hints for this message, which indicates\n    // there is a custom renderer for the event.\n    if (ModuleApi.instance.customComponents.getHintsForMessage(mxEvent)) {\n        return true;\n    }\n\n    // No tile for replacement events since they update the original tile\n    if (mxEvent.isRelation(RelationType.Replace)) return false;\n\n    const handler = pickFactory(mxEvent, matrixClient, showHiddenEvents);\n    if (!handler) return false;\n    if (handler === TextualEventFactory) {\n        return hasText(mxEvent, matrixClient, showHiddenEvents);\n    } else if (handler === STATE_EVENT_TILE_TYPES.get(EventType.RoomCreate)) {\n        const dynamicPredecessorsEnabled = SettingsStore.getValue(\"feature_dynamic_room_predecessors\");\n        const predecessor = matrixClient.getRoom(mxEvent.getRoomId())?.findPredecessor(dynamicPredecessorsEnabled);\n        return Boolean(predecessor);\n    } else if (ElementCallEventType.names.some((eventType) => handler === STATE_EVENT_TILE_TYPES.get(eventType))) {\n        const intent = mxEvent.getContent()[\"m.intent\"];\n        const newlyStarted = Object.keys(mxEvent.getPrevContent()).length === 0;\n        // Only interested in events that mark the start of a non-room call\n        return newlyStarted && typeof intent === \"string\" && intent !== GroupCallIntent.Room;\n    } else if (handler === JSONEventFactory) {\n        return false;\n    } else {\n        return true;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, M_BEACON_INFO } from \"matrix-js-sdk/src/matrix\";\n\n/**\n * beacon_info events without live property set to true\n * should be displayed in the timeline\n */\nexport const shouldDisplayAsBeaconTile = (event: MatrixEvent): boolean =>\n    M_BEACON_INFO.matches(event.getType()) &&\n    (event.getContent()?.live ||\n        // redacted beacons should show 'message deleted' tile\n        event.isRedacted());\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { M_POLL_END, M_POLL_START, M_BEACON_INFO, type MatrixEvent, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { getShareableLocationEventForBeacon } from \"../../utils/beacon/getShareableLocation\";\n\n/**\n * Get forwardable event for a given event\n * If an event is not forwardable return null\n */\nexport const getForwardableEvent = (event: MatrixEvent, cli: MatrixClient): MatrixEvent | null => {\n    if (M_POLL_START.matches(event.getType()) || M_POLL_END.matches(event.getType())) {\n        return null;\n    }\n\n    // Live location beacons should forward their latest location as a static pin location\n    // If the beacon is not live, or doesn't have a location forwarding is not allowed\n    if (M_BEACON_INFO.matches(event.getType())) {\n        return getShareableLocationEventForBeacon(event, cli);\n    }\n    return event;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { M_BEACON_INFO, type MatrixEvent, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { getShareableLocationEventForBeacon } from \"../../utils/beacon/getShareableLocation\";\nimport { isLocationEvent } from \"../../utils/EventUtils\";\n\n/**\n * Get event that is shareable as a location\n * If an event does not have a shareable location, return null\n */\nexport const getShareableLocationEvent = (event: MatrixEvent, cli: MatrixClient): MatrixEvent | null => {\n    if (isLocationEvent(event)) {\n        return event;\n    }\n\n    if (M_BEACON_INFO.matches(event.getType())) {\n        return getShareableLocationEventForBeacon(event, cli);\n    }\n    return null;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\nimport { CallType } from \"matrix-js-sdk/src/webrtc/call\";\nimport { type ReactNode, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport { logger as rootLogger } from \"matrix-js-sdk/src/logger\";\n\nimport type React from \"react\";\nimport { useSettingValue } from \"../useSettings\";\nimport { useEventEmitter, useEventEmitterState } from \"../useEventEmitter\";\nimport { LegacyCallHandlerEvent } from \"../../LegacyCallHandler\";\nimport { useWidgets } from \"../../utils/WidgetUtils\";\nimport { WidgetType } from \"../../widgets/WidgetType\";\nimport { useCall, useConnectionState, useParticipantCount } from \"../useCall\";\nimport { useRoomMemberCount } from \"../useRoomMembers\";\nimport { ConnectionState } from \"../../models/Call\";\nimport { placeCall } from \"../../utils/room/placeCall\";\nimport { WidgetLayoutStore } from \"../../stores/widgets/WidgetLayoutStore\";\nimport { useRoomState } from \"../useRoomState\";\nimport { _t } from \"../../languageHandler\";\nimport { isManagedHybridWidget, isManagedHybridWidgetEnabled } from \"../../widgets/ManagedHybrid\";\nimport { type IApp } from \"../../stores/WidgetStore\";\nimport { UPDATE_EVENT } from \"../../stores/AsyncStore\";\nimport defaultDispatcher from \"../../dispatcher/dispatcher\";\nimport { type ViewRoomPayload } from \"../../dispatcher/payloads/ViewRoomPayload\";\nimport { Action } from \"../../dispatcher/actions\";\nimport { CallStore, CallStoreEvent } from \"../../stores/CallStore\";\nimport { isVideoRoom } from \"../../utils/video-rooms\";\nimport { UIFeature } from \"../../settings/UIFeature\";\nimport { type InteractionName } from \"../../PosthogTrackers\";\nimport { ElementCallMemberEventType } from \"../../call-types\";\nimport { LocalRoom, LocalRoomState } from \"../../models/LocalRoom\";\nimport { useScopedRoomContext } from \"../../contexts/ScopedRoomContext\";\nimport { SDKContext } from \"../../contexts/SDKContext.ts\";\nimport SdkConfig from \"../../SdkConfig\";\n\nconst logger = rootLogger.getChild(\"useRoomCall\");\n\nexport enum PlatformCallType {\n    ElementCall,\n    JitsiCall,\n    LegacyCall,\n}\n\nexport const getPlatformCallTypeProps = (\n    platformCallType: PlatformCallType,\n): {\n    label: string;\n    children?: ReactNode;\n    analyticsName: InteractionName;\n} => {\n    switch (platformCallType) {\n        case PlatformCallType.ElementCall:\n            return {\n                label: _t(\"voip|element_call\"),\n                analyticsName: \"WebVoipOptionElementCall\",\n            };\n        case PlatformCallType.JitsiCall:\n            return {\n                label: _t(\"voip|jitsi_call\"),\n                analyticsName: \"WebVoipOptionJitsi\",\n            };\n        case PlatformCallType.LegacyCall:\n            return {\n                label: _t(\"voip|legacy_call\"),\n                analyticsName: \"WebVoipOptionLegacy\",\n            };\n        default:\n            throw Error(`Unexpected PlatformCallType ${platformCallType}`);\n    }\n};\n\nconst enum State {\n    NoCall,\n    NoPermission,\n    Unpinned,\n    Ongoing,\n    NotJoined,\n}\n\n/**\n * Utility hook for resolving state and click handlers for Voice & Video call buttons in the room header\n * @param room the room to track\n * @returns the call button attributes for the given room\n */\nexport const useRoomCall = (\n    room: Room | LocalRoom,\n): {\n    voiceCallDisabledReason: string | null;\n    voiceCallClick(this: void, evt: React.MouseEvent | undefined, selectedType: PlatformCallType): void;\n    videoCallDisabledReason: string | null;\n    videoCallClick(this: void, evt: React.MouseEvent | undefined, selectedType: PlatformCallType): void;\n    toggleCallMaximized: () => void;\n    isViewingCall: boolean;\n    isConnectedToCall: boolean;\n    /**\n     * The type of call in progress, or `null` if no call is ongoing.\n     */\n    activeCallSessionType: CallType | null;\n    callOptions: PlatformCallType[];\n    showVideoCallButton: boolean;\n    showVoiceCallButton: boolean;\n} => {\n    const sdkContext = useContext(SDKContext);\n    const roomViewStore = useScopedRoomContext(\"roomViewStore\").roomViewStore;\n    // settings\n    const widgetsFeatureEnabled = useSettingValue(UIFeature.Widgets);\n    const voipFeatureEnabled = useSettingValue(UIFeature.Voip);\n    const enableLegacyCallsVoip = useSettingValue(\"enableLegacyCallsVoip\");\n    const sdkConfigEcOnly = useMemo(() => {\n        return SdkConfig.get(\"element_call\").use_exclusively;\n    }, []);\n    const useElementCallExclusively = !enableLegacyCallsVoip || sdkConfigEcOnly;\n\n    const serverIsConfiguredForElementCall = useEventEmitterState(\n        CallStore.instance,\n        CallStoreEvent.TransportsUpdated,\n        () =>\n            CallStore.instance.getConfiguredRTCTransports().some((s) => s.type === \"livekit\" && s.livekit_service_url),\n    );\n\n    useEffect(() => {\n        if (useElementCallExclusively && !serverIsConfiguredForElementCall) {\n            logger.warn(\n                \"Element Call is configured to be used exclusively, but the server is not configured with a transport\",\n            );\n        }\n    }, [useElementCallExclusively, serverIsConfiguredForElementCall]);\n\n    const hasLegacyCall = useEventEmitterState(\n        sdkContext.legacyCallHandler,\n        LegacyCallHandlerEvent.CallsChanged,\n        () => sdkContext.legacyCallHandler.getCallForRoom(room.roomId) !== null,\n    );\n    // settings\n    const widgets = useWidgets(room);\n    const jitsiWidget = useMemo(() => widgets.find((widget) => WidgetType.JITSI.matches(widget.type)), [widgets]);\n    const hasJitsiWidget = !!jitsiWidget;\n    const managedHybridWidget = useMemo(() => widgets.find(isManagedHybridWidget), [widgets]);\n    const hasManagedHybridWidget = !!managedHybridWidget;\n\n    // group call\n    const groupCall = useCall(room.roomId);\n    const isConnectedToCall = useConnectionState(groupCall) === ConnectionState.Connected;\n    const hasGroupCall = groupCall !== null;\n    const isViewingCall = useEventEmitterState(\n        roomViewStore,\n        UPDATE_EVENT,\n        () => roomViewStore.isViewingCall() || isVideoRoom(room),\n    );\n\n    const participantCount = useParticipantCount(groupCall);\n    const activeCallSessionType = useMemo(() => {\n        if (!groupCall || participantCount === 0) {\n            return null;\n        }\n        return groupCall.callType;\n    }, [participantCount, groupCall]);\n\n    // room\n    const memberCount = useRoomMemberCount(room);\n\n    const [mayEditWidgets, mayCreateElementCallState] = useRoomState(room, () => [\n        room.currentState.mayClientSendStateEvent(\"im.vector.modular.widgets\", room.client),\n        room.currentState.mayClientSendStateEvent(ElementCallMemberEventType.name, room.client),\n    ]);\n\n    const mayCreateElementCalls = mayCreateElementCallState && serverIsConfiguredForElementCall;\n\n    // The options provided to the RoomHeader.\n    // If there are multiple options, the user will be prompted to choose.\n    const callOptions = useMemo((): PlatformCallType[] => {\n        const options: PlatformCallType[] = [];\n        if (!SdkConfig.get(\"element_call\").disable) {\n            if (useElementCallExclusively && !hasJitsiWidget) {\n                return [PlatformCallType.ElementCall];\n            }\n            if (hasGroupCall || mayCreateElementCalls) {\n                options.push(PlatformCallType.ElementCall);\n            }\n        }\n        if (memberCount <= 2) {\n            options.push(PlatformCallType.LegacyCall);\n        } else if (mayEditWidgets || hasJitsiWidget) {\n            options.push(PlatformCallType.JitsiCall);\n        }\n        if (hasGroupCall && WidgetType.CALL.matches(groupCall.widget.type)) {\n            // only allow joining the ongoing Element call if there is one.\n            return [PlatformCallType.ElementCall];\n        }\n        return options;\n    }, [\n        memberCount,\n        mayEditWidgets,\n        hasJitsiWidget,\n        hasGroupCall,\n        mayCreateElementCalls,\n        useElementCallExclusively,\n        groupCall?.widget.type,\n    ]);\n\n    let widget: IApp | undefined;\n    if (callOptions.includes(PlatformCallType.JitsiCall) || callOptions.includes(PlatformCallType.LegacyCall)) {\n        widget = jitsiWidget ?? managedHybridWidget;\n    }\n    if (callOptions.includes(PlatformCallType.ElementCall)) {\n        widget = groupCall?.widget;\n    } else {\n        widget = groupCall?.widget ?? jitsiWidget;\n    }\n    const updateWidgetState = useCallback((): void => {\n        setCanPinWidget(sdkContext.widgetLayoutStore.canAddToContainer(room, \"top\"));\n        setWidgetPinned(!!widget && sdkContext.widgetLayoutStore.isInContainer(room, widget, \"top\"));\n    }, [room, widget, sdkContext.widgetLayoutStore]);\n    useEventEmitter(sdkContext.widgetLayoutStore, WidgetLayoutStore.emissionForRoom(room), updateWidgetState);\n    useEffect(() => {\n        updateWidgetState();\n    }, [room, jitsiWidget, groupCall, updateWidgetState]);\n    const [canPinWidget, setCanPinWidget] = useState(false);\n    const [widgetPinned, setWidgetPinned] = useState(false);\n    // We only want to prompt to pin the widget if it's not element call based.\n    const isECWidget = WidgetType.CALL.matches(widget?.type ?? \"\");\n    const promptPinWidget = !isECWidget && canPinWidget && !widgetPinned;\n    const connectedCalls = useEventEmitterState(CallStore.instance, CallStoreEvent.ConnectedCalls, () =>\n        Array.from(CallStore.instance.connectedCalls),\n    );\n\n    const state = useMemo((): State => {\n        if (connectedCalls.find((call) => call.roomId != room.roomId)) {\n            return State.Ongoing;\n        }\n        if (hasGroupCall && (hasJitsiWidget || hasManagedHybridWidget)) {\n            return promptPinWidget ? State.Unpinned : State.Ongoing;\n        }\n        if (hasLegacyCall) {\n            return State.Ongoing;\n        }\n\n        if (!callOptions.includes(PlatformCallType.LegacyCall) && !mayCreateElementCalls && !mayEditWidgets) {\n            return State.NoPermission;\n        }\n        // Catch-all for just not having any call options available.\n        if (!callOptions.length) {\n            return State.NoPermission;\n        }\n        return State.NoCall;\n    }, [\n        callOptions,\n        connectedCalls,\n        hasGroupCall,\n        hasJitsiWidget,\n        hasLegacyCall,\n        hasManagedHybridWidget,\n        mayCreateElementCalls,\n        mayEditWidgets,\n        promptPinWidget,\n        room.roomId,\n    ]);\n\n    const voiceCallClick = useCallback(\n        (evt: React.MouseEvent | undefined, callPlatformType: PlatformCallType): void => {\n            evt?.stopPropagation();\n            if (widget && promptPinWidget) {\n                sdkContext.widgetLayoutStore.moveToContainer(room, widget, \"top\");\n            } else {\n                placeCall(\n                    sdkContext.legacyCallHandler,\n                    room,\n                    CallType.Voice,\n                    callPlatformType,\n                    evt?.shiftKey || undefined,\n                    true,\n                );\n            }\n        },\n        [promptPinWidget, room, widget, sdkContext.widgetLayoutStore, sdkContext.legacyCallHandler],\n    );\n    const videoCallClick = useCallback(\n        (evt: React.MouseEvent | undefined, callPlatformType: PlatformCallType): void => {\n            evt?.stopPropagation();\n            if (widget && promptPinWidget) {\n                sdkContext.widgetLayoutStore.moveToContainer(room, widget, \"top\");\n            } else {\n                // If we have pressed shift then always skip the lobby, otherwise `undefined` will defer\n                // to the defaults of the call implementation.\n                placeCall(\n                    sdkContext.legacyCallHandler,\n                    room,\n                    CallType.Video,\n                    callPlatformType,\n                    evt?.shiftKey || undefined,\n                    false,\n                );\n            }\n        },\n        [widget, promptPinWidget, room, sdkContext.widgetLayoutStore, sdkContext.legacyCallHandler],\n    );\n\n    let voiceCallDisabledReason: string | null;\n    let videoCallDisabledReason: string | null;\n    switch (state) {\n        case State.NoPermission:\n            voiceCallDisabledReason = _t(\"voip|disabled_no_perms_start_voice_call\");\n            videoCallDisabledReason = _t(\"voip|disabled_no_perms_start_video_call\");\n            break;\n        case State.Ongoing:\n            voiceCallDisabledReason = _t(\"voip|disabled_ongoing_call\");\n            videoCallDisabledReason = _t(\"voip|disabled_ongoing_call\");\n            break;\n        case State.Unpinned:\n        case State.NotJoined:\n        case State.NoCall:\n            voiceCallDisabledReason = null;\n            videoCallDisabledReason = null;\n    }\n    const toggleCallMaximized = useCallback(() => {\n        defaultDispatcher.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            room_id: room.roomId,\n            metricsTrigger: undefined,\n            view_call: !isViewingCall,\n        });\n    }, [isViewingCall, room.roomId]);\n\n    const roomDoesNotExist = room instanceof LocalRoom && room.state !== LocalRoomState.CREATED;\n\n    // We hide the voice call button if it'd have the same effect as the video call button\n    let hideVoiceCallButton =\n        isManagedHybridWidgetEnabled(room) ||\n        // Disable voice calls if Legacy calls are disabled\n        (!callOptions.includes(PlatformCallType.LegacyCall) &&\n            // Disable voice calls in ECall if the room is a group (we only present video calls for groups of users)\n            (!callOptions.includes(PlatformCallType.ElementCall) || memberCount > 2));\n\n    let hideVideoCallButton = false;\n    // We hide both buttons if:\n    // - they require widgets but widgets are disabled\n    // - if the Voip feature is disabled.\n    // - The room is not created yet (rendering \"send first message view\")\n    if ((memberCount > 2 && !widgetsFeatureEnabled) || !voipFeatureEnabled || roomDoesNotExist) {\n        hideVoiceCallButton = true;\n        hideVideoCallButton = true;\n    }\n\n    /**\n     * We've gone through all the steps\n     */\n    return {\n        voiceCallDisabledReason,\n        voiceCallClick,\n        videoCallDisabledReason,\n        videoCallClick,\n        toggleCallMaximized: toggleCallMaximized,\n        isViewingCall: isViewingCall,\n        isConnectedToCall: isConnectedToCall,\n        activeCallSessionType: activeCallSessionType,\n        callOptions,\n        showVoiceCallButton: !hideVoiceCallButton,\n        showVideoCallButton: !hideVideoCallButton,\n    };\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { useMemo } from \"react\";\n\nimport { TimelineRenderingType } from \"../../contexts/RoomContext\";\nimport { useSettingValue } from \"../useSettings\";\nimport { useScopedRoomContext } from \"../../contexts/ScopedRoomContext.tsx\";\n\nexport function useRoomMemberProfile({\n    userId = \"\",\n    member: propMember,\n    forceHistorical = false,\n}: {\n    userId: string | undefined;\n    member?: RoomMember | null;\n    forceHistorical?: boolean;\n}): RoomMember | undefined | null {\n    const context = useScopedRoomContext(\"room\", \"timelineRenderingType\");\n    const useOnlyCurrentProfiles = useSettingValue(\"useOnlyCurrentProfiles\");\n\n    const member = useMemo(() => {\n        const threadContexts = [TimelineRenderingType.ThreadsList, TimelineRenderingType.Thread];\n        if ((!forceHistorical && useOnlyCurrentProfiles) || threadContexts.includes(context.timelineRenderingType)) {\n            const currentMember = context.room?.getMember(userId);\n            if (currentMember) return currentMember;\n        }\n\n        return propMember;\n    }, [forceHistorical, propMember, context.room, context.timelineRenderingType, useOnlyCurrentProfiles, userId]);\n\n    return member;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useState, useCallback, useMemo, useEffect } from \"react\";\n\nimport type { RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { type Call, ConnectionState, CallEvent } from \"../models/Call\";\nimport { useTypedEventEmitterState, useEventEmitter } from \"./useEventEmitter\";\nimport { CallStore, CallStoreEvent } from \"../stores/CallStore\";\n\nexport const useCall = (roomId: string): Call | null => {\n    const [call, setCall] = useState(() => CallStore.instance.getCall(roomId));\n    useEventEmitter(CallStore.instance, CallStoreEvent.Call, (call: Call | null, forRoomId: string) => {\n        if (forRoomId === roomId) setCall(call);\n    });\n\n    // Reset the value when the roomId changes\n    useEffect(() => {\n        setCall(CallStore.instance.getCall(roomId));\n    }, [roomId]);\n\n    return call;\n};\n\nexport const useConnectionState = (call: Call | null): ConnectionState =>\n    useTypedEventEmitterState(\n        call ?? undefined,\n        CallEvent.ConnectionState,\n        useCallback((state) => state ?? call?.connectionState ?? ConnectionState.Disconnected, [call]),\n    );\n\nconst useParticipants = (call: Call | null): Map<RoomMember, Set<string>> => {\n    return useTypedEventEmitterState(\n        call ?? undefined,\n        CallEvent.Participants,\n        useCallback((state) => state ?? call?.participants ?? [], [call]),\n    );\n};\n\nexport const useParticipantCount = (call: Call | null): number => {\n    const participants = useParticipants(call);\n\n    return useMemo(() => {\n        return [...participants.values()].reduce<number>((count, set) => count + set.size, 0);\n    }, [participants]);\n};\n\nexport const useParticipatingMembers = (call: Call | null): RoomMember[] => {\n    const participants = useParticipants(call);\n    return useMemo(() => [...participants.keys()], [participants]);\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useEffect, useRef } from \"react\";\n\nimport { type ActionPayload } from \"../dispatcher/payloads\";\nimport { type MatrixDispatcher } from \"../dispatcher/dispatcher\";\n\n// Hook to simplify listening to event dispatches\nexport const useDispatcher = (dispatcher: MatrixDispatcher, handler: (payload: ActionPayload) => void): void => {\n    // Create a ref that stores handler\n    const savedHandler = useRef((payload: ActionPayload) => {});\n\n    // Update ref.current value if handler changes.\n    useEffect(() => {\n        savedHandler.current = handler;\n    }, [handler]);\n\n    useEffect(() => {\n        // Create event listener that calls handler function stored in ref\n        const ref = dispatcher.register((payload) => savedHandler.current(payload));\n        // Remove event listener on cleanup\n        return () => {\n            dispatcher.unregister(ref);\n        };\n    }, [dispatcher]);\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient, type MatrixEvent, type Room, EventType } from \"matrix-js-sdk/src/matrix\";\nimport { type CryptoApi } from \"matrix-js-sdk/src/crypto-api\";\n\nimport { useRoomState } from \"./useRoomState.ts\";\nimport { useAsyncMemo } from \"./useAsyncMemo.ts\";\nimport { LocalRoom } from \"../models/LocalRoom.ts\";\n\n/**\n * Check if a room is encrypted.\n * If the room is a LocalRoom, check the state directly.\n * Otherwise, use the crypto API to check if encryption is enabled in the room.\n *\n * @param room - The room to check.\n * @param cryptoApi - The crypto API from the Matrix client.\n */\nexport async function isRoomEncrypted(room: Room, cryptoApi: CryptoApi): Promise<boolean> {\n    if (room instanceof LocalRoom) {\n        // For local room check the state.\n        // The crypto check fails because the room ID is not valid (it is a local id)\n        return (room as LocalRoom).isEncryptionEnabled();\n    }\n\n    return await cryptoApi.isEncryptionEnabledInRoom(room.roomId);\n}\n\n// Hook to simplify watching whether a Matrix room is encrypted, returns null if room is undefined or the state is loading\nexport function useIsEncrypted(cli: MatrixClient, room?: Room): boolean | null {\n    const encryptionStateEvent: MatrixEvent | undefined = useRoomState(\n        room,\n        (roomState) => roomState.getStateEvents(EventType.RoomEncryption)?.[0],\n    );\n    return useAsyncMemo(\n        async () => {\n            const crypto = cli.getCrypto();\n            if (!room || !crypto) return null;\n\n            return isRoomEncrypted(room, crypto);\n        },\n        [room, encryptionStateEvent],\n        null,\n    );\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useCallback } from \"react\";\nimport { JoinRule, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport { useSettingValue } from \"./useSettings\";\nimport { useRoomState } from \"./useRoomState\";\nimport { useMatrixClientContext } from \"../contexts/MatrixClientContext\";\nimport { computeMediaVisibility, setMediaVisibility } from \"../utils/media/mediaVisibility\";\n\n/**\n * Determine whether media for an event should be visible in the client and expose a setter for\n * a per-event override.\n *\n * Visibility is resolved from the effective `mediaPreviewConfig` setting together with any\n * event-specific overrides stored in `showMediaEventIds`.\n *\n * @param mxEvent - The event that contains the media. If omitted, visibility is derived from the\n * current setting defaults and the returned setter is a no-op.\n *\n * @returns A tuple containing the effective visibility for the event and a function that stores a\n * device-local visibility override for that event.\n */\nexport function useMediaVisible(mxEvent?: MatrixEvent): [boolean, (visible: boolean) => void] {\n    const client = useMatrixClientContext();\n    const roomId = mxEvent?.getRoomId();\n    const mediaPreviewSetting = useSettingValue(\"mediaPreviewConfig\", roomId);\n    const eventVisibility = useSettingValue(\"showMediaEventIds\");\n    const room = roomId ? (client.getRoom(roomId) ?? undefined) : undefined;\n    const joinRule = useRoomState(room, (state) => state.getJoinRule());\n\n    const setMediaVisible = useCallback(\n        (visible: boolean) => {\n            if (!mxEvent) return;\n            void setMediaVisibility(mxEvent, visible);\n        },\n        [mxEvent],\n    );\n\n    return [\n        computeMediaVisibility(\n            mediaPreviewSetting,\n            eventVisibility,\n            client.getUserId() ?? undefined,\n            mxEvent?.getId(),\n            mxEvent?.getSender(),\n            joinRule ? [JoinRule.Invite, JoinRule.Knock, JoinRule.Restricted].includes(joinRule) : false,\n        ),\n        setMediaVisible,\n    ];\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useMemo, useState } from \"react\";\nimport { type Room, RoomEvent, type RoomMember, RoomStateEvent } from \"matrix-js-sdk/src/matrix\";\nimport { type Membership } from \"matrix-js-sdk/src/types\";\nimport { throttle } from \"lodash\";\n\nimport { useTypedEventEmitter } from \"./useEventEmitter\";\n\n// Hook to simplify watching Matrix Room joined members\nexport const useRoomMembers = (room: Room, throttleWait = 250): RoomMember[] => {\n    const [members, setMembers] = useState<RoomMember[]>(room.getJoinedMembers());\n\n    const throttledUpdate = useMemo(\n        () =>\n            throttle(\n                () => {\n                    setMembers(room.getJoinedMembers());\n                },\n                throttleWait,\n                { leading: true, trailing: true },\n            ),\n        [room, throttleWait],\n    );\n\n    useTypedEventEmitter(room.currentState, RoomStateEvent.Members, throttledUpdate);\n    return members;\n};\n\ntype RoomMemberCountOpts = {\n    /**\n     * Wait time between room member count update\n     */\n    throttleWait?: number;\n    /**\n     * Whether to include invited members in the count\n     * @default false\n     */\n    includeInvited?: boolean;\n};\n\n/**\n * Returns a count of members in a given room\n * @param room the room to track.\n * @param opts The options.\n * @returns the room member count.\n */\nexport const useRoomMemberCount = (\n    room: Room,\n    { throttleWait, includeInvited }: RoomMemberCountOpts = { throttleWait: 250, includeInvited: false },\n): number => {\n    const [count, setCount] = useState<number>(\n        includeInvited ? room.getInvitedAndJoinedMemberCount() : room.getJoinedMemberCount(),\n    );\n    const throttledUpdate = useMemo(\n        () =>\n            throttle(\n                () => {\n                    setCount(includeInvited ? room.getInvitedAndJoinedMemberCount() : room.getJoinedMemberCount());\n                },\n                throttleWait,\n                { leading: true, trailing: true },\n            ),\n        [room, throttleWait, includeInvited],\n    );\n\n    useTypedEventEmitter(room.currentState, RoomStateEvent.Members, throttledUpdate);\n\n    /**\n     * `room.getJoinedMemberCount()` caches the member count behind the room summary\n     * So we need to re-compute the member count when the summary gets updated\n     */\n    useTypedEventEmitter(room, RoomEvent.Summary, throttledUpdate);\n    return count;\n};\n\n// Hook to simplify watching the local user's membership in a room\nexport const useMyRoomMembership = (room: Room): Membership => {\n    const [membership, setMembership] = useState<Membership>(room.getMyMembership());\n    useTypedEventEmitter(room, RoomEvent.MyMembership, () => {\n        setMembership(room.getMyMembership());\n    });\n    return membership;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { type RoomNotifState } from \"../RoomNotifs\";\nimport { EchoChamber } from \"../stores/local-echo/EchoChamber\";\nimport { PROPERTY_UPDATED } from \"../stores/local-echo/GenericEchoChamber\";\nimport { CachedRoomKey } from \"../stores/local-echo/RoomEchoChamber\";\nimport { useEventEmitter } from \"./useEventEmitter\";\n\nexport const useNotificationState = (room: Room): [RoomNotifState | undefined, (state: RoomNotifState) => void] => {\n    const echoChamber = useMemo(() => EchoChamber.forRoom(room), [room]);\n    const [notificationState, setNotificationState] = useState<RoomNotifState | undefined>(\n        echoChamber.notificationVolume,\n    );\n    useEventEmitter(echoChamber, PROPERTY_UPDATED, (key: CachedRoomKey) => {\n        if (key === CachedRoomKey.NotificationVolume && echoChamber.notificationVolume !== undefined) {\n            setNotificationState(echoChamber.notificationVolume);\n        }\n    });\n    // eslint-disable-next-line react-compiler/react-compiler\n    const setter = useCallback((state: RoomNotifState) => (echoChamber.notificationVolume = state), [echoChamber]);\n    return [notificationState, setter];\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { type Room, type RoomState, RoomStateEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport { useTypedEventEmitter } from \"./useEventEmitter\";\n\ntype Mapper<T> = (roomState: RoomState) => T;\n\n/**\n * A hook to watch the state of a room.\n *\n * Call `useRoomState` in a component to watch the state of a room.\n *\n * A mapper function must be provided to process the room state into outputs suitable for the component. The mapper\n * function will be called whenever the room state changes.\n *\n * @example\n * ```\n * function MyComponent({room}: Props): JSX.Element {\n *   const { historyVisibility, joinRule } = useRoomState(room, state => ({\n *      historyVisibility: state.getHistoryVisibility(),\n *      joinRule: state.getJoinRule(),\n *   }));\n *   // ...\n * ```\n *\n * @param room - The room to watch. If this is undefined, the returned value will also be undefined.\n * @param mapper - A function to process the room state into outputs suitable for the component.\n * @returns The output of `mapper`, or `undefined` if `room` is undefined.\n */\nexport function useRoomState<T>(room: Room, mapper: Mapper<T>): T;\nexport function useRoomState<T>(room: Room | undefined, mapper: Mapper<T>): T | undefined;\nexport function useRoomState<T>(room: Room | undefined, mapper: Mapper<T>): T | undefined {\n    // Create a ref that stores mapper\n    const savedMapper = useRef(mapper);\n\n    // Update ref.current value if mapper changes.\n    useEffect(() => {\n        savedMapper.current = mapper;\n    }, [mapper]);\n\n    const [value, setValue] = useState<T | undefined>(room ? mapper(room.currentState) : undefined);\n\n    const update = useCallback(() => {\n        if (!room) return;\n        setValue(savedMapper.current(room.currentState));\n    }, [room]);\n\n    useTypedEventEmitter(room?.currentState, RoomStateEvent.Update, update);\n    useEffect(() => {\n        update();\n        return () => {\n            setValue(room ? savedMapper.current(room.currentState) : undefined);\n        };\n    }, [room, update]);\n    return value;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useEffect, useState } from \"react\";\n\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { type SettingLevel } from \"../settings/SettingLevel\";\nimport { type FeatureSettingKey, type SettingKey, type Settings } from \"../settings/Settings.tsx\";\n\n// Hook to fetch the value of a setting and dynamically update when it changes\nexport function useSettingValue<S extends SettingKey>(\n    settingName: S,\n    roomId: string | null,\n    excludeDefault: true,\n): Settings[S][\"default\"] | undefined;\nexport function useSettingValue<S extends SettingKey>(\n    settingName: S,\n    roomId?: string | null,\n    excludeDefault?: false,\n): Settings[S][\"default\"];\nexport function useSettingValue<S extends SettingKey>(\n    settingName: S,\n    roomId: string | null = null,\n    excludeDefault = false,\n): Settings[S][\"default\"] | undefined {\n    const [value, setValue] = useState(\n        // XXX: This seems naff but is needed to convince TypeScript that the overload is fine\n        excludeDefault\n            ? SettingsStore.getValue(settingName, roomId, excludeDefault)\n            : SettingsStore.getValue(settingName, roomId, excludeDefault),\n    );\n\n    useEffect(() => {\n        const ref = SettingsStore.watchSetting(settingName, roomId, () => {\n            setValue(\n                // XXX: This seems naff but is needed to convince TypeScript that the overload is fine\n                excludeDefault\n                    ? SettingsStore.getValue(settingName, roomId, excludeDefault)\n                    : SettingsStore.getValue(settingName, roomId, excludeDefault),\n            );\n        });\n        // clean-up\n        return () => {\n            SettingsStore.unwatchSetting(ref);\n        };\n    }, [settingName, roomId, excludeDefault]);\n\n    return value;\n}\n\n/**\n * Hook to fetch the value of a setting at a specific level and dynamically update when it changes\n * @see SettingsStore.getValueAt\n * @param level\n * @param settingName\n * @param roomId\n * @param explicit\n * @param excludeDefault\n */\nexport const useSettingValueAt = <S extends SettingKey>(\n    level: SettingLevel,\n    settingName: S,\n    roomId: string | null = null,\n    explicit = false,\n    excludeDefault = false,\n): Settings[S][\"default\"] => {\n    const [value, setValue] = useState(SettingsStore.getValueAt(level, settingName, roomId, explicit, excludeDefault));\n\n    useEffect(() => {\n        const ref = SettingsStore.watchSetting(settingName, roomId, () => {\n            setValue(SettingsStore.getValueAt(level, settingName, roomId, explicit, excludeDefault));\n        });\n        // clean-up\n        return () => {\n            SettingsStore.unwatchSetting(ref);\n        };\n    }, [level, settingName, roomId, explicit, excludeDefault]);\n\n    return value;\n};\n\n// Hook to fetch whether a feature is enabled and dynamically update when that changes\nexport const useFeatureEnabled = (featureName: FeatureSettingKey, roomId: string | null = null): boolean => {\n    const [enabled, setEnabled] = useState(SettingsStore.getValue(featureName, roomId));\n\n    useEffect(() => {\n        const ref = SettingsStore.watchSetting(featureName, roomId, () => {\n            setEnabled(SettingsStore.getValue(featureName, roomId));\n        });\n        // clean-up\n        return () => {\n            SettingsStore.unwatchSetting(ref);\n        };\n    }, [featureName, roomId]);\n\n    return enabled;\n};\n","/**\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useEffect, useState } from \"react\";\nimport { ClientEvent } from \"matrix-js-sdk/src/matrix\";\nimport { logger as rootLogger } from \"matrix-js-sdk/src/logger\";\nimport { type UserStatus } from \"@element-hq/web-shared-components\";\n\nimport { useMatrixClientContext } from \"../contexts/MatrixClientContext\";\nimport { useTypedEventEmitter } from \"./useEventEmitter\";\nimport { useFeatureEnabled } from \"./useSettings\";\nimport { fetchUserStatus, validateUserStatus } from \"../utils/userStatus\";\n\nconst logger = rootLogger.getChild(\"useUserStatus\");\n\n/**\n * Hook to get the MSC4426 user status for a given user ID. Returns undefined if the feature is disabled,\n * the user does not have a status, or if there was an error fetching the status.\n *\n * @param userId The ID of the user whose status is being fetched.\n * @returns The user's status, or undefined if not available.\n */\nexport function useUserStatus(userId: string | undefined): UserStatus | undefined {\n    const isEnabled = useFeatureEnabled(\"feature_user_status\");\n    const matrixClient = useMatrixClientContext();\n    const [userStatus, setUserStatus] = useState<UserStatus | undefined>();\n\n    useTypedEventEmitter(matrixClient, ClientEvent.UserProfileUpdate, (syncedUserId, syncProfile) => {\n        if (syncedUserId !== userId) {\n            return;\n        }\n\n        setUserStatus(validateUserStatus(syncProfile[\"org.matrix.msc4426.status\"]));\n    });\n    useEffect(() => {\n        (async () => {\n            if (!isEnabled) {\n                return;\n            }\n            if (!userId) {\n                setUserStatus(undefined);\n                return;\n            }\n            if ((await matrixClient.doesServerSupportExtendedProfiles()) === false) {\n                setUserStatus(undefined);\n                return;\n            }\n            try {\n                const result = await fetchUserStatus(matrixClient, userId);\n                setUserStatus(result);\n            } catch (ex) {\n                logger.warn(`Failed to get userStatus for ${userId}`, ex);\n            }\n        })();\n    }, [isEnabled, userId, matrixClient]);\n    if (!isEnabled) {\n        return;\n    }\n\n    return userStatus;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport globToRegexp from \"glob-to-regexp\";\n\n// Taken with permission from matrix-bot-sdk:\n// https://github.com/turt2live/matrix-js-bot-sdk/blob/eb148c2ecec7bf3ade801d73deb43df042d55aef/src/MatrixGlob.ts\n\n/**\n * Represents a common Matrix glob. This is commonly used\n * for server ACLs and similar functions.\n */\nexport class MatrixGlob {\n    private regex: RegExp;\n\n    /**\n     * Creates a new Matrix Glob\n     * @param {string} glob The glob to convert. Eg: \"*.example.org\"\n     */\n    public constructor(glob: string) {\n        const globRegex = globToRegexp(glob, {\n            extended: false,\n            globstar: false,\n        });\n\n        // We need to convert `?` manually because globToRegexp's extended mode\n        // does more than we want it to.\n        const replaced = globRegex.toString().replace(/\\\\\\?/g, \".\");\n        this.regex = new RegExp(replaced.substring(1, replaced.length - 1));\n    }\n\n    /**\n     * Tests the glob against a value, returning true if it matches.\n     * @param {string} val The value to test.\n     * @returns {boolean} True if the value matches the glob, false otherwise.\n     */\n    public test(val: string): boolean {\n        return this.regex.test(val);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n// We are using experimental APIs here, so we need to disable the linter\n// eslint-disable-next-line no-restricted-imports\nimport { PolicyRecommendation } from \"matrix-js-sdk/src/models/invites-ignorer\";\n\nimport { MatrixGlob } from \"../utils/MatrixGlob\";\n\n// Inspiration largely taken from Mjolnir itself\n\nexport const RECOMMENDATION_BAN = PolicyRecommendation.Ban;\nexport const RECOMMENDATION_BAN_TYPES: PolicyRecommendation[] = [\n    RECOMMENDATION_BAN,\n    \"org.matrix.mjolnir.ban\" as PolicyRecommendation,\n];\n\nexport function recommendationToStable(\n    recommendation: PolicyRecommendation,\n    unstable = true,\n): PolicyRecommendation | null {\n    if (RECOMMENDATION_BAN_TYPES.includes(recommendation)) {\n        return unstable ? RECOMMENDATION_BAN_TYPES[RECOMMENDATION_BAN_TYPES.length - 1] : RECOMMENDATION_BAN;\n    }\n    return null;\n}\n\nexport class ListRule {\n    private _glob: MatrixGlob;\n    private readonly _entity: string;\n    private readonly _action: string | null;\n    private readonly _reason: string;\n    private readonly _kind: string;\n\n    public constructor(entity: string, action: PolicyRecommendation, reason: string, kind: string) {\n        this._glob = new MatrixGlob(entity);\n        this._entity = entity;\n        this._action = recommendationToStable(action, false);\n        this._reason = reason;\n        this._kind = kind;\n    }\n\n    public get entity(): string {\n        return this._entity;\n    }\n\n    public get reason(): string {\n        return this._reason;\n    }\n\n    public get kind(): string {\n        return this._kind;\n    }\n\n    public get recommendation(): string | null {\n        return this._action;\n    }\n\n    public isMatch(entity: string): boolean {\n        return this._glob.test(entity);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n// Inspiration largely taken from Mjolnir itself\n\nimport { EventType } from \"matrix-js-sdk/src/matrix\";\n\nimport { ListRule, RECOMMENDATION_BAN, recommendationToStable } from \"./ListRule\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\n\nexport const RULE_USER = EventType.PolicyRuleUser;\nexport const RULE_ROOM = EventType.PolicyRuleRoom;\nexport const RULE_SERVER = EventType.PolicyRuleServer;\n\n// m.room.* events are legacy from when MSC2313 changed to m.policy.* last minute.\nexport const USER_RULE_TYPES = [RULE_USER, \"m.room.rule.user\", \"org.matrix.mjolnir.rule.user\"];\nexport const ROOM_RULE_TYPES = [RULE_ROOM, \"m.room.rule.room\", \"org.matrix.mjolnir.rule.room\"];\nexport const SERVER_RULE_TYPES = [RULE_SERVER, \"m.room.rule.server\", \"org.matrix.mjolnir.rule.server\"];\nexport const ALL_RULE_TYPES = [...USER_RULE_TYPES, ...ROOM_RULE_TYPES, ...SERVER_RULE_TYPES];\n\nexport function ruleTypeToStable(\n    rule: string,\n): EventType.PolicyRuleUser | EventType.PolicyRuleRoom | EventType.PolicyRuleServer | null {\n    if (USER_RULE_TYPES.includes(rule)) {\n        return RULE_USER;\n    }\n    if (ROOM_RULE_TYPES.includes(rule)) {\n        return RULE_ROOM;\n    }\n    if (SERVER_RULE_TYPES.includes(rule)) {\n        return RULE_SERVER;\n    }\n    return null;\n}\n\nexport class BanList {\n    private _rules: ListRule[] = [];\n    private _roomId: string;\n\n    public constructor(roomId: string) {\n        this._roomId = roomId;\n        this.updateList();\n    }\n\n    public get roomId(): string {\n        return this._roomId;\n    }\n\n    public get serverRules(): ListRule[] {\n        return this._rules.filter((r) => r.kind === RULE_SERVER);\n    }\n\n    public get userRules(): ListRule[] {\n        return this._rules.filter((r) => r.kind === RULE_USER);\n    }\n\n    public async banEntity(kind: string, entity: string, reason: string): Promise<any> {\n        const type = ruleTypeToStable(kind);\n        if (!type) return; // unknown rule type\n        await MatrixClientPeg.safeGet().sendStateEvent(\n            this._roomId,\n            type,\n            {\n                entity: entity,\n                reason: reason,\n                recommendation: recommendationToStable(RECOMMENDATION_BAN, true)!,\n            },\n            \"rule:\" + entity,\n        );\n        this._rules.push(new ListRule(entity, RECOMMENDATION_BAN, reason, type));\n    }\n\n    public async unbanEntity(kind: string, entity: string): Promise<any> {\n        const type = ruleTypeToStable(kind);\n        if (!type) return; // unknown rule type\n        // Empty state event is effectively deleting it.\n        await MatrixClientPeg.safeGet().sendStateEvent(this._roomId, type, {}, \"rule:\" + entity);\n        this._rules = this._rules.filter((r) => {\n            if (r.kind !== ruleTypeToStable(kind)) return true;\n            if (r.entity !== entity) return true;\n            return false; // we just deleted this rule\n        });\n    }\n\n    public updateList(): void {\n        this._rules = [];\n\n        const room = MatrixClientPeg.safeGet().getRoom(this._roomId);\n        if (!room) return;\n\n        for (const eventType of ALL_RULE_TYPES) {\n            const events = room.currentState.getStateEvents(eventType);\n            for (const ev of events) {\n                if (!ev.getStateKey()) continue;\n\n                const kind = ruleTypeToStable(eventType);\n                if (!kind) continue; // unknown type\n\n                const entity = ev.getContent()[\"entity\"];\n                const recommendation = ev.getContent()[\"recommendation\"];\n                const reason = ev.getContent()[\"reason\"];\n                if (!entity || !recommendation || !reason) continue;\n\n                this._rules.push(new ListRule(entity, recommendation, reason, kind));\n            }\n        }\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, RoomStateEvent, Preset } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport { ALL_RULE_TYPES, BanList } from \"./BanList\";\nimport SettingsStore, { type CallbackFn } from \"../settings/SettingsStore\";\nimport { _t } from \"../languageHandler\";\nimport dis from \"../dispatcher/dispatcher\";\nimport { SettingLevel } from \"../settings/SettingLevel\";\nimport { type ActionPayload } from \"../dispatcher/payloads\";\nimport { type DoAfterSyncPreparedPayload } from \"../dispatcher/payloads/DoAfterSyncPreparedPayload\";\nimport { Action } from \"../dispatcher/actions\";\n\n// TODO: Move this and related files to the js-sdk or something once finalized.\n\nexport class Mjolnir {\n    private static instance?: Mjolnir;\n\n    private _lists: BanList[] = []; // eslint-disable-line @typescript-eslint/naming-convention\n    private _roomIds: string[] = []; // eslint-disable-line @typescript-eslint/naming-convention\n    private mjolnirWatchRef?: string;\n    private dispatcherRef?: string;\n\n    public get roomIds(): string[] {\n        return this._roomIds;\n    }\n\n    public get lists(): BanList[] {\n        return this._lists;\n    }\n\n    public start(): void {\n        this.mjolnirWatchRef = SettingsStore.watchSetting(\"mjolnirRooms\", null, this.onListsChanged);\n\n        this.dispatcherRef = dis.register(this.onAction);\n        dis.dispatch<DoAfterSyncPreparedPayload<ActionPayload>>({\n            action: Action.DoAfterSyncPrepared,\n            deferred_action: { action: \"setup_mjolnir\" },\n        });\n    }\n\n    private onAction = (payload: ActionPayload): void => {\n        if (payload[\"action\"] === \"setup_mjolnir\") {\n            logger.log(\"Setting up Mjolnir: after sync\");\n            this.setup();\n        }\n    };\n\n    public setup(): void {\n        if (!MatrixClientPeg.get()) return;\n        this.updateLists(SettingsStore.getValue(\"mjolnirRooms\"));\n        MatrixClientPeg.get()!.on(RoomStateEvent.Events, this.onEvent);\n    }\n\n    public stop(): void {\n        SettingsStore.unwatchSetting(this.mjolnirWatchRef);\n        this.mjolnirWatchRef = undefined;\n\n        dis.unregister(this.dispatcherRef);\n        this.dispatcherRef = undefined;\n\n        MatrixClientPeg.get()?.removeListener(RoomStateEvent.Events, this.onEvent);\n    }\n\n    public async getOrCreatePersonalList(): Promise<BanList> {\n        let personalRoomId = SettingsStore.getValue(\"mjolnirPersonalRoom\");\n        if (!personalRoomId) {\n            const resp = await MatrixClientPeg.safeGet().createRoom({\n                name: _t(\"labs_mjolnir|room_name\"),\n                topic: _t(\"labs_mjolnir|room_topic\"),\n                preset: Preset.PrivateChat,\n            });\n            personalRoomId = resp[\"room_id\"];\n            await SettingsStore.setValue(\"mjolnirPersonalRoom\", null, SettingLevel.ACCOUNT, personalRoomId);\n            await SettingsStore.setValue(\"mjolnirRooms\", null, SettingLevel.ACCOUNT, [\n                personalRoomId,\n                ...this._roomIds,\n            ]);\n        }\n        if (!personalRoomId) {\n            throw new Error(\"Error finding a room ID to use\");\n        }\n\n        let list = this._lists.find((b) => b.roomId === personalRoomId);\n        if (!list) list = new BanList(personalRoomId);\n        // we don't append the list to the tracked rooms because it should already be there.\n        // we're just trying to get the caller some utility access to the list\n\n        return list;\n    }\n\n    // get without creating the list\n    public getPersonalList(): BanList | null {\n        const personalRoomId = SettingsStore.getValue(\"mjolnirPersonalRoom\");\n        if (!personalRoomId) return null;\n\n        let list = this._lists.find((b) => b.roomId === personalRoomId);\n        if (!list) list = new BanList(personalRoomId);\n        // we don't append the list to the tracked rooms because it should already be there.\n        // we're just trying to get the caller some utility access to the list\n\n        return list;\n    }\n\n    public async subscribeToList(roomId: string): Promise<void> {\n        const roomIds = [...this._roomIds, roomId];\n        await SettingsStore.setValue(\"mjolnirRooms\", null, SettingLevel.ACCOUNT, roomIds);\n        this._lists.push(new BanList(roomId));\n    }\n\n    public async unsubscribeFromList(roomId: string): Promise<void> {\n        const roomIds = this._roomIds.filter((r) => r !== roomId);\n        await SettingsStore.setValue(\"mjolnirRooms\", null, SettingLevel.ACCOUNT, roomIds);\n        this._lists = this._lists.filter((b) => b.roomId !== roomId);\n    }\n\n    private onEvent = (event: MatrixEvent): void => {\n        if (!MatrixClientPeg.get()) return;\n        if (!this._roomIds.includes(event.getRoomId()!)) return;\n        if (!ALL_RULE_TYPES.includes(event.getType())) return;\n\n        this.updateLists(this._roomIds);\n    };\n\n    private onListsChanged: CallbackFn<\"mjolnirRooms\"> = (settingName, roomId, atLevel, newValue): void => {\n        // We know that ban lists are only recorded at one level so we don't need to re-eval them\n        this.updateLists(newValue ?? []);\n    };\n\n    private updateLists(listRoomIds: string[]): void {\n        if (!MatrixClientPeg.get()) return;\n\n        logger.log(\"Updating Mjolnir ban lists to: \" + listRoomIds);\n        this._lists = [];\n        this._roomIds = listRoomIds || [];\n        if (!listRoomIds) return;\n\n        for (const roomId of listRoomIds) {\n            // Creating the list updates it\n            this._lists.push(new BanList(roomId));\n        }\n    }\n\n    public isServerBanned(serverName: string): boolean {\n        for (const list of this._lists) {\n            for (const rule of list.serverRules) {\n                if (rule.isMatch(serverName)) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    public isUserBanned(userId: string): boolean {\n        for (const list of this._lists) {\n            for (const rule of list.userRules) {\n                if (rule.isMatch(userId)) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    public static sharedInstance(): Mjolnir {\n        if (!Mjolnir.instance) {\n            Mjolnir.instance = new Mjolnir();\n        }\n        return Mjolnir.instance;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n    TypedEventEmitter,\n    RoomEvent,\n    RoomStateEvent,\n    type MatrixClient,\n    type IMyDevice,\n    type Room,\n    type RoomMember,\n} from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership, type Membership } from \"matrix-js-sdk/src/types\";\nimport { logger as rootLogger } from \"matrix-js-sdk/src/logger\";\nimport { secureRandomString } from \"matrix-js-sdk/src/randomstring\";\nimport { CallType } from \"matrix-js-sdk/src/webrtc/call\";\nimport { type IWidgetApiRequest, type ClientWidgetApi, type IWidgetData } from \"matrix-widget-api\";\nimport {\n    type MatrixRTCSession,\n    MatrixRTCSessionEvent,\n    MatrixRTCSessionManagerEvents,\n} from \"matrix-js-sdk/src/matrixrtc\";\n\nimport type EventEmitter from \"events\";\nimport type { IApp } from \"../stores/WidgetStore\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { timeout } from \"../utils/promise\";\nimport WidgetUtils from \"../utils/WidgetUtils\";\nimport { WidgetType } from \"../widgets/WidgetType\";\nimport { ElementWidgetActions } from \"../stores/widgets/ElementWidgetActions\";\nimport WidgetStore from \"../stores/WidgetStore\";\nimport { WidgetMessagingStore, WidgetMessagingStoreEvent } from \"../stores/widgets/WidgetMessagingStore\";\nimport ActiveWidgetStore, { ActiveWidgetStoreEvent } from \"../stores/ActiveWidgetStore\";\nimport { getCurrentLanguage } from \"../languageHandler\";\nimport { Anonymity, PosthogAnalytics } from \"../PosthogAnalytics\";\nimport { isVideoRoom } from \"../utils/video-rooms\";\nimport { FontWatcher } from \"../settings/watchers/FontWatcher\";\nimport { type JitsiCallMemberContent, JitsiCallMemberEventType } from \"../call-types\";\nimport SdkConfig from \"../SdkConfig.ts\";\nimport DMRoomMap from \"../utils/DMRoomMap.ts\";\nimport { type WidgetMessaging, WidgetMessagingEvent } from \"../stores/widgets/WidgetMessaging.ts\";\nimport { BugReportEndpointURLLocal } from \"../IConfigOptions.ts\";\n\nconst TIMEOUT_MS = 16000;\nconst logger = rootLogger.getChild(\"models/Call\");\n\n// Waits until an event is emitted satisfying the given predicate\nconst waitForEvent = async (\n    emitter: EventEmitter,\n    event: string,\n    pred: (...args: any[]) => boolean = () => true,\n    customTimeout?: number | false,\n): Promise<void> => {\n    let listener: (...args: any[]) => void;\n    const wait = new Promise<void>((resolve) => {\n        listener = (...args) => {\n            if (pred(...args)) resolve();\n        };\n        emitter.on(event, listener);\n    });\n\n    if (customTimeout !== false) {\n        const timedOut = (await timeout(wait, false, customTimeout ?? TIMEOUT_MS)) === false;\n        if (timedOut) throw new Error(\"Timed out\");\n    } else {\n        await wait;\n    }\n    emitter.off(event, listener!);\n};\n\nexport enum ConnectionState {\n    Disconnected = \"disconnected\",\n    Connected = \"connected\",\n    Disconnecting = \"disconnecting\",\n}\n\nexport const isConnected = (state: ConnectionState): boolean =>\n    state === ConnectionState.Connected || state === ConnectionState.Disconnecting;\n\nexport enum CallEvent {\n    ConnectionState = \"connection_state\",\n    Participants = \"participants\",\n    Close = \"close\",\n    Destroy = \"destroy\",\n    CallTypeChanged = \"call_type_changed\",\n}\n\ninterface CallEventHandlerMap {\n    [CallEvent.ConnectionState]: (state: ConnectionState, prevState: ConnectionState) => void;\n    [CallEvent.Participants]: (\n        participants: Map<RoomMember, Set<string>>,\n        prevParticipants: Map<RoomMember, Set<string>>,\n    ) => void;\n    [CallEvent.Close]: () => void;\n    [CallEvent.Destroy]: () => void;\n    [CallEvent.CallTypeChanged]: (callType: CallType) => void;\n}\n\n/**\n * A group call accessed through a widget.\n */\nexport abstract class Call extends TypedEventEmitter<CallEvent, CallEventHandlerMap> {\n    protected readonly widgetUid: string;\n    protected readonly room: Room;\n\n    private _callType: CallType;\n    public get callType(): CallType {\n        return this._callType;\n    }\n\n    protected set callType(callType: CallType) {\n        const prevCallType = this._callType;\n        this._callType = callType;\n        if (callType !== prevCallType) this.emit(CallEvent.CallTypeChanged, callType);\n    }\n\n    /**\n     * The time after which device member state should be considered expired.\n     */\n    public abstract readonly STUCK_DEVICE_TIMEOUT_MS: number;\n\n    private _widgetApi: ClientWidgetApi | null = null;\n    /**\n     * The widget API interface to the widget, or null if disconnected.\n     */\n    protected get widgetApi(): ClientWidgetApi | null {\n        return this._widgetApi;\n    }\n    private set widgetApi(value: ClientWidgetApi | null) {\n        this._widgetApi = value;\n    }\n\n    public get roomId(): string {\n        return this.widget.roomId;\n    }\n\n    private _connectionState = ConnectionState.Disconnected;\n    public get connectionState(): ConnectionState {\n        return this._connectionState;\n    }\n    protected set connectionState(value: ConnectionState) {\n        const prevValue = this._connectionState;\n        this._connectionState = value;\n        this.emit(CallEvent.ConnectionState, value, prevValue);\n    }\n\n    public get connected(): boolean {\n        return isConnected(this.connectionState);\n    }\n\n    private _participants = new Map<RoomMember, Set<string>>();\n    /**\n     * The participants in the call, as a map from members to device IDs.\n     */\n    public get participants(): Map<RoomMember, Set<string>> {\n        return this._participants;\n    }\n    protected set participants(value: Map<RoomMember, Set<string>>) {\n        const prevValue = this._participants;\n        this._participants = value;\n        this.emit(CallEvent.Participants, value, prevValue);\n    }\n\n    private _presented = false;\n    /**\n     * Whether the call widget is currently being presented in the user interface.\n     */\n    public get presented(): boolean {\n        return this._presented;\n    }\n    public set presented(value: boolean) {\n        this._presented = value;\n    }\n\n    protected constructor(\n        /**\n         * The widget used to access this call.\n         */\n        public readonly widget: IApp,\n        protected readonly client: MatrixClient,\n        initialCallType: CallType,\n    ) {\n        super();\n        this.widgetUid = WidgetUtils.getWidgetUid(this.widget);\n        this.room = this.client.getRoom(this.roomId)!;\n        WidgetMessagingStore.instance.on(WidgetMessagingStoreEvent.StopMessaging, this.onStopMessaging);\n        this._callType = initialCallType;\n    }\n\n    /**\n     * Gets the call associated with the given room, if any.\n     * @param {Room} room The room.\n     * @returns {Call | null} The call.\n     */\n    public static get(room: Room): Call | null {\n        return ElementCall.get(room) ?? JitsiCall.get(room);\n    }\n\n    /**\n     * Performs a routine check of the call's associated room state, cleaning up\n     * any data left over from an unclean disconnection.\n     */\n    public abstract clean(): Promise<void>;\n\n    /**\n     * Contacts the widget to disconnect from the call.\n     */\n    protected abstract performDisconnection(): Promise<void>;\n\n    /**\n     * Starts the communication between the widget and the call.\n     * The widget associated with the call must be active for this to succeed.\n     * Only call this if the call state is: ConnectionState.Disconnected.\n     * @param _params Widget generation parameters are unused in this abstract class.\n     * @returns The ClientWidgetApi for this call.\n     */\n    public async start(_params?: WidgetGenerationParameters): Promise<ClientWidgetApi> {\n        const messagingStore = WidgetMessagingStore.instance;\n        const startTime = performance.now();\n        let messaging: WidgetMessaging | undefined = messagingStore.getMessagingForUid(this.widgetUid);\n        // The widget might still be initializing, so wait for it in an async\n        // event loop. We need the messaging to be both present and started\n        // (have a connected widget API), so register listeners for both cases.\n        while (!messaging?.widgetApi) {\n            if (messaging) logger.debug(`Messaging present but not yet started for ${this.widgetUid}`);\n            else logger.debug(`No messaging yet for ${this.widgetUid}`);\n            const recheck = Promise.withResolvers<void>();\n            const currentMessaging = messaging;\n\n            // Maybe the messaging is present but not yet started. In this case,\n            // check again for a widget API as soon as it starts.\n            const onStart = (): void => recheck.resolve();\n            currentMessaging?.on(WidgetMessagingEvent.Start, onStart);\n\n            // Maybe the messaging is not present at all. It's also entirely\n            // possible (as shown in React strict mode) that the messaging could\n            // be abandoned and replaced by an entirely new messaging object\n            // while we were waiting for the original one to start. We need to\n            // react to store updates in either case.\n            const onStoreMessaging = (uid: string, m: WidgetMessaging): void => {\n                if (uid === this.widgetUid) {\n                    messagingStore.off(WidgetMessagingStoreEvent.StoreMessaging, onStoreMessaging);\n                    messaging = m; // Check the new messaging object on the next iteration of the loop\n                    recheck.resolve();\n                }\n            };\n            messagingStore.on(WidgetMessagingStoreEvent.StoreMessaging, onStoreMessaging);\n\n            // Race both of the above recheck signals against a timeout.\n            const timeout = setTimeout(\n                () => recheck.reject(new Error(`Widget for call in ${this.roomId} not started; timed out`)),\n                TIMEOUT_MS - (performance.now() - startTime),\n            );\n\n            try {\n                await recheck.promise;\n            } finally {\n                currentMessaging?.off(WidgetMessagingEvent.Start, onStart);\n                messagingStore.off(WidgetMessagingStoreEvent.StoreMessaging, onStoreMessaging);\n                clearTimeout(timeout);\n            }\n        }\n\n        logger.debug(`Widget ${this.widgetUid} now ready`);\n        return (this.widgetApi = messaging.widgetApi);\n    }\n\n    protected setConnected(): void {\n        this.room.on(RoomEvent.MyMembership, this.onMyMembership);\n        window.addEventListener(\"beforeunload\", this.beforeUnload);\n        this.connectionState = ConnectionState.Connected;\n    }\n\n    /**\n     * Manually marks the call as disconnected.\n     */\n    protected setDisconnected(): void {\n        this.room.off(RoomEvent.MyMembership, this.onMyMembership);\n        window.removeEventListener(\"beforeunload\", this.beforeUnload);\n        this.connectionState = ConnectionState.Disconnected;\n    }\n\n    /**\n     * Disconnects the user from the call.\n     */\n    public async disconnect(): Promise<void> {\n        if (!this.connected) throw new Error(\"Not connected\");\n\n        this.connectionState = ConnectionState.Disconnecting;\n        await this.performDisconnection();\n        this.setDisconnected();\n        this.close();\n    }\n\n    /**\n     * Stops further communication with the widget and tells the UI to close.\n     */\n    protected close(): void {\n        this.widgetApi = null;\n        this.emit(CallEvent.Close);\n    }\n\n    /**\n     * Stops all internal timers and tasks to prepare for garbage collection.\n     */\n    public destroy(): void {\n        if (this.connected) {\n            this.setDisconnected();\n            this.close();\n        }\n        WidgetMessagingStore.instance.off(WidgetMessagingStoreEvent.StopMessaging, this.onStopMessaging);\n        this.emit(CallEvent.Destroy);\n    }\n\n    private readonly onMyMembership = async (_room: Room, membership: Membership): Promise<void> => {\n        if (membership !== KnownMembership.Join) this.setDisconnected();\n    };\n\n    private readonly onStopMessaging = (uid: string): void => {\n        if (uid === this.widgetUid && this.connected) {\n            logger.debug(\"The widget died; treating this as a user hangup\");\n            this.setDisconnected();\n            this.close();\n        }\n    };\n\n    private beforeUnload = (): void => {\n        this.setDisconnected();\n        this.close();\n    };\n}\n\nexport type { JitsiCallMemberContent };\n\n/**\n * A group call using Jitsi as a backend.\n */\nexport class JitsiCall extends Call {\n    public static readonly MEMBER_EVENT_TYPE = JitsiCallMemberEventType;\n    public readonly STUCK_DEVICE_TIMEOUT_MS = 1000 * 60 * 60; // 1 hour\n\n    private resendDevicesTimer: number | null = null;\n    private participantsExpirationTimer: number | null = null;\n\n    private constructor(widget: IApp, client: MatrixClient) {\n        super(widget, client, CallType.Video);\n\n        this.room.on(RoomStateEvent.Update, this.onRoomState);\n        this.on(CallEvent.ConnectionState, this.onConnectionState);\n        this.updateParticipants();\n    }\n\n    public static get(room: Room): JitsiCall | null {\n        // Only supported in video rooms\n        if (room.isElementVideoRoom()) {\n            const apps = WidgetStore.instance.getApps(room.roomId);\n            // The isVideoChannel field differentiates rich Jitsi calls from bare Jitsi widgets\n            const jitsiWidget = apps.find((app) => WidgetType.JITSI.matches(app.type) && app.data?.isVideoChannel);\n            if (jitsiWidget) return new JitsiCall(jitsiWidget, room.client);\n        }\n\n        return null;\n    }\n\n    public static async create(room: Room): Promise<void> {\n        await WidgetUtils.addJitsiWidget(room.client, room.roomId, CallType.Video, \"Group call\", true, room.name);\n    }\n\n    private updateParticipants(): void {\n        if (this.participantsExpirationTimer !== null) {\n            clearTimeout(this.participantsExpirationTimer);\n            this.participantsExpirationTimer = null;\n        }\n\n        const participants = new Map<RoomMember, Set<string>>();\n        const now = Date.now();\n        let allExpireAt = Infinity;\n\n        for (const e of this.room.currentState.getStateEvents(JitsiCall.MEMBER_EVENT_TYPE)) {\n            const member = this.room.getMember(e.getStateKey()!);\n            const content = e.getContent<JitsiCallMemberContent>();\n            const expiresAt = typeof content.expires_ts === \"number\" ? content.expires_ts : -Infinity;\n            let devices =\n                expiresAt > now && Array.isArray(content.devices)\n                    ? content.devices.filter((d) => typeof d === \"string\")\n                    : [];\n\n            // Apply local echo for the disconnected case\n            if (!this.connected && member?.userId === this.client.getUserId()) {\n                devices = devices.filter((d) => d !== this.client.getDeviceId());\n            }\n            // Must have a connected device and still be joined to the room\n            if (devices.length > 0 && member?.membership === KnownMembership.Join) {\n                participants.set(member, new Set(devices));\n                if (expiresAt < allExpireAt) allExpireAt = expiresAt;\n            }\n        }\n\n        // Apply local echo for the connected case\n        if (this.connected) {\n            const localMember = this.room.getMember(this.client.getUserId()!)!;\n            let devices = participants.get(localMember);\n            if (devices === undefined) {\n                devices = new Set();\n                participants.set(localMember, devices);\n            }\n\n            devices.add(this.client.getDeviceId()!);\n        }\n\n        this.participants = participants;\n        if (allExpireAt < Infinity) {\n            this.participantsExpirationTimer = window.setTimeout(() => this.updateParticipants(), allExpireAt - now);\n        }\n    }\n\n    /**\n     * Updates our member state with the devices returned by the given function.\n     * @param fn A function from the current devices to the new devices. If it\n     *     returns null, the update is skipped.\n     */\n    private async updateDevices(fn: (devices: string[]) => string[] | null): Promise<void> {\n        if (this.room.getMyMembership() !== KnownMembership.Join) return;\n\n        const event = this.room.currentState.getStateEvents(JitsiCall.MEMBER_EVENT_TYPE, this.client.getUserId()!);\n        const content = event?.getContent<JitsiCallMemberContent>();\n        const expiresAt = typeof content?.expires_ts === \"number\" ? content.expires_ts : -Infinity;\n        const devices = expiresAt > Date.now() && Array.isArray(content?.devices) ? content!.devices : [];\n        const newDevices = fn(devices);\n\n        if (newDevices !== null) {\n            const newContent: JitsiCallMemberContent = {\n                devices: newDevices,\n                expires_ts: Date.now() + this.STUCK_DEVICE_TIMEOUT_MS,\n            };\n\n            await this.client.sendStateEvent(\n                this.roomId,\n                JitsiCall.MEMBER_EVENT_TYPE,\n                newContent,\n                this.client.getUserId()!,\n            );\n        }\n    }\n\n    public async clean(): Promise<void> {\n        const now = Date.now();\n        const { devices: myDevices } = await this.client.getDevices();\n        const deviceMap = new Map<string, IMyDevice>(myDevices.map((d) => [d.device_id, d]));\n\n        // Clean up our member state by filtering out logged out devices,\n        // inactive devices, and our own device (if we're disconnected)\n        await this.updateDevices((devices) => {\n            const newDevices = devices.filter((d) => {\n                const device = deviceMap.get(d);\n                return (\n                    device?.last_seen_ts !== undefined &&\n                    !(d === this.client.getDeviceId() && !this.connected) &&\n                    now - device.last_seen_ts < this.STUCK_DEVICE_TIMEOUT_MS\n                );\n            });\n\n            // Skip the update if the devices are unchanged\n            return newDevices.length === devices.length ? null : newDevices;\n        });\n    }\n\n    private async addOurDevice(): Promise<void> {\n        await this.updateDevices((devices) => Array.from(new Set(devices).add(this.client.getDeviceId()!)));\n    }\n\n    private async removeOurDevice(): Promise<void> {\n        await this.updateDevices((devices) => {\n            const devicesSet = new Set(devices);\n            devicesSet.delete(this.client.getDeviceId()!);\n            return Array.from(devicesSet);\n        });\n    }\n\n    public async start(): Promise<ClientWidgetApi> {\n        const widgetApi = await super.start();\n        widgetApi.on(`action:${ElementWidgetActions.JoinCall}`, this.onJoin);\n        widgetApi.on(`action:${ElementWidgetActions.HangupCall}`, this.onHangup);\n        ActiveWidgetStore.instance.on(ActiveWidgetStoreEvent.Dock, this.onDock);\n        ActiveWidgetStore.instance.on(ActiveWidgetStoreEvent.Undock, this.onUndock);\n        return widgetApi;\n    }\n\n    protected async performDisconnection(): Promise<void> {\n        const response = waitForEvent(\n            this.widgetApi!,\n            `action:${ElementWidgetActions.HangupCall}`,\n            (ev: CustomEvent<IWidgetApiRequest>) => {\n                ev.preventDefault();\n                this.widgetApi!.transport.reply(ev.detail, {}); // ack\n                return true;\n            },\n        );\n        const request = this.widgetApi!.transport.send(ElementWidgetActions.HangupCall, {});\n        try {\n            await Promise.all([request, response]);\n        } catch (e) {\n            throw new Error(`Failed to hangup call in room ${this.roomId}: ${e}`);\n        }\n    }\n\n    public close(): void {\n        this.widgetApi!.off(`action:${ElementWidgetActions.JoinCall}`, this.onJoin);\n        this.widgetApi!.off(`action:${ElementWidgetActions.HangupCall}`, this.onHangup);\n        ActiveWidgetStore.instance.off(ActiveWidgetStoreEvent.Dock, this.onDock);\n        ActiveWidgetStore.instance.off(ActiveWidgetStoreEvent.Undock, this.onUndock);\n        super.close();\n    }\n\n    public destroy(): void {\n        this.room.off(RoomStateEvent.Update, this.onRoomState);\n        this.off(CallEvent.ConnectionState, this.onConnectionState);\n        if (this.participantsExpirationTimer !== null) {\n            clearTimeout(this.participantsExpirationTimer);\n            this.participantsExpirationTimer = null;\n        }\n        if (this.resendDevicesTimer !== null) {\n            clearInterval(this.resendDevicesTimer);\n            this.resendDevicesTimer = null;\n        }\n\n        super.destroy();\n    }\n\n    private readonly onRoomState = (): void => this.updateParticipants();\n\n    private readonly onConnectionState = async (state: ConnectionState, prevState: ConnectionState): Promise<void> => {\n        if (state === ConnectionState.Connected && !isConnected(prevState)) {\n            this.updateParticipants(); // Local echo\n\n            // Tell others that we're connected, by adding our device to room state\n            await this.addOurDevice();\n            // Re-add this device every so often so our video member event doesn't become stale\n            this.resendDevicesTimer = window.setInterval(\n                async (): Promise<void> => {\n                    logger.debug(`Resending video member event for ${this.roomId}`);\n                    await this.addOurDevice();\n                },\n                (this.STUCK_DEVICE_TIMEOUT_MS * 3) / 4,\n            );\n        } else if (state === ConnectionState.Disconnected && isConnected(prevState)) {\n            this.updateParticipants(); // Local echo\n\n            if (this.resendDevicesTimer !== null) {\n                clearInterval(this.resendDevicesTimer);\n                this.resendDevicesTimer = null;\n            }\n            // Tell others that we're disconnected, by removing our device from room state\n            await this.removeOurDevice();\n        }\n    };\n\n    private readonly onDock = async (): Promise<void> => {\n        // The widget is no longer a PiP, so let's restore the default layout\n        await this.widgetApi!.transport.send(ElementWidgetActions.TileLayout, {});\n    };\n\n    private readonly onUndock = async (): Promise<void> => {\n        // The widget has become a PiP, so let's switch Jitsi to spotlight mode\n        // to only show the active speaker and economize on space\n        await this.widgetApi!.transport.send(ElementWidgetActions.SpotlightLayout, {});\n    };\n\n    private readonly onJoin = (ev: CustomEvent<IWidgetApiRequest>): void => {\n        ev.preventDefault();\n        this.widgetApi!.transport.reply(ev.detail, {}); // ack\n        this.setConnected();\n    };\n\n    private readonly onHangup = async (ev: CustomEvent<IWidgetApiRequest>): Promise<void> => {\n        // If we're already in the middle of a client-initiated disconnection,\n        // ignore the event\n        if (this.connectionState === ConnectionState.Disconnecting) return;\n\n        ev.preventDefault();\n        this.widgetApi!.transport.reply(ev.detail, {}); // ack\n        this.setDisconnected();\n        if (!isVideoRoom(this.room)) this.close();\n    };\n}\n\nexport enum ElementCallIntent {\n    StartCall = \"start_call\",\n    JoinExisting = \"join_existing\",\n    StartCallVoice = \"start_call_voice\",\n    JoinExistingVoice = \"join_existing_voice\",\n    StartCallDM = \"start_call_dm\",\n    StartCallDMVoice = \"start_call_dm_voice\",\n    JoinExistingDM = \"join_existing_dm\",\n    JoinExistingDMVoice = \"join_existing_dm_voice\",\n}\n\n/**\n * Parameters to be passed during widget creation.\n * These parameters are hints only, and may not be accepted by the implementation.\n */\nexport interface WidgetGenerationParameters {\n    /**\n     * Skip showing the lobby screen of a call.\n     */\n    skipLobby?: boolean;\n    /**\n     * Does the user intent to start a voice call?\n     */\n    voiceOnly?: boolean;\n}\n\n/**\n * Parameters to be passed during widget creation.\n * These parameters are hints only, and may not be accepted by the implementation.\n */\nexport interface WidgetGenerationParameters {\n    /**\n     * Skip showing the lobby screen of a call.\n     */\n    skipLobby?: boolean;\n}\n\n/**\n * A group call using MSC3401 and Element Call as a backend.\n * (somewhat cheekily named)\n */\nexport class ElementCall extends Call {\n    public readonly STUCK_DEVICE_TIMEOUT_MS = 1000 * 60 * 60; // 1 hour\n\n    private settingsStoreCallEncryptionWatcher?: string;\n    private terminationTimer?: number;\n\n    public get presented(): boolean {\n        return super.presented;\n    }\n    public set presented(value: boolean) {\n        super.presented = value;\n        this.checkDestroy();\n    }\n\n    public widgetGenerationParameters: WidgetGenerationParameters = {};\n\n    /**\n     * Calculate the correct intent (and associated parameters) for an Element Call room. Paarameters\n     * will be applied to the `params` instance.\n     *\n     * @param params Existing URL parameters\n     * @param client The current client.\n     * @param roomId The room ID for the call.\n     */\n    private static appendRoomParams(\n        params: URLSearchParams,\n        client: MatrixClient,\n        roomId: string,\n        { voiceOnly }: WidgetGenerationParameters,\n    ): void {\n        const room = client.getRoom(roomId);\n        if (!room) {\n            // If the room isn't known then skip setting an intent.\n            return;\n        } else if (isVideoRoom(room)) {\n            // Video rooms already exist, so just treat as if we're joining a group call.\n            params.append(\"intent\", ElementCallIntent.JoinExisting);\n            // Video rooms should always return to lobby.\n            params.append(\"returnToLobby\", \"true\");\n            // Never skip the lobby, we always want to give the caller a chance to explicitly join.\n            params.append(\"skipLobby\", \"false\");\n            return;\n        }\n\n        const isDM = !!DMRoomMap.shared().getUserIdForRoomId(room.roomId);\n        const oldestCallMember = client.matrixRTC.getRoomSession(room).getOldestMembership();\n        const hasCallStarted = !!oldestCallMember && oldestCallMember.sender !== client.getSafeUserId();\n        if (isDM) {\n            if (hasCallStarted) {\n                params.append(\n                    \"intent\",\n                    voiceOnly ? ElementCallIntent.JoinExistingDMVoice : ElementCallIntent.JoinExistingDM,\n                );\n            } else {\n                params.append(\"intent\", voiceOnly ? ElementCallIntent.StartCallDMVoice : ElementCallIntent.StartCallDM);\n            }\n        } else {\n            if (hasCallStarted) {\n                params.append(\n                    \"intent\",\n                    voiceOnly ? ElementCallIntent.JoinExistingVoice : ElementCallIntent.JoinExisting,\n                );\n            } else {\n                params.append(\"intent\", voiceOnly ? ElementCallIntent.StartCallVoice : ElementCallIntent.StartCall);\n            }\n        }\n    }\n\n    /**\n     * Calculate the correct analytics parameters for an Element Call room. Paarameters\n     * will be applied to the `params` instance.\n     *\n     * @param params Existing URL parameters\n     * @param client The current client.\n     */\n    private static appendAnalyticsParams(params: URLSearchParams, client: MatrixClient): void {\n        const posthogConfig = SdkConfig.get(\"posthog\");\n        if (\n            !posthogConfig?.project_api_key ||\n            !posthogConfig?.api_host ||\n            PosthogAnalytics.instance.getAnonymity() === Anonymity.Disabled\n        ) {\n            return;\n        }\n\n        const accountAnalyticsData = client.getAccountData(PosthogAnalytics.ANALYTICS_EVENT_TYPE)?.getContent();\n        // The analyticsID is passed directly to element call (EC) since this codepath is only for EC and no other widget.\n        // We really don't want the same analyticID's for the EC and EW posthog instances (Data on posthog should be limited/anonymized as much as possible).\n        // This is prohibited in EC where a hashed version of the analyticsID is used for the actual posthog identification.\n        // We can pass the raw EW analyticsID here since we need to trust EC with not sending sensitive data to posthog (EC has access to more sensible data than the analyticsID e.g. the username)\n        const analyticsID: string = accountAnalyticsData?.pseudonymousAnalyticsOptIn ? accountAnalyticsData?.id : \"\";\n\n        params.append(\"posthogUserId\", analyticsID);\n        params.append(\"posthogApiHost\", posthogConfig.api_host);\n        params.append(\"posthogApiKey\", posthogConfig.project_api_key);\n\n        // We gate passing sentry behind analytics consent as EC shares data automatically without user-consent,\n        // unlike EW where data is shared upon an intentional user action (rageshake).\n        const sentryConfig = SdkConfig.get(\"sentry\");\n        if (sentryConfig?.dsn) {\n            params.append(\"sentryDsn\", sentryConfig.dsn);\n            params.append(\"sentryEnvironment\", sentryConfig.environment ?? \"\");\n        }\n    }\n\n    /**\n     * Generate the correct Element Call widget URL for creating or joining a call in this room.\n     * Unless `Developer.elementCallUrl` is set, the widget will use the embedded Element Call package.\n     *\n     * @param client\n     * @param roomId\n     * @param opts\n     * @returns\n     */\n    private static generateWidgetUrl(client: MatrixClient, roomId: string, opts: WidgetGenerationParameters = {}): URL {\n        const elementCallUrlOverride = SettingsStore.getValue(\"Developer.elementCallUrl\");\n        const url = elementCallUrlOverride\n            ? new URL(elementCallUrlOverride)\n            : // this strips hash fragment from baseUrl\n              new URL(\"./widgets/element-call/index.html#\", window.location.href);\n\n        // Splice together the Element Call URL for this call\n        // Parameters can be found in https://github.com/element-hq/element-call/blob/livekit/src/UrlParams.ts.\n        const params = new URLSearchParams({\n            // Template variables are used, so that this can be configured using the widget data.\n            perParticipantE2EE: \"$perParticipantE2EE\",\n            userId: client.getUserId()!,\n            deviceId: client.getDeviceId()!,\n            roomId: roomId,\n            baseUrl: client.baseUrl,\n            lang: getCurrentLanguage().replace(\"_\", \"-\"),\n            fontScale: (FontWatcher.getRootFontSize() / FontWatcher.getBrowserDefaultFontSize()).toString(),\n            theme: \"$org.matrix.msc2873.client_theme\",\n            // on EW we do not want the gradient EC background.\n            background: \"solid\",\n        });\n\n        if (typeof opts.skipLobby === \"boolean\") {\n            params.set(\"skipLobby\", opts.skipLobby.toString());\n        }\n\n        const rageshakeSubmitUrl = SdkConfig.get(\"bug_report_endpoint_url\");\n        if (rageshakeSubmitUrl && rageshakeSubmitUrl !== BugReportEndpointURLLocal) {\n            params.append(\"rageshakeSubmitUrl\", rageshakeSubmitUrl);\n        }\n\n        if (SettingsStore.getValue(\"fallbackICEServerAllowed\")) {\n            params.append(\"allowIceFallback\", \"true\");\n        }\n\n        const echoCancellation = SettingsStore.getValue(\"webrtc_audio_echoCancellation\");\n        if (!echoCancellation) {\n            // the default is true, so only set if false\n            params.append(\"echoCancellation\", \"false\");\n        }\n        const noiseSuppression = SettingsStore.getValue(\"webrtc_audio_noiseSuppression\");\n        if (!noiseSuppression) {\n            // the default is true, so only set if false\n            params.append(\"noiseSuppression\", \"false\");\n        }\n\n        // Set custom fonts\n        if (SettingsStore.getValue(\"useSystemFont\")) {\n            SettingsStore.getValue(\"systemFont\")\n                .split(\",\")\n                .map((font) => {\n                    // Strip whitespace and quotes\n                    font = font.trim();\n                    if (font.startsWith('\"') && font.endsWith('\"')) font = font.slice(1, -1);\n                    return font;\n                })\n                .forEach((font) => params.append(\"font\", font));\n        }\n        this.appendAnalyticsParams(params, client);\n        this.appendRoomParams(params, client, roomId, opts);\n\n        const replacedUrl = params.toString().replace(/%24/g, \"$\");\n        url.hash = `#?${replacedUrl}`;\n        return url;\n    }\n\n    // Creates a new widget if there isn't any widget of typ Call in this room.\n    private static createOrGetCallWidget(roomId: string, client: MatrixClient): IApp {\n        const ecWidget = WidgetStore.instance.getApps(roomId).find((app) => WidgetType.CALL.matches(app.type));\n        if (ecWidget) {\n            // Always update the widget data because even if the widget is already created,\n            // we might have settings changes that update the widget.\n            ecWidget.data = ElementCall.getWidgetData(client, roomId, ecWidget?.data ?? {}, {});\n            return ecWidget;\n        }\n\n        // To use Element Call without touching room state, we create a virtual\n        // widget (one that doesn't have a corresponding state event)\n        const url = ElementCall.generateWidgetUrl(client, roomId);\n        return WidgetStore.instance.addVirtualWidget(\n            {\n                id: secureRandomString(24), // So that it's globally unique\n                creatorUserId: client.getUserId()!,\n                name: \"Element Call\",\n                type: WidgetType.CALL.preferred,\n                url: url.toString(),\n                waitForIframeLoad: false,\n                data: ElementCall.getWidgetData(client, roomId, {}, {}),\n            },\n            roomId,\n        );\n    }\n\n    private static getWidgetData(\n        client: MatrixClient,\n        roomId: string,\n        currentData: IWidgetData,\n        overwriteData: IWidgetData,\n    ): IWidgetData {\n        return {\n            ...currentData,\n            ...overwriteData,\n            perParticipantE2EE:\n                client.getRoom(roomId)?.hasEncryptionStateEvent() &&\n                !SettingsStore.getValue(\"feature_disable_call_per_sender_encryption\"),\n        };\n    }\n\n    private onCallEncryptionSettingsChange(): void {\n        this.widget.data = ElementCall.getWidgetData(this.client, this.roomId, this.widget.data ?? {}, {});\n    }\n\n    private constructor(\n        public session: MatrixRTCSession,\n        widget: IApp,\n        client: MatrixClient,\n    ) {\n        super(widget, client, session.getConsensusCallIntent() === \"audio\" ? CallType.Voice : CallType.Video);\n\n        this.session.on(MatrixRTCSessionEvent.MembershipsChanged, this.onMembershipChanged);\n        this.client.matrixRTC.on(MatrixRTCSessionManagerEvents.SessionEnded, this.checkDestroy);\n        SettingsStore.watchSetting(\n            \"feature_disable_call_per_sender_encryption\",\n            null,\n            this.onCallEncryptionSettingsChange.bind(this),\n        );\n        this.updateParticipants();\n    }\n\n    public static get(room: Room, voiceOnly?: boolean): ElementCall | null {\n        const apps = WidgetStore.instance.getApps(room.roomId);\n        const hasEcWidget = apps.some((app) => WidgetType.CALL.matches(app.type));\n        const session = room.client.matrixRTC.getRoomSession(room);\n\n        // A call is present if we\n        // - have a widget: This means the create function was called.\n        // - or there is a running session where we have not yet created a widget for.\n        // - or this is a call room. Then we also always want to show a call.\n        if (hasEcWidget || session.memberships.length !== 0 || room.isCallRoom()) {\n            // create a widget for the case we are joining a running call and don't have on yet.\n            const availableOrCreatedWidget = ElementCall.createOrGetCallWidget(room.roomId, room.client);\n            return new ElementCall(session, availableOrCreatedWidget, room.client);\n        }\n\n        return null;\n    }\n\n    public static create(room: Room): void {\n        ElementCall.createOrGetCallWidget(room.roomId, room.client);\n    }\n\n    public async start(widgetGenerationParameters: WidgetGenerationParameters): Promise<ClientWidgetApi> {\n        // Some parameters may only be set once the user has chosen to interact with the call, regenerate the URL\n        // at this point in case any of the parameters have changed.\n        this.widgetGenerationParameters = { ...this.widgetGenerationParameters, ...widgetGenerationParameters };\n        this.widget.url = ElementCall.generateWidgetUrl(\n            this.client,\n            this.roomId,\n            this.widgetGenerationParameters,\n        ).toString();\n        const widgetApi = await super.start();\n        widgetApi.on(`action:${ElementWidgetActions.JoinCall}`, this.onJoin);\n        widgetApi.on(`action:${ElementWidgetActions.HangupCall}`, this.onHangup);\n        widgetApi.on(`action:${ElementWidgetActions.Close}`, this.onClose);\n        widgetApi.on(`action:${ElementWidgetActions.DeviceMute}`, this.onDeviceMute);\n        return widgetApi;\n    }\n\n    protected async performDisconnection(): Promise<void> {\n        const response = waitForEvent(\n            this.widgetApi!,\n            `action:${ElementWidgetActions.HangupCall}`,\n            (ev: CustomEvent<IWidgetApiRequest>) => {\n                ev.preventDefault();\n                this.widgetApi!.transport.reply(ev.detail, {}); // ack\n                return true;\n            },\n        );\n        const request = this.widgetApi!.transport.send(ElementWidgetActions.HangupCall, {});\n        try {\n            await Promise.all([request, response]);\n        } catch (e) {\n            throw new Error(`Failed to hangup call in room ${this.roomId}: ${e}`);\n        }\n    }\n\n    public close(): void {\n        this.widgetApi!.off(`action:${ElementWidgetActions.JoinCall}`, this.onJoin);\n        this.widgetApi!.off(`action:${ElementWidgetActions.HangupCall}`, this.onHangup);\n        this.widgetApi!.off(`action:${ElementWidgetActions.Close}`, this.onClose);\n        this.widgetApi!.off(`action:${ElementWidgetActions.DeviceMute}`, this.onDeviceMute);\n        super.close();\n    }\n\n    public destroy(): void {\n        ActiveWidgetStore.instance.destroyPersistentWidget(this.widget.id, this.widget.roomId);\n        WidgetStore.instance.removeVirtualWidget(this.widget.id, this.widget.roomId);\n        this.session.off(MatrixRTCSessionEvent.MembershipsChanged, this.onMembershipChanged);\n        this.client.matrixRTC.off(MatrixRTCSessionManagerEvents.SessionEnded, this.checkDestroy);\n\n        SettingsStore.unwatchSetting(this.settingsStoreCallEncryptionWatcher);\n        clearTimeout(this.terminationTimer);\n        this.terminationTimer = undefined;\n\n        super.destroy();\n    }\n\n    private checkDestroy = (): void => {\n        // A call ceases to exist as soon as all participants leave and also the\n        // user isn't looking at it (for example, waiting in an empty lobby)\n        if (this.session.memberships.length === 0 && !this.presented && !this.room.isCallRoom()) this.destroy();\n    };\n\n    private readonly onMembershipChanged = (): void => {\n        this.updateParticipants();\n        this.callType = this.session.getConsensusCallIntent() === \"audio\" ? CallType.Voice : CallType.Video;\n    };\n\n    private updateParticipants(): void {\n        const participants = new Map<RoomMember, Set<string>>();\n\n        for (const m of this.session.memberships) {\n            if (!m.sender) continue;\n            const member = this.room.getMember(m.sender);\n            if (member) {\n                if (participants.has(member)) {\n                    participants.get(member)?.add(m.deviceId);\n                } else {\n                    participants.set(member, new Set([m.deviceId]));\n                }\n            }\n        }\n\n        this.participants = participants;\n    }\n\n    private readonly onDeviceMute = (ev: CustomEvent<IWidgetApiRequest>): void => {\n        ev.preventDefault();\n        this.widgetApi!.transport.reply(ev.detail, {}); // ack\n    };\n\n    private readonly onJoin = (ev: CustomEvent<IWidgetApiRequest>): void => {\n        ev.preventDefault();\n        this.widgetApi!.transport.reply(ev.detail, {}); // ack\n        this.setConnected();\n    };\n\n    private readonly onHangup = async (ev: CustomEvent<IWidgetApiRequest>): Promise<void> => {\n        // If we're already in the middle of a client-initiated disconnection,\n        // ignore the event\n        if (this.connectionState === ConnectionState.Disconnecting) return;\n\n        ev.preventDefault();\n        this.widgetApi!.transport.reply(ev.detail, {}); // ack\n        this.setDisconnected();\n    };\n\n    private readonly onClose = async (ev: CustomEvent<IWidgetApiRequest>): Promise<void> => {\n        ev.preventDefault();\n        this.widgetApi!.transport.reply(ev.detail, {}); // ack\n        this.setDisconnected(); // Just in case the widget forgot to emit a hangup action (maybe it's in an error state)\n        this.close(); // User is done with the call; tell the UI to close it\n    };\n\n    public clean(): Promise<void> {\n        return Promise.resolve();\n    }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { isThenable } from './is';\n\n/** SyncPromise internal states */\nconst STATE_PENDING = 0;\nconst STATE_RESOLVED = 1;\nconst STATE_REJECTED = 2;\n\ntype State = typeof STATE_PENDING | typeof STATE_RESOLVED | typeof STATE_REJECTED;\n\n// Overloads so we can call resolvedSyncPromise without arguments and generic argument\nexport function resolvedSyncPromise(): PromiseLike<void>;\nexport function resolvedSyncPromise<T>(value: T | PromiseLike<T>): PromiseLike<T>;\n\n/**\n * Creates a resolved sync promise.\n *\n * @param value the value to resolve the promise with\n * @returns the resolved sync promise\n */\nexport function resolvedSyncPromise<T>(value?: T | PromiseLike<T>): PromiseLike<T> {\n  return new SyncPromise(resolve => {\n    resolve(value);\n  });\n}\n\n/**\n * Creates a rejected sync promise.\n *\n * @param value the value to reject the promise with\n * @returns the rejected sync promise\n */\nexport function rejectedSyncPromise<T = never>(reason?: any): PromiseLike<T> {\n  return new SyncPromise((_, reject) => {\n    reject(reason);\n  });\n}\n\ntype Executor<T> = (resolve: (value?: T | PromiseLike<T> | null) => void, reject: (reason?: any) => void) => void;\n\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nexport class SyncPromise<T> implements PromiseLike<T> {\n  private _state: State;\n  private _handlers: Array<[boolean, (value: T) => void, (reason: any) => any]>;\n  private _value: any;\n\n  public constructor(executor: Executor<T>) {\n    this._state = STATE_PENDING;\n    this._handlers = [];\n\n    this._runExecutor(executor);\n  }\n\n  /** @inheritdoc */\n  public then<TResult1 = T, TResult2 = never>(\n    onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): PromiseLike<TResult1 | TResult2> {\n    return new SyncPromise((resolve, reject) => {\n      this._handlers.push([\n        false,\n        result => {\n          if (!onfulfilled) {\n            // TODO: ¯\\_(ツ)_/¯\n            // TODO: FIXME\n            resolve(result as any);\n          } else {\n            try {\n              resolve(onfulfilled(result));\n            } catch (e) {\n              reject(e);\n            }\n          }\n        },\n        reason => {\n          if (!onrejected) {\n            reject(reason);\n          } else {\n            try {\n              resolve(onrejected(reason));\n            } catch (e) {\n              reject(e);\n            }\n          }\n        },\n      ]);\n      this._executeHandlers();\n    });\n  }\n\n  /** @inheritdoc */\n  public catch<TResult = never>(\n    onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null,\n  ): PromiseLike<T | TResult> {\n    return this.then(val => val, onrejected);\n  }\n\n  /** @inheritdoc */\n  public finally<TResult>(onfinally?: (() => void) | null): PromiseLike<TResult> {\n    return new SyncPromise<TResult>((resolve, reject) => {\n      let val: TResult | any;\n      let isRejected: boolean;\n\n      return this.then(\n        value => {\n          isRejected = false;\n          val = value;\n          if (onfinally) {\n            onfinally();\n          }\n        },\n        reason => {\n          isRejected = true;\n          val = reason;\n          if (onfinally) {\n            onfinally();\n          }\n        },\n      ).then(() => {\n        if (isRejected) {\n          reject(val);\n          return;\n        }\n\n        resolve(val as unknown as any);\n      });\n    });\n  }\n\n  /** Excute the resolve/reject handlers. */\n  private _executeHandlers(): void {\n    if (this._state === STATE_PENDING) {\n      return;\n    }\n\n    const cachedHandlers = this._handlers.slice();\n    this._handlers = [];\n\n    cachedHandlers.forEach(handler => {\n      if (handler[0]) {\n        return;\n      }\n\n      if (this._state === STATE_RESOLVED) {\n        handler[1](this._value as unknown as any);\n      }\n\n      if (this._state === STATE_REJECTED) {\n        handler[2](this._value);\n      }\n\n      handler[0] = true;\n    });\n  }\n\n  /** Run the executor for the SyncPromise. */\n  private _runExecutor(executor: Executor<T>): void {\n    const setResult = (state: State, value?: T | PromiseLike<T> | any): void => {\n      if (this._state !== STATE_PENDING) {\n        return;\n      }\n\n      if (isThenable(value)) {\n        void (value as PromiseLike<T>).then(resolve, reject);\n        return;\n      }\n\n      this._state = state;\n      this._value = value;\n\n      this._executeHandlers();\n    };\n\n    const resolve = (value: unknown): void => {\n      setResult(STATE_RESOLVED, value);\n    };\n\n    const reject = (reason: unknown): void => {\n      setResult(STATE_REJECTED, reason);\n    };\n\n    try {\n      executor(resolve, reject);\n    } catch (e) {\n      reject(e);\n    }\n  }\n}\n","import { DEBUG_BUILD } from './debug-build';\nimport type { Event, EventHint } from './types/event';\nimport type { EventProcessor } from './types/eventprocessor';\nimport { debug } from './utils/debug-logger';\nimport { isThenable } from './utils/is';\nimport { rejectedSyncPromise, resolvedSyncPromise } from './utils/syncpromise';\n\n/**\n * Process an array of event processors, returning the processed event (or `null` if the event was dropped).\n */\nexport function notifyEventProcessors(\n  processors: EventProcessor[],\n  event: Event | null,\n  hint: EventHint,\n  index: number = 0,\n): PromiseLike<Event | null> {\n  try {\n    const result = _notifyEventProcessors(event, hint, processors, index);\n    return isThenable(result) ? result : resolvedSyncPromise(result);\n  } catch (error) {\n    return rejectedSyncPromise(error);\n  }\n}\n\nfunction _notifyEventProcessors(\n  event: Event | null,\n  hint: EventHint,\n  processors: EventProcessor[],\n  index: number,\n): Event | null | PromiseLike<Event | null> {\n  const processor = processors[index];\n\n  if (!event || !processor) {\n    return event;\n  }\n\n  const result = processor({ ...event }, hint);\n\n  DEBUG_BUILD && result === null && debug.log(`Event processor \"${processor.id || '?'}\" dropped event`);\n\n  if (isThenable(result)) {\n    return result.then(final => _notifyEventProcessors(final, hint, processors, index + 1));\n  }\n\n  return _notifyEventProcessors(result, hint, processors, index + 1);\n}\n","import type { DebugImage } from '../types/debugMeta';\nimport type { StackParser } from '../types/stacktrace';\nimport { normalizeStackTracePath } from './stacktrace';\nimport { GLOBAL_OBJ } from './worldwide';\n\ntype StackString = string;\ntype CachedResult = [string, string];\n\nlet parsedStackResults: Record<StackString, CachedResult> | undefined;\nlet lastSentryKeysCount: number | undefined;\nlet lastNativeKeysCount: number | undefined;\nlet cachedFilenameDebugIds: Record<string, string> | undefined;\n\n/**\n * Clears the cached debug ID mappings.\n * Useful for testing or when the global debug ID state changes.\n */\nexport function clearDebugIdCache(): void {\n  parsedStackResults = undefined;\n  lastSentryKeysCount = undefined;\n  lastNativeKeysCount = undefined;\n  cachedFilenameDebugIds = undefined;\n}\n\n/**\n * Returns a map of filenames to debug identifiers.\n * Supports both proprietary _sentryDebugIds and native _debugIds (e.g., from Vercel) formats.\n */\nexport function getFilenameToDebugIdMap(stackParser: StackParser): Record<string, string> {\n  const sentryDebugIdMap = GLOBAL_OBJ._sentryDebugIds;\n  const nativeDebugIdMap = GLOBAL_OBJ._debugIds;\n\n  if (!sentryDebugIdMap && !nativeDebugIdMap) {\n    return {};\n  }\n\n  const sentryDebugIdKeys = sentryDebugIdMap ? Object.keys(sentryDebugIdMap) : [];\n  const nativeDebugIdKeys = nativeDebugIdMap ? Object.keys(nativeDebugIdMap) : [];\n\n  // If the count of registered globals hasn't changed since the last call, we\n  // can just return the cached result.\n  if (\n    cachedFilenameDebugIds &&\n    sentryDebugIdKeys.length === lastSentryKeysCount &&\n    nativeDebugIdKeys.length === lastNativeKeysCount\n  ) {\n    return cachedFilenameDebugIds;\n  }\n\n  lastSentryKeysCount = sentryDebugIdKeys.length;\n  lastNativeKeysCount = nativeDebugIdKeys.length;\n\n  // Build a map of filename -> debug_id from both sources\n  cachedFilenameDebugIds = {};\n\n  if (!parsedStackResults) {\n    parsedStackResults = {};\n  }\n\n  const processDebugIds = (debugIdKeys: string[], debugIdMap: Record<string, string>): void => {\n    for (const key of debugIdKeys) {\n      const debugId = debugIdMap[key];\n      const result = parsedStackResults?.[key];\n\n      if (result && cachedFilenameDebugIds && debugId) {\n        // Use cached filename but update with current debug ID\n        cachedFilenameDebugIds[result[0]] = debugId;\n        // Update cached result with new debug ID\n        if (parsedStackResults) {\n          parsedStackResults[key] = [result[0], debugId];\n        }\n      } else if (debugId) {\n        const parsedStack = stackParser(key);\n\n        for (let i = parsedStack.length - 1; i >= 0; i--) {\n          const stackFrame = parsedStack[i];\n          const filename = stackFrame?.filename;\n\n          if (filename && cachedFilenameDebugIds && parsedStackResults) {\n            cachedFilenameDebugIds[filename] = debugId;\n            parsedStackResults[key] = [filename, debugId];\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  if (sentryDebugIdMap) {\n    processDebugIds(sentryDebugIdKeys, sentryDebugIdMap);\n  }\n\n  // Native _debugIds will override _sentryDebugIds if same file\n  if (nativeDebugIdMap) {\n    processDebugIds(nativeDebugIdKeys, nativeDebugIdMap);\n  }\n\n  return cachedFilenameDebugIds;\n}\n\n/**\n * Returns a list of debug images for the given resources.\n */\nexport function getDebugImagesForResources(\n  stackParser: StackParser,\n  resource_paths: ReadonlyArray<string>,\n): DebugImage[] {\n  const filenameDebugIdMap = getFilenameToDebugIdMap(stackParser);\n\n  if (!filenameDebugIdMap) {\n    return [];\n  }\n\n  const images: DebugImage[] = [];\n  for (const path of resource_paths) {\n    const normalizedPath = normalizeStackTracePath(path);\n    if (normalizedPath && filenameDebugIdMap[normalizedPath]) {\n      images.push({\n        type: 'sourcemap',\n        code_file: path,\n        debug_id: filenameDebugIdMap[normalizedPath],\n      });\n    }\n  }\n\n  return images;\n}\n","import type { Client } from '../client';\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { notifyEventProcessors } from '../eventProcessors';\nimport type { CaptureContext, ScopeContext } from '../scope';\nimport { Scope } from '../scope';\nimport type { Event, EventHint } from '../types/event';\nimport type { ClientOptions } from '../types/options';\nimport type { StackParser } from '../types/stacktrace';\nimport { getFilenameToDebugIdMap } from './debug-ids';\nimport { addExceptionMechanism, uuid4 } from './misc';\nimport { normalize } from './normalize';\nimport { applyScopeDataToEvent, getCombinedScopeData } from './scopeData';\nimport { truncate } from './string';\nimport { resolvedSyncPromise } from './syncpromise';\nimport { dateTimestampInSeconds } from './time';\n\n/**\n * This type makes sure that we get either a CaptureContext, OR an EventHint.\n * It does not allow mixing them, which could lead to unexpected outcomes, e.g. this is disallowed:\n * { user: { id: '123' }, mechanism: { handled: false } }\n */\nexport type ExclusiveEventHintOrCaptureContext =\n  | (CaptureContext & Partial<{ [key in keyof EventHint]: never }>)\n  | (EventHint & Partial<{ [key in keyof ScopeContext]: never }>);\n\n/**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n * @hidden\n */\nexport function prepareEvent(\n  options: ClientOptions,\n  event: Event,\n  hint: EventHint,\n  scope?: Scope,\n  client?: Client,\n  isolationScope?: Scope,\n): PromiseLike<Event | null> {\n  const { normalizeDepth = 3, normalizeMaxBreadth = 1_000 } = options;\n  const prepared: Event = {\n    ...event,\n    event_id: event.event_id || hint.event_id || uuid4(),\n    timestamp: event.timestamp || dateTimestampInSeconds(),\n  };\n  const integrations = hint.integrations || options.integrations.map(i => i.name);\n\n  applyClientOptions(prepared, options);\n  applyIntegrationsMetadata(prepared, integrations);\n\n  if (client) {\n    client.emit('applyFrameMetadata', event);\n  }\n\n  // Only put debug IDs onto frames for error events.\n  if (event.type === undefined) {\n    applyDebugIds(prepared, options.stackParser);\n  }\n\n  // If we have scope given to us, use it as the base for further modifications.\n  // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n  const finalScope = getFinalScope(scope, hint.captureContext);\n\n  if (hint.mechanism) {\n    addExceptionMechanism(prepared, hint.mechanism);\n  }\n\n  const clientEventProcessors = client ? client.getEventProcessors() : [];\n\n  // This should be the last thing called, since we want that\n  // {@link Scope.addEventProcessor} gets the finished prepared event.\n  // Merge scope data together\n  const data = getCombinedScopeData(isolationScope, finalScope);\n\n  const attachments = [...(hint.attachments || []), ...data.attachments];\n  if (attachments.length) {\n    hint.attachments = attachments;\n  }\n\n  applyScopeDataToEvent(prepared, data);\n\n  const eventProcessors = [\n    ...clientEventProcessors,\n    // Run scope event processors _after_ all other processors\n    ...data.eventProcessors,\n  ];\n\n  // Skip event processors for internal exceptions to prevent recursion\n  // oxlint-disable-next-line typescript/prefer-optional-chain\n  const isInternalException = hint.data && (hint.data as { __sentry__: boolean }).__sentry__ === true;\n  const result = isInternalException\n    ? resolvedSyncPromise(prepared)\n    : notifyEventProcessors(eventProcessors, prepared, hint);\n\n  return result.then(evt => {\n    if (evt) {\n      // We apply the debug_meta field only after all event processors have ran, so that if any event processors modified\n      // file names (e.g.the RewriteFrames integration) the filename -> debug ID relationship isn't destroyed.\n      // This should not cause any PII issues, since we're only moving data that is already on the event and not adding\n      // any new data\n      applyDebugMeta(evt);\n    }\n\n    if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n      return normalizeEvent(evt, normalizeDepth, normalizeMaxBreadth);\n    }\n    return evt;\n  });\n}\n\n/**\n * Enhances event using the client configuration.\n * It takes care of all \"static\" values like environment, release and `dist`,\n * as well as truncating overly long values.\n *\n * Only exported for tests.\n *\n * @param event event instance to be enhanced\n */\nexport function applyClientOptions(event: Event, options: ClientOptions): void {\n  const { environment, release, dist, maxValueLength } = options;\n\n  // empty strings do not make sense for environment, release, and dist\n  // so we handle them the same as if they were not provided\n  event.environment = event.environment || environment || DEFAULT_ENVIRONMENT;\n\n  if (!event.release && release) {\n    event.release = release;\n  }\n\n  if (!event.dist && dist) {\n    event.dist = dist;\n  }\n\n  const request = event.request;\n  if (request?.url && maxValueLength) {\n    request.url = truncate(request.url, maxValueLength);\n  }\n\n  if (maxValueLength) {\n    event.exception?.values?.forEach(exception => {\n      if (exception.value) {\n        // Truncates error messages\n        exception.value = truncate(exception.value, maxValueLength);\n      }\n    });\n  }\n}\n\n/**\n * Puts debug IDs into the stack frames of an error event.\n */\nexport function applyDebugIds(event: Event, stackParser: StackParser): void {\n  // Build a map of filename -> debug_id\n  const filenameDebugIdMap = getFilenameToDebugIdMap(stackParser);\n\n  event.exception?.values?.forEach(exception => {\n    exception.stacktrace?.frames?.forEach(frame => {\n      if (frame.filename) {\n        frame.debug_id = filenameDebugIdMap[frame.filename];\n      }\n    });\n  });\n}\n\n/**\n * Moves debug IDs from the stack frames of an error event into the debug_meta field.\n */\nexport function applyDebugMeta(event: Event): void {\n  // Extract debug IDs and filenames from the stack frames on the event.\n  const filenameDebugIdMap: Record<string, string> = {};\n  event.exception?.values?.forEach(exception => {\n    exception.stacktrace?.frames?.forEach(frame => {\n      if (frame.debug_id) {\n        if (frame.abs_path) {\n          filenameDebugIdMap[frame.abs_path] = frame.debug_id;\n        } else if (frame.filename) {\n          filenameDebugIdMap[frame.filename] = frame.debug_id;\n        }\n        delete frame.debug_id;\n      }\n    });\n  });\n\n  if (Object.keys(filenameDebugIdMap).length === 0) {\n    return;\n  }\n\n  // Fill debug_meta information\n  event.debug_meta = event.debug_meta || {};\n  event.debug_meta.images = event.debug_meta.images || [];\n  const images = event.debug_meta.images;\n  Object.entries(filenameDebugIdMap).forEach(([filename, debug_id]) => {\n    images.push({\n      type: 'sourcemap',\n      code_file: filename,\n      debug_id,\n    });\n  });\n}\n\n/**\n * This function adds all used integrations to the SDK info in the event.\n * @param event The event that will be filled with all integrations.\n */\nfunction applyIntegrationsMetadata(event: Event, integrationNames: string[]): void {\n  if (integrationNames.length > 0) {\n    event.sdk = event.sdk || {};\n    event.sdk.integrations = [...(event.sdk.integrations || []), ...integrationNames];\n  }\n}\n\n/**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\nfunction normalizeEvent(event: Event | null, depth: number, maxBreadth: number): Event | null {\n  if (!event) {\n    return null;\n  }\n\n  const normalized: Event = {\n    ...event,\n    ...(event.breadcrumbs && {\n      breadcrumbs: event.breadcrumbs.map(b => ({\n        ...b,\n        ...(b.data && {\n          data: normalize(b.data, depth, maxBreadth),\n        }),\n      })),\n    }),\n    ...(event.user && {\n      user: normalize(event.user, depth, maxBreadth),\n    }),\n    ...(event.contexts && {\n      contexts: normalize(event.contexts, depth, maxBreadth),\n    }),\n    ...(event.extra && {\n      extra: normalize(event.extra, depth, maxBreadth),\n    }),\n  };\n\n  // event.contexts.trace stores information about a Transaction. Similarly,\n  // event.spans[] stores information about child Spans. Given that a\n  // Transaction is conceptually a Span, normalization should apply to both\n  // Transactions and Spans consistently.\n  // For now the decision is to skip normalization of Transactions and Spans,\n  // so this block overwrites the normalized event to add back the original\n  // Transaction information prior to normalization.\n  if (event.contexts?.trace && normalized.contexts) {\n    normalized.contexts.trace = event.contexts.trace;\n\n    // event.contexts.trace.data may contain circular/dangerous data so we need to normalize it\n    if (event.contexts.trace.data) {\n      normalized.contexts.trace.data = normalize(event.contexts.trace.data, depth, maxBreadth);\n    }\n  }\n\n  // event.spans[].data may contain circular/dangerous data so we need to normalize it\n  if (event.spans) {\n    normalized.spans = event.spans.map(span => {\n      return {\n        ...span,\n        ...(span.data && {\n          data: normalize(span.data, depth, maxBreadth),\n        }),\n      };\n    });\n  }\n\n  // event.contexts.flags (FeatureFlagContext) stores context for our feature\n  // flag integrations. It has a greater nesting depth than our other typed\n  // Contexts, so we re-normalize with a fixed depth of 3 here. We do not want\n  // to skip this in case of conflicting, user-provided context.\n  if (event.contexts?.flags && normalized.contexts) {\n    normalized.contexts.flags = normalize(event.contexts.flags, 3, maxBreadth);\n  }\n\n  return normalized;\n}\n\nfunction getFinalScope(scope: Scope | undefined, captureContext: CaptureContext | undefined): Scope | undefined {\n  if (!captureContext) {\n    return scope;\n  }\n\n  const finalScope = scope ? scope.clone() : new Scope();\n  finalScope.update(captureContext);\n  return finalScope;\n}\n\n/**\n * Parse either an `EventHint` directly, or convert a `CaptureContext` to an `EventHint`.\n * This is used to allow to update method signatures that used to accept a `CaptureContext` but should now accept an `EventHint`.\n */\nexport function parseEventHintOrCaptureContext(\n  hint: ExclusiveEventHintOrCaptureContext | undefined,\n): EventHint | undefined {\n  if (!hint) {\n    return undefined;\n  }\n\n  // If you pass a Scope or `() => Scope` as CaptureContext, we just return this as captureContext\n  if (hintIsScopeOrFunction(hint)) {\n    return { captureContext: hint };\n  }\n\n  if (hintIsScopeContext(hint)) {\n    return {\n      captureContext: hint,\n    };\n  }\n\n  return hint;\n}\n\nfunction hintIsScopeOrFunction(hint: CaptureContext | EventHint): hint is Scope | ((scope: Scope) => Scope) {\n  return hint instanceof Scope || typeof hint === 'function';\n}\n\ntype ScopeContextProperty = keyof ScopeContext;\nconst captureContextKeys: readonly ScopeContextProperty[] = [\n  'user',\n  'level',\n  'extra',\n  'contexts',\n  'tags',\n  'fingerprint',\n  'propagationContext',\n] as const;\n\nfunction hintIsScopeContext(hint: Partial<ScopeContext> | EventHint): hint is Partial<ScopeContext> {\n  return Object.keys(hint).some(key => captureContextKeys.includes(key as ScopeContextProperty));\n}\n","import type { AttributeObject, RawAttribute, RawAttributes } from './attributes';\nimport { getClient, getCurrentScope, getIsolationScope, withIsolationScope } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { CaptureContext } from './scope';\nimport { closeSession, makeSession, updateSession } from './session';\nimport { startNewTrace } from './tracing/trace';\nimport type { CheckIn, FinishedCheckIn, MonitorConfig } from './types/checkin';\nimport type { Event, EventHint } from './types/event';\nimport type { EventProcessor } from './types/eventprocessor';\nimport type { Extra, Extras } from './types/extra';\nimport type { Primitive } from './types/misc';\nimport type { Session, SessionContext } from './types/session';\nimport type { SeverityLevel } from './types/severity';\nimport type { User } from './types/user';\nimport { debug } from './utils/debug-logger';\nimport { isThenable } from './utils/is';\nimport { uuid4 } from './utils/misc';\nimport type { ExclusiveEventHintOrCaptureContext } from './utils/prepareEvent';\nimport { parseEventHintOrCaptureContext } from './utils/prepareEvent';\nimport { getCombinedScopeData } from './utils/scopeData';\nimport { timestampInSeconds } from './utils/time';\nimport { GLOBAL_OBJ } from './utils/worldwide';\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception The exception to capture.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured Sentry event.\n */\nexport function captureException(exception: unknown, hint?: ExclusiveEventHintOrCaptureContext): string {\n  return getCurrentScope().captureException(exception, parseEventHintOrCaptureContext(hint));\n}\n\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param captureContext Define the level of the message or pass in additional data to attach to the message.\n * @returns the id of the captured message.\n */\nexport function captureMessage(message: string, captureContext?: CaptureContext | SeverityLevel): string {\n  // This is necessary to provide explicit scopes upgrade, without changing the original\n  // arity of the `captureMessage(message, level)` method.\n  const level = typeof captureContext === 'string' ? captureContext : undefined;\n  const hint = typeof captureContext !== 'string' ? { captureContext } : undefined;\n  return getCurrentScope().captureMessage(message, level, hint);\n}\n\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured event.\n */\nexport function captureEvent(event: Event, hint?: EventHint): string {\n  return getCurrentScope().captureEvent(event, hint);\n}\n\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\nexport function setContext(name: string, context: { [key: string]: unknown } | null): void {\n  getIsolationScope().setContext(name, context);\n}\n\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras: Extras): void {\n  getIsolationScope().setExtras(extras);\n}\n\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\nexport function setExtra(key: string, extra: Extra): void {\n  getIsolationScope().setExtra(key, extra);\n}\n\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags: { [key: string]: Primitive }): void {\n  getIsolationScope().setTags(tags);\n}\n\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\nexport function setTag(key: string, value: Primitive): void {\n  getIsolationScope().setTag(key, value);\n}\n\n/**\n * Sets attributes on the isolation scope.\n *\n * These attributes are applied to logs, metrics and streamed spans.\n *\n * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n *\n * @param attributes - The attributes to set on the scope, as key-value pairs.\n *\n * @example\n * ```typescript\n * Sentry.setAttributes({\n *   is_admin: true,\n *   payment_selection: 'credit_card',\n *   render_duration: 150,\n * });\n * ```\n */\nexport function setAttributes<T extends Record<string, unknown>>(attributes: RawAttributes<T>): void {\n  getIsolationScope().setAttributes(attributes);\n}\n\n/**\n * Sets an attribute on the isolation scope.\n *\n * These attributes are applied to logs, metrics and streamed spans.\n *\n * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n *\n * @param key - The attribute key.\n * @param value - The attribute value.\n *\n * @example\n * ```typescript\n * Sentry.setAttribute('is_admin', true);\n * Sentry.setAttribute('render_duration', 150);\n * ```\n */\nexport function setAttribute<\n  // oxlint-disable-next-line typescript-eslint/no-explicit-any\n  T extends RawAttribute<T> extends { value: any } | { unit: any } ? AttributeObject : unknown,\n>(key: string, value: RawAttribute<T>): void {\n  getIsolationScope().setAttribute(key, value);\n}\n\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user: User | null): void {\n  getIsolationScope().setUser(user);\n}\n\n/**\n * Sets the conversation ID for the current isolation scope.\n *\n * @param conversationId The conversation ID to set. Pass `null` or `undefined` to unset the conversation ID.\n */\nexport function setConversationId(conversationId: string | null | undefined): void {\n  getIsolationScope().setConversationId(conversationId);\n}\n\n/**\n * The last error event id of the isolation scope.\n *\n * Warning: This function really returns the last recorded error event id on the current\n * isolation scope. If you call this function after handling a certain error and another error\n * is captured in between, the last one is returned instead of the one you might expect.\n * Also, ids of events that were never sent to Sentry (for example because\n * they were dropped in `beforeSend`) could be returned.\n *\n * @returns The last event id of the isolation scope.\n */\nexport function lastEventId(): string | undefined {\n  return getIsolationScope().lastEventId();\n}\n\n/**\n * Create a cron monitor check in and send it to Sentry.\n *\n * @param checkIn An object that describes a check in.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nexport function captureCheckIn(checkIn: CheckIn, upsertMonitorConfig?: MonitorConfig): string {\n  const scope = getCurrentScope();\n  const client = getClient();\n  if (!client) {\n    DEBUG_BUILD && debug.warn('Cannot capture check-in. No client defined.');\n  } else if (!client.captureCheckIn) {\n    DEBUG_BUILD && debug.warn('Cannot capture check-in. Client does not support sending check-ins.');\n  } else {\n    return client.captureCheckIn(checkIn, upsertMonitorConfig, scope);\n  }\n\n  return uuid4();\n}\n\n/**\n * Wraps a callback with a cron monitor check in. The check in will be sent to Sentry when the callback finishes.\n *\n * @param monitorSlug The distinct slug of the monitor.\n * @param callback Callback to be monitored\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nexport function withMonitor<T>(\n  monitorSlug: CheckIn['monitorSlug'],\n  callback: () => T,\n  upsertMonitorConfig?: MonitorConfig,\n): T {\n  function runCallback(): T {\n    const checkInId = captureCheckIn({ monitorSlug, status: 'in_progress' }, upsertMonitorConfig);\n    const now = timestampInSeconds();\n\n    function finishCheckIn(status: FinishedCheckIn['status']): void {\n      captureCheckIn({ monitorSlug, status, checkInId, duration: timestampInSeconds() - now });\n    }\n    // Default behavior without isolateTrace\n    let maybePromiseResult: T;\n    try {\n      maybePromiseResult = callback();\n    } catch (e) {\n      finishCheckIn('error');\n      throw e;\n    }\n\n    if (isThenable(maybePromiseResult)) {\n      return maybePromiseResult.then(\n        r => {\n          finishCheckIn('ok');\n          return r;\n        },\n        e => {\n          finishCheckIn('error');\n          throw e;\n        },\n      ) as T;\n    }\n    finishCheckIn('ok');\n\n    return maybePromiseResult;\n  }\n\n  return withIsolationScope(() => (upsertMonitorConfig?.isolateTrace ? startNewTrace(runCallback) : runCallback()));\n}\n\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport async function flush(timeout?: number): Promise<boolean> {\n  const client = getClient();\n  if (client) {\n    return client.flush(timeout);\n  }\n  DEBUG_BUILD && debug.warn('Cannot flush events. No client defined.');\n  return Promise.resolve(false);\n}\n\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport async function close(timeout?: number): Promise<boolean> {\n  const client = getClient();\n  if (client) {\n    return client.close(timeout);\n  }\n  DEBUG_BUILD && debug.warn('Cannot flush events and disable SDK. No client defined.');\n  return Promise.resolve(false);\n}\n\n/**\n * Returns true if Sentry has been properly initialized.\n */\nexport function isInitialized(): boolean {\n  return !!getClient();\n}\n\n/** If the SDK is initialized & enabled. */\nexport function isEnabled(): boolean {\n  const client = getClient();\n  return client?.getOptions().enabled !== false && !!client?.getTransport();\n}\n\n/**\n * Add an event processor.\n * This will be added to the current isolation scope, ensuring any event that is processed in the current execution\n * context will have the processor applied.\n */\nexport function addEventProcessor(callback: EventProcessor): void {\n  getIsolationScope().addEventProcessor(callback);\n}\n\n/**\n * Start a session on the current isolation scope.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns the new active session\n */\nexport function startSession(context?: SessionContext): Session {\n  const isolationScope = getIsolationScope();\n\n  const { user } = getCombinedScopeData(isolationScope, getCurrentScope());\n\n  // Will fetch userAgent if called from browser sdk\n  const { userAgent } = GLOBAL_OBJ.navigator || {};\n\n  const session = makeSession({\n    user,\n    ...(userAgent && { userAgent }),\n    ...context,\n  });\n\n  // End existing session if there's one\n  const currentSession = isolationScope.getSession();\n  if (currentSession?.status === 'ok') {\n    updateSession(currentSession, { status: 'exited' });\n  }\n\n  endSession();\n\n  // Afterwards we set the new session on the scope\n  isolationScope.setSession(session);\n\n  return session;\n}\n\n/**\n * End the session on the current isolation scope.\n */\nexport function endSession(): void {\n  const isolationScope = getIsolationScope();\n  const currentScope = getCurrentScope();\n\n  const session = currentScope.getSession() || isolationScope.getSession();\n  if (session) {\n    closeSession(session);\n  }\n  _sendSessionUpdate();\n\n  // the session is over; take it off of the scope\n  isolationScope.setSession();\n}\n\n/**\n * Sends the current Session on the scope\n */\nfunction _sendSessionUpdate(): void {\n  const isolationScope = getIsolationScope();\n  const client = getClient();\n  const session = isolationScope.getSession();\n  if (session && client) {\n    client.captureSession(session);\n  }\n}\n\n/**\n * Sends the current session on the scope to Sentry\n *\n * @param end If set the session will be marked as exited and removed from the scope.\n *            Defaults to `false`.\n */\nexport function captureSession(end: boolean = false): void {\n  // both send the update and pull the session from the scope\n  if (end) {\n    endSession();\n    return;\n  }\n\n  // only send the update\n  _sendSessionUpdate();\n}\n","import type { Client } from './client';\nimport { getClient } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { Event, EventHint } from './types/event';\nimport type { Integration, IntegrationFn } from './types/integration';\nimport type { CoreOptions } from './types/options';\nimport type { StreamedSpanJSON } from './types/span';\nimport { debug } from './utils/debug-logger';\n\nexport const installedIntegrations: string[] = [];\n\n/** Map of integrations assigned to a client */\nexport type IntegrationIndex = {\n  [key: string]: Integration;\n};\n\ntype IntegrationWithDefaultInstance = Integration & { isDefaultInstance?: true };\n\n/**\n * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to\n * preserve the order of integrations in the array.\n *\n * @private\n */\nfunction filterDuplicates(integrations: Integration[]): Integration[] {\n  const integrationsByName: { [key: string]: Integration } = {};\n\n  integrations.forEach((currentInstance: IntegrationWithDefaultInstance) => {\n    const { name } = currentInstance;\n\n    const existingInstance: IntegrationWithDefaultInstance | undefined = integrationsByName[name];\n\n    // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a\n    // default instance to overwrite an existing user instance\n    if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) {\n      return;\n    }\n\n    integrationsByName[name] = currentInstance;\n  });\n\n  return Object.values(integrationsByName);\n}\n\n/** Gets integrations to install */\nexport function getIntegrationsToSetup(\n  options: Pick<CoreOptions, 'defaultIntegrations' | 'integrations'>,\n): Integration[] {\n  const defaultIntegrations = options.defaultIntegrations || [];\n  const userIntegrations = options.integrations;\n\n  // We flag default instances, so that later we can tell them apart from any user-created instances of the same class\n  defaultIntegrations.forEach((integration: IntegrationWithDefaultInstance) => {\n    integration.isDefaultInstance = true;\n  });\n\n  let integrations: Integration[];\n\n  if (Array.isArray(userIntegrations)) {\n    integrations = [...defaultIntegrations, ...userIntegrations];\n  } else if (typeof userIntegrations === 'function') {\n    const resolvedUserIntegrations = userIntegrations(defaultIntegrations);\n    integrations = Array.isArray(resolvedUserIntegrations) ? resolvedUserIntegrations : [resolvedUserIntegrations];\n  } else {\n    integrations = defaultIntegrations;\n  }\n\n  return filterDuplicates(integrations);\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(client: Client, integrations: Integration[]): IntegrationIndex {\n  const integrationIndex: IntegrationIndex = {};\n\n  integrations.forEach((integration: Integration | undefined) => {\n    if (integration?.beforeSetup) {\n      integration.beforeSetup(client);\n    }\n  });\n\n  integrations.forEach((integration: Integration | undefined) => {\n    // guard against empty provided integrations\n    if (integration) {\n      setupIntegration(client, integration, integrationIndex);\n    }\n  });\n\n  return integrationIndex;\n}\n\n/**\n * Execute the `afterAllSetup` hooks of the given integrations.\n */\nexport function afterSetupIntegrations(client: Client, integrations: Integration[]): void {\n  for (const integration of integrations) {\n    // guard against empty provided integrations\n    if (integration?.afterAllSetup) {\n      integration.afterAllSetup(client);\n    }\n  }\n}\n\n/** Setup a single integration.  */\nexport function setupIntegration(client: Client, integration: Integration, integrationIndex: IntegrationIndex): void {\n  if (integrationIndex[integration.name]) {\n    DEBUG_BUILD && debug.log(`Integration skipped because it was already installed: ${integration.name}`);\n    return;\n  }\n  integrationIndex[integration.name] = integration;\n\n  // `setupOnce` is only called the first time\n  if (!installedIntegrations.includes(integration.name) && typeof integration.setupOnce === 'function') {\n    integration.setupOnce();\n    installedIntegrations.push(integration.name);\n  }\n\n  // `setup` is run for each client\n  if (integration.setup && typeof integration.setup === 'function') {\n    integration.setup(client);\n  }\n\n  if (typeof integration.preprocessEvent === 'function') {\n    const callback = integration.preprocessEvent.bind(integration) as typeof integration.preprocessEvent;\n    client.on('preprocessEvent', (event, hint) => callback(event, hint, client));\n  }\n\n  if (typeof integration.processEvent === 'function') {\n    const callback = integration.processEvent.bind(integration) as typeof integration.processEvent;\n\n    const processor = Object.assign((event: Event, hint: EventHint) => callback(event, hint, client), {\n      id: integration.name,\n    });\n\n    client.addEventProcessor(processor);\n  }\n\n  (['processSpan', 'processSegmentSpan'] as const).forEach(hook => {\n    const callback = integration[hook];\n    if (typeof callback === 'function') {\n      // The cast is needed because TS can't resolve overloads when the discriminant is a union type.\n      // Both overloads have the same callback signature so this is safe.\n      client.on(hook as 'processSpan', (span: StreamedSpanJSON) => callback.call(integration, span, client));\n    }\n  });\n\n  DEBUG_BUILD && debug.log(`Integration installed: ${integration.name}`);\n}\n\n/** Add an integration to the current scope's client. */\nexport function addIntegration(integration: Integration): void {\n  const client = getClient();\n\n  if (!client) {\n    DEBUG_BUILD && debug.warn(`Cannot add integration \"${integration.name}\" because no SDK Client is available.`);\n    return;\n  }\n\n  client.addIntegration(integration);\n}\n\n/**\n * Define an integration function that can be used to create an integration instance.\n * Note that this by design hides the implementation details of the integration, as they are considered internal.\n */\nexport function defineIntegration<Fn extends IntegrationFn>(\n  fn: Fn,\n): (...args: Parameters<Fn>) => Integration & { name: ReturnType<Fn>['name'] } {\n  return fn;\n}\n\n// When  extending an integration, we allow other properties to be passed-through\ntype IntegrationWithOtherProperties = Record<string, unknown> & Integration;\ntype ExtendedIntegration<Base extends Integration, Extended extends Partial<IntegrationWithOtherProperties>> = Omit<\n  Base,\n  keyof Extended\n> &\n  Extended;\n\n/**\n * Wrap a parent integration with an extended integration.\n * Any passed integration function will call the parent integration function first, if it exists.\n *\n * Example usage:\n *\n * @example\n * ```typescript\n * const parentIntegration = defineIntegration(() => ({\n *   name: 'ParentIntegration',\n *   setupOnce: () => {\n *     console.log('ParentIntegration setupOnce');\n *   },\n * }));\n *\n * const extendedIntegration = extendIntegration(parentIntegration, {\n *   setupOnce: () => {\n *     console.log('ExtendedIntegration setupOnce');\n *   },\n * });\n * ```\n */\nexport function extendIntegration<Base extends Integration, Extended extends Partial<IntegrationWithOtherProperties>>(\n  integration: Base,\n  extendedIntegration: Extended,\n): ExtendedIntegration<Base, Extended> {\n  // The extension overrides the base for any shared key (object spread + the wrapping below), so the\n  // result type drops the overridden base keys rather than intersecting them — `Base & Extended` would\n  // wrongly intersect shared keys (e.g. a re-typed property collapses to `never`).\n  const wrappedIntegration = {\n    ...integration,\n    ...extendedIntegration,\n  } as ExtendedIntegration<Base, Extended>;\n\n  // Make sure that functions that are extended also call the base functions, if defined\n  // oxlint-disable-next-line guard-for-in\n  for (const key in extendedIntegration) {\n    const baseValue = integration[key as keyof Base];\n    const extendedValue = extendedIntegration[key];\n\n    type ValueType = typeof extendedValue;\n\n    if (typeof baseValue === 'function' && typeof extendedValue === 'function') {\n      const wrappedFunction = new Proxy(baseValue, {\n        apply: (target, thisArg, args) => {\n          Reflect.apply(target, thisArg, args);\n          return Reflect.apply(extendedValue, thisArg, args);\n        },\n      }) as ValueType;\n\n      // We know this is OK, but typescript does not properly narrow/infer types here\n      // so instead of casting the wrappedFunction to some complicated type, we just make clear that we simply overwrite this\n      (wrappedIntegration as Record<string, unknown>)[key] = wrappedFunction;\n    }\n  }\n\n  return wrappedIntegration;\n}\n","import type { Event } from '../types/event';\n\n/**\n * Get a list of possible event messages from a Sentry event.\n */\nexport function getPossibleEventMessages(event: Event): string[] {\n  const possibleMessages: string[] = [];\n\n  if (event.message) {\n    possibleMessages.push(event.message);\n  }\n\n  try {\n    // @ts-expect-error Try catching to save bundle size\n    const lastException = event.exception.values[event.exception.values.length - 1];\n    if (lastException?.value) {\n      possibleMessages.push(lastException.value);\n      if (lastException.type) {\n        possibleMessages.push(`${lastException.type}: ${lastException.value}`);\n      }\n    }\n  } catch {\n    // ignore errors here\n  }\n\n  return possibleMessages;\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport { defineIntegration } from '../integration';\nimport type { Event } from '../types/event';\nimport type { IntegrationFn } from '../types/integration';\nimport type { StackFrame } from '../types/stackframe';\nimport { debug } from '../utils/debug-logger';\nimport { getPossibleEventMessages } from '../utils/eventUtils';\nimport { getEventDescription } from '../utils/misc';\nimport { stringMatchesSomePattern } from '../utils/string';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [\n  /^Script error\\.?$/,\n  /^Javascript error: Script error\\.? on line 0$/,\n  /^ResizeObserver loop completed with undelivered notifications.$/, // The browser logs this when a ResizeObserver handler takes a bit longer. Usually this is not an actual issue though. It indicates slowness.\n  /^Cannot redefine property: googletag$/, // This is thrown when google tag manager is used in combination with an ad blocker\n  /^Can't find variable: gmo$/, // Error from Google Search App https://issuetracker.google.com/issues/396043331\n  /^undefined is not an object \\(evaluating 'a\\.[A-Z]'\\)$/, // Random error that happens but not actionable or noticeable to end-users.\n  /can't redefine non-configurable property \"solana\"/, // Probably a browser extension or custom browser (Brave) throwing this error\n  /vv\\(\\)\\.getRestrictions is not a function/, // Error thrown by GTM, seemingly not affecting end-users\n  /Can't find variable: _AutofillCallbackHandler/, // Unactionable error in instagram webview https://developers.facebook.com/community/threads/320013549791141/\n  /Object Not Found Matching Id:\\d+, MethodName:simulateEvent/, // unactionable error from CEFSharp, a .NET library that embeds chromium in .NET apps\n  /^Java exception was raised during method invocation$/, // error from Facebook Mobile browser (https://github.com/getsentry/sentry-javascript/issues/15065)\n];\n\n/** Options for the EventFilters integration */\nexport interface EventFiltersOptions {\n  allowUrls: Array<string | RegExp>;\n  denyUrls: Array<string | RegExp>;\n  ignoreErrors: Array<string | RegExp>;\n  ignoreTransactions: Array<string | RegExp>;\n  ignoreInternal: boolean;\n  disableErrorDefaults: boolean;\n}\n\nconst INTEGRATION_NAME = 'EventFilters' as const;\n\n/**\n * An integration that filters out events (errors and transactions) based on:\n *\n * - (Errors) A curated list of known low-value or irrelevant errors (see {@link DEFAULT_IGNORE_ERRORS})\n * - (Errors) A list of error messages or urls/filenames passed in via\n *   - Top level Sentry.init options (`ignoreErrors`, `denyUrls`, `allowUrls`)\n *   - The same options passed to the integration directly via @param options\n * - (Transactions/Spans) A list of root span (transaction) names passed in via\n *   - Top level Sentry.init option (`ignoreTransactions`)\n *   - The same option passed to the integration directly via @param options\n *\n * Events filtered by this integration will not be sent to Sentry.\n */\nexport const eventFiltersIntegration = defineIntegration((options: Partial<EventFiltersOptions> = {}) => {\n  let mergedOptions: Partial<EventFiltersOptions> | undefined;\n  return {\n    name: INTEGRATION_NAME,\n    setup(client) {\n      const clientOptions = client.getOptions();\n      mergedOptions = _mergeOptions(options, clientOptions);\n    },\n    processEvent(event, _hint, client) {\n      if (!mergedOptions) {\n        const clientOptions = client.getOptions();\n        mergedOptions = _mergeOptions(options, clientOptions);\n      }\n      return _shouldDropEvent(event, mergedOptions) ? null : event;\n    },\n  };\n});\n\n/**\n * An integration that filters out events (errors and transactions) based on:\n *\n * - (Errors) A curated list of known low-value or irrelevant errors (see {@link DEFAULT_IGNORE_ERRORS})\n * - (Errors) A list of error messages or urls/filenames passed in via\n *   - Top level Sentry.init options (`ignoreErrors`, `denyUrls`, `allowUrls`)\n *   - The same options passed to the integration directly via @param options\n * - (Transactions/Spans) A list of root span (transaction) names passed in via\n *   - Top level Sentry.init option (`ignoreTransactions`)\n *   - The same option passed to the integration directly via @param options\n *\n * Events filtered by this integration will not be sent to Sentry.\n *\n * @deprecated this integration was renamed and will be removed in a future major version.\n * Use `eventFiltersIntegration` instead.\n */\nexport const inboundFiltersIntegration = defineIntegration(((options: Partial<EventFiltersOptions> = {}) => {\n  return {\n    ...eventFiltersIntegration(options),\n    name: 'InboundFilters' as const,\n  };\n}) satisfies IntegrationFn);\n\nfunction _mergeOptions(\n  internalOptions: Partial<EventFiltersOptions> = {},\n  clientOptions: Partial<EventFiltersOptions> = {},\n): Partial<EventFiltersOptions> {\n  return {\n    allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])],\n    denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])],\n    ignoreErrors: [\n      ...(internalOptions.ignoreErrors || []),\n      ...(clientOptions.ignoreErrors || []),\n      ...(internalOptions.disableErrorDefaults ? [] : DEFAULT_IGNORE_ERRORS),\n    ],\n    ignoreTransactions: [...(internalOptions.ignoreTransactions || []), ...(clientOptions.ignoreTransactions || [])],\n  };\n}\n\nfunction _shouldDropEvent(event: Event, options: Partial<EventFiltersOptions>): boolean {\n  if (!event.type) {\n    // Filter errors\n    if (_isIgnoredError(event, options.ignoreErrors)) {\n      DEBUG_BUILD &&\n        debug.warn(\n          `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n        );\n      return true;\n    }\n    if (_isUselessError(event)) {\n      DEBUG_BUILD &&\n        debug.warn(\n          `Event dropped due to not having an error message, error type or stacktrace.\\nEvent: ${getEventDescription(\n            event,\n          )}`,\n        );\n      return true;\n    }\n    if (_isDeniedUrl(event, options.denyUrls)) {\n      DEBUG_BUILD &&\n        debug.warn(\n          `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n            event,\n          )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n        );\n      return true;\n    }\n    if (!_isAllowedUrl(event, options.allowUrls)) {\n      DEBUG_BUILD &&\n        debug.warn(\n          `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n            event,\n          )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n        );\n      return true;\n    }\n  } else if (event.type === 'transaction') {\n    // Filter transactions\n\n    if (_isIgnoredTransaction(event, options.ignoreTransactions)) {\n      DEBUG_BUILD &&\n        debug.warn(\n          `Event dropped due to being matched by \\`ignoreTransactions\\` option.\\nEvent: ${getEventDescription(event)}`,\n        );\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction _isIgnoredError(event: Event, ignoreErrors?: Array<string | RegExp>): boolean {\n  if (!ignoreErrors?.length) {\n    return false;\n  }\n\n  return getPossibleEventMessages(event).some(message => stringMatchesSomePattern(message, ignoreErrors));\n}\n\nfunction _isIgnoredTransaction(event: Event, ignoreTransactions?: Array<string | RegExp>): boolean {\n  if (!ignoreTransactions?.length) {\n    return false;\n  }\n\n  const name = event.transaction;\n  return name ? stringMatchesSomePattern(name, ignoreTransactions) : false;\n}\n\nfunction _isDeniedUrl(event: Event, denyUrls?: Array<string | RegExp>): boolean {\n  if (!denyUrls?.length) {\n    return false;\n  }\n  const url = _getEventFilterUrl(event);\n  return !url ? false : stringMatchesSomePattern(url, denyUrls);\n}\n\nfunction _isAllowedUrl(event: Event, allowUrls?: Array<string | RegExp>): boolean {\n  if (!allowUrls?.length) {\n    return true;\n  }\n  const url = _getEventFilterUrl(event);\n  return !url ? true : stringMatchesSomePattern(url, allowUrls);\n}\n\nfunction _getLastValidUrl(frames: StackFrame[] = []): string | null {\n  for (let i = frames.length - 1; i >= 0; i--) {\n    const frame = frames[i];\n\n    if (frame && frame.filename !== '<anonymous>' && frame.filename !== '[native code]') {\n      return frame.filename || null;\n    }\n  }\n\n  return null;\n}\n\nfunction _getEventFilterUrl(event: Event): string | null {\n  try {\n    // If there are linked exceptions or exception aggregates we only want to match against the top frame of the \"root\" (the main exception)\n    // The root always comes last in linked exceptions\n    const rootException = [...(event.exception?.values ?? [])]\n      .reverse()\n      .find(value => value.mechanism?.parent_id === undefined && value.stacktrace?.frames?.length);\n    const frames = rootException?.stacktrace?.frames;\n    return frames ? _getLastValidUrl(frames) : null;\n  } catch {\n    DEBUG_BUILD && debug.error(`Cannot extract url for event ${getEventDescription(event)}`);\n    return null;\n  }\n}\n\nfunction _isUselessError(event: Event): boolean {\n  // We only want to consider events for dropping that actually have recorded exception values.\n  if (!event.exception?.values?.length) {\n    return false;\n  }\n\n  return (\n    // No top-level message\n    !event.message &&\n    // There are no exception values that have a stacktrace, a non-generic-Error type or value\n    !event.exception.values.some(value => value.stacktrace || (value.type && value.type !== 'Error') || value.value)\n  );\n}\n","import type { Client } from '../client';\nimport { getClient } from '../currentScopes';\nimport { defineIntegration } from '../integration';\nimport type { IntegrationFn } from '../types/integration';\nimport type { WrappedFunction } from '../types/wrappedfunction';\nimport { getOriginalFunction } from '../utils/object';\n\nlet originalFunctionToString: () => void;\n\nconst INTEGRATION_NAME = 'FunctionToString' as const;\n\nconst SETUP_CLIENTS = new WeakMap<Client, boolean>();\n\nconst _functionToStringIntegration = (() => {\n  return {\n    name: INTEGRATION_NAME,\n    setupOnce() {\n      // eslint-disable-next-line @typescript-eslint/unbound-method\n      originalFunctionToString = Function.prototype.toString;\n\n      // intrinsics (like Function.prototype) might be immutable in some environments\n      // e.g. Node with --frozen-intrinsics, XS (an embedded JavaScript engine) or SES (a JavaScript proposal)\n      try {\n        Function.prototype.toString = function (this: WrappedFunction, ...args: unknown[]): string {\n          const originalFunction = getOriginalFunction(this);\n          const context =\n            SETUP_CLIENTS.has(getClient() as Client) && originalFunction !== undefined ? originalFunction : this;\n          return originalFunctionToString.apply(context, args);\n        };\n      } catch {\n        // ignore errors here, just don't patch this\n      }\n    },\n    setup(client) {\n      SETUP_CLIENTS.set(client, true);\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Patch toString calls to return proper name for wrapped functions.\n *\n * ```js\n * Sentry.init({\n *   integrations: [\n *     functionToStringIntegration(),\n *   ],\n * });\n * ```\n */\nexport const functionToStringIntegration = defineIntegration(_functionToStringIntegration);\n","import { DEBUG_BUILD } from '../debug-build';\nimport { debug } from '../utils/debug-logger';\nimport { getFunctionName } from '../utils/stacktrace';\n\nexport type InstrumentHandlerType =\n  | 'console'\n  | 'dom'\n  | 'fetch'\n  | 'fetch-body-resolved'\n  | 'history'\n  | 'xhr'\n  | 'error'\n  | 'unhandledrejection';\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type InstrumentHandlerCallback = (data: any) => void;\n\n// We keep the handlers globally\nconst handlers: { [key in InstrumentHandlerType]?: InstrumentHandlerCallback[] } = {};\nconst instrumented: { [key in InstrumentHandlerType]?: boolean } = {};\n\n/** Add a handler function. Returns a function to remove the handler. */\nexport function addHandler(type: InstrumentHandlerType, handler: InstrumentHandlerCallback): () => void {\n  handlers[type] = handlers[type] || [];\n  handlers[type].push(handler);\n\n  return () => {\n    const typeHandlers = handlers[type];\n    if (typeHandlers) {\n      const index = typeHandlers.indexOf(handler);\n      if (index !== -1) {\n        typeHandlers.splice(index, 1);\n      }\n    }\n  };\n}\n\n/**\n * Reset all instrumentation handlers.\n * This can be used by tests to ensure we have a clean slate of instrumentation handlers.\n */\nexport function resetInstrumentationHandlers(): void {\n  Object.keys(handlers).forEach(key => {\n    handlers[key as InstrumentHandlerType] = undefined;\n  });\n}\n\n/** Maybe run an instrumentation function, unless it was already called. */\nexport function maybeInstrument(type: InstrumentHandlerType, instrumentFn: () => void): void {\n  if (!instrumented[type]) {\n    instrumented[type] = true;\n    try {\n      instrumentFn();\n    } catch (e) {\n      DEBUG_BUILD && debug.error(`Error while instrumenting ${type}`, e);\n    }\n  }\n}\n\n/** Trigger handlers for a given instrumentation type. */\nexport function triggerHandlers(type: InstrumentHandlerType, data: unknown): void {\n  const typeHandlers = type && handlers[type];\n  if (!typeHandlers) {\n    return;\n  }\n\n  for (const handler of typeHandlers) {\n    try {\n      handler(data);\n    } catch (e) {\n      DEBUG_BUILD &&\n        debug.error(\n          `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(handler)}\\nError:`,\n          e,\n        );\n    }\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-types */\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { ConsoleLevel, HandlerDataConsole } from '../types/instrument';\nimport { CONSOLE_LEVELS, originalConsoleMethods } from '../utils/debug-logger';\nimport { fill } from '../utils/object';\nimport { stringMatchesSomePattern } from '../utils/string';\nimport { GLOBAL_OBJ } from '../utils/worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\nimport { debug } from '../utils/debug-logger';\n\n/**\n * Filter out console messages that match the given strings or regular expressions.\n * These will neither be passed to the handler, and they will also not be logged to the user, unless they have debug enabled.\n * This is a set to avoid duplicate integration setups to add the same filter multiple times.\n */\nconst _filter = new Set<string | RegExp>([]);\n\n/**\n * Add an instrumentation handler for when a console.xxx method is called.\n * Returns a function to remove the handler.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addConsoleInstrumentationHandler(handler: (data: HandlerDataConsole) => void): () => void {\n  const type = 'console';\n  const removeHandler = addHandler(type, handler);\n  maybeInstrument(type, instrumentConsole);\n  return removeHandler;\n}\n\n/**\n * Add a filter to the console instrumentation to filter out console messages that match the given strings or regular expressions.\n * Returns a function to remove the filter.\n */\nexport function addConsoleInstrumentationFilter(filter: (string | RegExp)[]): () => void {\n  for (const f of filter) {\n    _filter.add(f);\n  }\n\n  return () => {\n    for (const f of filter) {\n      _filter.delete(f);\n    }\n  };\n}\n\n/** Only exported for tests. */\nexport function _INTERNAL_resetConsoleInstrumentationOptions(): void {\n  _filter.clear();\n}\n\nfunction instrumentConsole(): void {\n  if (!('console' in GLOBAL_OBJ)) {\n    return;\n  }\n\n  CONSOLE_LEVELS.forEach(function (level: ConsoleLevel): void {\n    if (!(level in GLOBAL_OBJ.console)) {\n      return;\n    }\n\n    fill(GLOBAL_OBJ.console, level, function (originalConsoleMethod: () => any): Function {\n      originalConsoleMethods[level] = originalConsoleMethod;\n\n      return function (...args: any[]): void {\n        const firstArg = args[0];\n        const log = originalConsoleMethods[level];\n\n        const isFiltered = _filter.size && typeof firstArg === 'string' && stringMatchesSomePattern(firstArg, _filter);\n\n        // Only trigger handlers for non-filtered messages\n        if (!isFiltered) {\n          triggerHandlers('console', { args, level } as HandlerDataConsole);\n        }\n\n        // Only log filtered messages in debug mode\n        if (!isFiltered || (DEBUG_BUILD && debug.isEnabled())) {\n          // Call original console method\n          log?.apply(GLOBAL_OBJ.console, args);\n        }\n      };\n    });\n  });\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport { debug } from './debug-logger';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\ndeclare const EdgeRuntime: string | undefined;\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent(): boolean {\n  try {\n    new ErrorEvent('');\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError(): boolean {\n  try {\n    // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n    // 1 argument required, but only 0 present.\n    // @ts-expect-error It really needs 1 argument, not 0.\n    new DOMError('');\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException(): boolean {\n  try {\n    new DOMException('');\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory(): boolean {\n  return 'history' in WINDOW && !!WINDOW.history;\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n * @deprecated This is no longer used and will be removed in a future major version.\n */\nexport const supportsFetch = _isFetchSupported;\n\nfunction _isFetchSupported(): boolean {\n  if (!('fetch' in WINDOW)) {\n    return false;\n  }\n\n  try {\n    new Headers();\n    // Deno requires a valid URL so '' cannot be used as an argument\n    new Request('data:,');\n    new Response();\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * isNative checks if the given function is a native implementation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFunction(func: Function): boolean {\n  return func && /^function\\s+\\w+\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch(): boolean {\n  if (typeof EdgeRuntime === 'string') {\n    return true;\n  }\n\n  if (!_isFetchSupported()) {\n    return false;\n  }\n\n  // Fast path to avoid DOM I/O\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  if (isNativeFunction(WINDOW.fetch)) {\n    return true;\n  }\n\n  // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n  // so create a \"pure\" iframe to see if that has native fetch\n  let result = false;\n  const doc = WINDOW.document;\n  // eslint-disable-next-line typescript/no-deprecated\n  if (doc && typeof (doc.createElement as unknown) === 'function') {\n    try {\n      const sandbox = doc.createElement('iframe');\n      sandbox.hidden = true;\n      doc.head.appendChild(sandbox);\n      if (sandbox.contentWindow?.fetch) {\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        result = isNativeFunction(sandbox.contentWindow.fetch);\n      }\n      doc.head.removeChild(sandbox);\n    } catch (err) {\n      DEBUG_BUILD && debug.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n    }\n  }\n\n  return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver(): boolean {\n  return 'ReportingObserver' in WINDOW;\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n * @deprecated This is no longer used and will be removed in a future major version.\n */\nexport function supportsReferrerPolicy(): boolean {\n  // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n  // (see https://caniuse.com/#feat=referrer-policy),\n  // it doesn't. And it throws an exception instead of ignoring this parameter...\n  // REF: https://github.com/getsentry/raven-js/issues/1233\n\n  if (!_isFetchSupported()) {\n    return false;\n  }\n\n  try {\n    new Request('_', {\n      referrerPolicy: 'origin' as ReferrerPolicy,\n    });\n    return true;\n  } catch {\n    return false;\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { getClient } from '../currentScopes';\nimport type { HandlerDataFetch } from '../types/instrument';\nimport type { WebFetchHeaders } from '../types/webfetchapi';\nimport { isError, isRequest } from '../utils/is';\nimport { addNonEnumerableProperty, fill } from '../utils/object';\nimport { supportsNativeFetch } from '../utils/supports';\nimport { timestampInSeconds } from '../utils/time';\nimport { GLOBAL_OBJ } from '../utils/worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\ntype FetchResource = string | { toString(): string } | { url: string };\n\n/**\n * Add an instrumentation handler for when a fetch request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n * Returns a function to remove the handler.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addFetchInstrumentationHandler(\n  handler: (data: HandlerDataFetch) => void,\n  skipNativeFetchCheck?: boolean,\n): () => void {\n  const type = 'fetch';\n  const removeHandler = addHandler(type, handler);\n  maybeInstrument(type, () => instrumentFetch(undefined, skipNativeFetchCheck));\n  return removeHandler;\n}\n\n/**\n * Add an instrumentation handler for long-lived fetch requests, like consuming server-sent events (SSE) via fetch.\n * The handler will resolve the request body and emit the actual `endTimestamp`, so that the\n * span can be updated accordingly.\n * Returns a function to remove the handler.\n *\n * Only used internally\n * @hidden\n */\nexport function addFetchEndInstrumentationHandler(handler: (data: HandlerDataFetch) => void): () => void {\n  const type = 'fetch-body-resolved';\n  const removeHandler = addHandler(type, handler);\n  maybeInstrument(type, () => instrumentFetch(streamHandler));\n  return removeHandler;\n}\n\nfunction instrumentFetch(onFetchResolved?: (response: Response) => void, skipNativeFetchCheck: boolean = false): void {\n  if (skipNativeFetchCheck && !supportsNativeFetch()) {\n    return;\n  }\n\n  fill(GLOBAL_OBJ, 'fetch', function (originalFetch: () => void): () => void {\n    return function (...args: any[]): void {\n      // We capture the error right here and not in the Promise error callback because Safari (and probably other\n      // browsers too) will wipe the stack trace up to this point, only leaving us with this file which is useless.\n\n      // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n      //       it means the error, that was caused by your fetch call did not\n      //       have a stack trace, so the SDK backfilled the stack trace so\n      //       you can see which fetch call failed.\n      const virtualError = new Error();\n\n      const { method, url } = parseFetchArgs(args);\n      const handlerData: HandlerDataFetch = {\n        args,\n        fetchData: {\n          method,\n          url,\n        },\n        startTimestamp: timestampInSeconds() * 1000,\n        // // Adding the error to be able to fingerprint the failed fetch event in HttpClient instrumentation\n        virtualError,\n        headers: getHeadersFromFetchArgs(args),\n      };\n\n      // if there is no callback, fetch is instrumented directly\n      if (!onFetchResolved) {\n        triggerHandlers('fetch', {\n          ...handlerData,\n        });\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n      return originalFetch.apply(GLOBAL_OBJ, args).then(\n        async (response: Response) => {\n          if (onFetchResolved) {\n            onFetchResolved(response);\n          } else {\n            triggerHandlers('fetch', {\n              ...handlerData,\n              endTimestamp: timestampInSeconds() * 1000,\n              response,\n            });\n          }\n\n          return response;\n        },\n        (error: Error) => {\n          triggerHandlers('fetch', {\n            ...handlerData,\n            endTimestamp: timestampInSeconds() * 1000,\n            error,\n          });\n\n          if (isError(error) && error.stack === undefined) {\n            // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n            //       it means the error, that was caused by your fetch call did not\n            //       have a stack trace, so the SDK backfilled the stack trace so\n            //       you can see which fetch call failed.\n            error.stack = virtualError.stack;\n            addNonEnumerableProperty(error, 'framesToPop', 1);\n          }\n\n          // We enhance fetch error messages with hostname information based on the configuration.\n          // Possible messages we handle here:\n          // * \"Failed to fetch\" (chromium)\n          // * \"Load failed\" (webkit)\n          // * \"NetworkError when attempting to fetch resource.\" (firefox)\n          const client = getClient();\n          const enhanceOption = client?.getOptions().enhanceFetchErrorMessages ?? 'always';\n          const shouldEnhance = enhanceOption !== false;\n\n          if (\n            shouldEnhance &&\n            error instanceof TypeError &&\n            (error.message === 'Failed to fetch' ||\n              error.message === 'Load failed' ||\n              error.message === 'NetworkError when attempting to fetch resource.')\n          ) {\n            try {\n              const url = new URL(handlerData.fetchData.url);\n              const hostname = url.host;\n\n              if (enhanceOption === 'always') {\n                // Modify the error message directly\n                error.message = `${error.message} (${hostname})`;\n              } else {\n                // Store hostname as non-enumerable property for Sentry-only enhancement\n                // This preserves the original error message for third-party packages\n                addNonEnumerableProperty(error, '__sentry_fetch_url_host__', hostname);\n              }\n            } catch {\n              // ignore it if errors happen here\n            }\n          }\n\n          // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n          //       it means the sentry.javascript SDK caught an error invoking your application code.\n          //       This is expected behavior and NOT indicative of a bug with sentry.javascript.\n          throw error;\n        },\n      );\n    };\n  });\n}\n\nasync function resolveResponse(res: Response | undefined, onFinishedResolving: () => void): Promise<void> {\n  if (res?.body) {\n    const body = res.body;\n    const responseReader = body.getReader();\n\n    // Define a maximum duration after which we just cancel\n    const maxFetchDurationTimeout = setTimeout(\n      () => {\n        body.cancel().then(null, () => {\n          // noop\n        });\n      },\n      90 * 1000, // 90s\n    );\n\n    let readingActive = true;\n    while (readingActive) {\n      let chunkTimeout;\n      try {\n        // abort reading if read op takes more than 5s\n        chunkTimeout = setTimeout(() => {\n          body.cancel().then(null, () => {\n            // noop on error\n          });\n        }, 5000);\n\n        // This .read() call will reject/throw when we abort due to timeouts through `body.cancel()`\n        const { done } = await responseReader.read();\n\n        clearTimeout(chunkTimeout);\n\n        if (done) {\n          onFinishedResolving();\n          readingActive = false;\n        }\n      } catch {\n        readingActive = false;\n      } finally {\n        clearTimeout(chunkTimeout);\n      }\n    }\n\n    clearTimeout(maxFetchDurationTimeout);\n\n    responseReader.releaseLock();\n    body.cancel().then(null, () => {\n      // noop on error\n    });\n  }\n}\n\nfunction streamHandler(response: Response): void {\n  // clone response for awaiting stream\n  let clonedResponseForResolving: Response;\n  try {\n    clonedResponseForResolving = response.clone();\n  } catch {\n    return;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-floating-promises\n  resolveResponse(clonedResponseForResolving, () => {\n    triggerHandlers('fetch-body-resolved', {\n      endTimestamp: timestampInSeconds() * 1000,\n      response,\n    });\n  });\n}\n\nfunction hasProp<T extends string>(obj: unknown, prop: T): obj is Record<string, string> {\n  return !!obj && typeof obj === 'object' && !!(obj as Record<string, string>)[prop];\n}\n\nfunction getUrlFromResource(resource: FetchResource): string {\n  if (typeof resource === 'string') {\n    return resource;\n  }\n\n  if (!resource) {\n    return '';\n  }\n\n  if (hasProp(resource, 'url')) {\n    return resource.url;\n  }\n\n  if (resource.toString) {\n    return resource.toString();\n  }\n\n  return '';\n}\n\n/**\n * Parses the fetch arguments to find the used Http method and the url of the request.\n * Exported for tests only.\n */\nexport function parseFetchArgs(fetchArgs: unknown[]): { method: string; url: string } {\n  if (fetchArgs.length === 0) {\n    return { method: 'GET', url: '' };\n  }\n\n  if (fetchArgs.length === 2) {\n    const [resource, options] = fetchArgs as [FetchResource, object];\n\n    return {\n      url: getUrlFromResource(resource),\n      method: hasProp(options, 'method')\n        ? String(options.method).toUpperCase()\n        : // Request object as first argument\n          isRequest(resource) && hasProp(resource, 'method')\n          ? String(resource.method).toUpperCase()\n          : 'GET',\n    };\n  }\n\n  const arg = fetchArgs[0];\n  return {\n    url: getUrlFromResource(arg as FetchResource),\n    method: hasProp(arg, 'method') ? String(arg.method).toUpperCase() : 'GET',\n  };\n}\n\nfunction getHeadersFromFetchArgs(fetchArgs: unknown[]): WebFetchHeaders | undefined {\n  const [requestArgument, optionsArgument] = fetchArgs;\n\n  try {\n    if (\n      typeof optionsArgument === 'object' &&\n      optionsArgument !== null &&\n      'headers' in optionsArgument &&\n      optionsArgument.headers\n    ) {\n      return new Headers(optionsArgument.headers as any);\n    }\n\n    if (isRequest(requestArgument)) {\n      return new Headers(requestArgument.headers);\n    }\n  } catch {\n    // noop\n  }\n\n  return;\n}\n","import { getClient, getIsolationScope } from './currentScopes';\nimport type { Breadcrumb, BreadcrumbHint } from './types/breadcrumb';\nimport { consoleSandbox } from './utils/debug-logger';\nimport { dateTimestampInSeconds } from './utils/time';\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 100;\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n */\nexport function addBreadcrumb(breadcrumb: Breadcrumb, hint?: BreadcrumbHint): void {\n  const client = getClient();\n  const isolationScope = getIsolationScope();\n\n  if (!client) return;\n\n  const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } = client.getOptions();\n\n  if (maxBreadcrumbs <= 0) return;\n\n  const timestamp = dateTimestampInSeconds();\n  const mergedBreadcrumb = { timestamp, ...breadcrumb };\n  const finalBreadcrumb = beforeBreadcrumb\n    ? consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint))\n    : mergedBreadcrumb;\n\n  if (finalBreadcrumb === null) return;\n\n  if (client.emit) {\n    client.emit('beforeAddBreadcrumb', finalBreadcrumb, hint);\n  }\n\n  isolationScope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n}\n","import { isString } from './is';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\nconst DEFAULT_MAX_STRING_LENGTH = 80;\n\ntype SimpleNode = {\n  parentNode: SimpleNode;\n} | null;\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n * @deprecated This is browser-specific and will be removed from `@sentry/core` in a future major version.\n * Import `htmlTreeAsString` from `@sentry/browser-utils` instead.\n */\nexport function htmlTreeAsString(\n  elem: unknown,\n  options: string[] | { keyAttrs?: string[]; maxStringLength?: number } = {},\n): string {\n  if (!elem) {\n    return '<unknown>';\n  }\n\n  // try/catch both:\n  // - accessing event.target (see getsentry/raven-js#838, #768)\n  // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n  // - can throw an exception in some circumstances.\n  try {\n    let currentElem = elem as SimpleNode;\n    const MAX_TRAVERSE_HEIGHT = 5;\n    const out = [];\n    let height = 0;\n    let len = 0;\n    const separator = ' > ';\n    const sepLength = separator.length;\n    let nextStr;\n    const keyAttrs = Array.isArray(options) ? options : options.keyAttrs;\n    const maxStringLength = (!Array.isArray(options) && options.maxStringLength) || DEFAULT_MAX_STRING_LENGTH;\n\n    while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n      nextStr = _htmlElementAsString(currentElem, keyAttrs);\n      // bail out if\n      // - nextStr is the 'html' element\n      // - the length of the string that would be created exceeds maxStringLength\n      //   (ignore this limit if we are on the first iteration)\n      if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= maxStringLength)) {\n        break;\n      }\n\n      out.push(nextStr);\n\n      len += nextStr.length;\n      currentElem = currentElem.parentNode;\n    }\n\n    return out.reverse().join(separator);\n  } catch {\n    return '<unknown>';\n  }\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el: unknown, keyAttrs?: string[]): string {\n  const elem = el as {\n    tagName?: string;\n    id?: string;\n    className?: string;\n    getAttribute(key: string): string;\n  };\n\n  const out = [];\n\n  if (!elem?.tagName) {\n    return '';\n  }\n\n  // @ts-expect-error WINDOW has HTMLElement\n  if (WINDOW.HTMLElement) {\n    // If using the component name annotation plugin, this value may be available on the DOM node\n    if (elem instanceof HTMLElement && elem.dataset) {\n      if (elem.dataset['sentryComponent']) {\n        return elem.dataset['sentryComponent'];\n      }\n      if (elem.dataset['sentryElement']) {\n        return elem.dataset['sentryElement'];\n      }\n    }\n  }\n\n  out.push(elem.tagName.toLowerCase());\n\n  // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n  const keyAttrPairs = keyAttrs?.length\n    ? keyAttrs.filter(keyAttr => elem.getAttribute(keyAttr)).map(keyAttr => [keyAttr, elem.getAttribute(keyAttr)])\n    : null;\n\n  if (keyAttrPairs?.length) {\n    keyAttrPairs.forEach(keyAttrPair => {\n      out.push(`[${keyAttrPair[0]}=\"${keyAttrPair[1]}\"]`);\n    });\n  } else {\n    if (elem.id) {\n      out.push(`#${elem.id}`);\n    }\n\n    const className = elem.className;\n    if (className && isString(className)) {\n      const classes = className.split(/\\s+/);\n      for (const c of classes) {\n        out.push(`.${c}`);\n      }\n    }\n  }\n  for (const k of ['aria-label', 'type', 'name', 'title', 'alt']) {\n    const attr = elem.getAttribute(k);\n    if (attr) {\n      out.push(`[${k}=\"${attr}\"]`);\n    }\n  }\n\n  return out.join('');\n}\n\n/**\n * A safe form of location.href\n */\nexport function getLocationHref(): string {\n  try {\n    return WINDOW.document.location.href;\n  } catch {\n    return '';\n  }\n}\n\n/**\n * Given a DOM element, traverses up the tree until it finds the first ancestor node\n * that has the `data-sentry-component` or `data-sentry-element` attribute with `data-sentry-component` taking\n * precedence. This attribute is added at build-time by projects that have the component name annotation plugin installed.\n *\n * @returns a string representation of the component for the provided DOM element, or `null` if not found\n */\nexport function getComponentName(elem: unknown, maxTraverseHeight: number = 5): string | null {\n  // @ts-expect-error WINDOW has HTMLElement\n  if (!WINDOW.HTMLElement) {\n    return null;\n  }\n\n  let currentElem = elem as SimpleNode;\n  for (let i = 0; i < maxTraverseHeight; i++) {\n    if (!currentElem) {\n      return null;\n    }\n\n    if (currentElem instanceof HTMLElement) {\n      if (currentElem.dataset['sentryComponent']) {\n        return currentElem.dataset['sentryComponent'];\n      }\n      if (currentElem.dataset['sentryElement']) {\n        return currentElem.dataset['sentryElement'];\n      }\n    }\n\n    currentElem = currentElem.parentNode;\n  }\n\n  return null;\n}\n","import type { SeverityLevel } from '../types/severity';\n\n/**\n * Converts a string-based level into a `SeverityLevel`, normalizing it along the way.\n *\n * @param level String representation of desired `SeverityLevel`.\n * @returns The `SeverityLevel` corresponding to the given string, or 'log' if the string isn't a valid level.\n */\nexport function severityLevelFromString(level: SeverityLevel | string): SeverityLevel {\n  return (\n    level === 'warn' ? 'warning' : ['fatal', 'error', 'warning', 'log', 'info', 'debug'].includes(level) ? level : 'log'\n  ) as SeverityLevel;\n}\n","import type { SeverityLevel } from '../types/severity';\n\n/**\n * Determine a breadcrumb's log level (only `warning` or `error`) based on an HTTP status code.\n */\nexport function getBreadcrumbLogLevelFromHttpStatusCode(statusCode: number | undefined): SeverityLevel | undefined {\n  // NOTE: undefined defaults to 'info' in Sentry\n  if (statusCode === undefined) {\n    return undefined;\n  } else if (statusCode >= 400 && statusCode < 500) {\n    return 'warning';\n  } else if (statusCode >= 500) {\n    return 'error';\n  } else {\n    return undefined;\n  }\n}\n","import {\n  SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD,\n  SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n  SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n  SEMANTIC_ATTRIBUTE_URL_FULL,\n} from '../semanticAttributes';\nimport type { SpanAttributes } from '../types/span';\n\ntype PartialURL = {\n  host?: string;\n  path?: string;\n  protocol?: string;\n  relative?: string;\n  search?: string;\n  hash?: string;\n};\n\ninterface URLwithCanParse extends URL {\n  canParse: (url: string, base?: string | URL | undefined) => boolean;\n}\n\n// A subset of the URL object that is valid for relative URLs\n// The URL object cannot handle relative URLs, so we need to handle them separately\ntype RelativeURL = {\n  isRelative: true;\n  pathname: URL['pathname'];\n  search: URL['search'];\n  hash: URL['hash'];\n};\n\ntype URLObject = RelativeURL | URL;\n\n// Curious about `thismessage:/`? See: https://www.rfc-editor.org/rfc/rfc2557.html\n//  > When the methods above do not yield an absolute URI, a base URL\n//  > of \"thismessage:/\" MUST be employed. This base URL has been\n//  > defined for the sole purpose of resolving relative references\n//  > within a multipart/related structure when no other base URI is\n//  > specified.\n//\n// We need to provide a base URL to `parseStringToURLObject` because the fetch API gives us a\n// relative URL sometimes.\n//\n// This is the only case where we need to provide a base URL to `parseStringToURLObject`\n// because the relative URL is not valid on its own.\nconst DEFAULT_BASE_URL = 'thismessage:/';\n\n/**\n * Checks if the URL object is relative\n *\n * @param url - The URL object to check\n * @returns True if the URL object is relative, false otherwise\n */\nexport function isURLObjectRelative(url: URLObject): url is RelativeURL {\n  return 'isRelative' in url;\n}\n\n/**\n * Parses string to a URL object\n *\n * @param url - The URL to parse\n * @returns The parsed URL object or undefined if the URL is invalid\n */\nexport function parseStringToURLObject(url: string, urlBase?: string | URL | undefined): URLObject | undefined {\n  const isRelative = url.indexOf('://') <= 0 && url.indexOf('//') !== 0;\n  const base = urlBase ?? (isRelative ? DEFAULT_BASE_URL : undefined);\n  try {\n    // Use `canParse` to short-circuit the URL constructor if it's not a valid URL\n    // This is faster than trying to construct the URL and catching the error\n    // Node 20+, Chrome 120+, Firefox 115+, Safari 17+\n    if ('canParse' in URL && !(URL as unknown as URLwithCanParse).canParse(url, base)) {\n      return undefined;\n    }\n\n    const fullUrlObject = new URL(url, base);\n    if (isRelative) {\n      // Because we used a fake base URL, we need to return a relative URL object.\n      // We cannot return anything about the origin, host, etc. because it will refer to the fake base URL.\n      return {\n        isRelative,\n        pathname: fullUrlObject.pathname,\n        search: fullUrlObject.search,\n        hash: fullUrlObject.hash,\n      };\n    }\n    return fullUrlObject;\n  } catch {\n    // empty body\n  }\n\n  return undefined;\n}\n\n/**\n * Takes a URL object and returns a sanitized string which is safe to use as span name\n * see: https://develop.sentry.dev/sdk/data-handling/#structuring-data\n */\nexport function getSanitizedUrlStringFromUrlObject(url: URLObject): string {\n  if (isURLObjectRelative(url)) {\n    return url.pathname;\n  }\n\n  const newUrl = new URL(url);\n  newUrl.search = '';\n  newUrl.hash = '';\n  if (['80', '443'].includes(newUrl.port)) {\n    newUrl.port = '';\n  }\n  if (newUrl.password) {\n    newUrl.password = '%filtered%';\n  }\n  if (newUrl.username) {\n    newUrl.username = '%filtered%';\n  }\n\n  return newUrl.toString();\n}\n\ntype PartialRequest = {\n  method?: string;\n};\n\nfunction getHttpSpanNameFromUrlObject(\n  urlObject: URLObject | undefined,\n  kind: 'server' | 'client',\n  request?: PartialRequest,\n  routeName?: string,\n): string {\n  const method = request?.method?.toUpperCase() ?? 'GET';\n  const route = routeName\n    ? routeName\n    : urlObject\n      ? kind === 'client'\n        ? getSanitizedUrlStringFromUrlObject(urlObject)\n        : urlObject.pathname\n      : '/';\n\n  return `${method} ${route}`;\n}\n\n/**\n * Takes a parsed URL object and returns a set of attributes for the span\n * that represents the HTTP request for that url. This is used for both server\n * and client http spans.\n *\n * Follows https://opentelemetry.io/docs/specs/semconv/http/.\n *\n * @param urlObject - see {@link parseStringToURLObject}\n * @param kind - The type of HTTP operation (server or client)\n * @param spanOrigin - The origin of the span\n * @param request - The request object, see {@link PartialRequest}\n * @param routeName - The name of the route, must be low cardinality\n * @returns The span name and attributes for the HTTP operation\n */\nexport function getHttpSpanDetailsFromUrlObject(\n  urlObject: URLObject | undefined,\n  kind: 'server' | 'client',\n  spanOrigin: string,\n  request?: PartialRequest,\n  routeName?: string,\n): [name: string, attributes: SpanAttributes] {\n  const attributes: SpanAttributes = {\n    [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: spanOrigin,\n    [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n  };\n\n  if (routeName) {\n    // This is based on https://opentelemetry.io/docs/specs/semconv/http/http-spans/#name\n    attributes[kind === 'server' ? 'http.route' : 'url.template'] = routeName;\n    attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] = 'route';\n  }\n\n  if (request?.method) {\n    attributes[SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD] = request.method.toUpperCase();\n  }\n\n  if (urlObject) {\n    if (urlObject.search) {\n      attributes['url.query'] = urlObject.search;\n    }\n    if (urlObject.hash) {\n      attributes['url.fragment'] = urlObject.hash;\n    }\n    if (urlObject.pathname) {\n      attributes['url.path'] = urlObject.pathname;\n      if (urlObject.pathname === '/') {\n        attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] = 'route';\n      }\n    }\n\n    if (!isURLObjectRelative(urlObject)) {\n      attributes[SEMANTIC_ATTRIBUTE_URL_FULL] = urlObject.href;\n      if (urlObject.port) {\n        attributes['url.port'] = urlObject.port;\n      }\n      if (urlObject.protocol) {\n        attributes['url.scheme'] = urlObject.protocol;\n      }\n      if (urlObject.hostname) {\n        attributes[kind === 'server' ? 'server.address' : 'url.domain'] = urlObject.hostname;\n      }\n    }\n  }\n\n  return [getHttpSpanNameFromUrlObject(urlObject, kind, request, routeName), attributes];\n}\n\n/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not <a/> href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nexport function parseUrl(url: string): PartialURL {\n  if (!url) {\n    return {};\n  }\n\n  const match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n  if (!match) {\n    return {};\n  }\n\n  // coerce to undefined values to empty string so we don't get 'undefined'\n  const query = match[6] || '';\n  const fragment = match[8] || '';\n  return {\n    host: match[4],\n    path: match[5],\n    protocol: match[2],\n    search: query,\n    hash: fragment,\n    relative: match[5] + query + fragment, // everything minus origin\n  };\n}\n\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\nexport function stripUrlQueryAndFragment(urlPath: string): string {\n  return (urlPath.split(/[?#]/, 1) as [string, ...string[]])[0];\n}\n\n/**\n * Takes a URL object and returns a sanitized string which is safe to use as span name\n * see: https://develop.sentry.dev/sdk/data-handling/#structuring-data\n */\nexport function getSanitizedUrlString(url: PartialURL): string {\n  const { protocol, host, path } = url;\n\n  const filteredHost =\n    host\n      // Always filter out authority\n      ?.replace(/^.*@/, '[filtered]:[filtered]@')\n      // Don't show standard :80 (http) and :443 (https) ports to reduce the noise\n      // TODO: Use new URL global if it exists\n      .replace(/(:80)$/, '')\n      .replace(/(:443)$/, '') || '';\n\n  return `${protocol ? `${protocol}://` : ''}${filteredHost}${path}`;\n}\n\n/**\n * Strips the content from a data URL, returning a placeholder with the MIME type.\n *\n * Data URLs can be very long (e.g. base64 encoded scripts for Web Workers),\n * with little valuable information, often leading to envelopes getting dropped due\n * to size limit violations. Therefore, we strip data URLs and replace them with a\n * placeholder.\n *\n * @param url - The URL to process\n * @param includeDataPrefix - If true, includes the first 10 characters of the data stream\n *                            for debugging (e.g., to identify magic bytes like WASM's AGFzbQ).\n *                            Defaults to true.\n * @returns For data URLs, returns a short format like `data:text/javascript;base64,SGVsbG8gV2... [truncated]`.\n *          For non-data URLs, returns the original URL unchanged.\n */\nexport function stripDataUrlContent(url: string, includeDataPrefix: boolean = true): string {\n  if (url.startsWith('data:')) {\n    // Match the MIME type (everything after 'data:' until the first ';' or ',')\n    const match = url.match(/^data:([^;,]+)/);\n    const mimeType = match ? match[1] : 'text/plain';\n    const isBase64 = url.includes(';base64,');\n\n    // Find where the actual data starts (after the comma)\n    const dataStart = url.indexOf(',');\n    let dataPrefix = '';\n    if (includeDataPrefix && dataStart !== -1) {\n      const data = url.slice(dataStart + 1);\n      // Include first 10 chars of data to help identify content (e.g., magic bytes)\n      dataPrefix = data.length > 10 ? `${data.slice(0, 10)}... [truncated]` : data;\n    }\n\n    return `data:${mimeType}${isBase64 ? ',base64' : ''}${dataPrefix ? `,${dataPrefix}` : ''}`;\n  }\n  return url;\n}\n","import type {\n  FetchBreadcrumbHint,\n  HandlerDataFetch,\n  SentryWrappedXMLHttpRequest,\n  XhrBreadcrumbHint,\n} from '@sentry/core';\nimport { GLOBAL_OBJ } from '@sentry/core';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ &\n  // document is not available in all browser environments (webworkers). We make it optional so you have to explicitly check for it\n  Omit<Window, 'document'> &\n  Partial<Pick<Window, 'document'>>;\n\nexport type NetworkMetaWarning =\n  | 'MAYBE_JSON_TRUNCATED'\n  | 'TEXT_TRUNCATED'\n  | 'URL_SKIPPED'\n  | 'BODY_PARSE_ERROR'\n  | 'BODY_PARSE_TIMEOUT'\n  | 'UNPARSEABLE_BODY_TYPE';\n\ntype RequestBody = null | Blob | BufferSource | FormData | URLSearchParams | string;\n\nexport type XhrHint = XhrBreadcrumbHint & {\n  xhr: XMLHttpRequest & SentryWrappedXMLHttpRequest;\n  input?: RequestBody;\n};\nexport type FetchHint = FetchBreadcrumbHint & {\n  input: HandlerDataFetch['args'];\n  response: Response;\n};\n","import type { HandlerDataDom } from '@sentry/core';\nimport { addHandler, addNonEnumerableProperty, fill, maybeInstrument, triggerHandlers, uuid4 } from '@sentry/core';\nimport { WINDOW } from '../types';\n\ntype SentryWrappedTarget = HTMLElement & { _sentryId?: string };\n\ntype AddEventListener = (\n  type: string,\n  listener: EventListenerOrEventListenerObject,\n  options?: boolean | AddEventListenerOptions,\n) => void;\ntype RemoveEventListener = (\n  type: string,\n  listener: EventListenerOrEventListenerObject,\n  options?: boolean | EventListenerOptions,\n) => void;\n\ntype InstrumentedElement = Element & {\n  __sentry_instrumentation_handlers__?: {\n    [key in 'click' | 'keypress']?: {\n      handler?: unknown;\n      /** The number of custom listeners attached to this element */\n      refCount: number;\n    };\n  };\n};\n\nconst DEBOUNCE_DURATION = 1000;\n\nlet debounceTimerID: number | undefined;\nlet lastCapturedEventType: string | undefined;\nlet lastCapturedEventTargetId: string | undefined;\n\n/**\n * Add an instrumentation handler for when a click or a keypress happens.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addClickKeypressInstrumentationHandler(handler: (data: HandlerDataDom) => void): void {\n  const type = 'dom';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentDOM);\n}\n\n/** Exported for tests only. */\nexport function instrumentDOM(): void {\n  if (!WINDOW.document) {\n    return;\n  }\n\n  // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n  // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n  // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n  const triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n  const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n  WINDOW.document.addEventListener('click', globalDOMEventHandler, false);\n  WINDOW.document.addEventListener('keypress', globalDOMEventHandler, false);\n\n  // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n  // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n  // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n  // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n  // guaranteed to fire at least once.)\n  ['EventTarget', 'Node'].forEach((target: string) => {\n    const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n    const proto = globalObject[target]?.prototype;\n\n    // eslint-disable-next-line no-prototype-builtins\n    if (!proto?.hasOwnProperty?.('addEventListener')) {\n      return;\n    }\n\n    fill(proto, 'addEventListener', function (originalAddEventListener: AddEventListener): AddEventListener {\n      return function (this: InstrumentedElement, type, listener, options): AddEventListener {\n        if (type === 'click' || type == 'keypress') {\n          try {\n            const handlers = (this.__sentry_instrumentation_handlers__ =\n              this.__sentry_instrumentation_handlers__ || {});\n            const handlerForType = (handlers[type] = handlers[type] || { refCount: 0 });\n\n            if (!handlerForType.handler) {\n              const handler = makeDOMEventHandler(triggerDOMHandler);\n              handlerForType.handler = handler;\n              originalAddEventListener.call(this, type, handler, options);\n            }\n\n            handlerForType.refCount++;\n          } catch {\n            // Accessing dom properties is always fragile.\n            // Also allows us to skip `addEventListeners` calls with no proper `this` context.\n          }\n        }\n\n        return originalAddEventListener.call(this, type, listener, options);\n      };\n    });\n\n    fill(\n      proto,\n      'removeEventListener',\n      function (originalRemoveEventListener: RemoveEventListener): RemoveEventListener {\n        return function (this: InstrumentedElement, type, listener, options): () => void {\n          if (type === 'click' || type == 'keypress') {\n            try {\n              const handlers = this.__sentry_instrumentation_handlers__ || {};\n              const handlerForType = handlers[type];\n\n              if (handlerForType) {\n                handlerForType.refCount--;\n                // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n                if (handlerForType.refCount <= 0) {\n                  originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n                  handlerForType.handler = undefined;\n                  delete handlers[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n                }\n\n                // If there are no longer any custom handlers of any type on this element, cleanup everything.\n                if (Object.keys(handlers).length === 0) {\n                  delete this.__sentry_instrumentation_handlers__;\n                }\n              }\n            } catch {\n              // Accessing dom properties is always fragile.\n              // Also allows us to skip `addEventListeners` calls with no proper `this` context.\n            }\n          }\n\n          return originalRemoveEventListener.call(this, type, listener, options);\n        };\n      },\n    );\n  });\n}\n\n/**\n * Check whether the event is similar to the last captured one. For example, two click events on the same button.\n */\nfunction isSimilarToLastCapturedEvent(event: Event): boolean {\n  // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n  if (event.type !== lastCapturedEventType) {\n    return false;\n  }\n\n  try {\n    // If both events have the same type, it's still possible that actions were performed on different targets.\n    // e.g. 2 clicks on different buttons.\n    if (!event.target || (event.target as SentryWrappedTarget)._sentryId !== lastCapturedEventTargetId) {\n      return false;\n    }\n  } catch {\n    // just accessing `target` property can throw an exception in some rare circumstances\n    // see: https://github.com/getsentry/sentry-javascript/issues/838\n  }\n\n  // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n  // to which an event listener was attached), we treat them as the same action, as we want to capture\n  // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n  return true;\n}\n\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(eventType: string, target: SentryWrappedTarget | null): boolean {\n  // We are only interested in filtering `keypress` events for now.\n  if (eventType !== 'keypress') {\n    return false;\n  }\n\n  if (!target?.tagName) {\n    return true;\n  }\n\n  // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n  // e.g.tabbing through elements, hotkeys, etc.\n  if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n */\nfunction makeDOMEventHandler(\n  handler: (data: HandlerDataDom) => void,\n  globalListener: boolean = false,\n): (event: Event) => void {\n  return (event: Event & { _sentryCaptured?: true }): void => {\n    // It's possible this handler might trigger multiple times for the same\n    // event (e.g. event propagation through node ancestors).\n    // Ignore if we've already captured that event.\n    if (!event || event['_sentryCaptured']) {\n      return;\n    }\n\n    const target = getEventTarget(event);\n\n    // We always want to skip _some_ events.\n    if (shouldSkipDOMEvent(event.type, target)) {\n      return;\n    }\n\n    // Mark event as \"seen\"\n    addNonEnumerableProperty(event, '_sentryCaptured', true);\n\n    if (target && !target._sentryId) {\n      // Add UUID to event target so we can identify if\n      addNonEnumerableProperty(target, '_sentryId', uuid4());\n    }\n\n    const name = event.type === 'keypress' ? 'input' : event.type;\n\n    // If there is no last captured event, it means that we can safely capture the new event and store it for future comparisons.\n    // If there is a last captured event, see if the new event is different enough to treat it as a unique one.\n    // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n    if (!isSimilarToLastCapturedEvent(event)) {\n      const handlerData: HandlerDataDom = { event, name, global: globalListener };\n      handler(handlerData);\n      lastCapturedEventType = event.type;\n      lastCapturedEventTargetId = target ? target._sentryId : undefined;\n    }\n\n    // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n    clearTimeout(debounceTimerID);\n    debounceTimerID = WINDOW.setTimeout(() => {\n      lastCapturedEventTargetId = undefined;\n      lastCapturedEventType = undefined;\n    }, DEBOUNCE_DURATION);\n  };\n}\n\nfunction getEventTarget(event: Event): SentryWrappedTarget | null {\n  try {\n    return event.target as SentryWrappedTarget | null;\n  } catch {\n    // just accessing `target` property can throw an exception in some rare circumstances\n    // see: https://github.com/getsentry/sentry-javascript/issues/838\n    return null;\n  }\n}\n","import type { HandlerDataXhr, SentryWrappedXMLHttpRequest } from '@sentry/core';\nimport { addHandler, isString, maybeInstrument, timestampInSeconds, triggerHandlers } from '@sentry/core';\nimport { WINDOW } from '../types';\n\nexport const SENTRY_XHR_DATA_KEY = '__sentry_xhr_v3__';\n\ntype WindowWithXhr = Window & { XMLHttpRequest?: typeof XMLHttpRequest };\n\n/**\n * Add an instrumentation handler for when an XHR request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addXhrInstrumentationHandler(handler: (data: HandlerDataXhr) => void): void {\n  const type = 'xhr';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentXHR);\n}\n\n/** Exported only for tests. */\nexport function instrumentXHR(): void {\n  if (!(WINDOW as WindowWithXhr).XMLHttpRequest) {\n    return;\n  }\n\n  const xhrproto = XMLHttpRequest.prototype;\n\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  xhrproto.open = new Proxy(xhrproto.open, {\n    apply(\n      originalOpen,\n      xhrOpenThisArg: XMLHttpRequest & SentryWrappedXMLHttpRequest,\n      xhrOpenArgArray:\n        | [method: string, url: string | URL]\n        | [method: string, url: string | URL, async: boolean, username?: string | null, password?: string | null],\n    ) {\n      // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n      //       it means the error, that was caused by your XHR call did not\n      //       have a stack trace. If you are using HttpClient integration,\n      //       this is the expected behavior, as we are using this virtual error to capture\n      //       the location of your XHR call, and group your HttpClient events accordingly.\n      const virtualError = new Error();\n\n      const startTimestamp = timestampInSeconds() * 1000;\n\n      // open() should always be called with two or more arguments\n      // But to be on the safe side, we actually validate this and bail out if we don't have a method & url\n      const method = isString(xhrOpenArgArray[0]) ? xhrOpenArgArray[0].toUpperCase() : undefined;\n      const url = parseXhrUrlArg(xhrOpenArgArray[1]);\n\n      if (!method || !url) {\n        return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);\n      }\n\n      xhrOpenThisArg[SENTRY_XHR_DATA_KEY] = {\n        method,\n        url,\n        request_headers: {},\n      };\n\n      // if Sentry key appears in URL, don't capture it as a request\n      if (method === 'POST' && url.match(/sentry_key/)) {\n        xhrOpenThisArg.__sentry_own_request__ = true;\n      }\n\n      const onreadystatechangeHandler: () => void = () => {\n        // For whatever reason, this is not the same instance here as from the outer method\n        const xhrInfo = xhrOpenThisArg[SENTRY_XHR_DATA_KEY];\n\n        if (!xhrInfo) {\n          return;\n        }\n\n        if (xhrOpenThisArg.readyState === 4) {\n          try {\n            // touching statusCode in some platforms throws\n            // an exception\n            xhrInfo.status_code = xhrOpenThisArg.status;\n          } catch {\n            /* do nothing */\n          }\n\n          const handlerData: HandlerDataXhr = {\n            endTimestamp: timestampInSeconds() * 1000,\n            startTimestamp,\n            xhr: xhrOpenThisArg,\n            virtualError,\n          };\n          triggerHandlers('xhr', handlerData);\n        }\n      };\n\n      if ('onreadystatechange' in xhrOpenThisArg && typeof xhrOpenThisArg.onreadystatechange === 'function') {\n        xhrOpenThisArg.onreadystatechange = new Proxy(xhrOpenThisArg.onreadystatechange, {\n          apply(originalOnreadystatechange, onreadystatechangeThisArg, onreadystatechangeArgArray: unknown[]) {\n            onreadystatechangeHandler();\n            return originalOnreadystatechange.apply(onreadystatechangeThisArg, onreadystatechangeArgArray);\n          },\n        });\n      } else {\n        xhrOpenThisArg.addEventListener('readystatechange', onreadystatechangeHandler);\n      }\n\n      // Intercepting `setRequestHeader` to access the request headers of XHR instance.\n      // This will only work for user/library defined headers, not for the default/browser-assigned headers.\n      // Request cookies are also unavailable for XHR, as `Cookie` header can't be defined by `setRequestHeader`.\n      xhrOpenThisArg.setRequestHeader = new Proxy(xhrOpenThisArg.setRequestHeader, {\n        apply(\n          originalSetRequestHeader,\n          setRequestHeaderThisArg: SentryWrappedXMLHttpRequest,\n          setRequestHeaderArgArray: unknown[],\n        ) {\n          const [header, value] = setRequestHeaderArgArray;\n\n          const xhrInfo = setRequestHeaderThisArg[SENTRY_XHR_DATA_KEY];\n\n          if (xhrInfo && isString(header) && isString(value)) {\n            xhrInfo.request_headers[header.toLowerCase()] = value;\n          }\n\n          return originalSetRequestHeader.apply(setRequestHeaderThisArg, setRequestHeaderArgArray);\n        },\n      });\n\n      return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);\n    },\n  });\n\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  xhrproto.send = new Proxy(xhrproto.send, {\n    apply(originalSend, sendThisArg: XMLHttpRequest & SentryWrappedXMLHttpRequest, sendArgArray: unknown[]) {\n      const sentryXhrData = sendThisArg[SENTRY_XHR_DATA_KEY];\n\n      if (!sentryXhrData) {\n        return originalSend.apply(sendThisArg, sendArgArray);\n      }\n\n      if (sendArgArray[0] !== undefined) {\n        sentryXhrData.body = sendArgArray[0];\n      }\n\n      const handlerData: HandlerDataXhr = {\n        startTimestamp: timestampInSeconds() * 1000,\n        xhr: sendThisArg,\n      };\n      triggerHandlers('xhr', handlerData);\n\n      return originalSend.apply(sendThisArg, sendArgArray);\n    },\n  });\n}\n\n/**\n * Parses the URL argument of a XHR method to a string.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/open#url\n * url: A string or any other object with a stringifier — including a URL object — that provides the URL of the resource to send the request to.\n *\n * @param url - The URL argument of an XHR method\n * @returns The parsed URL string or undefined if the URL is invalid\n */\nfunction parseXhrUrlArg(url: unknown): string | undefined {\n  if (isString(url)) {\n    return url;\n  }\n\n  try {\n    // If the passed in argument is not a string, it should have a `toString` method as a stringifier.\n    // If that fails, we just return undefined (like in IE11 where URL is not available)\n    return (url as URL).toString();\n  } catch {} // eslint-disable-line no-empty\n\n  return undefined;\n}\n","import type { HandlerDataHistory } from '@sentry/core';\nimport { addHandler, fill, maybeInstrument, supportsHistory, triggerHandlers } from '@sentry/core';\nimport { WINDOW } from '../types';\n\nlet lastHref: string | undefined;\n\n/**\n * Add an instrumentation handler for when a fetch request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addHistoryInstrumentationHandler(handler: (data: HandlerDataHistory) => void): void {\n  const type = 'history';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentHistory);\n}\n\n/**\n * Exported just for testing\n */\nexport function instrumentHistory(): void {\n  // The `popstate` event may also be triggered on `pushState`, but it may not always reliably be emitted by the browser\n  // Which is why we also monkey-patch methods below, in addition to this\n  WINDOW.addEventListener('popstate', () => {\n    const to = WINDOW.location.href;\n    // keep track of the current URL state, as we always receive only the updated state\n    const from = lastHref;\n    lastHref = to;\n\n    if (from === to) {\n      return;\n    }\n\n    const handlerData = { from, to } satisfies HandlerDataHistory;\n    triggerHandlers('history', handlerData);\n  });\n\n  // Just guard against this not being available, in weird environments\n  if (!supportsHistory()) {\n    return;\n  }\n\n  function historyReplacementFunction(originalHistoryFunction: () => void): () => void {\n    return function (this: History, ...args: unknown[]): void {\n      const url = args.length > 2 ? args[2] : undefined;\n      if (url) {\n        const from = lastHref;\n\n        // Ensure the URL is absolute\n        // this can be either a path, then it is relative to the current origin\n        // or a full URL of the current origin - other origins are not allowed\n        // See: https://developer.mozilla.org/en-US/docs/Web/API/History/pushState#url\n        // coerce to string (this is what pushState does)\n        const to = getAbsoluteUrl(String(url));\n\n        // keep track of the current URL state, as we always receive only the updated state\n        lastHref = to;\n\n        if (from === to) {\n          return originalHistoryFunction.apply(this, args);\n        }\n\n        const handlerData = { from, to } satisfies HandlerDataHistory;\n        triggerHandlers('history', handlerData);\n      }\n      return originalHistoryFunction.apply(this, args);\n    };\n  }\n\n  fill(WINDOW.history, 'pushState', historyReplacementFunction);\n  fill(WINDOW.history, 'replaceState', historyReplacementFunction);\n}\n\nfunction getAbsoluteUrl(urlOrPath: string): string {\n  try {\n    const url = new URL(urlOrPath, WINDOW.location.origin);\n    return url.toString();\n  } catch {\n    // fallback, just do nothing\n    return urlOrPath;\n  }\n}\n","import { isString } from '@sentry/core';\n\nconst DEFAULT_MAX_STRING_LENGTH = 80;\n\ntype SimpleNode = {\n  parentNode: SimpleNode;\n} | null;\n\n// Native DOM accessors cached at module load. Calling these instead of reading\n// instance properties bypasses user-defined getters that shadow the prototypes.\n// Stored unbound and rebound via .call(el) — the unbound-method lint is expected.\n// See https://github.com/getsentry/sentry-javascript/issues/21353\ntype AccessorKey = 'parentNode' | 'tagName' | 'id' | 'className' | 'getAttribute' | 'dataset';\nconst accessors: Partial<Record<AccessorKey, Function>> = {};\n\n// oxlint-disable typescript-eslint(unbound-method)\ntry {\n  if (typeof Node !== 'undefined') {\n    accessors.parentNode = Object.getOwnPropertyDescriptor(Node.prototype, 'parentNode')!.get!;\n  }\n  if (typeof Element !== 'undefined') {\n    accessors.tagName = Object.getOwnPropertyDescriptor(Element.prototype, 'tagName')!.get!;\n    accessors.id = Object.getOwnPropertyDescriptor(Element.prototype, 'id')!.get!;\n    accessors.className = Object.getOwnPropertyDescriptor(Element.prototype, 'className')!.get!;\n    accessors.getAttribute = Element.prototype.getAttribute;\n  }\n  if (typeof HTMLElement !== 'undefined') {\n    accessors.dataset = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'dataset')!.get!;\n  }\n} catch {\n  // Polyfilled or stubbed prototypes may not have the expected descriptors.\n  // _safeRead falls back to direct property access.\n}\n// oxlint-enable typescript-eslint(unbound-method)\n\nfunction _safeRead<T>(el: unknown, prop: AccessorKey, arg?: string): T {\n  const fn = accessors[prop];\n  if (fn) {\n    try {\n      return fn.call(el, arg) as T;\n    } catch {\n      // Fall through to direct access\n    }\n  }\n  const val = (el as Record<string, unknown>)[prop];\n  return typeof val === 'function' ? val.call(el, arg) : (val as T);\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nexport function htmlTreeAsString(\n  elem: unknown,\n  options: string[] | { keyAttrs?: string[]; maxStringLength?: number } = {},\n): string {\n  if (!elem) {\n    return '<unknown>';\n  }\n\n  // try/catch both:\n  // - accessing event.target (see getsentry/raven-js#838, #768)\n  // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n  // - can throw an exception in some circumstances.\n  try {\n    let currentElem = elem as SimpleNode;\n    const MAX_TRAVERSE_HEIGHT = 5;\n    const out = [];\n    let height = 0;\n    let len = 0;\n    const separator = ' > ';\n    const sepLength = separator.length;\n    let nextStr;\n    const keyAttrs = Array.isArray(options) ? options : options.keyAttrs;\n    const maxStringLength = (!Array.isArray(options) && options.maxStringLength) || DEFAULT_MAX_STRING_LENGTH;\n\n    while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n      nextStr = _htmlElementAsString(currentElem, keyAttrs);\n      // bail out if\n      // - nextStr is the 'html' element\n      // - the length of the string that would be created exceeds maxStringLength\n      //   (ignore this limit if we are on the first iteration)\n      if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= maxStringLength)) {\n        break;\n      }\n\n      out.push(nextStr);\n\n      len += nextStr.length;\n      currentElem = _safeRead<SimpleNode>(currentElem, 'parentNode');\n    }\n\n    return out.reverse().join(separator);\n  } catch {\n    return '<unknown>';\n  }\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el: unknown, keyAttrs?: string[]): string {\n  const out = [];\n\n  const tagName = _safeRead<string | undefined>(el, 'tagName');\n  if (!tagName) {\n    return '';\n  }\n\n  if (typeof HTMLElement !== 'undefined') {\n    // If using the component name annotation plugin, this value may be available on the DOM node\n    if (el instanceof HTMLElement) {\n      const dataset = _safeRead<DOMStringMap | undefined>(el, 'dataset');\n      if (dataset) {\n        if (dataset['sentryComponent']) {\n          return dataset['sentryComponent'];\n        }\n        if (dataset['sentryElement']) {\n          return dataset['sentryElement'];\n        }\n      }\n    }\n  }\n\n  out.push(tagName.toLowerCase());\n\n  // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n  const keyAttrPairs = keyAttrs?.length\n    ? keyAttrs\n        .filter(keyAttr => _safeRead<string | null>(el, 'getAttribute', keyAttr))\n        .map(keyAttr => [keyAttr, _safeRead<string | null>(el, 'getAttribute', keyAttr)])\n    : null;\n\n  if (keyAttrPairs?.length) {\n    keyAttrPairs.forEach(keyAttrPair => {\n      out.push(`[${keyAttrPair[0]}=\"${keyAttrPair[1]}\"]`);\n    });\n  } else {\n    const id = _safeRead<string | undefined>(el, 'id');\n    if (id) {\n      out.push(`#${id}`);\n    }\n\n    const className = _safeRead<string | undefined>(el, 'className');\n    if (className && isString(className)) {\n      const classes = className.split(/\\s+/);\n      for (const c of classes) {\n        out.push(`.${c}`);\n      }\n    }\n  }\n  for (const k of ['aria-label', 'type', 'name', 'title', 'alt']) {\n    const attr = _safeRead<string | null>(el, 'getAttribute', k);\n    if (attr) {\n      out.push(`[${k}=\"${attr}\"]`);\n    }\n  }\n\n  return out.join('');\n}\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","import type { Mechanism, WrappedFunction } from '@sentry/core/browser';\nimport {\n  addExceptionMechanism,\n  addExceptionTypeValue,\n  addNonEnumerableProperty,\n  captureException,\n  getLocationHref,\n  getOriginalFunction,\n  GLOBAL_OBJ,\n  markFunctionWrapped,\n  withScope,\n} from '@sentry/core/browser';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nlet ignoreOnError: number = 0;\n\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError(): boolean {\n  return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nexport function ignoreNextOnError(): void {\n  // onerror should trigger before setTimeout\n  ignoreOnError++;\n  setTimeout(() => {\n    ignoreOnError--;\n  });\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype WrappableFunction = Function;\n\nexport function wrap<T extends WrappableFunction>(\n  fn: T,\n  options?: {\n    mechanism?: Mechanism;\n  },\n): WrappedFunction<T>;\nexport function wrap<NonFunction>(\n  fn: NonFunction,\n  options?: {\n    mechanism?: Mechanism;\n  },\n): NonFunction;\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap<T extends WrappableFunction, NonFunction>(\n  fn: T | NonFunction,\n  options: {\n    mechanism?: Mechanism;\n  } = {},\n): NonFunction | WrappedFunction<T> {\n  // for future readers what this does is wrap a function and then create\n  // a bi-directional wrapping between them.\n  //\n  // example: wrapped = wrap(original);\n  //  original.__sentry_wrapped__ -> wrapped\n  //  wrapped.__sentry_original__ -> original\n\n  function isFunction(fn: T | NonFunction): fn is T {\n    return typeof fn === 'function';\n  }\n\n  if (!isFunction(fn)) {\n    return fn;\n  }\n\n  try {\n    // If we're dealing with a function that was previously wrapped, return the original wrapper.\n    // Check via hasOwnProperty so a `__sentry_wrapped__` inherited from a wrapped `Function.prototype`\n    // is not mistaken for a real wrapper.\n    const hasOwnWrapper = Object.prototype.hasOwnProperty.call(fn, '__sentry_wrapped__');\n    if (hasOwnWrapper) {\n      const wrapper = (fn as WrappedFunction<T>).__sentry_wrapped__;\n      if (typeof wrapper === 'function') {\n        return wrapper;\n      } else {\n        // If we find that the `__sentry_wrapped__` function is not a function at the time of accessing it, it means\n        // that something messed with it. In that case we want to return the originally passed function.\n        return fn;\n      }\n    }\n\n    // We don't wanna wrap it twice\n    if (getOriginalFunction(fn)) {\n      return fn;\n    }\n  } catch {\n    // Just accessing custom props in some Selenium environments\n    // can cause a \"Permission denied\" exception (see raven-js#495).\n    // Bail on wrapping and return the function as-is (defers to window.onerror).\n    return fn;\n  }\n\n  // Wrap the function itself\n  // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n  const sentryWrapped = function (this: unknown, ...args: unknown[]): unknown {\n    // Track depth on GLOBAL_OBJ so the thirdPartyErrorFilterIntegration (in @sentry/core) can detect\n    // that processEvent is running inside a sentryWrapped call, even with minified/bundled code.\n    GLOBAL_OBJ._sentryWrappedDepth = (GLOBAL_OBJ._sentryWrappedDepth || 0) + 1;\n    try {\n      // Also wrap arguments that are themselves functions\n      const wrappedArguments = args.map(arg => wrap(arg, options));\n\n      // Attempt to invoke user-land function\n      // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n      //       means the sentry.javascript SDK caught an error invoking your application code. This\n      //       is expected behavior and NOT indicative of a bug with sentry.javascript.\n      return fn.apply(this, wrappedArguments);\n    } catch (ex) {\n      ignoreNextOnError();\n\n      withScope(scope => {\n        scope.addEventProcessor(event => {\n          if (options.mechanism) {\n            addExceptionTypeValue(event, undefined, undefined);\n            addExceptionMechanism(event, options.mechanism);\n          }\n\n          event.extra = {\n            ...event.extra,\n            arguments: args,\n          };\n\n          return event;\n        });\n\n        // no need to add a mechanism here, we already add it via an event processor above\n        captureException(ex);\n      });\n\n      throw ex;\n    } finally {\n      GLOBAL_OBJ._sentryWrappedDepth = (GLOBAL_OBJ._sentryWrappedDepth || 0) - 1;\n    }\n  } as unknown as WrappedFunction<T>;\n\n  // Wrap the wrapped function in a proxy, to ensure any other properties of the original function remain available\n  try {\n    for (const property in fn) {\n      if (Object.prototype.hasOwnProperty.call(fn, property)) {\n        sentryWrapped[property as keyof T] = fn[property as keyof T];\n      }\n    }\n  } catch {\n    // Accessing some objects may throw\n    // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n  }\n\n  // Signal that this function has been wrapped/filled already\n  // for both debugging and to prevent it to being wrapped/filled twice\n  markFunctionWrapped(sentryWrapped, fn);\n\n  addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n\n  // Restore original function name (not all browsers allow that)\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name')!;\n    if (descriptor.configurable) {\n      Object.defineProperty(sentryWrapped, 'name', {\n        get(): string {\n          return fn.name;\n        },\n      });\n    }\n  } catch {\n    // This may throw if e.g. the descriptor does not exist, or a browser does not allow redefining `name`.\n    // to save some bytes we simply try-catch this\n  }\n\n  return sentryWrapped;\n}\n\n/**\n * Get HTTP request data from the current page.\n */\nexport function getHttpRequestData(): { url: string; headers: Record<string, string> } {\n  // grab as much info as exists and add it to the event\n  const url = getLocationHref();\n  const { referrer } = WINDOW.document || {};\n  const { userAgent } = WINDOW.navigator || {};\n\n  const headers = {\n    ...(referrer && { Referer: referrer }),\n    ...(userAgent && { 'User-Agent': userAgent }),\n  };\n  const request = {\n    url,\n    headers,\n  };\n\n  return request;\n}\n","/* eslint-disable max-lines */\n\nimport type {\n  Breadcrumb,\n  Client,\n  Event as SentryEvent,\n  FetchBreadcrumbData,\n  FetchBreadcrumbHint,\n  HandlerDataConsole,\n  HandlerDataDom,\n  HandlerDataFetch,\n  HandlerDataHistory,\n  HandlerDataXhr,\n  IntegrationFn,\n  XhrBreadcrumbData,\n  XhrBreadcrumbHint,\n} from '@sentry/core/browser';\nimport {\n  addBreadcrumb,\n  addConsoleInstrumentationHandler,\n  addFetchInstrumentationHandler,\n  debug,\n  defineIntegration,\n  getBreadcrumbLogLevelFromHttpStatusCode,\n  getClient,\n  getComponentName,\n  getEventDescription,\n  parseUrl,\n  safeJoin,\n  severityLevelFromString,\n} from '@sentry/core/browser';\nimport type { FetchHint, XhrHint } from '@sentry/browser-utils';\nimport {\n  addClickKeypressInstrumentationHandler,\n  addHistoryInstrumentationHandler,\n  addXhrInstrumentationHandler,\n  htmlTreeAsString,\n  SENTRY_XHR_DATA_KEY,\n} from '@sentry/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\ninterface BreadcrumbsOptions {\n  console: boolean;\n  dom:\n    | boolean\n    | {\n        serializeAttribute?: string | string[];\n        maxStringLength?: number;\n      };\n  fetch: boolean;\n  history: boolean;\n  sentry: boolean;\n  xhr: boolean;\n}\n\n/** maxStringLength gets capped to prevent 100 breadcrumbs exceeding 1MB event payload size */\nconst MAX_ALLOWED_STRING_LENGTH = 1024;\n\nconst INTEGRATION_NAME = 'Breadcrumbs' as const;\n\nconst _breadcrumbsIntegration = ((options: Partial<BreadcrumbsOptions> = {}) => {\n  const _options = {\n    console: true,\n    dom: true,\n    fetch: true,\n    history: true,\n    sentry: true,\n    xhr: true,\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    setup(client) {\n      // TODO(v11): Remove this functionality and use `consoleIntegration` from @sentry/core instead.\n      if (_options.console) {\n        addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client));\n      }\n      if (_options.dom) {\n        addClickKeypressInstrumentationHandler(_getDomBreadcrumbHandler(client, _options.dom));\n      }\n      if (_options.xhr) {\n        addXhrInstrumentationHandler(_getXhrBreadcrumbHandler(client));\n      }\n      if (_options.fetch) {\n        addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client));\n      }\n      if (_options.history) {\n        addHistoryInstrumentationHandler(_getHistoryBreadcrumbHandler(client));\n      }\n      if (_options.sentry) {\n        client.on('beforeSendEvent', _getSentryBreadcrumbHandler(client));\n      }\n    },\n  };\n}) satisfies IntegrationFn;\n\nexport const breadcrumbsIntegration = defineIntegration(_breadcrumbsIntegration);\n\n/**\n * Adds a breadcrumb for Sentry events or transactions if this option is enabled.\n */\nfunction _getSentryBreadcrumbHandler(client: Client): (event: SentryEvent) => void {\n  return function addSentryBreadcrumb(event: SentryEvent): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    addBreadcrumb(\n      {\n        category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n        event_id: event.event_id,\n        level: event.level,\n        message: getEventDescription(event),\n      },\n      {\n        event,\n      },\n    );\n  };\n}\n\n/**\n * A HOC that creates a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\nfunction _getDomBreadcrumbHandler(\n  client: Client,\n  dom: BreadcrumbsOptions['dom'],\n): (handlerData: HandlerDataDom) => void {\n  return function _innerDomBreadcrumb(handlerData: HandlerDataDom): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    let target;\n    let componentName;\n    let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n\n    let maxStringLength =\n      typeof dom === 'object' && typeof dom.maxStringLength === 'number' ? dom.maxStringLength : undefined;\n    if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) {\n      DEBUG_BUILD &&\n        debug.warn(\n          `\\`dom.maxStringLength\\` cannot exceed ${MAX_ALLOWED_STRING_LENGTH}, but a value of ${maxStringLength} was configured. Sentry will use ${MAX_ALLOWED_STRING_LENGTH} instead.`,\n        );\n      maxStringLength = MAX_ALLOWED_STRING_LENGTH;\n    }\n\n    if (typeof keyAttrs === 'string') {\n      keyAttrs = [keyAttrs];\n    }\n\n    // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n    try {\n      const event = handlerData.event as Event | Node;\n      const element = _isEvent(event) ? event.target : event;\n\n      target = htmlTreeAsString(element, { keyAttrs, maxStringLength });\n      componentName = getComponentName(element);\n    } catch {\n      target = '<unknown>';\n    }\n\n    if (target.length === 0) {\n      return;\n    }\n\n    const breadcrumb: Breadcrumb = {\n      category: `ui.${handlerData.name}`,\n      message: target,\n    };\n\n    if (componentName) {\n      breadcrumb.data = { 'ui.component_name': componentName };\n    }\n\n    addBreadcrumb(breadcrumb, {\n      event: handlerData.event,\n      name: handlerData.name,\n      global: handlerData.global,\n    });\n  };\n}\n\n/**\n * Creates breadcrumbs from console API calls\n */\nfunction _getConsoleBreadcrumbHandler(client: Client): (handlerData: HandlerDataConsole) => void {\n  return function _consoleBreadcrumb(handlerData: HandlerDataConsole): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const breadcrumb = {\n      category: 'console',\n      data: {\n        arguments: handlerData.args,\n        logger: 'console',\n      },\n      level: severityLevelFromString(handlerData.level),\n      message: safeJoin(handlerData.args, ' '),\n    };\n\n    if (handlerData.level === 'assert') {\n      if (handlerData.args[0] === false) {\n        breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n        breadcrumb.data.arguments = handlerData.args.slice(1);\n      } else {\n        // Don't capture a breadcrumb for passed assertions\n        return;\n      }\n    }\n\n    addBreadcrumb(breadcrumb, {\n      input: handlerData.args,\n      level: handlerData.level,\n    });\n  };\n}\n\n/**\n * Creates breadcrumbs from XHR API calls\n */\nfunction _getXhrBreadcrumbHandler(client: Client): (handlerData: HandlerDataXhr) => void {\n  return function _xhrBreadcrumb(handlerData: HandlerDataXhr): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const { startTimestamp, endTimestamp } = handlerData;\n\n    const sentryXhrData = handlerData.xhr[SENTRY_XHR_DATA_KEY];\n\n    // We only capture complete, non-sentry requests\n    if (!startTimestamp || !endTimestamp || !sentryXhrData) {\n      return;\n    }\n\n    const { method, url, status_code, body } = sentryXhrData;\n\n    const data: XhrBreadcrumbData = {\n      method,\n      url,\n      status_code,\n    };\n\n    const hint: XhrBreadcrumbHint = {\n      xhr: handlerData.xhr,\n      input: body,\n      startTimestamp,\n      endTimestamp,\n    };\n\n    const breadcrumb = {\n      category: 'xhr',\n      data,\n      type: 'http',\n      level: getBreadcrumbLogLevelFromHttpStatusCode(status_code),\n    };\n\n    client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as XhrHint);\n\n    addBreadcrumb(breadcrumb, hint);\n  };\n}\n\n/**\n * Creates breadcrumbs from fetch API calls\n */\nfunction _getFetchBreadcrumbHandler(client: Client): (handlerData: HandlerDataFetch) => void {\n  return function _fetchBreadcrumb(handlerData: HandlerDataFetch): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const { startTimestamp, endTimestamp } = handlerData;\n\n    // We only capture complete fetch requests\n    if (!endTimestamp) {\n      return;\n    }\n\n    if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n      // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n      return;\n    }\n\n    if (handlerData.error) {\n      const hint: FetchBreadcrumbHint = {\n        data: handlerData.error,\n        input: handlerData.args,\n        startTimestamp,\n        endTimestamp,\n      };\n\n      const breadcrumb = {\n        category: 'fetch',\n        data: handlerData.fetchData,\n        level: 'error',\n        type: 'http',\n      } satisfies Breadcrumb;\n\n      client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as FetchHint);\n\n      addBreadcrumb(breadcrumb, hint);\n    } else {\n      const response = handlerData.response as Response | undefined;\n      const data: FetchBreadcrumbData = {\n        ...handlerData.fetchData,\n        status_code: response?.status,\n      };\n\n      const hint: FetchBreadcrumbHint = {\n        input: handlerData.args,\n        response,\n        startTimestamp,\n        endTimestamp,\n      };\n\n      const breadcrumb = {\n        category: 'fetch',\n        data,\n        type: 'http',\n        level: getBreadcrumbLogLevelFromHttpStatusCode(data.status_code),\n      };\n\n      client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as FetchHint);\n\n      addBreadcrumb(breadcrumb, hint);\n    }\n  };\n}\n\n/**\n * Creates breadcrumbs from history API calls\n */\nfunction _getHistoryBreadcrumbHandler(client: Client): (handlerData: HandlerDataHistory) => void {\n  return function _historyBreadcrumb(handlerData: HandlerDataHistory): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    let from: string | undefined = handlerData.from;\n    let to: string | undefined = handlerData.to;\n    const parsedLoc = parseUrl(WINDOW.location.href);\n    let parsedFrom = from ? parseUrl(from) : undefined;\n    const parsedTo = parseUrl(to);\n\n    // Initial pushState doesn't provide `from` information\n    if (!parsedFrom?.path) {\n      parsedFrom = parsedLoc;\n    }\n\n    // Use only the path component of the URL if the URL matches the current\n    // document (almost all the time when using pushState)\n    if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n      to = parsedTo.relative;\n    }\n    if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n      from = parsedFrom.relative;\n    }\n\n    addBreadcrumb({\n      category: 'navigation',\n      data: {\n        from,\n        to,\n      },\n    });\n  };\n}\n\nfunction _isEvent(event: unknown): event is Event {\n  return !!event && !!(event as Record<string, unknown>).target;\n}\n","import type { RawAttributes } from '../../attributes';\nimport type { Client } from '../../client';\nimport type { ScopeData } from '../../scope';\nimport {\n  SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n  SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n  SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,\n  SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n  SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n  SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n  SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n  SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n  SEMANTIC_ATTRIBUTE_USER_EMAIL,\n  SEMANTIC_ATTRIBUTE_USER_ID,\n  SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n  SEMANTIC_ATTRIBUTE_USER_USERNAME,\n} from '../../semanticAttributes';\nimport type { SerializedStreamedSpan, Span, StreamedSpanJSON } from '../../types/span';\nimport { getCombinedScopeData } from '../../utils/scopeData';\nimport {\n  INTERNAL_getSegmentSpan,\n  showSpanDropWarning,\n  spanToStreamedSpanJSON,\n  streamedSpanJsonToSerializedSpan,\n} from '../../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from '../utils';\nimport { isStreamedBeforeSendSpanCallback } from './beforeSendSpan';\nimport { scopeContextsToSpanAttributes } from './scopeContextAttributes';\nimport { DEFAULT_ENVIRONMENT } from '../../constants';\n\nexport type SerializedStreamedSpanWithSegmentSpan = SerializedStreamedSpan & {\n  _segmentSpan: Span;\n};\n\n/**\n * Captures a span and returns a JSON representation to be enqueued for sending.\n *\n * IMPORTANT: This function converts the span to JSON immediately to avoid writing\n * to an already-ended OTel span instance (which is blocked by the OTel Span class).\n *\n * @returns the final serialized span with a reference to its segment span. This reference\n * is needed later on to compute the DSC for the span envelope.\n */\nexport function captureSpan(span: Span, client: Client): SerializedStreamedSpanWithSegmentSpan {\n  // Convert to JSON FIRST - we cannot write to an already-ended span\n  const spanJSON = spanToStreamedSpanJSON(span);\n\n  const segmentSpan = INTERNAL_getSegmentSpan(span);\n  const serializedSegmentSpan = spanToStreamedSpanJSON(segmentSpan);\n\n  const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n  const finalScopeData = getCombinedScopeData(spanIsolationScope, spanScope);\n\n  applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, finalScopeData);\n\n  // Access `kind` via duck-typing — OTel span objects have this property but it's not on Sentry's Span type.\n  // It is forwarded to `preprocessSpan` subscribers (e.g. the OpenTelemetry SDK backfills op/source/name from it).\n  const spanKind = (span as { kind?: number }).kind;\n\n  // Preprocess the span JSON before any other hooks run, so that `processSpan`/`processSegmentSpan`\n  // subscribers (incl. integrations) and `beforeSendSpan` see fully inferred span data.\n  client.emit('preprocessSpan', spanJSON, { spanKind });\n\n  if (spanJSON.is_segment) {\n    applyScopeToSegmentSpan(spanJSON, finalScopeData);\n    applySdkMetadataToSegmentSpan(spanJSON, client);\n    // Allow hook subscribers to mutate the segment span JSON\n    // This also invokes the `processSegmentSpan` hook of all integrations\n    client.emit('processSegmentSpan', spanJSON);\n  }\n\n  // This allows hook subscribers to mutate the span JSON\n  // This also invokes the `processSpan` hook of all integrations\n  client.emit('processSpan', spanJSON);\n\n  const { beforeSendSpan } = client.getOptions();\n  const processedSpan =\n    beforeSendSpan && isStreamedBeforeSendSpanCallback(beforeSendSpan)\n      ? applyBeforeSendSpanCallback(spanJSON, beforeSendSpan)\n      : spanJSON;\n\n  // Backfill sentry.span.source from sentry.source. Only `sentry.span.source` is respected by Sentry.\n  // TODO(v11): Remove this backfill once we renamed SEMANTIC_ATTRIBUTE_SENTRY_SOURCE to sentry.span.source\n  const spanNameSource = processedSpan.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n  if (spanNameSource) {\n    safeSetSpanJSONAttributes(processedSpan, {\n      // Purposefully not using a constant defined here like in other attributes:\n      // This will be the name for SEMANTIC_ATTRIBUTE_SENTRY_SOURCE in v11\n      'sentry.span.source': spanNameSource,\n    });\n  }\n\n  return {\n    ...streamedSpanJsonToSerializedSpan(processedSpan),\n    _segmentSpan: segmentSpan,\n  };\n}\n\nfunction applyScopeToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, scopeData: ScopeData): void {\n  const contextAttributes = scopeContextsToSpanAttributes(scopeData.contexts);\n  safeSetSpanJSONAttributes(segmentSpanJSON, contextAttributes);\n}\n\n/**\n * Safely set attributes on a span JSON.\n * If an attribute already exists, it will not be overwritten.\n */\nexport function safeSetSpanJSONAttributes(\n  spanJSON: StreamedSpanJSON,\n  newAttributes: RawAttributes<Record<string, unknown>>,\n): void {\n  const originalAttributes = spanJSON.attributes ?? (spanJSON.attributes = {});\n\n  Object.entries(newAttributes).forEach(([key, value]) => {\n    if (value != null && !(key in originalAttributes)) {\n      originalAttributes[key] = value;\n    }\n  });\n}\n\nfunction applySdkMetadataToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, client: Client): void {\n  const integrationNames = client.getIntegrationNames();\n  if (!integrationNames.length) return;\n\n  safeSetSpanJSONAttributes(segmentSpanJSON, {\n    [SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: integrationNames,\n  });\n}\n\nfunction applyCommonSpanAttributes(\n  spanJSON: StreamedSpanJSON,\n  serializedSegmentSpan: StreamedSpanJSON,\n  client: Client,\n  scopeData: ScopeData,\n): void {\n  const sdk = client.getSdkMetadata();\n  const { release, environment } = client.getOptions();\n\n  // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n  safeSetSpanJSONAttributes(spanJSON, {\n    [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n    [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment || DEFAULT_ENVIRONMENT,\n    [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n    [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n    [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n    [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n    [SEMANTIC_ATTRIBUTE_USER_ID]: scopeData.user?.id,\n    [SEMANTIC_ATTRIBUTE_USER_EMAIL]: scopeData.user?.email,\n    [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: scopeData.user?.ip_address,\n    [SEMANTIC_ATTRIBUTE_USER_USERNAME]: scopeData.user?.username,\n    ...scopeData.attributes,\n  });\n}\n\n/**\n * Apply a user-provided beforeSendSpan callback to a span JSON.\n */\nexport function applyBeforeSendSpanCallback(\n  span: StreamedSpanJSON,\n  beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON,\n): StreamedSpanJSON {\n  const modifedSpan = beforeSendSpan(span);\n  if (!modifedSpan) {\n    showSpanDropWarning();\n    return span;\n  }\n  return modifedSpan;\n}\n","import { defineIntegration, safeSetSpanJSONAttributes, SEMANTIC_ATTRIBUTE_SENTRY_OP } from '@sentry/core/browser';\nimport { getHttpRequestData, WINDOW } from '../helpers';\n\n/**\n * Collects information about HTTP request headers and\n * attaches them to the event.\n */\nexport const httpContextIntegration = defineIntegration(() => {\n  return {\n    name: 'HttpContext' as const,\n    preprocessEvent(event) {\n      // if none of the information we want exists, don't bother\n      if (!WINDOW.navigator && !WINDOW.location && !WINDOW.document) {\n        return;\n      }\n\n      const reqData = getHttpRequestData();\n      const headers = {\n        ...reqData.headers,\n        ...event.request?.headers,\n      };\n\n      event.request = {\n        ...reqData,\n        ...event.request,\n        headers,\n      };\n    },\n    processSegmentSpan(span) {\n      const spanOp = span.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_OP];\n\n      // if none of the information we want exists, don't bother\n      if (!WINDOW.navigator && !WINDOW.location && !WINDOW.document) {\n        return;\n      }\n\n      const reqData = getHttpRequestData();\n\n      safeSetSpanJSONAttributes(span, {\n        // Coerce empty string to undefined so the helper's nullish check drops it,\n        // rather than writing an empty `url.full` attribute onto the span.\n        'url.full': spanOp !== 'http.client' ? reqData.url : undefined,\n        'http.request.header.user_agent': reqData.headers['User-Agent'],\n        'http.request.header.referer': reqData.headers['Referer'],\n      });\n    },\n  };\n});\n","import { DEBUG_BUILD } from '../debug-build';\nimport { defineIntegration } from '../integration';\nimport type { Event } from '../types/event';\nimport type { Exception } from '../types/exception';\nimport type { IntegrationFn } from '../types/integration';\nimport type { StackFrame } from '../types/stackframe';\nimport { debug } from '../utils/debug-logger';\nimport { getFramesFromEvent } from '../utils/stacktrace';\n\nconst INTEGRATION_NAME = 'Dedupe' as const;\n\nconst _dedupeIntegration = (() => {\n  let previousEvent: Event | undefined;\n\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(currentEvent) {\n      // We want to ignore any non-error type events, e.g. transactions or replays\n      // These should never be deduped, and also not be compared against as _previousEvent.\n      if (currentEvent.type) {\n        return currentEvent;\n      }\n\n      // Juuust in case something goes wrong\n      try {\n        if (_shouldDropEvent(currentEvent, previousEvent)) {\n          DEBUG_BUILD && debug.warn('Event dropped due to being a duplicate of previously captured event.');\n          return null;\n        }\n      } catch {} // eslint-disable-line no-empty\n\n      return (previousEvent = currentEvent);\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Deduplication filter.\n */\nexport const dedupeIntegration = defineIntegration(_dedupeIntegration);\n\n/** only exported for tests. */\nexport function _shouldDropEvent(currentEvent: Event, previousEvent?: Event): boolean {\n  if (!previousEvent) {\n    return false;\n  }\n\n  if (_isSameMessageEvent(currentEvent, previousEvent)) {\n    return true;\n  }\n\n  if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction _isSameMessageEvent(currentEvent: Event, previousEvent: Event): boolean {\n  const currentMessage = currentEvent.message;\n  const previousMessage = previousEvent.message;\n\n  // If neither event has a message property, they were both exceptions, so bail out\n  if (!currentMessage && !previousMessage) {\n    return false;\n  }\n\n  // If only one event has a stacktrace, but not the other one, they are not the same\n  if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n    return false;\n  }\n\n  if (currentMessage !== previousMessage) {\n    return false;\n  }\n\n  if (!_isSameFingerprint(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  if (!_isSameStacktrace(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction _isSameExceptionEvent(currentEvent: Event, previousEvent: Event): boolean {\n  const previousException = _getExceptionFromEvent(previousEvent);\n  const currentException = _getExceptionFromEvent(currentEvent);\n\n  if (!previousException || !currentException) {\n    return false;\n  }\n\n  if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n    return false;\n  }\n\n  if (!_isSameFingerprint(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  if (!_isSameStacktrace(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction _isSameStacktrace(currentEvent: Event, previousEvent: Event): boolean {\n  let currentFrames = getFramesFromEvent(currentEvent);\n  let previousFrames = getFramesFromEvent(previousEvent);\n\n  // If neither event has a stacktrace, they are assumed to be the same\n  if (!currentFrames && !previousFrames) {\n    return true;\n  }\n\n  // If only one event has a stacktrace, but not the other one, they are not the same\n  if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n    return false;\n  }\n\n  currentFrames = currentFrames as StackFrame[];\n  previousFrames = previousFrames as StackFrame[];\n\n  // If number of frames differ, they are not the same\n  if (previousFrames.length !== currentFrames.length) {\n    return false;\n  }\n\n  // Otherwise, compare the two\n  for (let i = 0; i < previousFrames.length; i++) {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const frameA = previousFrames[i]!;\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const frameB = currentFrames[i]!;\n\n    if (\n      frameA.filename !== frameB.filename ||\n      frameA.lineno !== frameB.lineno ||\n      frameA.colno !== frameB.colno ||\n      frameA.function !== frameB.function\n    ) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction _isSameFingerprint(currentEvent: Event, previousEvent: Event): boolean {\n  let currentFingerprint = currentEvent.fingerprint;\n  let previousFingerprint = previousEvent.fingerprint;\n\n  // If neither event has a fingerprint, they are assumed to be the same\n  if (!currentFingerprint && !previousFingerprint) {\n    return true;\n  }\n\n  // If only one event has a fingerprint, but not the other one, they are not the same\n  if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n    return false;\n  }\n\n  currentFingerprint = currentFingerprint as string[];\n  previousFingerprint = previousFingerprint as string[];\n\n  // Otherwise, compare the two\n  try {\n    return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n  } catch {\n    return false;\n  }\n}\n\nfunction _getExceptionFromEvent(event: Event): Exception | undefined {\n  return event.exception?.values?.[0];\n}\n","import type { Client } from '../client';\nimport { getCurrentScope, getIsolationScope } from '../currentScopes';\nimport { defineIntegration } from '../integration';\nimport { GEN_AI_CONVERSATION_ID_ATTRIBUTE } from '../semanticAttributes';\nimport type { IntegrationFn } from '../types/integration';\nimport type { Span } from '../types/span';\nimport { spanToJSON } from '../utils/spanUtils';\n\nconst INTEGRATION_NAME = 'ConversationId' as const;\n\nconst _conversationIdIntegration = (() => {\n  return {\n    name: INTEGRATION_NAME,\n    setup(client: Client) {\n      client.on('spanStart', (span: Span) => {\n        const scopeData = getCurrentScope().getScopeData();\n        const isolationScopeData = getIsolationScope().getScopeData();\n\n        const conversationId = scopeData.conversationId || isolationScopeData.conversationId;\n\n        if (conversationId) {\n          const { op, data: attributes, description: name } = spanToJSON(span);\n\n          // Only apply conversation ID to gen_ai spans.\n          // We also check for Vercel AI spans (ai.operationId attribute or ai.* span name)\n          // because the Vercel AI integration sets the gen_ai.* op in its own spanStart handler\n          // which fires after this, so the op is not yet available at this point.\n          if (!op?.startsWith('gen_ai.') && !attributes['ai.operationId'] && !name?.startsWith('ai.')) {\n            return;\n          }\n\n          span.setAttribute(GEN_AI_CONVERSATION_ID_ATTRIBUTE, conversationId);\n        }\n      });\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Automatically applies conversation ID from scope to spans.\n *\n * This integration reads the conversation ID from the current or isolation scope\n * and applies it to spans when they start. This ensures the conversation ID is\n * available for all AI-related operations.\n */\nexport const conversationIdIntegration = defineIntegration(_conversationIdIntegration);\n","import type { Client } from './client';\nimport { getCurrentScope } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { ClientOptions } from './types/options';\nimport { consoleSandbox, debug } from './utils/debug-logger';\n\n/** A class object that can instantiate Client objects. */\nexport type ClientClass<F extends Client, O extends ClientOptions> = new (options: O) => F;\n\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instantiate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind<F extends Client, O extends ClientOptions>(\n  clientClass: ClientClass<F, O>,\n  options: O,\n): Client {\n  if (options.debug === true) {\n    if (DEBUG_BUILD) {\n      debug.enable();\n    } else {\n      // use `console.warn` rather than `debug.warn` since by non-debug bundles have all `debug.x` statements stripped\n      consoleSandbox(() => {\n        // eslint-disable-next-line no-console\n        console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n      });\n    }\n  }\n  const scope = getCurrentScope();\n  scope.update(options.initialScope);\n\n  const client = new clientClass(options);\n  setCurrentClient(client);\n  client.init();\n  return client;\n}\n\n/**\n * Make the given client the current client.\n */\nexport function setCurrentClient(client: Client): void {\n  getCurrentScope().setClient(client);\n}\n","import type { ReportDialogOptions } from './report-dialog';\nimport type { DsnComponents, DsnLike } from './types/dsn';\nimport type { SdkInfo } from './types/sdkinfo';\nimport { dsnToString, makeDsn } from './utils/dsn';\n\nexport const SENTRY_API_VERSION = '7';\n\n/** Returns the prefix to construct Sentry ingestion API endpoints. */\nfunction getBaseApiEndpoint(dsn: DsnComponents): string {\n  const protocol = dsn.protocol ? `${dsn.protocol}:` : '';\n  const port = dsn.port ? `:${dsn.port}` : '';\n  return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ''}/api/`;\n}\n\n/** Returns the ingest API endpoint for target. */\nfunction _getIngestEndpoint(dsn: DsnComponents): string {\n  return `${getBaseApiEndpoint(dsn)}${dsn.projectId}/envelope/`;\n}\n\n/** Returns a URL-encoded string with auth config suitable for a query string. */\nfunction _encodedAuth(dsn: DsnComponents, sdkInfo: SdkInfo | undefined): string {\n  const params: Record<string, string> = {\n    sentry_version: SENTRY_API_VERSION,\n  };\n\n  if (dsn.publicKey) {\n    // We send only the minimum set of required information. See\n    // https://github.com/getsentry/sentry-javascript/issues/2572.\n    params.sentry_key = dsn.publicKey;\n  }\n\n  if (sdkInfo) {\n    params.sentry_client = `${sdkInfo.name}/${sdkInfo.version}`;\n  }\n\n  return new URLSearchParams(params).toString();\n}\n\n/**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nexport function getEnvelopeEndpointWithUrlEncodedAuth(dsn: DsnComponents, tunnel?: string, sdkInfo?: SdkInfo): string {\n  return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, sdkInfo)}`;\n}\n\n/** Returns the url to the report dialog endpoint. */\nexport function getReportDialogEndpoint(dsnLike: DsnLike, dialogOptions: ReportDialogOptions): string {\n  const dsn = makeDsn(dsnLike);\n  if (!dsn) {\n    return '';\n  }\n\n  const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n\n  let encodedOptions = `dsn=${dsnToString(dsn)}`;\n  for (const key in dialogOptions) {\n    if (key === 'dsn') {\n      continue;\n    }\n\n    if (key === 'onClose') {\n      continue;\n    }\n\n    if (key === 'user') {\n      const user = dialogOptions.user;\n      if (!user) {\n        continue;\n      }\n      if (user.name) {\n        encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n      }\n      if (user.email) {\n        encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n      }\n    } else {\n      encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] as string)}`;\n    }\n  }\n\n  return `${endpoint}?${encodedOptions}`;\n}\n","import type { DsnComponents } from '../types/dsn';\nimport type { MetricContainerItem, MetricEnvelope } from '../types/envelope';\nimport type { SerializedMetric } from '../types/metric';\nimport type { SdkMetadata } from '../types/sdkmetadata';\nimport { dsnToString } from '../utils/dsn';\nimport { createEnvelope } from '../utils/envelope';\nimport { isBrowser } from '../utils/isBrowser';\n\n/**\n * Creates a metric container envelope item for a list of metrics.\n *\n * @param items - The metrics to include in the envelope.\n * @param inferUserData - If true, tells Relay to infer the end-user IP and User-Agent from the incoming request.\n *                        Only emitted as `ingest_settings` in browser environments.\n * @returns The created metric container envelope item.\n */\nexport function createMetricContainerEnvelopeItem(\n  items: Array<SerializedMetric>,\n  inferUserData?: boolean,\n): MetricContainerItem {\n  const inferSetting = inferUserData ? 'auto' : 'never';\n  return [\n    {\n      type: 'trace_metric',\n      item_count: items.length,\n      content_type: 'application/vnd.sentry.items.trace-metric+json',\n    } as MetricContainerItem[0],\n    {\n      version: 2,\n      ...(isBrowser() && {\n        ingest_settings: { infer_ip: inferSetting, infer_user_agent: inferSetting },\n      }),\n      items,\n    },\n  ];\n}\n\n/**\n * Creates an envelope for a list of metrics.\n *\n * Metrics from multiple traces can be included in the same envelope.\n *\n * @param metrics - The metrics to include in the envelope.\n * @param metadata - The metadata to include in the envelope.\n * @param tunnel - The tunnel to include in the envelope.\n * @param dsn - The DSN to include in the envelope.\n * @param inferUserData - If true, tells Relay to infer the end-user IP and User-Agent from the incoming request.\n * @returns The created envelope.\n */\nexport function createMetricEnvelope(\n  metrics: Array<SerializedMetric>,\n  metadata?: SdkMetadata,\n  tunnel?: string,\n  dsn?: DsnComponents,\n  inferUserData?: boolean,\n): MetricEnvelope {\n  const headers: MetricEnvelope[0] = {};\n\n  if (metadata?.sdk) {\n    headers.sdk = {\n      name: metadata.sdk.name,\n      version: metadata.sdk.version,\n    };\n  }\n\n  if (!!tunnel && !!dsn) {\n    headers.dsn = dsnToString(dsn);\n  }\n\n  return createEnvelope<MetricEnvelope>(headers, [createMetricContainerEnvelopeItem(metrics, inferUserData)]);\n}\n","import { type RawAttributes, serializeAttributes } from '../attributes';\nimport { getGlobalSingleton } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport type { Integration } from '../types/integration';\nimport type { Metric, SerializedMetric } from '../types/metric';\nimport type { User } from '../types/user';\nimport { debug } from '../utils/debug-logger';\nimport { getCombinedScopeData } from '../utils/scopeData';\nimport { _getSpanForScope } from '../utils/spanOnScope';\nimport { timestampInSeconds } from '../utils/time';\nimport { getSequenceAttribute } from '../utils/timestampSequence';\nimport { _getTraceInfoFromScope } from '../utils/trace-info';\nimport { createMetricEnvelope } from './envelope';\n\nconst MAX_METRIC_BUFFER_SIZE = 1000;\n\n/**\n * Sets a metric attribute if the value exists and the attribute key is not already present.\n *\n * @param metricAttributes - The metric attributes object to modify.\n * @param key - The attribute key to set.\n * @param value - The value to set (only sets if truthy and key not present).\n * @param setEvenIfPresent - Whether to set the attribute if it is present. Defaults to true.\n */\nfunction setMetricAttribute(\n  metricAttributes: Record<string, unknown>,\n  key: string,\n  value: unknown,\n  setEvenIfPresent = true,\n): void {\n  if (value && (setEvenIfPresent || !(key in metricAttributes))) {\n    metricAttributes[key] = value;\n  }\n}\n\n/**\n * Captures a serialized metric event and adds it to the metric buffer for the given client.\n *\n * @param client - A client. Uses the current client if not provided.\n * @param serializedMetric - The serialized metric event to capture.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureSerializedMetric(client: Client, serializedMetric: SerializedMetric): void {\n  const bufferMap = _getBufferMap();\n  const metricBuffer = _INTERNAL_getMetricBuffer(client);\n\n  if (metricBuffer === undefined) {\n    bufferMap.set(client, [serializedMetric]);\n  } else {\n    if (metricBuffer.length >= MAX_METRIC_BUFFER_SIZE) {\n      _INTERNAL_flushMetricsBuffer(client, metricBuffer);\n      bufferMap.set(client, [serializedMetric]);\n    } else {\n      bufferMap.set(client, [...metricBuffer, serializedMetric]);\n    }\n  }\n}\n\n/**\n * Options for capturing a metric internally.\n */\nexport interface InternalCaptureMetricOptions {\n  /**\n   * The scope to capture the metric with.\n   */\n  scope?: Scope;\n\n  /**\n   * A function to capture the serialized metric.\n   */\n  captureSerializedMetric?: (client: Client, metric: SerializedMetric) => void;\n}\n\n/**\n * Enriches metric with all contextual attributes (user, SDK metadata, replay, etc.)\n */\nfunction _enrichMetricAttributes(beforeMetric: Metric, client: Client, user: User): Metric {\n  const { release, environment } = client.getOptions();\n\n  const processedMetricAttributes = {\n    ...beforeMetric.attributes,\n  };\n\n  // Add user attributes\n  setMetricAttribute(processedMetricAttributes, 'user.id', user.id, false);\n  setMetricAttribute(processedMetricAttributes, 'user.email', user.email, false);\n  setMetricAttribute(processedMetricAttributes, 'user.name', user.username, false);\n\n  // Add Sentry metadata\n  setMetricAttribute(processedMetricAttributes, 'sentry.release', release);\n  setMetricAttribute(processedMetricAttributes, 'sentry.environment', environment);\n\n  // Add SDK metadata\n  const { name, version } = client.getSdkMetadata()?.sdk ?? {};\n  setMetricAttribute(processedMetricAttributes, 'sentry.sdk.name', name);\n  setMetricAttribute(processedMetricAttributes, 'sentry.sdk.version', version);\n\n  // Add replay metadata\n  const replay = client.getIntegrationByName<\n    Integration & {\n      getReplayId: (onlyIfSampled?: boolean) => string;\n      getRecordingMode: () => 'session' | 'buffer' | undefined;\n    }\n  >('Replay');\n\n  const replayId = replay?.getReplayId(true);\n  setMetricAttribute(processedMetricAttributes, 'sentry.replay_id', replayId);\n\n  if (replayId && replay?.getRecordingMode() === 'buffer') {\n    setMetricAttribute(processedMetricAttributes, 'sentry._internal.replay_is_buffering', true);\n  }\n\n  return {\n    ...beforeMetric,\n    attributes: processedMetricAttributes,\n  };\n}\n\n/**\n * Creates a serialized metric ready to be sent to Sentry.\n */\nfunction _buildSerializedMetric(\n  metric: Metric,\n  client: Client,\n  currentScope: Scope,\n  scopeAttributes: RawAttributes<Record<string, unknown>> | undefined,\n): SerializedMetric {\n  // Get trace context\n  const [, traceContext] = _getTraceInfoFromScope(client, currentScope);\n  const span = _getSpanForScope(currentScope);\n  const traceId = span ? span.spanContext().traceId : traceContext?.trace_id;\n  const spanId = span ? span.spanContext().spanId : undefined;\n\n  const timestamp = timestampInSeconds();\n  const sequenceAttr = getSequenceAttribute(timestamp);\n\n  return {\n    timestamp,\n    trace_id: traceId ?? '',\n    span_id: spanId,\n    name: metric.name,\n    type: metric.type,\n    unit: metric.unit,\n    value: metric.value,\n    attributes: {\n      ...serializeAttributes(scopeAttributes),\n      ...serializeAttributes(metric.attributes, 'skip-undefined'),\n      [sequenceAttr.key]: sequenceAttr.value,\n    },\n  };\n}\n\n/**\n * Captures a metric event and sends it to Sentry.\n *\n * @param metric - The metric event to capture.\n * @param options - Options for capturing the metric.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureMetric(beforeMetric: Metric, options?: InternalCaptureMetricOptions): void {\n  const currentScope = options?.scope ?? getCurrentScope();\n  const captureSerializedMetric = options?.captureSerializedMetric ?? _INTERNAL_captureSerializedMetric;\n  const client = currentScope?.getClient() ?? getClient();\n  if (!client) {\n    DEBUG_BUILD && debug.warn('No client available to capture metric.');\n    return;\n  }\n\n  const { _experiments, enableMetrics, beforeSendMetric } = client.getOptions();\n\n  // todo(v11): Remove the experimental flag\n  // eslint-disable-next-line typescript/no-deprecated\n  const metricsEnabled = enableMetrics ?? _experiments?.enableMetrics ?? true;\n\n  if (!metricsEnabled) {\n    DEBUG_BUILD && debug.warn('metrics option not enabled, metric will not be captured.');\n    return;\n  }\n\n  // Enrich metric with contextual attributes\n  const { user, attributes: scopeAttributes } = getCombinedScopeData(getIsolationScope(), currentScope);\n  const enrichedMetric = _enrichMetricAttributes(beforeMetric, client, user);\n\n  client.emit('processMetric', enrichedMetric);\n\n  // todo(v11): Remove the experimental `beforeSendMetric`\n  // eslint-disable-next-line typescript/no-deprecated\n  const beforeSendCallback = beforeSendMetric || _experiments?.beforeSendMetric;\n  const processedMetric = beforeSendCallback ? beforeSendCallback(enrichedMetric) : enrichedMetric;\n\n  if (!processedMetric) {\n    DEBUG_BUILD && debug.log('`beforeSendMetric` returned `null`, will not send metric.');\n    return;\n  }\n\n  const serializedMetric = _buildSerializedMetric(processedMetric, client, currentScope, scopeAttributes);\n\n  DEBUG_BUILD && debug.log('[Metric]', serializedMetric);\n\n  captureSerializedMetric(client, serializedMetric);\n\n  client.emit('afterCaptureMetric', processedMetric);\n}\n\n/**\n * Flushes the metrics buffer to Sentry.\n *\n * @param client - A client.\n * @param maybeMetricBuffer - A metric buffer. Uses the metric buffer for the given client if not provided.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_flushMetricsBuffer(client: Client, maybeMetricBuffer?: Array<SerializedMetric>): void {\n  const metricBuffer = maybeMetricBuffer ?? _INTERNAL_getMetricBuffer(client) ?? [];\n  if (metricBuffer.length === 0) {\n    return;\n  }\n\n  const clientOptions = client.getOptions();\n  const envelope = createMetricEnvelope(\n    metricBuffer,\n    clientOptions._metadata,\n    clientOptions.tunnel,\n    client.getDsn(),\n    client.getDataCollectionOptions().userInfo,\n  );\n\n  // Clear the metric buffer after envelopes have been constructed.\n  _getBufferMap().set(client, []);\n\n  client.emit('flushMetrics');\n\n  // sendEnvelope should not throw\n  // eslint-disable-next-line @typescript-eslint/no-floating-promises\n  client.sendEnvelope(envelope);\n}\n\n/**\n * Returns the metric buffer for a given client.\n *\n * Exported for testing purposes.\n *\n * @param client - The client to get the metric buffer for.\n * @returns The metric buffer for the given client.\n */\nexport function _INTERNAL_getMetricBuffer(client: Client): Array<SerializedMetric> | undefined {\n  return _getBufferMap().get(client);\n}\n\nfunction _getBufferMap(): WeakMap<Client, Array<SerializedMetric>> {\n  // The reference to the Client <> MetricBuffer map is stored on the carrier to ensure it's always the same\n  return getGlobalSingleton('clientToMetricBufferMap', () => new WeakMap<Client, Array<SerializedMetric>>());\n}\n","import type { RawAttributes } from '../../attributes';\nimport type { SerializedStreamedSpan, SpanJSON, StreamedSpanJSON } from '../../types/span';\nimport { streamedSpanJsonToSerializedSpan } from '../../utils/spanUtils';\n\n/**\n * Converts a v1 SpanJSON (from a legacy transaction) to a serialized v2 StreamedSpan.\n */\nexport function spanJsonToSerializedStreamedSpan(span: SpanJSON): SerializedStreamedSpan {\n  const streamedSpan: StreamedSpanJSON = {\n    trace_id: span.trace_id,\n    span_id: span.span_id,\n    parent_span_id: span.parent_span_id,\n    name: span.description || '',\n    start_timestamp: span.start_timestamp,\n    end_timestamp: span.timestamp || span.start_timestamp,\n    status: !span.status || span.status === 'ok' || span.status === 'cancelled' ? 'ok' : 'error',\n    is_segment: false,\n    attributes: { ...(span.data as RawAttributes<Record<string, unknown>>) },\n    links: span.links,\n  };\n\n  return streamedSpanJsonToSerializedSpan(streamedSpan);\n}\n","/**\n * Calls `unref` on a timer, if the method is available on @param timer.\n *\n * `unref()` is used to allow processes to exit immediately, even if the timer\n * is still running and hasn't resolved yet.\n *\n * Use this in places where code can run on browser or server, since browsers\n * do not support `unref`.\n */\nexport function safeUnref(timer: ReturnType<typeof setTimeout>): ReturnType<typeof setTimeout> {\n  if (typeof timer === 'object' && typeof timer.unref === 'function') {\n    timer.unref();\n  }\n  return timer;\n}\n","import { rejectedSyncPromise, resolvedSyncPromise } from './syncpromise';\nimport { safeUnref } from './timer';\n\nexport interface PromiseBuffer<T> {\n  // exposes the internal array so tests can assert on the state of it.\n  // XXX: this really should not be public api.\n  $: PromiseLike<T>[];\n  add(taskProducer: () => PromiseLike<T>): PromiseLike<T>;\n  drain(timeout?: number): PromiseLike<boolean>;\n}\n\nexport const SENTRY_BUFFER_FULL_ERROR = Symbol.for('SentryBufferFullError');\n\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nexport function makePromiseBuffer<T>(limit: number = 100): PromiseBuffer<T> {\n  const buffer: Set<PromiseLike<T>> = new Set();\n\n  function isReady(): boolean {\n    return buffer.size < limit;\n  }\n\n  /**\n   * Remove a promise from the queue.\n   *\n   * @param task Can be any PromiseLike<T>\n   * @returns Removed promise.\n   */\n  function remove(task: PromiseLike<T>): void {\n    buffer.delete(task);\n  }\n\n  /**\n   * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n   *\n   * @param taskProducer A function producing any PromiseLike<T>; In previous versions this used to be `task:\n   *        PromiseLike<T>`, but under that model, Promises were instantly created on the call-site and their executor\n   *        functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n   *        requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n   *        limit check.\n   * @returns The original promise.\n   */\n  function add(taskProducer: () => PromiseLike<T>): PromiseLike<T> {\n    if (!isReady()) {\n      return rejectedSyncPromise(SENTRY_BUFFER_FULL_ERROR);\n    }\n\n    // start the task and add its promise to the queue\n    const task = taskProducer();\n    buffer.add(task);\n    void task.then(\n      () => remove(task),\n      () => remove(task),\n    );\n    return task;\n  }\n\n  /**\n   * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n   *\n   * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n   * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n   * `true`.\n   * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n   * `false` otherwise\n   */\n  function drain(timeout?: number): PromiseLike<boolean> {\n    if (!buffer.size) {\n      return resolvedSyncPromise(true);\n    }\n\n    // We want to resolve even if one of the promises rejects\n    const drainPromise = Promise.allSettled(Array.from(buffer)).then(() => true);\n\n    if (!timeout) {\n      return drainPromise;\n    }\n\n    const promises = [\n      drainPromise,\n      new Promise<boolean>(resolve => safeUnref(setTimeout(() => resolve(false), timeout))),\n    ];\n\n    return Promise.race(promises);\n  }\n\n  return {\n    get $(): PromiseLike<T>[] {\n      return Array.from(buffer);\n    },\n    add,\n    drain,\n  };\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport type { ClientOptions, IgnoreSpanAttributeValue } from '../types/options';\nimport type { SpanJSON } from '../types/span';\nimport { debug } from './debug-logger';\nimport { isMatchingPattern } from './string';\n\nfunction logIgnoredSpan(droppedSpan: Pick<SpanJSON, 'description' | 'op'>): void {\n  debug.log(`Ignoring span ${droppedSpan.op} - ${droppedSpan.description} because it matches \\`ignoreSpans\\`.`);\n}\n\n/**\n * Check if a span should be ignored based on the ignoreSpans configuration.\n */\nexport function shouldIgnoreSpan(\n  span: Pick<SpanJSON, 'description' | 'op'> & { attributes?: Record<string, unknown> },\n  ignoreSpans: Required<ClientOptions>['ignoreSpans'],\n): boolean {\n  if (!ignoreSpans?.length) {\n    return false;\n  }\n\n  for (const pattern of ignoreSpans) {\n    if (isStringOrRegExp(pattern)) {\n      if (span.description && isMatchingPattern(span.description, pattern)) {\n        DEBUG_BUILD && logIgnoredSpan(span);\n        return true;\n      }\n      continue;\n    }\n\n    const hasAttributes = !!pattern.attributes && Object.keys(pattern.attributes).length > 0;\n    if (!pattern.name && !pattern.op && !hasAttributes) {\n      continue;\n    }\n\n    const nameMatches = pattern.name ? span.description && isMatchingPattern(span.description, pattern.name) : true;\n    const opMatches = pattern.op ? span.op && isMatchingPattern(span.op, pattern.op) : true;\n    const attrsMatch = pattern.attributes\n      ? Object.entries(pattern.attributes).every(([key, valuePattern]) =>\n          _matchesAttributeValue(span.attributes?.[key], valuePattern),\n        )\n      : true;\n\n    // This check here is only correct because we can guarantee that we ran `isMatchingPattern`\n    // for at least one of `nameMatches`, `opMatches`, or `attrsMatch`. So in contrary to how this looks,\n    // not all of op, name, and attributes actually have to match. This is the most efficient way to check\n    // for all combinations of name, op, and attribute patterns.\n    if (nameMatches && opMatches && attrsMatch) {\n      DEBUG_BUILD && logIgnoredSpan(span);\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction _matchesAttributeValue(actual: unknown, pat: IgnoreSpanAttributeValue): boolean {\n  // String values support pattern matching\n  if (typeof actual === 'string' && (typeof pat === 'string' || pat instanceof RegExp)) {\n    return isMatchingPattern(actual, pat);\n  }\n  // Arrays: element-wise strict equality\n  if (Array.isArray(actual) && Array.isArray(pat)) {\n    return actual.length === pat.length && actual.every((v, i) => v === pat[i]);\n  }\n  // Primitives: strict equality\n  return actual === pat;\n}\n\n/**\n * Takes a list of spans, and a span that was dropped, and re-parents the child spans of the dropped span to the parent of the dropped span, if possible.\n * This mutates the spans array in place!\n */\nexport function reparentChildSpans(spans: SpanJSON[], dropSpan: SpanJSON): void {\n  const droppedSpanParentId = dropSpan.parent_span_id;\n  const droppedSpanId = dropSpan.span_id;\n\n  // This should generally not happen, as we do not apply this on root spans\n  // but to be safe, we just bail in this case\n  if (!droppedSpanParentId) {\n    return;\n  }\n\n  for (const span of spans) {\n    if (span.parent_span_id === droppedSpanId) {\n      span.parent_span_id = droppedSpanParentId;\n    }\n  }\n}\n\nfunction isStringOrRegExp(value: unknown): value is string | RegExp {\n  return typeof value === 'string' || value instanceof RegExp;\n}\n","export const FILTERED_VALUE = '[Filtered]';\n\nexport const PII_HEADER_SNIPPETS = ['forwarded', '-ip', 'remote-', 'via', '-user'];\n\nexport const SENSITIVE_KEY_SNIPPETS = [\n  'auth',\n  'token',\n  'secret',\n  'session', // for the user_session cookie\n  'password',\n  'passwd',\n  'pwd',\n  'key',\n  'jwt',\n  'bearer',\n  'sso',\n  'saml',\n  'csrf',\n  'xsrf',\n  'credentials',\n  'sid',\n  'identity',\n  // Always treat cookie headers as sensitive in case individual key-value cookie pairs cannot properly be extracted\n  'set-cookie',\n  'cookie',\n];\n\n/**\n * Extra substrings matched only against individual Cookie / Set-Cookie **names** (not header names),\n * so we can cover common session secrets that do not match {@link SENSITIVE_KEY_SNIPPETS}\n * (e.g. `connect.sid` does not contain `session`) without false positives on arbitrary HTTP headers.\n *\n * Cookie names are checked with the same `includes()` list as headers plus these entries; omit redundant\n * cookie-only snippets that are already implied by a header match (e.g. `oauth` → `auth`, `id_token` → `token`,\n * `next-auth` → `auth`).\n */\nexport const SENSITIVE_COOKIE_NAME_SNIPPETS = [\n  // Express / Connect default session cookie\n  '.sid',\n  // Opaque session ids (PHPSESSID, ASPSESSIONID*, BIGipServer*, *sessid*, …)\n  'sessid',\n  // Laravel etc. \"remember me\" tokens\n  'remember',\n  // OIDC / OAuth auxiliary (`oauth*` covered by header snippet `auth`)\n  'oidc',\n  'pkce',\n  'nonce',\n  // RFC 6265bis high-security cookie name prefixes\n  '__secure-',\n  '__host-',\n  // Load balancer / CDN sticky-session cookies (opaque routing tokens)\n  'awsalb',\n  'awselb',\n  'akamai',\n  // BaaS / IdP session cookies (names often omit \"session\")\n  '__stripe',\n  'cognito',\n  'firebase',\n  'supabase',\n  'sb-',\n  // Step-up / MFA cookies\n  'mfa',\n  '2fa',\n];\n","import type { DataCollection, ResolvedDataCollection } from '../../types/datacollection';\nimport { defaultPiiToCollectionOptions } from './defaultPiiToCollectionOptions';\n\nconst DEFAULTS: ResolvedDataCollection = {\n  userInfo: true,\n  cookies: true,\n  httpHeaders: { request: true, response: true },\n  httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'],\n  queryParams: true,\n  genAI: { inputs: true, outputs: true },\n  stackFrameVariables: true,\n  frameContextLines: 5,\n};\n\n/**\n * Resolves the effective `DataCollection` configuration from client options.\n *\n * Precedence:\n * 1. Fields explicitly set in `dataCollection`\n * 2. If `sendDefaultPii` is set and `dataCollection` is absent, bridge via `defaultPiiToCollectionOptions`\n * 3. Spec defaults\n *\n * TODO(v11): Remove `sendDefaultPii` support and always fall through to DEFAULTS so that `userInfo: true`\n * NOTE: In v10, DEFAULTS only apply when `dataCollection` is explicitly provided.\n * When `dataCollection` is absent, the legacy `sendDefaultPii` bridge is used, which defaults to\n * `userInfo: false` to preserve backward compatibility.\n */\nexport function resolveDataCollectionOptions(options: {\n  dataCollection?: DataCollection;\n  sendDefaultPii?: boolean;\n}): ResolvedDataCollection {\n  // TODO(v11): Remove the sendDefaultPii bridge and always use DEFAULTS.\n  const base = options.dataCollection != null ? DEFAULTS : defaultPiiToCollectionOptions(options.sendDefaultPii);\n\n  const dc = options.dataCollection ?? {};\n\n  return {\n    userInfo: dc.userInfo ?? base.userInfo,\n    cookies: dc.cookies ?? base.cookies,\n    httpHeaders: {\n      request: dc.httpHeaders?.request ?? base.httpHeaders.request,\n      response: dc.httpHeaders?.response ?? base.httpHeaders.response,\n    },\n    httpBodies: dc.httpBodies ?? base.httpBodies,\n    queryParams: dc.queryParams ?? base.queryParams,\n    genAI: {\n      inputs: dc.genAI?.inputs ?? base.genAI.inputs,\n      outputs: dc.genAI?.outputs ?? base.genAI.outputs,\n    },\n    stackFrameVariables: dc.stackFrameVariables ?? base.stackFrameVariables,\n    frameContextLines: dc.frameContextLines ?? base.frameContextLines,\n  };\n}\n","import { PII_HEADER_SNIPPETS } from './filtering-snippets';\nimport type { ResolvedDataCollection } from '../../types/datacollection';\n\n/**\n * Helper function that maps the `sendDefaultPii` boolean flag to the corresponding `DataCollection` configuration.\n * Used as a backward-compatibility bridge when `dataCollection` is not set by the user.\n *\n * TODO(v11): Remove this function along with `sendDefaultPii`. Once `dataCollection` is the only API,\n * the DEFAULTS in `resolveDataCollectionOptions` (including `userInfo: true`) will always apply.\n */\nexport function defaultPiiToCollectionOptions(sendDefaultPii?: boolean): ResolvedDataCollection {\n  return sendDefaultPii === true\n    ? {\n        userInfo: true,\n        cookies: true,\n        httpHeaders: { request: true, response: true },\n        httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'],\n        queryParams: true,\n        genAI: { inputs: true, outputs: true },\n        stackFrameVariables: true,\n        frameContextLines: 7, // default should be 5, but ContextLines integration uses 7\n      }\n    : {\n        userInfo: false,\n        cookies: { deny: PII_HEADER_SNIPPETS },\n        httpHeaders: { request: { deny: PII_HEADER_SNIPPETS }, response: { deny: PII_HEADER_SNIPPETS } },\n        httpBodies: [],\n        queryParams: { deny: PII_HEADER_SNIPPETS },\n        genAI: { inputs: false, outputs: false },\n        stackFrameVariables: true,\n        frameContextLines: 7, // default should be 5, but ContextLines integration uses 7\n      };\n}\n","/* eslint-disable max-lines */\nimport { getEnvelopeEndpointWithUrlEncodedAuth } from './api';\nimport { DEFAULT_ENVIRONMENT } from './constants';\nimport { getCurrentScope, getIsolationScope, getTraceContextFromScope } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport { createEventEnvelope, createSessionEnvelope } from './envelope';\nimport type { IntegrationIndex } from './integration';\nimport { afterSetupIntegrations, setupIntegration, setupIntegrations } from './integration';\nimport { _INTERNAL_flushLogsBuffer } from './logs/internal';\nimport { _INTERNAL_flushMetricsBuffer } from './metrics/internal';\nimport type { Scope } from './scope';\nimport { updateSession } from './session';\nimport { getDynamicSamplingContextFromScope } from './tracing/dynamicSamplingContext';\nimport { isStreamedBeforeSendSpanCallback } from './tracing/spans/beforeSendSpan';\nimport { extractGenAiSpansFromEvent } from './tracing/spans/extractGenAiSpans';\nimport { DEFAULT_TRANSPORT_BUFFER_SIZE } from './transports/base';\nimport type { Breadcrumb, BreadcrumbHint, FetchBreadcrumbHint, XhrBreadcrumbHint } from './types/breadcrumb';\nimport type { CheckIn, MonitorConfig } from './types/checkin';\nimport type { EventDropReason, Outcome } from './types/clientreport';\nimport type { DataCategory } from './types/datacategory';\nimport type { DsnComponents } from './types/dsn';\nimport type { DynamicSamplingContext, Envelope } from './types/envelope';\nimport type { ErrorEvent, Event, EventHint, EventType, TransactionEvent } from './types/event';\nimport type { EventProcessor } from './types/eventprocessor';\nimport type { FeedbackEvent } from './types/feedback';\nimport type { Integration } from './types/integration';\nimport type { Log } from './types/log';\nimport type { Metric } from './types/metric';\nimport type { Primitive } from './types/misc';\nimport type { ClientOptions } from './types/options';\nimport type { ParameterizedString } from './types/parameterize';\nimport type { ReplayEndEvent, ReplayStartEvent } from './types/replay';\nimport type { RequestEventData } from './types/request';\nimport type { SdkMetadata } from './types/sdkmetadata';\nimport type { Session, SessionAggregates } from './types/session';\nimport type { SeverityLevel } from './types/severity';\nimport type { Span, SpanAttributes, SpanContextData, SpanJSON, StreamedSpanJSON } from './types/span';\nimport type { StartSpanOptions } from './types/startSpanOptions';\nimport type { Transport, TransportMakeRequestResponse } from './types/transport';\nimport type { ResolvedDataCollection } from './types/datacollection';\nimport { createClientReportEnvelope } from './utils/clientreport';\nimport { debug } from './utils/debug-logger';\nimport { dsnToString, makeDsn } from './utils/dsn';\nimport { addItemToEnvelope, createAttachmentEnvelopeItem } from './utils/envelope';\nimport { getPossibleEventMessages } from './utils/eventUtils';\nimport { isParameterizedString, isPlainObject, isPrimitive, isThenable } from './utils/is';\nimport { merge } from './utils/merge';\nimport { checkOrSetAlreadyCaught, uuid4 } from './utils/misc';\nimport { parseSampleRate } from './utils/parseSampleRate';\nimport { prepareEvent } from './utils/prepareEvent';\nimport { makePromiseBuffer, type PromiseBuffer, SENTRY_BUFFER_FULL_ERROR } from './utils/promisebuffer';\nimport { safeMathRandom } from './utils/randomSafeContext';\nimport { reparentChildSpans, shouldIgnoreSpan } from './utils/should-ignore-span';\nimport { showSpanDropWarning } from './utils/spanUtils';\nimport { rejectedSyncPromise } from './utils/syncpromise';\nimport { safeUnref } from './utils/timer';\nimport { convertSpanJsonToTransactionEvent, convertTransactionEventToSpanJson } from './utils/transactionEvent';\nimport { resolveDataCollectionOptions } from './utils/data-collection/resolveDataCollectionOptions';\n\nconst ALREADY_SEEN_ERROR = \"Not capturing exception because it's already been captured.\";\nconst MISSING_RELEASE_FOR_SESSION_ERROR = 'Discarded session because of missing or non-string release';\n\nconst INTERNAL_ERROR_SYMBOL = Symbol.for('SentryInternalError');\nconst DO_NOT_SEND_EVENT_SYMBOL = Symbol.for('SentryDoNotSendEventError');\n\n// Default interval for flushing logs and metrics (5 seconds)\nconst DEFAULT_FLUSH_INTERVAL = 5000;\n\ninterface InternalError {\n  message: string;\n  [INTERNAL_ERROR_SYMBOL]: true;\n}\n\ninterface DoNotSendEventError {\n  message: string;\n  [DO_NOT_SEND_EVENT_SYMBOL]: true;\n}\n\nfunction _makeInternalError(message: string): InternalError {\n  return {\n    message,\n    [INTERNAL_ERROR_SYMBOL]: true,\n  };\n}\n\nfunction _makeDoNotSendEventError(message: string): DoNotSendEventError {\n  return {\n    message,\n    [DO_NOT_SEND_EVENT_SYMBOL]: true,\n  };\n}\n\nfunction _isInternalError(error: unknown): error is InternalError {\n  return !!error && typeof error === 'object' && INTERNAL_ERROR_SYMBOL in error;\n}\n\nfunction _isDoNotSendEventError(error: unknown): error is DoNotSendEventError {\n  return !!error && typeof error === 'object' && DO_NOT_SEND_EVENT_SYMBOL in error;\n}\n\n/**\n * Sets up weight-based flushing for logs or metrics.\n * This helper function encapsulates the common pattern of:\n * 1. Tracking accumulated weight of items\n * 2. Flushing when weight exceeds threshold (800KB)\n * 3. Flushing after timeout period from the first item\n *\n * Uses closure variables to track weight and timeout state.\n */\nfunction setupWeightBasedFlushing<\n  T,\n  AfterCaptureHook extends 'afterCaptureLog' | 'afterCaptureMetric',\n  FlushHook extends 'flushLogs' | 'flushMetrics',\n>(\n  client: Client,\n  afterCaptureHook: AfterCaptureHook,\n  flushHook: FlushHook,\n  estimateSizeFn: (item: T) => number,\n  flushFn: (client: Client) => void,\n): void {\n  // Track weight and timeout in closure variables\n  let weight = 0;\n  let flushTimeout: ReturnType<typeof setTimeout> | undefined;\n  let isTimerActive = false;\n\n  // @ts-expect-error - TypeScript can't narrow generic hook types to match specific overloads, but we know this is type-safe\n  client.on(flushHook, () => {\n    weight = 0;\n    clearTimeout(flushTimeout);\n    isTimerActive = false;\n  });\n\n  // @ts-expect-error - TypeScript can't narrow generic hook types to match specific overloads, but we know this is type-safe\n  client.on(afterCaptureHook, (item: T) => {\n    weight += estimateSizeFn(item);\n\n    // We flush the buffer if it exceeds 0.8 MB\n    // The weight is a rough estimate, so we flush way before the payload gets too big.\n    if (weight >= 800_000) {\n      flushFn(client);\n    } else if (!isTimerActive) {\n      const flushInterval = client.getOptions()._flushInterval ?? DEFAULT_FLUSH_INTERVAL;\n      if (flushInterval > 0) {\n        // Only start timer if one isn't already running.\n        // This prevents flushing being delayed by items that arrive close to the timeout limit\n        // and thus resetting the flushing timeout and delaying items being flushed.\n        isTimerActive = true;\n        // Use safeUnref so the timer doesn't prevent the process from exiting\n        flushTimeout = safeUnref(\n          setTimeout(() => {\n            flushFn(client);\n            // Note: isTimerActive is reset by the flushHook handler above, not here,\n            // to avoid race conditions when new items arrive during the flush.\n          }, flushInterval),\n        );\n      }\n    }\n  });\n\n  client.on('flush', () => {\n    flushFn(client);\n  });\n}\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event, it is passed through\n * {@link Client._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends Client<NodeOptions> {\n *   public constructor(options: NodeOptions) {\n *     super(options);\n *   }\n *\n *   // ...\n * }\n */\nexport abstract class Client<O extends ClientOptions = ClientOptions> {\n  /** Options passed to the SDK. */\n  protected readonly _options: O;\n\n  /** The client Dsn, if specified in options. Without this Dsn, the SDK will be disabled. */\n  protected readonly _dsn?: DsnComponents;\n\n  protected readonly _transport?: Transport;\n\n  /** Array of set up integrations. */\n  protected _integrations: IntegrationIndex;\n\n  /** Number of calls being processed */\n  protected _numProcessing: number;\n\n  protected _eventProcessors: EventProcessor[];\n\n  /** Holds flushable  */\n  protected _outcomes: { [key: string]: number };\n\n  // eslint-disable-next-line @typescript-eslint/ban-types\n  protected _hooks: Record<string, Set<Function>>;\n\n  protected _promiseBuffer: PromiseBuffer<unknown>;\n\n  protected readonly _dataCollection: ResolvedDataCollection;\n\n  /**\n   * Initializes this client instance.\n   *\n   * @param options Options for the client.\n   */\n  protected constructor(options: O) {\n    this._options = options;\n    this._integrations = {};\n    this._numProcessing = 0;\n    this._outcomes = {};\n    this._hooks = {};\n    this._eventProcessors = [];\n    this._promiseBuffer = makePromiseBuffer(options.transportOptions?.bufferSize ?? DEFAULT_TRANSPORT_BUFFER_SIZE);\n    this._dataCollection = resolveDataCollectionOptions(options);\n\n    if (options.dsn) {\n      this._dsn = makeDsn(options.dsn);\n    } else {\n      DEBUG_BUILD && debug.warn('No DSN provided, client will not send events.');\n    }\n\n    if (this._dsn) {\n      const url = getEnvelopeEndpointWithUrlEncodedAuth(\n        this._dsn,\n        options.tunnel,\n        options._metadata ? options._metadata.sdk : undefined,\n      );\n      this._transport = options.transport({\n        tunnel: this._options.tunnel,\n        recordDroppedEvent: this.recordDroppedEvent.bind(this),\n        ...options.transportOptions,\n        url,\n      });\n    }\n\n    // Backfill enableLogs option from _experiments.enableLogs\n    // TODO(v11): Remove or change default value\n    // eslint-disable-next-line typescript/no-deprecated\n    this._options.enableLogs = this._options.enableLogs ?? this._options._experiments?.enableLogs;\n\n    // Setup log flushing with weight and timeout tracking\n    if (this._options.enableLogs) {\n      setupWeightBasedFlushing(this, 'afterCaptureLog', 'flushLogs', estimateLogSizeInBytes, _INTERNAL_flushLogsBuffer);\n    }\n\n    // todo(v11): Remove the experimental flag\n    // eslint-disable-next-line typescript/no-deprecated\n    const enableMetrics = this._options.enableMetrics ?? this._options._experiments?.enableMetrics ?? true;\n\n    // Setup metric flushing with weight and timeout tracking\n    if (enableMetrics) {\n      setupWeightBasedFlushing(\n        this,\n        'afterCaptureMetric',\n        'flushMetrics',\n        estimateMetricSizeInBytes,\n        _INTERNAL_flushMetricsBuffer,\n      );\n    }\n  }\n\n  /**\n   * Captures an exception event and sends it to Sentry.\n   *\n   * Unlike `captureException` exported from every SDK, this method requires that you pass it the current scope.\n   */\n  public captureException(exception: unknown, hint?: EventHint, scope?: Scope): string {\n    const eventId = uuid4();\n\n    // ensure we haven't captured this very object before\n    if (checkOrSetAlreadyCaught(exception)) {\n      DEBUG_BUILD && debug.log(ALREADY_SEEN_ERROR);\n      return eventId;\n    }\n\n    const hintWithEventId = {\n      event_id: eventId,\n      ...hint,\n    };\n\n    this._process(\n      () =>\n        this.eventFromException(exception, hintWithEventId)\n          .then(event => this._captureEvent(event, hintWithEventId, scope))\n          .then(res => res),\n      'error',\n    );\n\n    return hintWithEventId.event_id;\n  }\n\n  /**\n   * Captures a message event and sends it to Sentry.\n   *\n   * Unlike `captureMessage` exported from every SDK, this method requires that you pass it the current scope.\n   */\n  public captureMessage(\n    message: ParameterizedString,\n    level?: SeverityLevel,\n    hint?: EventHint,\n    currentScope?: Scope,\n  ): string {\n    const hintWithEventId = {\n      event_id: uuid4(),\n      ...hint,\n    };\n\n    const eventMessage = isParameterizedString(message) ? message : String(message);\n    const isMessage = isPrimitive(message);\n    const promisedEvent = isMessage\n      ? this.eventFromMessage(eventMessage, level, hintWithEventId)\n      : this.eventFromException(message, hintWithEventId);\n\n    this._process(\n      () => promisedEvent.then(event => this._captureEvent(event, hintWithEventId, currentScope)),\n      isMessage ? 'unknown' : 'error',\n    );\n\n    return hintWithEventId.event_id;\n  }\n\n  /**\n   * Captures a manually created event and sends it to Sentry.\n   *\n   * Unlike `captureEvent` exported from every SDK, this method requires that you pass it the current scope.\n   */\n  public captureEvent(event: Event, hint?: EventHint, currentScope?: Scope): string {\n    const eventId = uuid4();\n\n    // ensure we haven't captured this very object before\n    if (hint?.originalException && checkOrSetAlreadyCaught(hint.originalException)) {\n      DEBUG_BUILD && debug.log(ALREADY_SEEN_ERROR);\n      return eventId;\n    }\n\n    const hintWithEventId = {\n      event_id: eventId,\n      ...hint,\n    };\n\n    const sdkProcessingMetadata = event.sdkProcessingMetadata || {};\n    const capturedSpanScope: Scope | undefined = sdkProcessingMetadata.capturedSpanScope;\n    const capturedSpanIsolationScope: Scope | undefined = sdkProcessingMetadata.capturedSpanIsolationScope;\n    const dataCategory = getDataCategoryByType(event.type);\n\n    this._process(\n      () => this._captureEvent(event, hintWithEventId, capturedSpanScope || currentScope, capturedSpanIsolationScope),\n      dataCategory,\n    );\n\n    return hintWithEventId.event_id;\n  }\n\n  /**\n   * Captures a session.\n   */\n  public captureSession(session: Session): void {\n    this.sendSession(session);\n    // After sending, we set init false to indicate it's not the first occurrence\n    updateSession(session, { init: false });\n  }\n\n  /**\n   * Create a cron monitor check in and send it to Sentry. This method is not available on all clients.\n   *\n   * @param checkIn An object that describes a check in.\n   * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n   * to create a monitor automatically when sending a check in.\n   * @param scope An optional scope containing event metadata.\n   * @returns A string representing the id of the check in.\n   */\n  public captureCheckIn?(checkIn: CheckIn, monitorConfig?: MonitorConfig, scope?: Scope): string;\n\n  /**\n   * Get the current Dsn.\n   */\n  public getDsn(): DsnComponents | undefined {\n    return this._dsn;\n  }\n\n  /**\n   * Get the current options.\n   */\n  public getOptions(): O {\n    return this._options;\n  }\n\n  /**\n   * Get the resolved data collection configuration.\n   */\n  public getDataCollectionOptions(): ResolvedDataCollection {\n    return this._dataCollection;\n  }\n\n  /**\n   * Get the SDK metadata.\n   * @see SdkMetadata\n   */\n  public getSdkMetadata(): SdkMetadata | undefined {\n    return this._options._metadata;\n  }\n\n  /**\n   * Returns the transport that is used by the client.\n   * Please note that the transport gets lazy initialized so it will only be there once the first event has been sent.\n   */\n  public getTransport(): Transport | undefined {\n    return this._transport;\n  }\n\n  /**\n   * Wait for all events to be sent or the timeout to expire, whichever comes first.\n   *\n   * @param timeout Maximum time in ms the client should wait for events to be flushed. Omitting this parameter will\n   *   cause the client to wait until all events are sent before resolving the promise.\n   * @returns A promise that will resolve with `true` if all events are sent before the timeout, or `false` if there are\n   * still events in the queue when the timeout is reached.\n   */\n  // @ts-expect-error - PromiseLike is a subset of Promise\n  public async flush(timeout?: number): PromiseLike<boolean> {\n    const transport = this._transport;\n\n    // Emit `flush` unconditionally so weight-based log/metric flushers drain\n    // their buffers and clear their idle timers, even when no transport is\n    // configured (e.g. no DSN).\n    this.emit('flush');\n\n    if (!transport) {\n      return true;\n    }\n\n    const clientFinished = await this._isClientDoneProcessing(timeout);\n    const transportFlushed = await transport.flush(timeout);\n\n    return clientFinished && transportFlushed;\n  }\n\n  /**\n   * Flush the event queue and set the client to `enabled = false`. See {@link Client.flush}.\n   *\n   * @param {number} timeout Maximum time in ms the client should wait before shutting down. Omitting this parameter will cause\n   *   the client to wait until all events are sent before disabling itself.\n   * @returns {Promise<boolean>} A promise which resolves to `true` if the flush completes successfully before the timeout, or `false` if\n   * it doesn't.\n   */\n  // @ts-expect-error - PromiseLike is a subset of Promise\n  public async close(timeout?: number): PromiseLike<boolean> {\n    _INTERNAL_flushLogsBuffer(this);\n    const result = await this.flush(timeout);\n    this.getOptions().enabled = false;\n    this.emit('close');\n    return result;\n  }\n\n  /**\n   * Get all installed event processors.\n   */\n  public getEventProcessors(): EventProcessor[] {\n    return this._eventProcessors;\n  }\n\n  /**\n   * Adds an event processor that applies to any event processed by this client.\n   */\n  public addEventProcessor(eventProcessor: EventProcessor): void {\n    this._eventProcessors.push(eventProcessor);\n  }\n\n  /**\n   * Initialize this client.\n   * Call this after the client was set on a scope.\n   */\n  public init(): void {\n    if (\n      this._isEnabled() ||\n      // Force integrations to be setup even if no DSN was set when we have\n      // Spotlight enabled. This is particularly important for browser as we\n      // don't support the `spotlight` option there and rely on the users\n      // adding the `spotlightBrowserIntegration()` to their integrations which\n      // wouldn't get initialized with the check below when there's no DSN set.\n      this._options.integrations.some(({ name }) => name.startsWith('Spotlight'))\n    ) {\n      this._setupIntegrations();\n    }\n  }\n\n  /**\n   * Gets an installed integration by its name.\n   *\n   * @returns {Integration|undefined} The installed integration or `undefined` if no integration with that `name` was installed.\n   */\n  public getIntegrationByName<T extends Integration = Integration>(integrationName: string): T | undefined {\n    return this._integrations[integrationName] as T | undefined;\n  }\n\n  /**\n   * Returns the names of all installed integrations.\n   */\n  public getIntegrationNames(): string[] {\n    return Object.keys(this._integrations);\n  }\n\n  /**\n   * Add an integration to the client.\n   * This can be used to e.g. lazy load integrations.\n   * In most cases, this should not be necessary,\n   * and you're better off just passing the integrations via `integrations: []` at initialization time.\n   * However, if you find the need to conditionally load & add an integration, you can use `addIntegration` to do so.\n   */\n  public addIntegration(integration: Integration): void {\n    const isAlreadyInstalled = this._integrations[integration.name];\n\n    if (!isAlreadyInstalled && integration.beforeSetup) {\n      integration.beforeSetup(this);\n    }\n\n    // This hook takes care of only installing if not already installed\n    setupIntegration(this, integration, this._integrations);\n    // Here we need to check manually to make sure to not run this multiple times\n    if (!isAlreadyInstalled) {\n      afterSetupIntegrations(this, [integration]);\n    }\n  }\n\n  /**\n   * Send a fully prepared event to Sentry.\n   */\n  public sendEvent(event: Event, hint: EventHint = {}): void {\n    this.emit('beforeSendEvent', event, hint);\n\n    // Extract gen_ai spans from transaction and convert to span v2 format.\n    // This mutates event.spans to remove the extracted spans.\n    const genAiSpanItem = extractGenAiSpansFromEvent(event, this);\n\n    let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);\n\n    for (const attachment of hint.attachments || []) {\n      env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));\n    }\n\n    if (genAiSpanItem) {\n      env = addItemToEnvelope(env, genAiSpanItem);\n    }\n\n    // sendEnvelope should not throw\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.sendEnvelope(env).then(sendResponse => this.emit('afterSendEvent', event, sendResponse));\n  }\n\n  /**\n   * Send a session or session aggregrates to Sentry.\n   */\n  public sendSession(session: Session | SessionAggregates): void {\n    // Backfill release and environment on session\n    const { release: clientReleaseOption, environment: clientEnvironmentOption = DEFAULT_ENVIRONMENT } = this._options;\n    if ('aggregates' in session) {\n      const sessionAttrs = session.attrs || {};\n      if (!sessionAttrs.release && !clientReleaseOption) {\n        DEBUG_BUILD && debug.warn(MISSING_RELEASE_FOR_SESSION_ERROR);\n        return;\n      }\n      sessionAttrs.release = sessionAttrs.release || clientReleaseOption;\n      sessionAttrs.environment = sessionAttrs.environment || clientEnvironmentOption;\n      session.attrs = sessionAttrs;\n    } else {\n      if (!session.release && !clientReleaseOption) {\n        DEBUG_BUILD && debug.warn(MISSING_RELEASE_FOR_SESSION_ERROR);\n        return;\n      }\n      session.release = session.release || clientReleaseOption;\n      session.environment = session.environment || clientEnvironmentOption;\n    }\n\n    this.emit('beforeSendSession', session);\n\n    const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);\n\n    // sendEnvelope should not throw\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.sendEnvelope(env);\n  }\n\n  /**\n   * Record on the client that an event got dropped (ie, an event that will not be sent to Sentry).\n   */\n  public recordDroppedEvent(reason: EventDropReason, category: DataCategory, count: number = 1): void {\n    if (this._options.sendClientReports) {\n      // We want to track each category (error, transaction, session, replay_event) separately\n      // but still keep the distinction between different type of outcomes.\n      // We could use nested maps, but it's much easier to read and type this way.\n      // A correct type for map-based implementation if we want to go that route\n      // would be `Partial<Record<SentryRequestType, Partial<Record<Outcome, number>>>>`\n      // With typescript 4.1 we could even use template literal types\n      const key = `${reason}:${category}`;\n      DEBUG_BUILD && debug.log(`Recording outcome: \"${key}\"${count > 1 ? ` (${count} times)` : ''}`);\n      this._outcomes[key] = (this._outcomes[key] || 0) + count;\n    }\n  }\n\n  /* eslint-disable @typescript-eslint/unified-signatures */\n  /**\n   * Register a callback for whenever a span is started.\n   * Receives the span as argument.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'spanStart', callback: (span: Span) => void): () => void;\n\n  /**\n   * Register a callback before span sampling runs. Receives a `samplingDecision` object argument with a `decision`\n   * property that can be used to make a sampling decision that will be enforced, before any span sampling runs.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(\n    hook: 'beforeSampling',\n    callback: (\n      samplingData: {\n        spanAttributes: SpanAttributes;\n        spanName: string;\n        parentSampled?: boolean;\n        parentSampleRate?: number;\n        parentContext?: SpanContextData;\n      },\n      samplingDecision: { decision: boolean },\n    ) => void,\n  ): void;\n\n  /**\n   * Register a callback for after a span is ended.\n   * NOTE: The span cannot be mutated anymore in this callback.\n   * Receives the span as argument.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'spanEnd', callback: (span: Span) => void): () => void;\n\n  /**\n   * Register a callback for after a span is ended and the `spanEnd` hook has run.\n   * NOTE: The span cannot be mutated anymore in this callback.\n   */\n  public on(hook: 'afterSpanEnd', callback: (immutableSegmentSpan: Readonly<Span>) => void): () => void;\n\n  /**\n   * Register a callback for after a segment span is ended and the `segmentSpanEnd` hook has run.\n   * NOTE: The segment span cannot be mutated anymore in this callback.\n   */\n  public on(hook: 'afterSegmentSpanEnd', callback: (immutableSegmentSpan: Readonly<Span>) => void): () => void;\n\n  /**\n   * Register a callback to preprocess a span JSON _before_ it is passed to the `processSpan` and\n   * `processSegmentSpan` hooks. Use this to backfill data that subsequent hooks rely on.\n   * The optional `hint` exposes additional context about the originating span (e.g. the OTel `spanKind`).\n   */\n  public on(\n    hook: 'preprocessSpan',\n    callback: (streamedSpanJSON: StreamedSpanJSON, hint?: { spanKind?: number }) => void,\n  ): () => void;\n\n  /**\n   * Register a callback for when a span JSON is processed, to add some data to the span JSON.\n   */\n  public on(hook: 'processSpan', callback: (streamedSpanJSON: StreamedSpanJSON) => void): () => void;\n\n  /**\n   * Register a callback for when a segment span JSON is processed, to add some data to the segment span JSON.\n   */\n  public on(hook: 'processSegmentSpan', callback: (streamedSpanJSON: StreamedSpanJSON) => void): () => void;\n\n  /**\n   * Register a callback for when an idle span is allowed to auto-finish.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'idleSpanEnableAutoFinish', callback: (span: Span) => void): () => void;\n\n  /**\n   * Register a callback for transaction start and finish.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'beforeEnvelope', callback: (envelope: Envelope) => void): () => void;\n\n  /**\n   * Register a callback that runs when stack frame metadata should be applied to an event.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'applyFrameMetadata', callback: (event: Event) => void): () => void;\n\n  /**\n   * Register a callback for before sending an event.\n   * This is called right before an event is sent and should not be used to mutate the event.\n   * Receives an Event & EventHint as arguments.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'beforeSendEvent', callback: (event: Event, hint?: EventHint | undefined) => void): () => void;\n\n  /**\n   * Register a callback for before sending a session or session aggregrates..\n   * Receives the session/aggregate as second argument.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'beforeSendSession', callback: (session: Session | SessionAggregates) => void): () => void;\n\n  /**\n   * Register a callback for preprocessing an event,\n   * before it is passed to (global) event processors.\n   * Receives an Event & EventHint as arguments.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'preprocessEvent', callback: (event: Event, hint?: EventHint | undefined) => void): () => void;\n\n  /**\n   * Register a callback for postprocessing an event,\n   * after it was passed to (global) event processors, before it is being sent.\n   * Receives an Event & EventHint as arguments.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'postprocessEvent', callback: (event: Event, hint?: EventHint | undefined) => void): () => void;\n\n  /**\n   * Register a callback for when an event has been sent.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(\n    hook: 'afterSendEvent',\n    callback: (event: Event, sendResponse: TransportMakeRequestResponse) => void,\n  ): () => void;\n\n  /**\n   * Register a callback before a breadcrumb is added.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'beforeAddBreadcrumb', callback: (breadcrumb: Breadcrumb, hint?: BreadcrumbHint) => void): () => void;\n\n  /**\n   * Register a callback when a DSC (Dynamic Sampling Context) is created.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'createDsc', callback: (dsc: DynamicSamplingContext, rootSpan?: Span) => void): () => void;\n\n  /**\n   * Register a callback when a Feedback event has been prepared.\n   * This should be used to mutate the event. The options argument can hint\n   * about what kind of mutation it expects.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(\n    hook: 'beforeSendFeedback',\n    callback: (feedback: FeedbackEvent, options?: { includeReplay?: boolean }) => void,\n  ): () => void;\n\n  /**\n   * Register a callback when the feedback widget is opened in a user's browser\n   */\n  public on(hook: 'openFeedbackWidget', callback: () => void): () => void;\n\n  /**\n   * A hook that is called when a replay session starts recording (either session or buffer mode).\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'replayStart', callback: (event: ReplayStartEvent) => void): () => void;\n\n  /**\n   * A hook that is called when a replay session stops recording, either manually or due to an\n   * internal condition such as `maxReplayDuration` expiry, send failure, or mutation limit.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'replayEnd', callback: (event: ReplayEndEvent) => void): () => void;\n\n  /**\n   * A hook for the browser tracing integrations to trigger a span start for a page load.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(\n    hook: 'startPageLoadSpan',\n    callback: (\n      options: StartSpanOptions,\n      traceOptions?: { sentryTrace?: string | undefined; baggage?: string | undefined },\n    ) => void,\n  ): () => void;\n\n  /**\n   * A hook for the browser tracing integrations to trigger the end of a page load span.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'endPageloadSpan', callback: () => void): () => void;\n\n  /**\n   * A hook for the browser tracing integrations to trigger after the pageload span was started.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'afterStartPageLoadSpan', callback: (span: Span) => void): () => void;\n\n  /**\n   * A hook for triggering right before a navigation span is started.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(\n    hook: 'beforeStartNavigationSpan',\n    callback: (options: StartSpanOptions, navigationOptions?: { isRedirect?: boolean }) => void,\n  ): () => void;\n\n  /**\n   * A hook for browser tracing integrations to trigger a span for a navigation.\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(\n    hook: 'startNavigationSpan',\n    callback: (options: StartSpanOptions, navigationOptions?: { isRedirect?: boolean }) => void,\n  ): () => void;\n\n  /**\n   * A hook for GraphQL client integration to enhance a span with request data.\n   * @returns A function that, when executed, removes the registered callback.\n   */\n  public on(\n    hook: 'beforeOutgoingRequestSpan',\n    callback: (span: Span, hint: XhrBreadcrumbHint | FetchBreadcrumbHint) => void,\n  ): () => void;\n\n  /**\n   * A hook for GraphQL client integration to enhance a breadcrumb with request data.\n   * @returns A function that, when executed, removes the registered callback.\n   */\n  public on(\n    hook: 'beforeOutgoingRequestBreadcrumb',\n    callback: (breadcrumb: Breadcrumb, hint: XhrBreadcrumbHint | FetchBreadcrumbHint) => void,\n  ): () => void;\n\n  /**\n   * A hook that is called when the client is flushing\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'flush', callback: () => void): () => void;\n\n  /**\n   * A hook that is called when the client is closing\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'close', callback: () => void): () => void;\n\n  /**\n   * A hook that is called before a log is captured. This hooks runs before `beforeSendLog` is fired.\n   *\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'beforeCaptureLog', callback: (log: Log) => void): () => void;\n\n  /**\n   * A hook that is called after a log is captured\n   *\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'afterCaptureLog', callback: (log: Log) => void): () => void;\n\n  /**\n   * A hook that is called when the client is flushing logs\n   *\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'flushLogs', callback: () => void): () => void;\n\n  /**\n   * A hook that is called after capturing a metric. This hooks runs after `beforeSendMetric` is fired.\n   *\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'afterCaptureMetric', callback: (metric: Metric) => void): () => void;\n\n  /**\n   * A hook that is called when the client is flushing metrics\n   *\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'flushMetrics', callback: () => void): () => void;\n\n  /**\n   * A hook that is called when a metric is processed before it is captured and before the `beforeSendMetric` callback is fired.\n   *\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'processMetric', callback: (metric: Metric) => void): () => void;\n\n  /**\n   * A hook that is called when a http server request is started.\n   * This hook is called after request isolation, but before the request is processed.\n   *\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(\n    hook: 'httpServerRequest',\n    callback: (request: unknown, response: unknown, normalizedRequest: RequestEventData) => void,\n  ): () => void;\n\n  /**\n   * A hook that is called when the UI Profiler should start profiling.\n   *\n   * This hook is called when running `Sentry.uiProfiler.startProfiler()`.\n   *\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'startUIProfiler', callback: () => void): () => void;\n\n  /**\n   * A hook that is called when the UI Profiler should stop profiling.\n   *\n   * This hook is called when running `Sentry.uiProfiler.stopProfiler()`.\n   *\n   * @returns {() => void} A function that, when executed, removes the registered callback.\n   */\n  public on(hook: 'stopUIProfiler', callback: () => void): () => void;\n\n  /**\n   * Register a hook on this client.\n   */\n  public on(hook: string, callback: unknown): () => void {\n    const hookCallbacks = (this._hooks[hook] = this._hooks[hook] || new Set());\n\n    // Wrap the callback in a function so that registering the same callback instance multiple\n    // times results in the callback being called multiple times.\n    // @ts-expect-error - The `callback` type is correct and must be a function due to the\n    // individual, specific overloads of this function.\n    // eslint-disable-next-line @typescript-eslint/ban-types\n    const uniqueCallback: Function = (...args: unknown[]) => callback(...args);\n\n    hookCallbacks.add(uniqueCallback);\n\n    // This function returns a callback execution handler that, when invoked,\n    // deregisters a callback. This is crucial for managing instances where callbacks\n    // need to be unregistered to prevent self-referencing in callback closures,\n    // ensuring proper garbage collection.\n    return () => {\n      hookCallbacks.delete(uniqueCallback);\n    };\n  }\n\n  /** Fire a hook whenever a span starts. */\n  public emit(hook: 'spanStart', span: Span): void;\n\n  /** A hook that is called every time before a span is sampled. */\n  public emit(\n    hook: 'beforeSampling',\n    samplingData: {\n      spanAttributes: SpanAttributes;\n      spanName: string;\n      parentSampled?: boolean;\n      parentSampleRate?: number;\n      parentContext?: SpanContextData;\n    },\n    samplingDecision: { decision: boolean },\n  ): void;\n\n  /** Fire a hook whenever a span ends. */\n  public emit(hook: 'spanEnd', span: Span): void;\n\n  /**\n   * Fire a hook event after a span ends and the `spanEnd` hook has run.\n   */\n  public emit(hook: 'afterSpanEnd', immutableSpan: Readonly<Span>): void;\n\n  /**\n   * Fire a hook event after a segment span ends and the `spanEnd` hook has run.\n   */\n  public emit(hook: 'afterSegmentSpanEnd', immutableSegmentSpan: Readonly<Span>): void;\n\n  /**\n   * Fire a hook event to preprocess a span JSON before the `processSpan` and `processSegmentSpan` hooks run.\n   */\n  public emit(hook: 'preprocessSpan', streamedSpanJSON: StreamedSpanJSON, hint?: { spanKind?: number }): void;\n\n  /**\n   * Fire a hook event when a span JSON is processed, to add some data to the span JSON.\n   */\n  public emit(hook: 'processSpan', streamedSpanJSON: StreamedSpanJSON): void;\n\n  /**\n   * Fire a hook event for when a segment span JSON is processed, to add some data to the segment span JSON.\n   */\n  public emit(hook: 'processSegmentSpan', streamedSpanJSON: StreamedSpanJSON): void;\n\n  /**\n   * Fire a hook indicating that an idle span is allowed to auto finish.\n   */\n  public emit(hook: 'idleSpanEnableAutoFinish', span: Span): void;\n\n  /**\n   * Fire a hook event for envelope creation and sending. Expects to be given an envelope as the\n   * second argument.\n   */\n  public emit(hook: 'beforeEnvelope', envelope: Envelope): void;\n\n  /**\n   * Fire a hook indicating that stack frame metadata should be applied to the event passed to the hook.\n   */\n  public emit(hook: 'applyFrameMetadata', event: Event): void;\n\n  /**\n   * Fire a hook event before sending an event.\n   * This is called right before an event is sent and should not be used to mutate the event.\n   * Expects to be given an Event & EventHint as the second/third argument.\n   */\n  public emit(hook: 'beforeSendEvent', event: Event, hint?: EventHint): void;\n\n  /**\n   * Fire a hook event before sending a session/aggregates.\n   * Expects to be given the prepared session/aggregates as second argument.\n   */\n  public emit(hook: 'beforeSendSession', session: Session | SessionAggregates): void;\n\n  /**\n   * Fire a hook event to process events before they are passed to (global) event processors.\n   * Expects to be given an Event & EventHint as the second/third argument.\n   */\n  public emit(hook: 'preprocessEvent', event: Event, hint?: EventHint): void;\n\n  /**\n   * Fire a hook event to process a user on an event before it is sent to Sentry, after all other processors have run.\n   * Expects to be given an Event & EventHint as the second/third argument.\n   */\n  public emit(hook: 'postprocessEvent', event: Event, hint?: EventHint): void;\n\n  /**\n   * Fire a hook event after sending an event. Expects to be given an Event as the\n   * second argument.\n   */\n  public emit(hook: 'afterSendEvent', event: Event, sendResponse: TransportMakeRequestResponse): void;\n\n  /**\n   * Fire a hook for when a breadcrumb is added. Expects the breadcrumb as second argument.\n   */\n  public emit(hook: 'beforeAddBreadcrumb', breadcrumb: Breadcrumb, hint?: BreadcrumbHint): void;\n\n  /**\n   * Fire a hook for when a DSC (Dynamic Sampling Context) is created. Expects the DSC as second argument.\n   */\n  public emit(hook: 'createDsc', dsc: DynamicSamplingContext, rootSpan?: Span): void;\n\n  /**\n   * Fire a hook event for after preparing a feedback event. Events to be given\n   * a feedback event as the second argument, and an optional options object as\n   * third argument.\n   */\n  public emit(hook: 'beforeSendFeedback', feedback: FeedbackEvent, options?: { includeReplay?: boolean }): void;\n\n  /**\n   * Fire a hook event for when the feedback widget is opened in a user's browser\n   */\n  public emit(hook: 'openFeedbackWidget'): void;\n\n  /**\n   * Fire a hook event when a replay session starts recording.\n   */\n  public emit(hook: 'replayStart', event: ReplayStartEvent): void;\n\n  /**\n   * Fire a hook event when a replay session stops recording.\n   */\n  public emit(hook: 'replayEnd', event: ReplayEndEvent): void;\n\n  /**\n   * Emit a hook event for browser tracing integrations to trigger a span start for a page load.\n   */\n  public emit(\n    hook: 'startPageLoadSpan',\n    options: StartSpanOptions,\n    traceOptions?: { sentryTrace?: string | undefined; baggage?: string | undefined },\n  ): void;\n\n  /**\n   * Emit a hook event for browser tracing integrations to trigger the end of a page load span.\n   */\n  public emit(hook: 'endPageloadSpan'): void;\n\n  /**\n   * Emit a hook event for browser tracing integrations to trigger after the pageload span was started.\n   */\n  public emit(hook: 'afterStartPageLoadSpan', span: Span): void;\n\n  /**\n   * Emit a hook event for triggering right before a navigation span is started.\n   */\n  public emit(\n    hook: 'beforeStartNavigationSpan',\n    options: StartSpanOptions,\n    navigationOptions?: { isRedirect?: boolean },\n  ): void;\n\n  /**\n   * Emit a hook event for browser tracing integrations to trigger a span for a navigation.\n   */\n  public emit(\n    hook: 'startNavigationSpan',\n    options: StartSpanOptions,\n    navigationOptions?: { isRedirect?: boolean },\n  ): void;\n\n  /**\n   * Emit a hook event for GraphQL client integration to enhance a span with request data.\n   */\n  public emit(hook: 'beforeOutgoingRequestSpan', span: Span, hint: XhrBreadcrumbHint | FetchBreadcrumbHint): void;\n\n  /**\n   * Emit a hook event for GraphQL client integration to enhance a breadcrumb with request data.\n   */\n  public emit(\n    hook: 'beforeOutgoingRequestBreadcrumb',\n    breadcrumb: Breadcrumb,\n    hint: XhrBreadcrumbHint | FetchBreadcrumbHint,\n  ): void;\n\n  /**\n   * Emit a hook event for client flush\n   */\n  public emit(hook: 'flush'): void;\n\n  /**\n   * Emit a hook event for client close\n   */\n  public emit(hook: 'close'): void;\n\n  /**\n   * Emit a hook event for client before capturing a log. This hooks runs before `beforeSendLog` is fired.\n   */\n  public emit(hook: 'beforeCaptureLog', log: Log): void;\n\n  /**\n   * Emit a hook event for client after capturing a log.\n   */\n  public emit(hook: 'afterCaptureLog', log: Log): void;\n\n  /**\n   * Emit a hook event for client flush logs\n   */\n  public emit(hook: 'flushLogs'): void;\n\n  /**\n   * Emit a hook event for client after capturing a metric.\n   */\n  public emit(hook: 'afterCaptureMetric', metric: Metric): void;\n\n  /**\n   * Emit a hook event for client flush metrics\n   */\n  public emit(hook: 'flushMetrics'): void;\n\n  /**\n   *\n   * Emit a hook event for client to process a metric before it is captured.\n   * This hook is called before the `beforeSendMetric` callback is fired.\n   */\n  public emit(hook: 'processMetric', metric: Metric): void;\n\n  /**\n   * Emit a hook event for client when a http server request is started.\n   * This hook is called after request isolation, but before the request is processed.\n   */\n  public emit(\n    hook: 'httpServerRequest',\n    request: unknown,\n    response: unknown,\n    normalizedRequest: RequestEventData,\n  ): void;\n\n  /**\n   * Emit a hook event for starting the UI Profiler.\n   */\n  public emit(hook: 'startUIProfiler'): void;\n\n  /**\n   * Emit a hook event for stopping the UI Profiler.\n   */\n  public emit(hook: 'stopUIProfiler'): void;\n\n  /**\n   * Emit a hook that was previously registered via `on()`.\n   */\n  public emit(hook: string, ...rest: unknown[]): void {\n    const callbacks = this._hooks[hook];\n    if (callbacks) {\n      callbacks.forEach(callback => callback(...rest));\n    }\n  }\n\n  /**\n   * Send an envelope to Sentry.\n   */\n  // @ts-expect-error - PromiseLike is a subset of Promise\n  public async sendEnvelope(envelope: Envelope): PromiseLike<TransportMakeRequestResponse> {\n    this.emit('beforeEnvelope', envelope);\n\n    if (this._isEnabled() && this._transport) {\n      try {\n        return await this._transport.send(envelope);\n      } catch (reason) {\n        DEBUG_BUILD && debug.error('Error while sending envelope:', reason);\n        return {};\n      }\n    }\n\n    DEBUG_BUILD && debug.error('Transport disabled');\n    return {};\n  }\n\n  /**\n   * Register a cleanup function to be called when the client is disposed.\n   * This is useful for integrations that need to clean up global state.\n   *\n   * NOTE: This is a no-op in the base `Client` class. Subclasses like `ServerRuntimeClient`\n   * override this method to actually register and execute cleanup callbacks.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  public registerCleanup(callback: () => void): void {\n    // No-op in base class - subclasses override to implement cleanup registration\n  }\n\n  /**\n   * Disposes of the client and releases all resources.\n   *\n   * Subclasses should override this method to clean up their own resources, including invoking\n   * any callbacks registered via {@link Client.registerCleanup}. The base implementation is a\n   * no-op and does NOT execute registered cleanup callbacks.\n   *\n   * After calling dispose(), the client should not be used anymore.\n   */\n  public dispose(): void {\n    // Base class has no cleanup logic - subclasses implement their own\n  }\n\n  /* eslint-enable @typescript-eslint/unified-signatures */\n\n  /** Setup integrations for this client. */\n  protected _setupIntegrations(): void {\n    const { integrations } = this._options;\n    this._integrations = setupIntegrations(this, integrations);\n    afterSetupIntegrations(this, integrations);\n  }\n\n  /** Updates existing session based on the provided event */\n  protected _updateSessionFromEvent(session: Session, event: Event): void {\n    // initially, set `crashed` based on the event level and update from exceptions if there are any later on\n    let crashed = event.level === 'fatal';\n    let errored = false;\n    const exceptions = event.exception?.values;\n\n    if (exceptions) {\n      errored = true;\n      // reset crashed to false if there are exceptions, to ensure `mechanism.handled` is respected.\n      crashed = false;\n\n      for (const ex of exceptions) {\n        if (ex.mechanism?.handled === false) {\n          crashed = true;\n          break;\n        }\n      }\n    }\n\n    // A session is updated and that session update is sent in only one of the two following scenarios:\n    // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n    // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n    const sessionNonTerminal = session.status === 'ok';\n    const shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed);\n\n    if (shouldUpdateAndSend) {\n      updateSession(session, {\n        ...(crashed && { status: 'crashed' }),\n        errors: session.errors || Number(errored || crashed),\n      });\n      this.captureSession(session);\n    }\n  }\n\n  /**\n   * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n   * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n   *\n   * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n   * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n   * `true`.\n   * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n   * `false` otherwise\n   */\n  protected async _isClientDoneProcessing(timeout?: number): Promise<boolean> {\n    let ticked = 0;\n\n    while (!timeout || ticked < timeout) {\n      await new Promise(resolve => setTimeout(resolve, 1));\n\n      if (!this._numProcessing) {\n        return true;\n      }\n      ticked++;\n    }\n\n    return false;\n  }\n\n  /** Determines whether this SDK is enabled and a transport is present. */\n  protected _isEnabled(): boolean {\n    return this.getOptions().enabled !== false && this._transport !== undefined;\n  }\n\n  /**\n   * Adds common information to events.\n   *\n   * The information includes release and environment from `options`,\n   * breadcrumbs and context (extra, tags and user) from the scope.\n   *\n   * Information that is already present in the event is never overwritten. For\n   * nested objects, such as the context, keys are merged.\n   *\n   * @param event The original event.\n   * @param hint May contain additional information about the original exception.\n   * @param currentScope A scope containing event metadata.\n   * @returns A new event with more information.\n   */\n  protected _prepareEvent(\n    event: Event,\n    hint: EventHint,\n    currentScope: Scope,\n    isolationScope: Scope,\n  ): PromiseLike<Event | null> {\n    const options = this.getOptions();\n    const integrations = this.getIntegrationNames();\n    if (!hint.integrations && integrations.length) {\n      hint.integrations = integrations;\n    }\n\n    this.emit('preprocessEvent', event, hint);\n\n    if (!event.type) {\n      isolationScope.setLastEventId(event.event_id || hint.event_id);\n    }\n\n    return prepareEvent(options, event, hint, currentScope, this, isolationScope).then(evt => {\n      if (evt === null) {\n        return evt;\n      }\n\n      this.emit('postprocessEvent', evt, hint);\n\n      evt.contexts = {\n        trace: { ...evt.contexts?.trace, ...getTraceContextFromScope(currentScope) },\n        ...evt.contexts,\n      };\n\n      const dynamicSamplingContext = getDynamicSamplingContextFromScope(this, currentScope);\n\n      evt.sdkProcessingMetadata = {\n        dynamicSamplingContext,\n        ...evt.sdkProcessingMetadata,\n      };\n\n      return evt;\n    });\n  }\n\n  /**\n   * Processes the event and logs an error in case of rejection\n   * @param event\n   * @param hint\n   * @param scope\n   */\n  protected _captureEvent(\n    event: Event,\n    hint: EventHint = {},\n    currentScope = getCurrentScope(),\n    isolationScope = getIsolationScope(),\n  ): PromiseLike<string | undefined> {\n    if (DEBUG_BUILD && isErrorEvent(event)) {\n      debug.log(`Captured error event \\`${getPossibleEventMessages(event)[0] || '<unknown>'}\\``);\n    }\n\n    return this._processEvent(event, hint, currentScope, isolationScope).then(\n      finalEvent => {\n        return finalEvent.event_id;\n      },\n      reason => {\n        if (DEBUG_BUILD) {\n          if (_isDoNotSendEventError(reason)) {\n            debug.log(reason.message);\n          } else if (_isInternalError(reason)) {\n            debug.warn(reason.message);\n          } else {\n            debug.warn(reason);\n          }\n        }\n        return undefined;\n      },\n    );\n  }\n\n  /**\n   * Processes an event (either error or message) and sends it to Sentry.\n   *\n   * This also adds breadcrumbs and context information to the event. However,\n   * platform specific meta data (such as the User's IP address) must be added\n   * by the SDK implementor.\n   *\n   *\n   * @param event The event to send to Sentry.\n   * @param hint May contain additional information about the original exception.\n   * @param currentScope A scope containing event metadata.\n   * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n   */\n  protected _processEvent(\n    event: Event,\n    hint: EventHint,\n    currentScope: Scope,\n    isolationScope: Scope,\n  ): PromiseLike<Event> {\n    const options = this.getOptions();\n    const { sampleRate } = options;\n\n    const isTransaction = isTransactionEvent(event);\n    const isError = isErrorEvent(event);\n    const eventType = event.type || 'error';\n    const beforeSendLabel = `before send for type \\`${eventType}\\``;\n\n    // 1.0 === 100% events are sent\n    // 0.0 === 0% events are sent\n    // Sampling for transaction happens somewhere else\n    const parsedSampleRate = typeof sampleRate === 'undefined' ? undefined : parseSampleRate(sampleRate);\n    if (isError && typeof parsedSampleRate === 'number' && safeMathRandom() > parsedSampleRate) {\n      this.recordDroppedEvent('sample_rate', 'error');\n      return rejectedSyncPromise(\n        _makeDoNotSendEventError(\n          `Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`,\n        ),\n      );\n    }\n\n    const dataCategory = getDataCategoryByType(event.type);\n\n    return this._prepareEvent(event, hint, currentScope, isolationScope)\n      .then(prepared => {\n        if (prepared === null) {\n          this.recordDroppedEvent('event_processor', dataCategory);\n          throw _makeDoNotSendEventError('An event processor returned `null`, will not send event.');\n        }\n\n        const isInternalException = (hint.data as { __sentry__: boolean })?.__sentry__ === true;\n        if (isInternalException) {\n          return prepared;\n        }\n\n        const result = processBeforeSend(this, options, prepared, hint);\n        return _validateBeforeSendResult(result, beforeSendLabel);\n      })\n      .then(processedEvent => {\n        if (processedEvent === null) {\n          this.recordDroppedEvent('before_send', dataCategory);\n          if (isTransaction) {\n            const spans = event.spans || [];\n            // the transaction itself counts as one span, plus all the child spans that are added\n            const spanCount = 1 + spans.length;\n            this.recordDroppedEvent('before_send', 'span', spanCount);\n          }\n          throw _makeDoNotSendEventError(`${beforeSendLabel} returned \\`null\\`, will not send event.`);\n        }\n\n        const session = currentScope.getSession() || isolationScope.getSession();\n        if (isError && session) {\n          this._updateSessionFromEvent(session, processedEvent);\n        }\n\n        if (isTransaction) {\n          const spanCountBefore = processedEvent.sdkProcessingMetadata?.spanCountBeforeProcessing || 0;\n          const spanCountAfter = processedEvent.spans ? processedEvent.spans.length : 0;\n\n          const droppedSpanCount = spanCountBefore - spanCountAfter;\n          if (droppedSpanCount > 0) {\n            this.recordDroppedEvent('before_send', 'span', droppedSpanCount);\n          }\n        }\n\n        // None of the Sentry built event processor will update transaction name,\n        // so if the transaction name has been changed by an event processor, we know\n        // it has to come from custom event processor added by a user\n        const transactionInfo = processedEvent.transaction_info;\n        if (isTransaction && transactionInfo && processedEvent.transaction !== event.transaction) {\n          const source = 'custom';\n          processedEvent.transaction_info = {\n            ...transactionInfo,\n            source,\n          };\n        }\n\n        this.sendEvent(processedEvent, hint);\n        return processedEvent;\n      })\n      .then(null, reason => {\n        if (_isDoNotSendEventError(reason) || _isInternalError(reason)) {\n          throw reason;\n        }\n\n        this.captureException(reason, {\n          mechanism: {\n            handled: false,\n            type: 'internal',\n          },\n          data: {\n            __sentry__: true,\n          },\n          originalException: reason,\n        });\n        throw _makeInternalError(\n          `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: ${reason}`,\n        );\n      });\n  }\n\n  /**\n   * Occupies the client with processing and event\n   */\n  protected _process<T>(taskProducer: () => PromiseLike<T>, dataCategory: DataCategory): void {\n    this._numProcessing++;\n\n    void this._promiseBuffer.add(taskProducer).then(\n      value => {\n        this._numProcessing--;\n        return value;\n      },\n      reason => {\n        this._numProcessing--;\n\n        if (reason === SENTRY_BUFFER_FULL_ERROR) {\n          this.recordDroppedEvent('queue_overflow', dataCategory);\n        }\n\n        return reason;\n      },\n    );\n  }\n\n  /**\n   * Clears outcomes on this client and returns them.\n   */\n  protected _clearOutcomes(): Outcome[] {\n    const outcomes = this._outcomes;\n    this._outcomes = {};\n    return Object.entries(outcomes).map(([key, quantity]) => {\n      const [reason, category] = key.split(':') as [EventDropReason, DataCategory];\n      return {\n        reason,\n        category,\n        quantity,\n      };\n    });\n  }\n\n  /**\n   * Sends client reports as an envelope.\n   */\n  protected _flushOutcomes(): void {\n    DEBUG_BUILD && debug.log('Flushing outcomes...');\n\n    const outcomes = this._clearOutcomes();\n\n    if (outcomes.length === 0) {\n      DEBUG_BUILD && debug.log('No outcomes to send');\n      return;\n    }\n\n    // This is really the only place where we want to check for a DSN and only send outcomes then\n    if (!this._dsn) {\n      DEBUG_BUILD && debug.log('No dsn provided, will not send outcomes');\n      return;\n    }\n\n    DEBUG_BUILD && debug.log('Sending outcomes:', outcomes);\n\n    const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));\n\n    // sendEnvelope should not throw\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.sendEnvelope(envelope);\n  }\n\n  /**\n   * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n   */\n  public abstract eventFromException(_exception: unknown, _hint?: EventHint): PromiseLike<Event>;\n\n  /**\n   * Creates an {@link Event} from primitive inputs to `captureMessage`.\n   */\n  public abstract eventFromMessage(\n    _message: ParameterizedString,\n    _level?: SeverityLevel,\n    _hint?: EventHint,\n  ): PromiseLike<Event>;\n}\n\nfunction getDataCategoryByType(type: EventType | 'replay_event' | undefined): DataCategory {\n  return type === 'replay_event' ? 'replay' : type || 'error';\n}\n\n/**\n * Verifies that return value of configured `beforeSend` or `beforeSendTransaction` is of expected type, and returns the value if so.\n */\nfunction _validateBeforeSendResult(\n  beforeSendResult: PromiseLike<Event | null> | Event | null,\n  beforeSendLabel: string,\n): PromiseLike<Event | null> | Event | null {\n  const invalidValueError = `${beforeSendLabel} must return \\`null\\` or a valid event.`;\n  if (isThenable(beforeSendResult)) {\n    return beforeSendResult.then(\n      event => {\n        if (!isPlainObject(event) && event !== null) {\n          throw _makeInternalError(invalidValueError);\n        }\n        return event;\n      },\n      e => {\n        throw _makeInternalError(`${beforeSendLabel} rejected with ${e}`);\n      },\n    );\n  } else if (!isPlainObject(beforeSendResult) && beforeSendResult !== null) {\n    throw _makeInternalError(invalidValueError);\n  }\n  return beforeSendResult;\n}\n\n/**\n * Process the matching `beforeSendXXX` callback.\n */\nfunction processBeforeSend(\n  client: Client,\n  options: ClientOptions,\n  event: Event,\n  hint: EventHint,\n): PromiseLike<Event | null> | Event | null {\n  const { beforeSend, beforeSendTransaction, ignoreSpans } = options;\n  const beforeSendSpan = !isStreamedBeforeSendSpanCallback(options.beforeSendSpan) && options.beforeSendSpan;\n\n  let processedEvent = event;\n\n  if (isErrorEvent(processedEvent) && beforeSend) {\n    return beforeSend(processedEvent, hint);\n  }\n\n  if (isTransactionEvent(processedEvent)) {\n    // Avoid processing if we don't have to\n    if (beforeSendSpan || ignoreSpans) {\n      // 1. Process root span\n      const rootSpanJson = convertTransactionEventToSpanJson(processedEvent);\n\n      // 1.1 If the root span should be ignored, drop the whole transaction\n      if (\n        ignoreSpans?.length &&\n        shouldIgnoreSpan(\n          { description: rootSpanJson.description, op: rootSpanJson.op, attributes: rootSpanJson.data },\n          ignoreSpans,\n        )\n      ) {\n        // dropping the whole transaction!\n        return null;\n      }\n\n      // 1.2 If a `beforeSendSpan` callback is defined, process the root span\n      if (beforeSendSpan) {\n        const processedRootSpanJson = beforeSendSpan(rootSpanJson);\n        if (!processedRootSpanJson) {\n          showSpanDropWarning();\n        } else {\n          // update event with processed root span values\n          processedEvent = merge(event, convertSpanJsonToTransactionEvent(processedRootSpanJson));\n        }\n      }\n\n      // 2. Process child spans\n      if (processedEvent.spans) {\n        const processedSpans: SpanJSON[] = [];\n\n        const initialSpans = processedEvent.spans;\n\n        for (const span of initialSpans) {\n          // 2.a If the child span should be ignored, reparent it to the root span\n          if (\n            ignoreSpans?.length &&\n            shouldIgnoreSpan({ description: span.description, op: span.op, attributes: span.data }, ignoreSpans)\n          ) {\n            reparentChildSpans(initialSpans, span);\n            continue;\n          }\n\n          // 2.b If a `beforeSendSpan` callback is defined, process the child span\n          if (beforeSendSpan) {\n            const processedSpan = beforeSendSpan(span);\n            if (!processedSpan) {\n              showSpanDropWarning();\n              processedSpans.push(span);\n            } else {\n              processedSpans.push(processedSpan);\n            }\n          } else {\n            processedSpans.push(span);\n          }\n        }\n\n        const droppedSpans = processedEvent.spans.length - processedSpans.length;\n        if (droppedSpans) {\n          client.recordDroppedEvent('before_send', 'span', droppedSpans);\n        }\n\n        processedEvent.spans = processedSpans;\n      }\n    }\n\n    if (beforeSendTransaction) {\n      if (processedEvent.spans) {\n        // We store the # of spans before processing in SDK metadata,\n        // so we can compare it afterwards to determine how many spans were dropped\n        const spanCountBefore = processedEvent.spans.length;\n        processedEvent.sdkProcessingMetadata = {\n          ...event.sdkProcessingMetadata,\n          spanCountBeforeProcessing: spanCountBefore,\n        };\n      }\n      return beforeSendTransaction(processedEvent as TransactionEvent, hint);\n    }\n  }\n\n  return processedEvent;\n}\n\nfunction isErrorEvent(event: Event): event is ErrorEvent {\n  return event.type === undefined;\n}\n\nfunction isTransactionEvent(event: Event): event is TransactionEvent {\n  return event.type === 'transaction';\n}\n\n/**\n * Estimate the size of a metric in bytes.\n *\n * @param metric - The metric to estimate the size of.\n * @returns The estimated size of the metric in bytes.\n */\nfunction estimateMetricSizeInBytes(metric: Metric): number {\n  let weight = 0;\n\n  // Estimate byte size of 2 bytes per character. This is a rough estimate JS strings are stored as UTF-16.\n  if (metric.name) {\n    weight += metric.name.length * 2;\n  }\n\n  // Add weight for number\n  weight += 8;\n\n  return weight + estimateAttributesSizeInBytes(metric.attributes);\n}\n\n/**\n * Estimate the size of a log in bytes.\n *\n * @param log - The log to estimate the size of.\n * @returns The estimated size of the log in bytes.\n */\nfunction estimateLogSizeInBytes(log: Log): number {\n  let weight = 0;\n\n  // Estimate byte size of 2 bytes per character. This is a rough estimate JS strings are stored as UTF-16.\n  if (log.message) {\n    weight += log.message.length * 2;\n  }\n\n  return weight + estimateAttributesSizeInBytes(log.attributes);\n}\n\n/**\n * Estimate the size of attributes in bytes.\n *\n * @param attributes - The attributes object to estimate the size of.\n * @returns The estimated size of the attributes in bytes.\n */\nfunction estimateAttributesSizeInBytes(attributes: Record<string, unknown> | undefined): number {\n  if (!attributes) {\n    return 0;\n  }\n\n  let weight = 0;\n\n  Object.values(attributes).forEach(value => {\n    if (Array.isArray(value)) {\n      weight += value.length * estimatePrimitiveSizeInBytes(value[0]);\n    } else if (isPrimitive(value)) {\n      weight += estimatePrimitiveSizeInBytes(value);\n    } else {\n      // For objects values, we estimate the size of the object as 100 bytes\n      weight += 100;\n    }\n  });\n\n  return weight;\n}\n\nfunction estimatePrimitiveSizeInBytes(value: Primitive): number {\n  if (typeof value === 'string') {\n    return value.length * 2;\n  } else if (typeof value === 'number') {\n    return 8;\n  } else if (typeof value === 'boolean') {\n    return 4;\n  }\n\n  return 0;\n}\n","import type { Client } from '../../client';\nimport type { SpanContainerItem } from '../../types/envelope';\nimport type { Event } from '../../types/event';\nimport { isBrowser } from '../../utils/isBrowser';\nimport { hasSpanStreamingEnabled } from './hasSpanStreamingEnabled';\nimport { spanJsonToSerializedStreamedSpan } from './spanJsonToStreamedSpan';\n\n/**\n * Extracts gen_ai spans from a transaction event, converts them to span v2 format,\n * and returns them as a SpanContainerItem.\n *\n * Only applies to static mode (non-streaming) transactions.\n *\n * WARNING: This function mutates `event.spans` by removing the extracted gen_ai spans\n * from the array. Call this before creating the event envelope so the transaction\n * item does not include the extracted spans.\n */\nexport function extractGenAiSpansFromEvent(event: Event, client: Client): SpanContainerItem | undefined {\n  if (\n    event.type !== 'transaction' ||\n    !event.spans?.length ||\n    !event.sdkProcessingMetadata?.hasGenAiSpans ||\n    client.getOptions().streamGenAiSpans === false ||\n    hasSpanStreamingEnabled(client)\n  ) {\n    return undefined;\n  }\n\n  const genAiSpans = [];\n  const remainingSpans = [];\n\n  for (const span of event.spans) {\n    if (span.op?.startsWith('gen_ai.')) {\n      genAiSpans.push(spanJsonToSerializedStreamedSpan(span));\n    } else {\n      remainingSpans.push(span);\n    }\n  }\n\n  if (genAiSpans.length === 0) {\n    return undefined;\n  }\n\n  event.spans = remainingSpans;\n\n  const inferSetting = client.getDataCollectionOptions().userInfo ? 'auto' : 'never';\n\n  return [\n    { type: 'span', item_count: genAiSpans.length, content_type: 'application/vnd.sentry.items.span.v2+json' },\n    {\n      version: 2,\n      ...(isBrowser() && {\n        ingest_settings: { infer_ip: inferSetting, infer_user_agent: inferSetting },\n      }),\n      items: genAiSpans,\n    },\n  ];\n}\n","import type { Client } from '../../client';\n\n/**\n * Determines if span streaming is enabled for the given client\n */\nexport function hasSpanStreamingEnabled(client: Client): boolean {\n  return client.getOptions().traceLifecycle === 'stream';\n}\n","import type { Client } from './client';\nimport { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext';\nimport type { SentrySpan } from './tracing/sentrySpan';\nimport { isStreamedBeforeSendSpanCallback } from './tracing/spans/beforeSendSpan';\nimport type { LegacyCSPReport } from './types/csp';\nimport type { DsnComponents } from './types/dsn';\nimport type {\n  DynamicSamplingContext,\n  EventEnvelope,\n  EventItem,\n  RawSecurityEnvelope,\n  RawSecurityItem,\n  SessionEnvelope,\n  SessionItem,\n  SpanEnvelope,\n  SpanItem,\n} from './types/envelope';\nimport type { Event } from './types/event';\nimport type { SdkInfo } from './types/sdkinfo';\nimport type { SdkMetadata } from './types/sdkmetadata';\nimport type { Session, SessionAggregates } from './types/session';\nimport { dsnToString } from './utils/dsn';\nimport {\n  createEnvelope,\n  createEventEnvelopeHeaders,\n  createSpanEnvelopeItem,\n  getSdkMetadataForEnvelopeHeader,\n} from './utils/envelope';\nimport { uuid4 } from './utils/misc';\nimport { safeDateNow } from './utils/randomSafeContext';\nimport { shouldIgnoreSpan } from './utils/should-ignore-span';\nimport { showSpanDropWarning, spanToJSON } from './utils/spanUtils';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n *\n * @internal, exported only for testing\n **/\nexport function _enhanceEventWithSdkInfo(event: Event, newSdkInfo?: SdkInfo): Event {\n  if (!newSdkInfo) {\n    return event;\n  }\n\n  const eventSdkInfo = event.sdk || {};\n\n  event.sdk = {\n    ...eventSdkInfo,\n    name: eventSdkInfo.name || newSdkInfo.name,\n    version: eventSdkInfo.version || newSdkInfo.version,\n    integrations: [...(event.sdk?.integrations || []), ...(newSdkInfo.integrations || [])],\n    packages: [...(event.sdk?.packages || []), ...(newSdkInfo.packages || [])],\n    settings:\n      event.sdk?.settings || newSdkInfo.settings\n        ? {\n            ...event.sdk?.settings,\n            ...newSdkInfo.settings,\n          }\n        : undefined,\n  };\n\n  return event;\n}\n\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(\n  session: Session | SessionAggregates,\n  dsn?: DsnComponents,\n  metadata?: SdkMetadata,\n  tunnel?: string,\n): SessionEnvelope {\n  const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n  const envelopeHeaders = {\n    sent_at: new Date(safeDateNow()).toISOString(),\n    ...(sdkInfo && { sdk: sdkInfo }),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n  };\n\n  const envelopeItem: SessionItem =\n    'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session.toJSON()];\n\n  return createEnvelope<SessionEnvelope>(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nexport function createEventEnvelope(\n  event: Event,\n  dsn?: DsnComponents,\n  metadata?: SdkMetadata,\n  tunnel?: string,\n): EventEnvelope {\n  const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n  /*\n    Note: Due to TS, event.type may be `replay_event`, theoretically.\n    In practice, we never call `createEventEnvelope` with `replay_event` type,\n    and we'd have to adjust a looot of types to make this work properly.\n    We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n    So the safe choice is to really guard against the replay_event type here.\n  */\n  const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n  _enhanceEventWithSdkInfo(event, metadata?.sdk);\n\n  const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n  // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n  // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n  // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n  // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n  delete event.sdkProcessingMetadata;\n\n  const eventItem: EventItem = [{ type: eventType }, event];\n  return createEnvelope<EventEnvelope>(envelopeHeaders, [eventItem]);\n}\n\n/**\n * Create envelope from Span item.\n *\n * Takes an optional client and runs spans through `beforeSendSpan` if available.\n */\nexport function createSpanEnvelope(spans: [SentrySpan, ...SentrySpan[]], client?: Client): SpanEnvelope {\n  function dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n    return !!dsc.trace_id && !!dsc.public_key;\n  }\n\n  // For the moment we'll obtain the DSC from the first span in the array\n  // This might need to be changed if we permit sending multiple spans from\n  // different segments in one envelope\n  const dsc = getDynamicSamplingContextFromSpan(spans[0]);\n\n  const dsn = client?.getDsn();\n  const tunnel = client?.getOptions().tunnel;\n\n  const headers: SpanEnvelope[0] = {\n    sent_at: new Date(safeDateNow()).toISOString(),\n    ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n  };\n\n  const { beforeSendSpan, ignoreSpans } = client?.getOptions() || {};\n\n  const filteredSpans = ignoreSpans?.length\n    ? spans.filter(span => {\n        const json = spanToJSON(span);\n        return !shouldIgnoreSpan({ description: json.description, op: json.op, attributes: json.data }, ignoreSpans);\n      })\n    : spans;\n  const droppedSpans = spans.length - filteredSpans.length;\n\n  if (droppedSpans) {\n    client?.recordDroppedEvent('before_send', 'span', droppedSpans);\n  }\n\n  const convertToSpanJSON = beforeSendSpan\n    ? (span: SentrySpan) => {\n        const spanJson = spanToJSON(span);\n        const processedSpan = !isStreamedBeforeSendSpanCallback(beforeSendSpan) ? beforeSendSpan(spanJson) : spanJson;\n\n        if (!processedSpan) {\n          showSpanDropWarning();\n          return spanJson;\n        }\n\n        return processedSpan;\n      }\n    : spanToJSON;\n\n  const items: SpanItem[] = [];\n  for (const span of filteredSpans) {\n    const spanJson = convertToSpanJSON(span);\n    if (spanJson) {\n      items.push(createSpanEnvelopeItem(spanJson));\n    }\n  }\n\n  return createEnvelope<SpanEnvelope>(headers, items);\n}\n\n/**\n * Create an Envelope from a CSP report.\n */\nexport function createRawSecurityEnvelope(\n  report: LegacyCSPReport,\n  dsn: DsnComponents,\n  tunnel?: string,\n  release?: string,\n  environment?: string,\n): RawSecurityEnvelope {\n  const envelopeHeaders = {\n    event_id: uuid4(),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n  };\n\n  const eventItem: RawSecurityItem = [\n    { type: 'raw_security', sentry_release: release, sentry_environment: environment },\n    report,\n  ];\n\n  return createEnvelope<RawSecurityEnvelope>(envelopeHeaders, [eventItem]);\n}\n","/**\n * Parse a sample rate from a given value.\n * This will either return a boolean or number sample rate, if the sample rate is valid (between 0 and 1).\n * If a string is passed, we try to convert it to a number.\n *\n * Any invalid sample rate will return `undefined`.\n */\nexport function parseSampleRate(sampleRate: unknown): number | undefined {\n  if (typeof sampleRate === 'boolean') {\n    return Number(sampleRate);\n  }\n\n  const rate = typeof sampleRate === 'string' ? parseFloat(sampleRate) : sampleRate;\n  if (typeof rate !== 'number' || isNaN(rate) || rate < 0 || rate > 1) {\n    return undefined;\n  }\n\n  return rate;\n}\n","import type { CoreOptions } from '../../types/options';\nimport type { BeforeSendStreamedSpanCallback } from '../../types/options';\nimport type { StreamedSpanJSON } from '../../types/span';\nimport { addNonEnumerableProperty } from '../../utils/object';\n\ntype StaticBeforeSendSpanCallback = CoreOptions['beforeSendSpan'];\n\n/**\n * A wrapper to use the new span format in your `beforeSendSpan` callback.\n *\n * When using `traceLifecycle: 'stream'`, wrap your callback with this function\n * to receive and return {@link StreamedSpanJSON} instead of the standard {@link SpanJSON}.\n *\n * @example\n *\n * Sentry.init({\n *   traceLifecycle: 'stream',\n *   beforeSendSpan: withStreamedSpan((span) => {\n *     // span is of type StreamedSpanJSON\n *     return span;\n *   }),\n * });\n *\n * @param callback - The callback function that receives and returns a {@link StreamedSpanJSON}.\n * @returns A callback that is compatible with the `beforeSendSpan` option when using `traceLifecycle: 'stream'`.\n */\nexport function withStreamedSpan(\n  callback: (span: StreamedSpanJSON) => StreamedSpanJSON,\n): StaticBeforeSendSpanCallback & { _streamed: true } {\n  addNonEnumerableProperty(callback, '_streamed', true);\n  return callback as unknown as StaticBeforeSendSpanCallback & { _streamed: true };\n}\n\n/**\n * Typesafe check to identify if a `beforeSendSpan` callback expects the streamed span JSON format.\n *\n * @param callback - The `beforeSendSpan` callback to check.\n * @returns `true` if the callback was wrapped with {@link withStreamedSpan}.\n */\nexport function isStreamedBeforeSendSpanCallback(callback: unknown): callback is BeforeSendStreamedSpanCallback {\n  return !!callback && typeof callback === 'function' && '_streamed' in callback && !!callback._streamed;\n}\n","import { SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME, SEMANTIC_ATTRIBUTE_PROFILE_ID } from '../semanticAttributes';\nimport type { TransactionEvent } from '../types/event';\nimport type { SpanJSON } from '../types/span';\n\n/**\n * Converts a transaction event to a span JSON object.\n */\nexport function convertTransactionEventToSpanJson(event: TransactionEvent): SpanJSON {\n  const { trace_id, parent_span_id, span_id, status, origin, data, op } = event.contexts?.trace ?? {};\n\n  return {\n    data: data ?? {},\n    description: event.transaction,\n    op,\n    parent_span_id,\n    span_id: span_id ?? '',\n    start_timestamp: event.start_timestamp ?? 0,\n    status,\n    timestamp: event.timestamp,\n    trace_id: trace_id ?? '',\n    origin,\n    profile_id: data?.[SEMANTIC_ATTRIBUTE_PROFILE_ID] as string | undefined,\n    exclusive_time: data?.[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME] as number | undefined,\n    measurements: event.measurements,\n    is_segment: true,\n  };\n}\n\n/**\n * Converts a span JSON object to a transaction event.\n */\nexport function convertSpanJsonToTransactionEvent(span: SpanJSON): TransactionEvent {\n  return {\n    type: 'transaction',\n    timestamp: span.timestamp,\n    start_timestamp: span.start_timestamp,\n    transaction: span.description,\n    contexts: {\n      trace: {\n        trace_id: span.trace_id,\n        span_id: span.span_id,\n        parent_span_id: span.parent_span_id,\n        op: span.op,\n        status: span.status,\n        origin: span.origin,\n        data: {\n          ...span.data,\n          ...(span.profile_id && { [SEMANTIC_ATTRIBUTE_PROFILE_ID]: span.profile_id }),\n          ...(span.exclusive_time && { [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: span.exclusive_time }),\n        },\n      },\n    },\n    measurements: span.measurements,\n  };\n}\n","import type { ClientReport } from '../types/clientreport';\nimport type { ClientReportEnvelope, ClientReportItem } from '../types/envelope';\nimport { createEnvelope } from './envelope';\nimport { dateTimestampInSeconds } from './time';\n\n/**\n * Creates client report envelope\n * @param discarded_events An array of discard events\n * @param dsn A DSN that can be set on the header. Optional.\n */\nexport function createClientReportEnvelope(\n  discarded_events: ClientReport['discarded_events'],\n  dsn?: string,\n  timestamp?: number,\n): ClientReportEnvelope {\n  const clientReportItem: ClientReportItem = [\n    { type: 'client_report' },\n    {\n      timestamp: timestamp || dateTimestampInSeconds(),\n      discarded_events,\n    },\n  ];\n  return createEnvelope<ClientReportEnvelope>(dsn ? { dsn } : {}, [clientReportItem]);\n}\n","import type { Session, SessionAggregates } from '../types/session';\nimport type { User } from '../types/user';\n\n// By default, we want to infer the IP address, unless this is explicitly set to `null`\n// We do this after all other processing is done\n// If `ip_address` is explicitly set to `null` or a value, we leave it as is\n\n/**\n * @internal\n * @deprecated -- set ip inferral via via SDK metadata options on client instead.\n */\nexport function addAutoIpAddressToUser(objWithMaybeUser: { user?: User | null }): void {\n  if (objWithMaybeUser.user?.ip_address === undefined) {\n    objWithMaybeUser.user = {\n      ...objWithMaybeUser.user,\n      ip_address: '{{auto}}',\n    };\n  }\n}\n\n/**\n * @internal\n */\nexport function addAutoIpAddressToSession(session: Session | SessionAggregates): void {\n  if ('aggregates' in session) {\n    if (session.attrs?.['ip_address'] === undefined) {\n      session.attrs = {\n        ...session.attrs,\n        ip_address: '{{auto}}',\n      };\n    }\n  } else {\n    if (session.ipAddress === undefined) {\n      session.ipAddress = '{{auto}}';\n    }\n  }\n}\n","import type { Client } from '../client';\nimport type { Event, EventHint } from '../types/event';\nimport type { Exception } from '../types/exception';\nimport type { Extras } from '../types/extra';\nimport type { Mechanism } from '../types/mechanism';\nimport type { ParameterizedString } from '../types/parameterize';\nimport type { SeverityLevel } from '../types/severity';\nimport type { StackFrame } from '../types/stackframe';\nimport type { StackParser } from '../types/stacktrace';\nimport { isError, isErrorEvent, isParameterizedString, isPlainObject } from './is';\nimport { addExceptionMechanism, addExceptionTypeValue } from './misc';\nimport { normalizeToSize } from './normalize';\nimport { extractExceptionKeysForMessage } from './object';\n\n/**\n * Extracts stack frames from the error.stack string\n */\nexport function parseStackFrames(stackParser: StackParser, error: Error): StackFrame[] {\n  return stackParser(error.stack || '', 1);\n}\n\nfunction hasSentryFetchUrlHost(error: unknown): error is Error & { __sentry_fetch_url_host__: string } {\n  return isError(error) && '__sentry_fetch_url_host__' in error && typeof error.__sentry_fetch_url_host__ === 'string';\n}\n\n/**\n * Enhances the error message with the hostname for better Sentry error reporting.\n * This allows third-party packages to still match on the original error message,\n * while Sentry gets the enhanced version with context.\n *\n * Only used internally\n * @hidden\n */\nexport function _enhanceErrorWithSentryInfo<T extends Error>(error: T): string {\n  // If the error has a __sentry_fetch_url_host__ property (added by fetch instrumentation),\n  // enhance the error message with the hostname.\n  if (hasSentryFetchUrlHost(error)) {\n    return `${error.message} (${error.__sentry_fetch_url_host__})`;\n  }\n\n  return error.message;\n}\n\n/**\n * Extracts stack frames from the error and builds a Sentry Exception\n */\nexport function exceptionFromError(stackParser: StackParser, error: Error): Exception {\n  const exception: Exception = {\n    type: error.name || error.constructor.name,\n    value: _enhanceErrorWithSentryInfo(error),\n  };\n\n  const frames = parseStackFrames(stackParser, error);\n  if (frames.length) {\n    exception.stacktrace = { frames };\n  }\n\n  return exception;\n}\n\n/** If a plain object has a property that is an `Error`, return this error. */\nfunction getErrorPropertyFromObject(obj: Record<string, unknown>): Error | undefined {\n  for (const prop in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n      const value = obj[prop];\n      if (value instanceof Error) {\n        return value;\n      }\n    }\n  }\n\n  return undefined;\n}\n\nfunction getMessageForObject(exception: Record<string, unknown>): string {\n  if ('name' in exception && typeof exception.name === 'string') {\n    let message = `'${exception.name}' captured as exception`;\n\n    if ('message' in exception && typeof exception.message === 'string') {\n      message += ` with message '${exception.message}'`;\n    }\n\n    return message;\n  } else if ('message' in exception && typeof exception.message === 'string') {\n    return exception.message;\n  }\n\n  const keys = extractExceptionKeysForMessage(exception);\n\n  // Some ErrorEvent instances do not have an `error` property, which is why they are not handled before\n  // We still want to try to get a decent message for these cases\n  if (isErrorEvent(exception)) {\n    return `Event \\`ErrorEvent\\` captured as exception with message \\`${exception.message}\\``;\n  }\n\n  const className = getObjectClassName(exception);\n\n  return `${\n    className && className !== 'Object' ? `'${className}'` : 'Object'\n  } captured as exception with keys: ${keys}`;\n}\n\nfunction getObjectClassName(obj: unknown): string | undefined | void {\n  try {\n    const prototype: unknown | null = Object.getPrototypeOf(obj);\n    return prototype ? prototype.constructor.name : undefined;\n  } catch {\n    // ignore errors here\n  }\n}\n\nfunction getException(\n  client: Client,\n  mechanism: Mechanism,\n  exception: unknown,\n  hint?: EventHint,\n): [Error, Extras | undefined] {\n  if (isError(exception)) {\n    return [exception, undefined];\n  }\n\n  // Mutate this!\n  mechanism.synthetic = true;\n\n  if (isPlainObject(exception)) {\n    const normalizeDepth = client?.getOptions().normalizeDepth;\n    const extras = { ['__serialized__']: normalizeToSize(exception, normalizeDepth) };\n\n    const errorFromProp = getErrorPropertyFromObject(exception);\n    if (errorFromProp) {\n      return [errorFromProp, extras];\n    }\n\n    const message = getMessageForObject(exception);\n    const ex = hint?.syntheticException || new Error(message);\n    ex.message = message;\n\n    return [ex, extras];\n  }\n\n  // This handles when someone does: `throw \"something awesome\";`\n  // We use synthesized Error here so we can extract a (rough) stack trace.\n  const ex = hint?.syntheticException || new Error(exception as string);\n  ex.message = `${exception}`;\n\n  return [ex, undefined];\n}\n\n/**\n * Builds and Event from a Exception\n * @hidden\n */\nexport function eventFromUnknownInput(\n  client: Client,\n  stackParser: StackParser,\n  exception: unknown,\n  hint?: EventHint,\n): Event {\n  const providedMechanism: Mechanism | undefined = hint?.data && (hint.data as { mechanism: Mechanism }).mechanism;\n  const mechanism: Mechanism = providedMechanism || {\n    handled: true,\n    type: 'generic',\n  };\n\n  const [ex, extras] = getException(client, mechanism, exception, hint);\n\n  const event: Event = {\n    exception: {\n      values: [exceptionFromError(stackParser, ex)],\n    },\n  };\n\n  if (extras) {\n    event.extra = extras;\n  }\n\n  addExceptionTypeValue(event, undefined, undefined);\n  addExceptionMechanism(event, mechanism);\n\n  return {\n    ...event,\n    event_id: hint?.event_id,\n  };\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(\n  stackParser: StackParser,\n  message: ParameterizedString,\n  level: SeverityLevel = 'info',\n  hint?: EventHint,\n  attachStacktrace?: boolean,\n): Event {\n  const event: Event = {\n    event_id: hint?.event_id,\n    level,\n  };\n\n  if (attachStacktrace && hint?.syntheticException) {\n    const frames = parseStackFrames(stackParser, hint.syntheticException);\n    if (frames.length) {\n      event.exception = {\n        values: [\n          {\n            value: message,\n            stacktrace: { frames },\n          },\n        ],\n      };\n      addExceptionMechanism(event, { synthetic: true });\n    }\n  }\n\n  if (isParameterizedString(message)) {\n    const { __sentry_template_string__, __sentry_template_values__ } = message;\n\n    event.logentry = {\n      message: __sentry_template_string__,\n      params: __sentry_template_values__,\n    };\n    return event;\n  }\n\n  event.message = message;\n  return event;\n}\n","import type {\n  Event,\n  EventHint,\n  Exception,\n  ParameterizedString,\n  SeverityLevel,\n  StackFrame,\n  StackParser,\n} from '@sentry/core/browser';\nimport {\n  _INTERNAL_enhanceErrorWithSentryInfo,\n  addExceptionMechanism,\n  addExceptionTypeValue,\n  extractExceptionKeysForMessage,\n  getClient,\n  isDOMError,\n  isDOMException,\n  isError,\n  isErrorEvent,\n  isEvent,\n  isParameterizedString,\n  isPlainObject,\n  normalizeToSize,\n  resolvedSyncPromise,\n} from '@sentry/core/browser';\n\ntype Prototype = { constructor: (...args: unknown[]) => unknown };\n\n/**\n * This function creates an exception from a JavaScript Error\n */\nexport function exceptionFromError(stackParser: StackParser, ex: Error): Exception {\n  // Get the frames first since Opera can lose the stack if we touch anything else first\n  const frames = parseStackFrames(stackParser, ex);\n\n  const exception: Exception = {\n    type: extractType(ex),\n    value: extractMessage(ex),\n  };\n\n  if (frames.length) {\n    exception.stacktrace = { frames };\n  }\n\n  if (exception.type === undefined && exception.value === '') {\n    exception.value = 'Unrecoverable error caught';\n  }\n\n  return exception;\n}\n\nfunction eventFromPlainObject(\n  stackParser: StackParser,\n  exception: Record<string, unknown>,\n  syntheticException?: Error,\n  isUnhandledRejection?: boolean,\n): Event {\n  const client = getClient();\n  const normalizeDepth = client?.getOptions().normalizeDepth;\n\n  // If we can, we extract an exception from the object properties\n  const errorFromProp = getErrorPropertyFromObject(exception);\n\n  const extra = {\n    __serialized__: normalizeToSize(exception, normalizeDepth),\n  };\n\n  if (errorFromProp) {\n    return {\n      exception: {\n        values: [exceptionFromError(stackParser, errorFromProp)],\n      },\n      extra,\n    };\n  }\n\n  const event = {\n    exception: {\n      values: [\n        {\n          type: isEvent(exception) ? exception.constructor.name : isUnhandledRejection ? 'UnhandledRejection' : 'Error',\n          value: getNonErrorObjectExceptionValue(exception, { isUnhandledRejection }),\n        } as Exception,\n      ],\n    },\n    extra,\n  } satisfies Event;\n\n  if (syntheticException) {\n    const frames = parseStackFrames(stackParser, syntheticException);\n    if (frames.length) {\n      // event.exception.values[0] has been set above\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      event.exception.values[0]!.stacktrace = { frames };\n    }\n  }\n\n  return event;\n}\n\nfunction eventFromError(stackParser: StackParser, ex: Error): Event {\n  return {\n    exception: {\n      values: [exceptionFromError(stackParser, ex)],\n    },\n  };\n}\n\n/** Parses stack frames from an error */\nfunction parseStackFrames(\n  stackParser: StackParser,\n  ex: Error & { framesToPop?: number; stacktrace?: string },\n): StackFrame[] {\n  // Access and store the stacktrace property before doing ANYTHING\n  // else to it because Opera is not very good at providing it\n  // reliably in other circumstances.\n  const stacktrace = ex.stacktrace || ex.stack || '';\n\n  const skipLines = getSkipFirstStackStringLines(ex);\n  const framesToPop = getPopFirstTopFrames(ex);\n\n  try {\n    return stackParser(stacktrace, skipLines, framesToPop);\n  } catch {\n    // no-empty\n  }\n\n  return [];\n}\n\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\n/**\n * Certain known React errors contain links that would be falsely\n * parsed as frames. This function check for these errors and\n * returns number of the stack string lines to skip.\n */\nfunction getSkipFirstStackStringLines(ex: Error): number {\n  if (ex && reactMinifiedRegexp.test(ex.message)) {\n    return 1;\n  }\n\n  return 0;\n}\n\n/**\n * If error has `framesToPop` property, it means that the\n * creator tells us the first x frames will be useless\n * and should be discarded. Typically error from wrapper function\n * which don't point to the actual location in the developer's code.\n *\n * Example: https://github.com/zertosh/invariant/blob/master/invariant.js#L46\n */\nfunction getPopFirstTopFrames(ex: Error & { framesToPop?: unknown }): number {\n  if (typeof ex.framesToPop === 'number') {\n    return ex.framesToPop;\n  }\n\n  return 0;\n}\n\n// https://developer.mozilla.org/en-US/docs/WebAssembly/JavaScript_interface/Exception\n// @ts-expect-error - WebAssembly.Exception is a valid class\nfunction isWebAssemblyException(exception: unknown): exception is WebAssembly.Exception {\n  // Check for support\n  // @ts-expect-error - WebAssembly.Exception is a valid class\n  // oxlint-disable-next-line typescript/prefer-optional-chain\n  if (typeof WebAssembly !== 'undefined' && typeof WebAssembly.Exception !== 'undefined') {\n    // @ts-expect-error - WebAssembly.Exception is a valid class\n    return exception instanceof WebAssembly.Exception;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Extracts from errors what we use as the exception `type` in error events.\n *\n * Usually, this is the `name` property on Error objects but WASM errors need to be treated differently.\n */\nexport function extractType(ex: Error & { message: { error?: Error } }): string | undefined {\n  const name = ex?.name;\n\n  // The name for WebAssembly.Exception Errors needs to be extracted differently.\n  // Context: https://github.com/getsentry/sentry-javascript/issues/13787\n  if (!name && isWebAssemblyException(ex)) {\n    // Emscripten sets array[type, message] to the \"message\" property on the WebAssembly.Exception object\n    const hasTypeInMessage = ex.message && Array.isArray(ex.message) && ex.message.length == 2;\n    return hasTypeInMessage ? ex.message[0] : 'WebAssembly.Exception';\n  }\n\n  return name;\n}\n\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nexport function extractMessage(ex: Error & { message: { error?: Error } }): string {\n  const message = ex?.message;\n\n  if (isWebAssemblyException(ex)) {\n    // For Node 18, Emscripten sets array[type, message] to the \"message\" property on the WebAssembly.Exception object\n    if (Array.isArray(ex.message) && ex.message.length == 2) {\n      return ex.message[1];\n    }\n    return 'wasm exception';\n  }\n\n  if (!message) {\n    return 'No error message';\n  }\n\n  if (message.error && typeof message.error.message === 'string') {\n    return _INTERNAL_enhanceErrorWithSentryInfo(message.error);\n  }\n\n  return _INTERNAL_enhanceErrorWithSentryInfo(ex);\n}\n\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nexport function eventFromException(\n  stackParser: StackParser,\n  exception: unknown,\n  hint?: EventHint,\n  attachStacktrace?: boolean,\n): PromiseLike<Event> {\n  const syntheticException = hint?.syntheticException || undefined;\n  const event = eventFromUnknownInput(stackParser, exception, syntheticException, attachStacktrace);\n  addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n  event.level = 'error';\n  if (hint?.event_id) {\n    event.event_id = hint.event_id;\n  }\n  return resolvedSyncPromise(event);\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(\n  stackParser: StackParser,\n  message: ParameterizedString,\n  level: SeverityLevel = 'info',\n  hint?: EventHint,\n  attachStacktrace?: boolean,\n): PromiseLike<Event> {\n  const syntheticException = hint?.syntheticException || undefined;\n  const event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n  event.level = level;\n  if (hint?.event_id) {\n    event.event_id = hint.event_id;\n  }\n  return resolvedSyncPromise(event);\n}\n\n/**\n * @hidden\n */\nexport function eventFromUnknownInput(\n  stackParser: StackParser,\n  exception: unknown,\n  syntheticException?: Error,\n  attachStacktrace?: boolean,\n  isUnhandledRejection?: boolean,\n): Event {\n  let event: Event;\n\n  if (isErrorEvent(exception as ErrorEvent) && (exception as ErrorEvent).error) {\n    // If it is an ErrorEvent with `error` property, extract it to get actual Error\n    const errorEvent = exception as ErrorEvent;\n    return eventFromError(stackParser, errorEvent.error as Error);\n  }\n\n  // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n  // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n  // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n  //\n  // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n  // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n  // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n  if (isDOMError(exception) || isDOMException(exception as DOMException)) {\n    const domException = exception as DOMException;\n\n    if ('stack' in (exception as Error)) {\n      event = eventFromError(stackParser, exception as Error);\n\n      const firstException = event.exception?.values?.[0];\n      if (attachStacktrace && syntheticException && firstException && !firstException.stacktrace) {\n        const frames = parseStackFrames(stackParser, syntheticException);\n        if (frames.length) {\n          firstException.stacktrace = { frames };\n          addExceptionMechanism(event, { synthetic: true });\n        }\n      }\n    } else {\n      const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n      const message = domException.message ? `${name}: ${domException.message}` : name;\n      event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n      addExceptionTypeValue(event, message);\n    }\n    if ('code' in domException) {\n      // eslint-disable-next-line typescript/no-deprecated\n      event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` };\n    }\n\n    return event;\n  }\n  if (isError(exception)) {\n    // we have a real Error object, do nothing\n    return eventFromError(stackParser, exception);\n  }\n  if (isPlainObject(exception) || isEvent(exception)) {\n    // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n    // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n    // group on any key/value change.\n    const objectException = exception;\n    event = eventFromPlainObject(stackParser, objectException, syntheticException, isUnhandledRejection);\n    addExceptionMechanism(event, {\n      synthetic: true,\n    });\n    return event;\n  }\n\n  // If none of previous checks were valid, then it means that it's not:\n  // - an instance of DOMError\n  // - an instance of DOMException\n  // - an instance of Event\n  // - an instance of Error\n  // - a valid ErrorEvent (one with an error property)\n  // - a plain Object\n  //\n  // So bail out and capture it as a simple message:\n  event = eventFromString(stackParser, exception as string, syntheticException, attachStacktrace);\n  addExceptionTypeValue(event, `${exception}`, undefined);\n  addExceptionMechanism(event, {\n    synthetic: true,\n  });\n\n  return event;\n}\n\nfunction eventFromString(\n  stackParser: StackParser,\n  message: ParameterizedString,\n  syntheticException?: Error,\n  attachStacktrace?: boolean,\n): Event {\n  const event: Event = {};\n\n  if (attachStacktrace && syntheticException) {\n    const frames = parseStackFrames(stackParser, syntheticException);\n    if (frames.length) {\n      event.exception = {\n        values: [{ value: message, stacktrace: { frames } }],\n      };\n    }\n    addExceptionMechanism(event, { synthetic: true });\n  }\n\n  if (isParameterizedString(message)) {\n    const { __sentry_template_string__, __sentry_template_values__ } = message;\n\n    event.logentry = {\n      message: __sentry_template_string__,\n      params: __sentry_template_values__,\n    };\n    return event;\n  }\n\n  event.message = message;\n  return event;\n}\n\nfunction getNonErrorObjectExceptionValue(\n  exception: Record<string, unknown>,\n  { isUnhandledRejection }: { isUnhandledRejection?: boolean },\n): string {\n  const keys = extractExceptionKeysForMessage(exception);\n  const captureType = isUnhandledRejection ? 'promise rejection' : 'exception';\n\n  // Some ErrorEvent instances do not have an `error` property, which is why they are not handled before\n  // We still want to try to get a decent message for these cases\n  if (isErrorEvent(exception)) {\n    return `Event \\`ErrorEvent\\` captured as ${captureType} with message \\`${exception.message}\\``;\n  }\n\n  if (isEvent(exception)) {\n    const className = getObjectClassName(exception);\n    return `Event \\`${className}\\` (type=${exception.type}) captured as ${captureType}`;\n  }\n\n  return `Object captured as ${captureType} with keys: ${keys}`;\n}\n\nfunction getObjectClassName(obj: unknown): string | undefined | void {\n  try {\n    const prototype: Prototype | null = Object.getPrototypeOf(obj);\n    return prototype ? prototype.constructor.name : undefined;\n  } catch {\n    // ignore errors here\n  }\n}\n\n/** If a plain object has a property that is an `Error`, return this error. */\nfunction getErrorPropertyFromObject(obj: Record<string, unknown>): Error | undefined {\n  return Object.values(obj).find((v): v is Error => v instanceof Error);\n}\n","import type {\n  BrowserClientProfilingOptions,\n  BrowserClientReplayOptions,\n  ClientOptions,\n  Event,\n  EventHint,\n  Options as CoreOptions,\n  ParameterizedString,\n  Scope,\n  SeverityLevel,\n} from '@sentry/core/browser';\nimport {\n  _INTERNAL_flushLogsBuffer,\n  _INTERNAL_flushMetricsBuffer,\n  addAutoIpAddressToSession,\n  applySdkMetadata,\n  Client,\n  getSDKSource,\n} from '@sentry/core/browser';\nimport { eventFromException, eventFromMessage } from './eventbuilder';\nimport { WINDOW } from './helpers';\nimport type { BrowserTransportOptions } from './transports/types';\n\n/**\n * A magic string that build tooling can leverage in order to inject a release value into the SDK.\n */\ndeclare const __SENTRY_RELEASE__: string | undefined;\n\ntype BrowserSpecificOptions = BrowserClientReplayOptions &\n  BrowserClientProfilingOptions & {\n    /** If configured, this URL will be used as base URL for lazy loading integration. */\n    cdnBaseUrl?: string;\n\n    /**\n     * Important: Only set this option if you know what you are doing!\n     *\n     * By default, the SDK will check if `Sentry.init` is called in a browser extension.\n     * In case it is, it will stop initialization and log a warning\n     * because browser extensions require a different Sentry initialization process:\n     * https://docs.sentry.io/platforms/javascript/best-practices/shared-environments/\n     *\n     * Setting up the SDK in a browser extension with global error monitoring is not recommended\n     * and will likely flood you with errors from other web sites or extensions. This can heavily\n     * impact your quota and cause interference with your and other Sentry SDKs in shared environments.\n     *\n     * If this check wrongfully flags your setup as a browser extension, you can set this\n     * option to `true` to skip the check.\n     *\n     * @default false\n     */\n    skipBrowserExtensionCheck?: boolean;\n\n    /**\n     * If you use Spotlight by Sentry during development, use\n     * this option to forward captured Sentry events to Spotlight.\n     *\n     * Either set it to true, or provide a specific Spotlight Sidecar URL.\n     *\n     * More details: https://spotlightjs.com/\n     *\n     * IMPORTANT: Only set this option to `true` while developing, not in production!\n     */\n    spotlight?: boolean | string;\n  };\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see @sentry/core Options for more information.\n */\nexport type BrowserOptions = CoreOptions<BrowserTransportOptions> & BrowserSpecificOptions;\n\n/**\n * Configuration options for the Sentry Browser SDK Client class\n * @see BrowserClient for more information.\n */\nexport type BrowserClientOptions = ClientOptions<BrowserTransportOptions> & BrowserSpecificOptions;\n\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nexport class BrowserClient extends Client<BrowserClientOptions> {\n  /**\n   * Creates a new Browser SDK instance.\n   *\n   * @param options Configuration options for this SDK.\n   */\n  public constructor(options: BrowserClientOptions) {\n    const opts = applyDefaultOptions(options);\n    const sdkSource = WINDOW.SENTRY_SDK_SOURCE || getSDKSource();\n    applySdkMetadata(opts, 'browser', ['browser'], sdkSource);\n\n    super(opts);\n\n    const { userInfo } = this.getDataCollectionOptions();\n\n    if (opts._metadata?.sdk) {\n      opts._metadata.sdk.settings = {\n        // Only allow IP inferral by Relay if the user opted in via dataCollection\n        infer_ip: userInfo ? 'auto' : 'never',\n        // purposefully allowing already passed settings to override the default\n        ...opts._metadata.sdk.settings,\n      };\n    }\n\n    const { sendClientReports, enableLogs, _experiments, enableMetrics: enableMetricsOption } = this._options;\n\n    // todo(v11): Remove the experimental flag\n    // eslint-disable-next-line typescript/no-deprecated\n    const enableMetrics = enableMetricsOption ?? _experiments?.enableMetrics ?? true;\n\n    // Flush logs and metrics when page becomes hidden (e.g., tab switch, navigation)\n    // todo(v11): Remove the experimental flag\n    if (WINDOW.document && (sendClientReports || enableLogs || enableMetrics)) {\n      WINDOW.document.addEventListener('visibilitychange', () => {\n        if (WINDOW.document.visibilityState === 'hidden') {\n          if (sendClientReports) {\n            this._flushOutcomes();\n          }\n          if (enableLogs) {\n            _INTERNAL_flushLogsBuffer(this);\n          }\n\n          if (enableMetrics) {\n            _INTERNAL_flushMetricsBuffer(this);\n          }\n        }\n      });\n    }\n\n    if (userInfo) {\n      this.on('beforeSendSession', addAutoIpAddressToSession);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public eventFromException(exception: unknown, hint?: EventHint): PromiseLike<Event> {\n    return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public eventFromMessage(\n    message: ParameterizedString,\n    level: SeverityLevel = 'info',\n    hint?: EventHint,\n  ): PromiseLike<Event> {\n    return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  protected _prepareEvent(\n    event: Event,\n    hint: EventHint,\n    currentScope: Scope,\n    isolationScope: Scope,\n  ): PromiseLike<Event | null> {\n    event.platform = event.platform || 'javascript';\n\n    return super._prepareEvent(event, hint, currentScope, isolationScope);\n  }\n}\n\n/** Exported only for tests. */\nexport function applyDefaultOptions<T extends Partial<BrowserClientOptions>>(optionsArg: T): T {\n  return {\n    release:\n      typeof __SENTRY_RELEASE__ === 'string' // This allows build tooling to find-and-replace __SENTRY_RELEASE__ to inject a release value\n        ? __SENTRY_RELEASE__\n        : WINDOW.SENTRY_RELEASE?.id, // This supports the variable that sentry-webpack-plugin injects\n    sendClientReports: true,\n    // We default this to true, as it is the safer scenario\n    parentSpanIsAlwaysRootSpan: true,\n    ...optionsArg,\n  };\n}\n","import type { CoreOptions } from '../types/options';\nimport { SDK_VERSION } from '../utils/version';\n\n/**\n * A builder for the SDK metadata in the options for the SDK initialization.\n *\n * Note: This function is identical to `buildMetadata` in Remix and NextJS and SvelteKit.\n * We don't extract it for bundle size reasons.\n * @see https://github.com/getsentry/sentry-javascript/pull/7404\n * @see https://github.com/getsentry/sentry-javascript/pull/4196\n *\n * If you make changes to this function consider updating the others as well.\n *\n * @param options SDK options object that gets mutated\n * @param names list of package names\n */\nexport function applySdkMetadata(options: CoreOptions, name: string, names = [name], source = 'npm'): void {\n  const sdk = ((options._metadata = options._metadata || {}).sdk = options._metadata.sdk || {});\n\n  if (!sdk.name) {\n    sdk.name = `sentry.javascript.${name}`;\n    sdk.packages = names.map(name => ({\n      name: `${source}:@sentry/${name}`,\n      version: SDK_VERSION,\n    }));\n    sdk.version = SDK_VERSION;\n  }\n}\n","import type { IntegrationFn, WrappedFunction } from '@sentry/core/browser';\nimport { defineIntegration, fill, getFunctionName, getOriginalFunction } from '@sentry/core/browser';\nimport { WINDOW, wrap } from '../helpers';\n\n// Using a comma-separated string and split for smaller bundle size vs an array literal\nconst DEFAULT_EVENT_TARGET =\n  'EventTarget,Window,Node,ApplicationCache,AudioTrackList,BroadcastChannel,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload'.split(\n    ',',\n  );\n\nconst INTEGRATION_NAME = 'BrowserApiErrors' as const;\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\ninterface BrowserApiErrorsOptions {\n  setTimeout: boolean;\n  setInterval: boolean;\n  requestAnimationFrame: boolean;\n  XMLHttpRequest: boolean;\n  eventTarget: boolean | string[];\n\n  /**\n   * If you experience issues with this integration causing double-invocations of event listeners,\n   * try setting this option to `true`. It will unregister the original callbacks from the event targets\n   * before adding the instrumented callback.\n   *\n   * @default false\n   */\n  unregisterOriginalCallbacks: boolean;\n}\n\nconst _browserApiErrorsIntegration = ((options: Partial<BrowserApiErrorsOptions> = {}) => {\n  const _options = {\n    XMLHttpRequest: true,\n    eventTarget: true,\n    requestAnimationFrame: true,\n    setInterval: true,\n    setTimeout: true,\n    unregisterOriginalCallbacks: false,\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    // TODO: This currently only works for the first client this is setup\n    // We may want to adjust this to check for client etc.\n    setupOnce() {\n      if (_options.setTimeout) {\n        fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n      }\n\n      if (_options.setInterval) {\n        fill(WINDOW, 'setInterval', _wrapTimeFunction);\n      }\n\n      if (_options.requestAnimationFrame) {\n        fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n      }\n\n      if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n        fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n      }\n\n      const eventTargetOption = _options.eventTarget;\n      if (eventTargetOption) {\n        const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n        eventTarget.forEach(target => _wrapEventTarget(target, _options));\n      }\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nexport const browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original: () => void): () => number {\n  return function (this: unknown, ...args: unknown[]): number {\n    const originalCallback = args[0];\n    args[0] = wrap(originalCallback, {\n      mechanism: {\n        handled: false,\n        type: `auto.browser.browserapierrors.${getFunctionName(original)}`,\n      },\n    });\n    return original.apply(this, args);\n  };\n}\n\nfunction _wrapRAF(original: () => void): (callback: () => void) => unknown {\n  return function (this: unknown, callback: () => void): () => void {\n    return original.apply(this, [\n      wrap(callback, {\n        mechanism: {\n          data: {\n            handler: getFunctionName(original),\n          },\n          handled: false,\n          type: 'auto.browser.browserapierrors.requestAnimationFrame',\n        },\n      }),\n    ]);\n  };\n}\n\nfunction _wrapXHR(originalSend: () => void): () => void {\n  return function (this: XMLHttpRequest, ...args: unknown[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const xhr = this;\n    const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n    xmlHttpRequestProps.forEach(prop => {\n      if (prop in xhr && typeof xhr[prop] === 'function') {\n        fill(xhr, prop, function (original) {\n          const wrapOptions = {\n            mechanism: {\n              data: {\n                handler: getFunctionName(original),\n              },\n              handled: false,\n              type: `auto.browser.browserapierrors.xhr.${prop}`,\n            },\n          };\n\n          // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n          const originalFunction = getOriginalFunction(original);\n          if (originalFunction) {\n            wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n          }\n\n          // Otherwise wrap directly\n          return wrap(original, wrapOptions);\n        });\n      }\n    });\n\n    return originalSend.apply(this, args);\n  };\n}\n\nfunction _wrapEventTarget(target: string, integrationOptions: BrowserApiErrorsOptions): void {\n  const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n  const proto = globalObject[target]?.prototype;\n\n  // eslint-disable-next-line no-prototype-builtins\n  if (!proto?.hasOwnProperty?.('addEventListener')) {\n    return;\n  }\n\n  fill(proto, 'addEventListener', function (original: VoidFunction): (\n    ...args: Parameters<typeof WINDOW.addEventListener>\n  ) => ReturnType<typeof WINDOW.addEventListener> {\n    return function (this: unknown, eventName, fn, options): VoidFunction {\n      try {\n        if (isEventListenerObject(fn)) {\n          // ESlint disable explanation:\n          //  First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n          //  introduce a bug here, because bind returns a new function that doesn't have our\n          //  flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n          //  Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n          // eslint-disable-next-line @typescript-eslint/unbound-method\n          fn.handleEvent = wrap(fn.handleEvent, {\n            mechanism: {\n              data: {\n                handler: getFunctionName(fn),\n                target,\n              },\n              handled: false,\n              type: 'auto.browser.browserapierrors.handleEvent',\n            },\n          });\n        }\n      } catch {\n        // can sometimes get 'Permission denied to access property \"handle Event'\n      }\n\n      if (integrationOptions.unregisterOriginalCallbacks) {\n        unregisterOriginalCallback(this, eventName, fn);\n      }\n\n      return original.apply(this, [\n        eventName,\n        wrap(fn, {\n          mechanism: {\n            data: {\n              handler: getFunctionName(fn),\n              target,\n            },\n            handled: false,\n            type: 'auto.browser.browserapierrors.addEventListener',\n          },\n        }),\n        options,\n      ]);\n    };\n  });\n\n  fill(proto, 'removeEventListener', function (originalRemoveEventListener: VoidFunction): (\n    this: unknown,\n    ...args: Parameters<typeof WINDOW.removeEventListener>\n  ) => ReturnType<typeof WINDOW.removeEventListener> {\n    return function (this: unknown, eventName, fn, options): VoidFunction {\n      /**\n       * There are 2 possible scenarios here:\n       *\n       * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n       * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n       * as a pass-through, and call original `removeEventListener` with it.\n       *\n       * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n       * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n       * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n       * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n       * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n       *\n       * When someone adds a handler prior to initialization, and then do it again, but after,\n       * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n       * to get rid of the initial handler and it'd stick there forever.\n       */\n      try {\n        // Check via hasOwnProperty so a `__sentry_wrapped__` inherited from a wrapped\n        // `Function.prototype` doesn't cause removal of the wrong handler.\n        if (Object.prototype.hasOwnProperty.call(fn, '__sentry_wrapped__')) {\n          const originalEventHandler = (fn as WrappedFunction).__sentry_wrapped__;\n          if (originalEventHandler) {\n            originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n          }\n        }\n      } catch {\n        // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n      }\n      return originalRemoveEventListener.call(this, eventName, fn, options);\n    };\n  });\n}\n\nfunction isEventListenerObject(obj: unknown): obj is EventListenerObject {\n  return typeof (obj as EventListenerObject).handleEvent === 'function';\n}\n\nfunction unregisterOriginalCallback(target: unknown, eventName: string, fn: EventListenerOrEventListenerObject): void {\n  if (\n    target &&\n    typeof target === 'object' &&\n    'removeEventListener' in target &&\n    typeof target.removeEventListener === 'function'\n  ) {\n    target.removeEventListener(eventName, fn);\n  }\n}\n","import { WINDOW } from '../../../types';\n\n/**\n * web-vitals 5.1.0 switched listeners to be added on the window rather than the document.\n * Instead of having to check for window/document every time we add a listener, we can use this function.\n */\nexport function addPageListener(type: string, listener: EventListener, options?: boolean | AddEventListenerOptions) {\n  if (WINDOW.document) {\n    WINDOW.addEventListener(type, listener, options);\n  }\n}\n/**\n * web-vitals 5.1.0 switched listeners to be removed from the window rather than the document.\n * Instead of having to check for window/document every time we remove a listener, we can use this function.\n */\nexport function removePageListener(type: string, listener: EventListener, options?: boolean | AddEventListenerOptions) {\n  if (WINDOW.document) {\n    WINDOW.removeEventListener(type, listener, options);\n  }\n}\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const runOnce = (cb: () => void) => {\n  let called = false;\n  return () => {\n    if (!called) {\n      cb();\n      called = true;\n    }\n  };\n};\n","import { captureSession, debug, defineIntegration, getIsolationScope, startSession } from '@sentry/core/browser';\nimport { addHistoryInstrumentationHandler, whenIdleOrHidden } from '@sentry/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\ninterface BrowserSessionOptions {\n  /**\n   * Controls the session lifecycle - when new sessions are created.\n   *\n   * - `'route'`: A session is created on page load and on every navigation.\n   *   This is the default behavior.\n   * - `'page'`: A session is created once when the page is loaded. Session is not\n   *   updated on navigation. This is useful for webviews or single-page apps where\n   *   URL changes should not trigger new sessions.\n   *\n   * @default 'route'\n   */\n  lifecycle?: 'route' | 'page';\n}\n\n/**\n * When added, automatically creates sessions which allow you to track adoption and crashes (crash free rate) in your Releases in Sentry.\n * More information: https://docs.sentry.io/product/releases/health/\n *\n * Note: In order for session tracking to work, you need to set up Releases: https://docs.sentry.io/product/releases/\n */\nexport const browserSessionIntegration = defineIntegration((options: BrowserSessionOptions = {}) => {\n  const lifecycle = options.lifecycle ?? 'route';\n\n  return {\n    name: 'BrowserSession' as const,\n    setupOnce() {\n      if (typeof WINDOW.document === 'undefined') {\n        DEBUG_BUILD &&\n          debug.warn('Using the `browserSessionIntegration` in non-browser environments is not supported.');\n        return;\n      }\n\n      // The session duration for browser sessions does not track a meaningful\n      // concept that can be used as a metric.\n      // Automatically captured sessions are akin to page views, and thus we\n      // discard their duration.\n      startSession({ ignoreDuration: true });\n\n      // Sending the session envelope synchronously in `init()` runs the full send\n      // pipeline during page load, competing with critical resources for the network and\n      // adding overhead that measurably hurts LCP. We defer the initial send until the\n      // browser is idle; `whenIdleOrHidden` flushes it on page-hide so we don't lose short\n      // (page-view-like) sessions.\n      let initialSessionSent = false;\n      whenIdleOrHidden(() => {\n        // A navigation (in `'route'` lifecycle) may start and send a new session before this\n        // deferred callback fires. In that case the current session was already sent, so\n        // re-capturing here would send it a second time - guard against that.\n        if (!initialSessionSent) {\n          captureSession();\n          initialSessionSent = true;\n        }\n      });\n\n      // User data can be set at any time, for example async after Sentry.init has run and the initial session\n      // envelope was already sent, but still on the initial page.\n      // Therefore, we have to update the ongoing session with the new user data if it exists, to send the `did`.\n      // In theory, sessions, as well as user data is always put onto the isolation scope. So we listen to the\n      // isolation scope for changes and update the session with the new user data if it exists.\n      // This will not catch users set onto other scopes, like the current scope. For now, we'll accept this limitation.\n      // The alternative is to update and capture the session from within the scope. This could be too costly or would not\n      // play well with session aggregates on the server side. Since this happens in the scope class, we'd need change\n      // scope behaviour in the browser.\n      const isolationScope = getIsolationScope();\n      let previousUser = isolationScope.getUser();\n      isolationScope.addScopeListener(scope => {\n        const maybeNewUser = scope.getUser();\n        // sessions only care about user id and ip address, so we only need to capture the session if the user has changed\n        if (previousUser?.id !== maybeNewUser?.id || previousUser?.ip_address !== maybeNewUser?.ip_address) {\n          previousUser = maybeNewUser;\n          // Only emit a dedicated update envelope for user data that arrives _after_ the\n          // deferred initial session was sent. User data set during page load is already\n          // reflected in that session (the scope writes it onto the session), so capturing\n          // here would send a redundant envelope - and do so during page load, which is\n          // exactly the overhead we're deferring away from.\n          if (initialSessionSent) {\n            captureSession();\n          }\n        }\n      });\n\n      if (lifecycle === 'route') {\n        // We want to create a session for every navigation as well\n        addHistoryInstrumentationHandler(({ from, to }) => {\n          // Don't create an additional session for the initial route or if the location did not change\n          if (from !== to) {\n            startSession({ ignoreDuration: true });\n            captureSession();\n            // A session has now been sent, so the deferred initial capture (if still pending)\n            // must not re-send this navigation session.\n            initialSessionSent = true;\n          }\n        });\n      }\n    },\n  };\n});\n","/*\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types.js';\nimport { addPageListener, removePageListener } from './globalListeners.js';\nimport { runOnce } from './runOnce.js';\n\n/**\n * Runs the passed callback during the next idle period, or immediately\n * if the browser's visibility state is (or becomes) hidden.\n */\nexport const whenIdleOrHidden = (cb: () => void) => {\n  const rIC = WINDOW.requestIdleCallback || WINDOW.setTimeout;\n\n  // If the document is hidden, run the callback immediately, otherwise\n  // race an idle callback with the next `visibilitychange` event.\n  if (WINDOW.document?.visibilityState === 'hidden') {\n    cb();\n  } else {\n    // eslint-disable-next-line no-param-reassign\n    cb = runOnce(cb);\n    addPageListener('visibilitychange', cb, { once: true, capture: true });\n    // sentry: we use pagehide instead of directly listening to visibilitychange\n    // because some browsers we still support (Safari <14.4) don't fully support\n    // `visibilitychange` or have known bugs w.r.t the `visibilitychange` event.\n    // TODO(v11): remove this once we drop support for Safari <14.4\n    addPageListener('pagehide', cb, { once: true, capture: true });\n    rIC(() => {\n      cb();\n      // Remove the above event listener since no longer required.\n      // See: https://github.com/GoogleChrome/web-vitals/issues/622\n      removePageListener('visibilitychange', cb, { capture: true });\n      // TODO(v11): remove this once we drop support for Safari <14.4\n      removePageListener('pagehide', cb, { capture: true });\n    });\n  }\n};\n","import type { CultureContext, IntegrationFn } from '@sentry/core/browser';\nimport { defineIntegration, safeSetSpanJSONAttributes } from '@sentry/core/browser';\nimport { WINDOW } from '../helpers';\n\nconst INTEGRATION_NAME = 'CultureContext' as const;\n\nconst _cultureContextIntegration = (() => {\n  return {\n    name: INTEGRATION_NAME,\n    preprocessEvent(event) {\n      const culture = getCultureContext();\n\n      if (culture) {\n        event.contexts = {\n          ...event.contexts,\n          culture: { ...culture, ...event.contexts?.culture },\n        };\n      }\n    },\n    processSegmentSpan(span) {\n      const culture = getCultureContext();\n\n      if (culture) {\n        safeSetSpanJSONAttributes(span, {\n          'culture.locale': culture.locale,\n          'culture.timezone': culture.timezone,\n          'culture.calendar': culture.calendar,\n        });\n      }\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Captures culture context from the browser.\n *\n * Enabled by default.\n *\n * @example\n * ```js\n * import * as Sentry from '@sentry/browser';\n *\n * Sentry.init({\n *   integrations: [Sentry.cultureContextIntegration()],\n * });\n * ```\n */\nexport const cultureContextIntegration = defineIntegration(_cultureContextIntegration);\n\n/**\n * Returns the culture context from the browser's Intl API.\n */\nfunction getCultureContext(): CultureContext | undefined {\n  try {\n    const intl = (WINDOW as { Intl?: typeof Intl }).Intl;\n    if (!intl) {\n      return undefined;\n    }\n\n    const options = intl.DateTimeFormat().resolvedOptions();\n\n    return {\n      locale: options.locale,\n      timezone: options.timeZone,\n      calendar: options.calendar,\n    };\n  } catch {\n    // Ignore errors\n    return undefined;\n  }\n}\n","import type { HandlerDataError } from '../types/instrument';\nimport { GLOBAL_OBJ } from '../utils/worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\nlet _oldOnErrorHandler: (typeof GLOBAL_OBJ)['onerror'] | null = null;\n\n/**\n * Add an instrumentation handler for when an error is captured by the global error handler.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addGlobalErrorInstrumentationHandler(handler: (data: HandlerDataError) => void): void {\n  const type = 'error';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentError);\n}\n\nfunction instrumentError(): void {\n  _oldOnErrorHandler = GLOBAL_OBJ.onerror;\n\n  // Note: The reason we are doing window.onerror instead of window.addEventListener('error')\n  // is that we are using this handler in the Loader Script, to handle buffered errors consistently\n  GLOBAL_OBJ.onerror = function (\n    msg: string | object,\n    url?: string,\n    line?: number,\n    column?: number,\n    error?: Error,\n  ): boolean {\n    const handlerData: HandlerDataError = {\n      column,\n      error,\n      line,\n      msg,\n      url,\n    };\n    triggerHandlers('error', handlerData);\n\n    if (_oldOnErrorHandler) {\n      // eslint-disable-next-line prefer-rest-params\n      return _oldOnErrorHandler.apply(this, arguments);\n    }\n\n    return false;\n  };\n\n  GLOBAL_OBJ.onerror.__SENTRY_INSTRUMENTED__ = true;\n}\n","import type { HandlerDataUnhandledRejection } from '../types/instrument';\nimport { GLOBAL_OBJ } from '../utils/worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\nlet _oldOnUnhandledRejectionHandler: (typeof GLOBAL_OBJ)['onunhandledrejection'] | null = null;\n\n/**\n * Add an instrumentation handler for when an unhandled promise rejection is captured.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addGlobalUnhandledRejectionInstrumentationHandler(\n  handler: (data: HandlerDataUnhandledRejection) => void,\n): void {\n  const type = 'unhandledrejection';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentUnhandledRejection);\n}\n\nfunction instrumentUnhandledRejection(): void {\n  _oldOnUnhandledRejectionHandler = GLOBAL_OBJ.onunhandledrejection;\n\n  // Note: The reason we are doing window.onunhandledrejection instead of window.addEventListener('unhandledrejection')\n  // is that we are using this handler in the Loader Script, to handle buffered rejections consistently\n  GLOBAL_OBJ.onunhandledrejection = function (e: unknown): boolean {\n    const handlerData: HandlerDataUnhandledRejection = e;\n    triggerHandlers('unhandledrejection', handlerData);\n\n    if (_oldOnUnhandledRejectionHandler) {\n      // eslint-disable-next-line prefer-rest-params\n      return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n    }\n\n    return true;\n  };\n\n  GLOBAL_OBJ.onunhandledrejection.__SENTRY_INSTRUMENTED__ = true;\n}\n","import type { Client, Event, IntegrationFn, Primitive, StackParser } from '@sentry/core/browser';\nimport {\n  addGlobalErrorInstrumentationHandler,\n  addGlobalUnhandledRejectionInstrumentationHandler,\n  captureEvent,\n  debug,\n  defineIntegration,\n  getClient,\n  getLocationHref,\n  isPrimitive,\n  isString,\n  stripDataUrlContent,\n  UNKNOWN_FUNCTION,\n} from '@sentry/core/browser';\nimport type { BrowserClient } from '../client';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n\ntype GlobalHandlersIntegrationsOptionKeys = 'onerror' | 'onunhandledrejection';\n\ntype GlobalHandlersIntegrations = Record<GlobalHandlersIntegrationsOptionKeys, boolean>;\n\nconst INTEGRATION_NAME = 'GlobalHandlers' as const;\n\nconst _globalHandlersIntegration = ((options: Partial<GlobalHandlersIntegrations> = {}) => {\n  const _options = {\n    onerror: true,\n    onunhandledrejection: true,\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    setupOnce() {\n      Error.stackTraceLimit = 50;\n    },\n    setup(client) {\n      if (_options.onerror) {\n        _installGlobalOnErrorHandler(client);\n        globalHandlerLog('onerror');\n      }\n      if (_options.onunhandledrejection) {\n        _installGlobalOnUnhandledRejectionHandler(client);\n        globalHandlerLog('onunhandledrejection');\n      }\n    },\n  };\n}) satisfies IntegrationFn;\n\nexport const globalHandlersIntegration = defineIntegration(_globalHandlersIntegration);\n\nfunction _installGlobalOnErrorHandler(client: Client): void {\n  addGlobalErrorInstrumentationHandler(data => {\n    const { stackParser, attachStacktrace } = getOptions();\n\n    if (getClient() !== client || shouldIgnoreOnError()) {\n      return;\n    }\n\n    const { msg, url, line, column, error } = data;\n\n    const event = _enhanceEventWithInitialFrame(\n      eventFromUnknownInput(stackParser, error || msg, undefined, attachStacktrace, false),\n      url,\n      line,\n      column,\n    );\n\n    event.level = 'error';\n\n    captureEvent(event, {\n      originalException: error,\n      mechanism: {\n        handled: false,\n        type: 'auto.browser.global_handlers.onerror',\n      },\n    });\n  });\n}\n\nfunction _installGlobalOnUnhandledRejectionHandler(client: Client): void {\n  addGlobalUnhandledRejectionInstrumentationHandler(e => {\n    const { stackParser, attachStacktrace } = getOptions();\n\n    if (getClient() !== client || shouldIgnoreOnError()) {\n      return;\n    }\n\n    const error = _getUnhandledRejectionError(e);\n\n    const event = isPrimitive(error)\n      ? _eventFromRejectionWithPrimitive(error)\n      : eventFromUnknownInput(stackParser, error, undefined, attachStacktrace, true);\n\n    event.level = 'error';\n\n    captureEvent(event, {\n      originalException: error,\n      mechanism: {\n        handled: false,\n        type: 'auto.browser.global_handlers.onunhandledrejection',\n      },\n    });\n  });\n}\n\n/**\n *\n */\nexport function _getUnhandledRejectionError(error: unknown): unknown {\n  if (isPrimitive(error)) {\n    return error;\n  }\n\n  // dig the object of the rejection out of known event types\n  try {\n    type ErrorWithReason = { reason: unknown };\n    // PromiseRejectionEvents store the object of the rejection under 'reason'\n    // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n    if ('reason' in (error as ErrorWithReason)) {\n      return (error as ErrorWithReason).reason;\n    }\n\n    type CustomEventWithDetail = { detail: { reason: unknown } };\n    // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n    // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n    // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n    // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n    // https://github.com/getsentry/sentry-javascript/issues/2380\n    if ('detail' in (error as CustomEventWithDetail) && 'reason' in (error as CustomEventWithDetail).detail) {\n      return (error as CustomEventWithDetail).detail.reason;\n    }\n  } catch {} // eslint-disable-line no-empty\n\n  return error;\n}\n\n/**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\nexport function _eventFromRejectionWithPrimitive(reason: Primitive): Event {\n  return {\n    exception: {\n      values: [\n        {\n          type: 'UnhandledRejection',\n          // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n          value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n        },\n      ],\n    },\n  };\n}\n\nfunction _enhanceEventWithInitialFrame(\n  event: Event,\n  url: string | undefined,\n  lineno: number | undefined,\n  colno: number | undefined,\n): Event {\n  // event.exception\n  const e = (event.exception = event.exception || {});\n  // event.exception.values\n  const ev = (e.values = e.values || []);\n  // event.exception.values[0]\n  const ev0 = (ev[0] = ev[0] || {});\n  // event.exception.values[0].stacktrace\n  const ev0s = (ev0.stacktrace = ev0.stacktrace || {});\n  // event.exception.values[0].stacktrace.frames\n  const ev0sf = (ev0s.frames = ev0s.frames || []);\n\n  if (ev0sf.length === 0) {\n    ev0sf.push({\n      colno,\n      lineno,\n      filename: getFilenameFromUrl(url) ?? getLocationHref(),\n      function: UNKNOWN_FUNCTION,\n      in_app: true,\n    });\n  }\n\n  return event;\n}\n\nfunction globalHandlerLog(type: string): void {\n  DEBUG_BUILD && debug.log(`Global Handler attached: ${type}`);\n}\n\nfunction getOptions(): { stackParser: StackParser; attachStacktrace?: boolean } {\n  const client = getClient<BrowserClient>();\n  const options = client?.getOptions() || {\n    stackParser: () => [],\n    attachStacktrace: false,\n  };\n  return options;\n}\n\nfunction getFilenameFromUrl(url: string | undefined): string | undefined {\n  if (!isString(url) || url.length === 0) {\n    return undefined;\n  }\n\n  // Strip data URL content to avoid long base64 strings in stack frames\n  // (e.g. when initializing a Worker with a base64 encoded script)\n  // Don't include data prefix for filenames as it's not useful for stack traces\n  // Wrap with < > to indicate it's a placeholder\n  if (url.startsWith('data:')) {\n    return `<${stripDataUrlContent(url, false)}>`;\n  }\n\n  return url;\n}\n","import type { ExtendedError } from '../types/error';\nimport type { Event, EventHint } from '../types/event';\nimport type { Exception } from '../types/exception';\nimport type { StackParser } from '../types/stacktrace';\nimport { isInstanceOf } from './is';\n\n/**\n * Creates exceptions inside `event.exception.values` for errors that are nested on properties based on the `key` parameter.\n */\nexport function applyAggregateErrorsToEvent(\n  exceptionFromErrorImplementation: (stackParser: StackParser, ex: Error) => Exception,\n  parser: StackParser,\n  key: string,\n  limit: number,\n  event: Event,\n  hint?: EventHint,\n): void {\n  if (!event.exception?.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n    return;\n  }\n\n  // Generally speaking the last item in `event.exception.values` is the exception originating from the original Error\n  const originalException: Exception | undefined =\n    event.exception.values.length > 0 ? event.exception.values[event.exception.values.length - 1] : undefined;\n\n  // We only create exception grouping if there is an exception in the event.\n  if (originalException) {\n    event.exception.values = aggregateExceptionsFromError(\n      exceptionFromErrorImplementation,\n      parser,\n      limit,\n      hint.originalException as ExtendedError,\n      key,\n      event.exception.values,\n      originalException,\n      0,\n    );\n  }\n}\n\nfunction aggregateExceptionsFromError(\n  exceptionFromErrorImplementation: (stackParser: StackParser, ex: Error) => Exception,\n  parser: StackParser,\n  limit: number,\n  error: ExtendedError,\n  key: string,\n  prevExceptions: Exception[],\n  exception: Exception,\n  exceptionId: number,\n): Exception[] {\n  if (prevExceptions.length >= limit + 1) {\n    return prevExceptions;\n  }\n\n  let newExceptions = [...prevExceptions];\n\n  // Recursively call this function in order to walk down a chain of errors\n  if (isInstanceOf(error[key], Error)) {\n    applyExceptionGroupFieldsForParentException(exception, exceptionId, error);\n    const newException = exceptionFromErrorImplementation(parser, error[key] as Error);\n    const newExceptionId = newExceptions.length;\n    applyExceptionGroupFieldsForChildException(newException, key, newExceptionId, exceptionId);\n    newExceptions = aggregateExceptionsFromError(\n      exceptionFromErrorImplementation,\n      parser,\n      limit,\n      error[key] as ExtendedError,\n      key,\n      [newException, ...newExceptions],\n      newException,\n      newExceptionId,\n    );\n  }\n\n  // This will create exception grouping for AggregateErrors\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError\n  if (isExceptionGroup(error)) {\n    error.errors.forEach((childError, i) => {\n      if (isInstanceOf(childError, Error)) {\n        applyExceptionGroupFieldsForParentException(exception, exceptionId, error);\n        const newException = exceptionFromErrorImplementation(parser, childError as Error);\n        const newExceptionId = newExceptions.length;\n        applyExceptionGroupFieldsForChildException(newException, `errors[${i}]`, newExceptionId, exceptionId);\n        newExceptions = aggregateExceptionsFromError(\n          exceptionFromErrorImplementation,\n          parser,\n          limit,\n          childError as ExtendedError,\n          key,\n          [newException, ...newExceptions],\n          newException,\n          newExceptionId,\n        );\n      }\n    });\n  }\n\n  return newExceptions;\n}\n\nfunction isExceptionGroup(error: ExtendedError): error is ExtendedError & { errors: unknown[] } {\n  return Array.isArray(error.errors);\n}\n\nfunction applyExceptionGroupFieldsForParentException(\n  exception: Exception,\n  exceptionId: number,\n  error: ExtendedError,\n): void {\n  exception.mechanism = {\n    handled: true,\n    type: 'auto.core.linked_errors',\n    ...(isExceptionGroup(error) && { is_exception_group: true }),\n    ...exception.mechanism,\n    exception_id: exceptionId,\n  };\n}\n\nfunction applyExceptionGroupFieldsForChildException(\n  exception: Exception,\n  source: string,\n  exceptionId: number,\n  parentId: number | undefined,\n): void {\n  exception.mechanism = {\n    handled: true,\n    ...exception.mechanism,\n    type: 'chained',\n    source,\n    exception_id: exceptionId,\n    parent_id: parentId,\n  };\n}\n","import type { IntegrationFn } from '@sentry/core/browser';\nimport { applyAggregateErrorsToEvent, defineIntegration } from '@sentry/core/browser';\nimport { exceptionFromError } from '../eventbuilder';\n\ninterface LinkedErrorsOptions {\n  key?: string;\n  limit?: number;\n}\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\nconst INTEGRATION_NAME = 'LinkedErrors' as const;\n\nconst _linkedErrorsIntegration = ((options: LinkedErrorsOptions = {}) => {\n  const limit = options.limit || DEFAULT_LIMIT;\n  const key = options.key || DEFAULT_KEY;\n\n  return {\n    name: INTEGRATION_NAME,\n    preprocessEvent(event, hint, client) {\n      const options = client.getOptions();\n\n      applyAggregateErrorsToEvent(\n        // This differs from the LinkedErrors integration in core by using a different exceptionFromError function\n        exceptionFromError,\n        options.stackParser,\n        key,\n        limit,\n        event,\n        hint,\n      );\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Aggregrate linked errors in an event.\n */\nexport const linkedErrorsIntegration = defineIntegration(_linkedErrorsIntegration);\n","// This was originally forked from https://github.com/csnover/TraceKit, and was largely\n// re - written as part of raven - js.\n//\n// This code was later copied to the JavaScript mono - repo and further modified and\n// refactored over the years.\n\n// Copyright (c) 2013 Onur Can Cakmak onur.cakmak@gmail.com and all TraceKit contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this\n// software and associated documentation files(the 'Software'), to deal in the Software\n// without restriction, including without limitation the rights to use, copy, modify,\n// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies\n// or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n// PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport type { StackFrame, StackLineParser, StackLineParserFn } from '@sentry/core/browser';\nimport { createStackParser, UNKNOWN_FUNCTION } from '@sentry/core/browser';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n  const frame: StackFrame = {\n    filename,\n    function: func === '<anonymous>' ? UNKNOWN_FUNCTION : func,\n    in_app: true, // All browser frames are considered in_app\n  };\n\n  if (lineno !== undefined) {\n    frame.lineno = lineno;\n  }\n\n  if (colno !== undefined) {\n    frame.colno = colno;\n  }\n\n  return frame;\n}\n\n// This regex matches frames that have no function name (ie. are at the top level of a module).\n// For example \"at http://localhost:5000//script.js:1:126\"\n// Frames _with_ function names usually look as follows: \"at commitLayoutEffects (react-dom.development.js:23426:1)\"\nconst chromeRegexNoFnName = /^\\s*at (\\S+?)(?::(\\d+))(?::(\\d+))\\s*$/i;\n\n// This regex matches all the frames that have a function name.\nconst chromeRegex =\n  /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\n// Matches stack frames with data URIs instead of filename so we can still get the function name\n// Example: \"at dynamicFn (data:application/javascript,export function dynamicFn() {...\"\nconst chromeDataUriRegex = /at (.+?) ?\\(data:(.+?),/;\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\n// We cannot call this variable `chrome` because it can conflict with global `chrome` variable in certain environments\n// See: https://github.com/getsentry/sentry-javascript/issues/6880\nconst chromeStackParserFn: StackLineParserFn = line => {\n  const dataUriMatch = line.match(chromeDataUriRegex);\n  if (dataUriMatch) {\n    return {\n      filename: `<data:${dataUriMatch[2]}>`,\n      function: dataUriMatch[1],\n    };\n  }\n\n  // If the stack line has no function name, we need to parse it differently\n  const noFnParts = chromeRegexNoFnName.exec(line) as null | [string, string, string, string];\n\n  if (noFnParts) {\n    const [, filename, line, col] = noFnParts;\n    return createFrame(filename, UNKNOWN_FUNCTION, +line, +col);\n  }\n\n  const parts = chromeRegex.exec(line) as null | [string, string, string, string, string];\n\n  if (parts) {\n    const isEval = parts[2]?.indexOf('eval') === 0; // start of line\n\n    if (isEval) {\n      const subMatch = chromeEvalRegex.exec(parts[2]) as null | [string, string, string, string];\n\n      if (subMatch) {\n        // throw out eval line/column and use top-most line/column number\n        parts[2] = subMatch[1]; // url\n        parts[3] = subMatch[2]; // line\n        parts[4] = subMatch[3]; // column\n      }\n    }\n\n    // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n    // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n    const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n    return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n  }\n\n  return;\n};\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chromeStackParserFn];\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n  /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko: StackLineParserFn = line => {\n  const parts = geckoREgex.exec(line) as null | [string, string, string, string, string, string];\n\n  if (parts) {\n    const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n    if (isEval) {\n      const subMatch = geckoEvalRegex.exec(parts[3]) as null | [string, string, string];\n\n      if (subMatch) {\n        // throw out eval line/column and use top-most line number\n        parts[1] = parts[1] || 'eval';\n        parts[3] = subMatch[1];\n        parts[4] = subMatch[2];\n        parts[5] = ''; // no column when eval\n      }\n    }\n\n    let filename = parts[3];\n    let func = parts[1] || UNKNOWN_FUNCTION;\n    [func, filename] = extractSafariExtensionDetails(func, filename);\n\n    return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n  }\n\n  return;\n};\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs: StackLineParserFn = line => {\n  const parts = winjsRegex.exec(line) as null | [string, string, string, string, string];\n\n  return parts\n    ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n    : undefined;\n};\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10: StackLineParserFn = line => {\n  const parts = opera10Regex.exec(line) as null | [string, string, string, string];\n  return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n  / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11: StackLineParserFn = line => {\n  const parts = opera11Regex.exec(line) as null | [string, string, string, string, string, string];\n  return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11];\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser];\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers);\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n *   at function@url:row:col\n *   at function@url:row:col\n *   at function@url:row:col\n *\n * it produces something like:\n *\n *   function@url:row:col\n *   function@url:row:col\n *   function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n  const isSafariExtension = func.indexOf('safari-extension') !== -1;\n  const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n  return isSafariExtension || isSafariWebExtension\n    ? [\n        func.indexOf('@') !== -1 ? (func.split('@')[0] as string) : UNKNOWN_FUNCTION,\n        isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n      ]\n    : [func, filename];\n};\n","import type { DataCategory } from '../types/datacategory';\nimport type { TransportMakeRequestResponse } from '../types/transport';\nimport { safeDateNow } from './randomSafeContext';\n\n// Intentionally keeping the key broad, as we don't know for sure what rate limit headers get returned from backend\nexport type RateLimits = Record<string, number>;\n\nexport const DEFAULT_RETRY_AFTER = 60 * 1000; // 60 seconds\n\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param header string representation of 'Retry-After' header\n * @param now current unix timestamp\n *\n */\nexport function parseRetryAfterHeader(header: string, now: number = safeDateNow()): number {\n  const headerDelay = parseInt(`${header}`, 10);\n  if (!isNaN(headerDelay)) {\n    return headerDelay * 1000;\n  }\n\n  const headerDate = Date.parse(`${header}`);\n  if (!isNaN(headerDate)) {\n    return headerDate - now;\n  }\n\n  return DEFAULT_RETRY_AFTER;\n}\n\n/**\n * Gets the time that the given category is disabled until for rate limiting.\n * In case no category-specific limit is set but a general rate limit across all categories is active,\n * that time is returned.\n *\n * @return the time in ms that the category is disabled until or 0 if there's no active rate limit.\n */\nexport function disabledUntil(limits: RateLimits, dataCategory: DataCategory): number {\n  return limits[dataCategory] || limits.all || 0;\n}\n\n/**\n * Checks if a category is rate limited\n */\nexport function isRateLimited(limits: RateLimits, dataCategory: DataCategory, now: number = safeDateNow()): boolean {\n  return disabledUntil(limits, dataCategory) > now;\n}\n\n/**\n * Update ratelimits from incoming headers.\n *\n * @return the updated RateLimits object.\n */\nexport function updateRateLimits(\n  limits: RateLimits,\n  { statusCode, headers }: TransportMakeRequestResponse,\n  now: number = safeDateNow(),\n): RateLimits {\n  const updatedRateLimits: RateLimits = {\n    ...limits,\n  };\n\n  // \"The name is case-insensitive.\"\n  // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n  const rateLimitHeader = headers?.['x-sentry-rate-limits'];\n  const retryAfterHeader = headers?.['retry-after'];\n\n  if (rateLimitHeader) {\n    /**\n     * rate limit headers are of the form\n     *     <header>,<header>,..\n     * where each <header> is of the form\n     *     <retry_after>: <categories>: <scope>: <reason_code>: <namespaces>\n     * where\n     *     <retry_after> is a delay in seconds\n     *     <categories> is the event type(s) (error, transaction, etc) being rate limited and is of the form\n     *         <category>;<category>;...\n     *     <scope> is what's being limited (org, project, or key) - ignored by SDK\n     *     <reason_code> is an arbitrary string like \"org_quota\" - ignored by SDK\n     *     <namespaces> Semicolon-separated list of metric namespace identifiers. Defines which namespace(s) will be affected.\n     *         Only present if rate limit applies to the metric_bucket data category.\n     */\n    for (const limit of rateLimitHeader.trim().split(',')) {\n      const [retryAfter, categories, , , namespaces] = limit.split(':', 5) as [string, ...string[]];\n      const headerDelay = parseInt(retryAfter, 10);\n      const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n      if (!categories) {\n        updatedRateLimits.all = now + delay;\n      } else {\n        for (const category of categories.split(';')) {\n          if (category === 'metric_bucket') {\n            // namespaces will be present when category === 'metric_bucket'\n            if (!namespaces || namespaces.split(';').includes('custom')) {\n              updatedRateLimits[category] = now + delay;\n            }\n          } else {\n            updatedRateLimits[category] = now + delay;\n          }\n        }\n      }\n    }\n  } else if (retryAfterHeader) {\n    updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);\n  } else if (statusCode === 429) {\n    updatedRateLimits.all = now + 60 * 1000;\n  }\n\n  return updatedRateLimits;\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport type { EventDropReason } from '../types/clientreport';\nimport type { Envelope, EnvelopeItem } from '../types/envelope';\nimport type {\n  InternalBaseTransportOptions,\n  Transport,\n  TransportMakeRequestResponse,\n  TransportRequestExecutor,\n} from '../types/transport';\nimport { debug } from '../utils/debug-logger';\nimport {\n  createEnvelope,\n  envelopeContainsItemType,\n  envelopeItemTypeToDataCategory,\n  forEachEnvelopeItem,\n  serializeEnvelope,\n} from '../utils/envelope';\nimport { makePromiseBuffer, type PromiseBuffer, SENTRY_BUFFER_FULL_ERROR } from '../utils/promisebuffer';\nimport { isRateLimited, type RateLimits, updateRateLimits } from '../utils/ratelimit';\n\nexport const DEFAULT_TRANSPORT_BUFFER_SIZE = 64;\n\n/**\n * Creates an instance of a Sentry `Transport`\n *\n * @param options\n * @param makeRequest\n */\nexport function createTransport(\n  options: InternalBaseTransportOptions,\n  makeRequest: TransportRequestExecutor,\n  buffer: PromiseBuffer<TransportMakeRequestResponse> = makePromiseBuffer(\n    options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE,\n  ),\n): Transport {\n  let rateLimits: RateLimits = {};\n  const flush = (timeout?: number): PromiseLike<boolean> => buffer.drain(timeout);\n\n  function send(envelope: Envelope): PromiseLike<TransportMakeRequestResponse> {\n    const filteredEnvelopeItems: EnvelopeItem[] = [];\n\n    // Drop rate limited items from envelope\n    forEachEnvelopeItem(envelope, (item, type) => {\n      const dataCategory = envelopeItemTypeToDataCategory(type);\n      if (isRateLimited(rateLimits, dataCategory)) {\n        options.recordDroppedEvent('ratelimit_backoff', dataCategory);\n      } else {\n        filteredEnvelopeItems.push(item);\n      }\n    });\n\n    // Skip sending if envelope is empty after filtering out rate limited events\n    if (filteredEnvelopeItems.length === 0) {\n      return Promise.resolve({});\n    }\n\n    const filteredEnvelope: Envelope = createEnvelope(envelope[0], filteredEnvelopeItems as (typeof envelope)[1]);\n\n    // Creates client report for each item in an envelope\n    const recordEnvelopeLoss = (reason: EventDropReason): void => {\n      // Don't record outcomes for client reports - we don't want to create a feedback loop if client reports themselves fail to send\n      if (envelopeContainsItemType(filteredEnvelope, ['client_report'])) {\n        DEBUG_BUILD && debug.warn(`Dropping client report. Will not send outcomes (reason: ${reason}).`);\n        return;\n      }\n      forEachEnvelopeItem(filteredEnvelope, (item, type) => {\n        options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type));\n      });\n    };\n\n    const requestTask = (): PromiseLike<TransportMakeRequestResponse> =>\n      makeRequest({ body: serializeEnvelope(filteredEnvelope) }).then(\n        response => {\n          // Handle 413 Content Too Large\n          // Loss of envelope content is expected so we record a send_error client report\n          // https://develop.sentry.dev/sdk/expected-features/#dealing-with-network-failures\n          if (response.statusCode === 413) {\n            DEBUG_BUILD &&\n              debug.error(\n                'Sentry responded with status code 413. Envelope was discarded due to exceeding size limits.',\n              );\n            recordEnvelopeLoss('send_error');\n            return response;\n          }\n\n          // We don't want to throw on NOK responses, but we want to at least log them\n          if (\n            DEBUG_BUILD &&\n            response.statusCode !== undefined &&\n            (response.statusCode < 200 || response.statusCode >= 300)\n          ) {\n            debug.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);\n          }\n\n          rateLimits = updateRateLimits(rateLimits, response);\n          return response;\n        },\n        error => {\n          recordEnvelopeLoss('network_error');\n          DEBUG_BUILD && debug.error('Encountered error running transport request:', error);\n          throw error;\n        },\n      );\n\n    return buffer.add(requestTask).then(\n      result => result,\n      error => {\n        if (error === SENTRY_BUFFER_FULL_ERROR) {\n          DEBUG_BUILD && debug.error('Skipped sending event because buffer is full.');\n          recordEnvelopeLoss('queue_overflow');\n          return Promise.resolve({});\n        } else {\n          throw error;\n        }\n      },\n    );\n  }\n\n  return {\n    send,\n    flush,\n  };\n}\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","import { debug, isNativeFunction } from '@sentry/core';\nimport { DEBUG_BUILD } from './debug-build';\nimport { WINDOW } from './types';\n\n/**\n * We generally want to use window.fetch / window.setTimeout.\n * However, in some cases this may be wrapped (e.g. by Zone.js for Angular),\n * so we try to get an unpatched version of this from a sandboxed iframe.\n */\n\ninterface CacheableImplementations {\n  setTimeout: typeof WINDOW.setTimeout;\n  fetch: typeof WINDOW.fetch;\n}\n\nconst cachedImplementations: Partial<CacheableImplementations> = {};\n\n/**\n * Get the native implementation of a browser function.\n *\n * This can be used to ensure we get an unwrapped version of a function, in cases where a wrapped function can lead to problems.\n *\n * The following methods can be retrieved:\n * - `setTimeout`: This can be wrapped by e.g. Angular, causing change detection to be triggered.\n * - `fetch`: This can be wrapped by e.g. ad-blockers, causing an infinite loop when a request is blocked.\n */\nexport function getNativeImplementation<T extends keyof CacheableImplementations>(\n  name: T,\n): CacheableImplementations[T] {\n  const cached = cachedImplementations[name];\n  if (cached) {\n    return cached;\n  }\n\n  let impl = WINDOW[name] as CacheableImplementations[T];\n\n  // Fast path to avoid DOM I/O\n  if (isNativeFunction(impl)) {\n    return (cachedImplementations[name] = impl.bind(WINDOW) as CacheableImplementations[T]);\n  }\n\n  const document = WINDOW.document;\n  // eslint-disable-next-line typescript/no-deprecated\n  if (document && typeof document.createElement === 'function') {\n    try {\n      const sandbox = document.createElement('iframe');\n      sandbox.hidden = true;\n      document.head.appendChild(sandbox);\n      const contentWindow = sandbox.contentWindow;\n      if (contentWindow?.[name]) {\n        impl = contentWindow[name] as CacheableImplementations[T];\n      }\n      document.head.removeChild(sandbox);\n    } catch (e) {\n      // Could not create sandbox iframe, just use window.xxx\n      DEBUG_BUILD && debug.warn(`Could not create sandbox iframe for ${name} check, bailing to window.${name}: `, e);\n    }\n  }\n\n  // Sanity check: This _should_ not happen, but if it does, we just skip caching...\n  // This can happen e.g. in tests where fetch may not be available in the env, or similar.\n  if (!impl) {\n    return impl;\n  }\n\n  return (cachedImplementations[name] = impl.bind(WINDOW) as CacheableImplementations[T]);\n}\n\n/** Clear a cached implementation. */\nexport function clearCachedImplementation(name: keyof CacheableImplementations): void {\n  cachedImplementations[name] = undefined;\n}\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n *   const p = f.apply(this, arguments);\n *\n *   p.then(function() {\n *     console.log('hi.');\n *   });\n *\n *   return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome:  Failed to fetch\n * Edge:    Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari:  resource blocked by content blocker\n */\nexport function fetch(...rest: Parameters<typeof WINDOW.fetch>): ReturnType<typeof WINDOW.fetch> {\n  return getNativeImplementation('fetch')(...rest);\n}\n\n/**\n * Get an unwrapped `setTimeout` method.\n * This ensures that even if e.g. Angular wraps `setTimeout`, we get the native implementation,\n * avoiding triggering change detection.\n */\nexport function setTimeout(...rest: Parameters<typeof WINDOW.setTimeout>): ReturnType<typeof WINDOW.setTimeout> {\n  return getNativeImplementation('setTimeout')(...rest);\n}\n","import type { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/core/browser';\nimport { createTransport, makePromiseBuffer } from '@sentry/core/browser';\nimport { clearCachedImplementation, getNativeImplementation } from '@sentry/browser-utils';\nimport type { WINDOW } from '../helpers';\nimport type { BrowserTransportOptions } from './types';\n\nconst DEFAULT_BROWSER_TRANSPORT_BUFFER_SIZE = 40;\n\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nexport function makeFetchTransport(\n  options: BrowserTransportOptions,\n  nativeFetch: typeof WINDOW.fetch = getNativeImplementation('fetch'),\n): Transport {\n  let pendingBodySize = 0;\n  let pendingCount = 0;\n\n  async function makeRequest(request: TransportRequest): Promise<TransportMakeRequestResponse> {\n    const requestSize = request.body.length;\n    pendingBodySize += requestSize;\n    pendingCount++;\n\n    const requestOptions: RequestInit = {\n      body: request.body,\n      method: 'POST',\n      referrerPolicy: 'strict-origin',\n      headers: options.headers,\n      // Outgoing requests are usually cancelled when navigating to a different page, causing a \"TypeError: Failed to\n      // fetch\" error and sending a \"network_error\" client-outcome - in Chrome, the request status shows \"(cancelled)\".\n      // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're\n      // frequently sending events right before the user is switching pages (eg. when finishing navigation transactions).\n      // Gotchas:\n      // - `keepalive` isn't supported by Firefox\n      // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch):\n      //   If the sum of contentLength and inflightKeepaliveBytes is greater than 64 kibibytes, then return a network error.\n      //   We will therefore only activate the flag when we're below that limit.\n      // There is also a limit of requests that can be open at the same time, so we also limit this to 15\n      // See https://github.com/getsentry/sentry-javascript/pull/7553 for details\n      keepalive: pendingBodySize <= 60_000 && pendingCount < 15,\n      ...options.fetchOptions,\n    };\n\n    try {\n      // Note: We do not need to suppress tracing here, because we are using the native fetch, instead of our wrapped one.\n      const response = await nativeFetch(options.url, requestOptions);\n\n      return {\n        statusCode: response.status,\n        headers: {\n          'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n          'retry-after': response.headers.get('Retry-After'),\n        },\n      };\n    } catch (e) {\n      clearCachedImplementation('fetch');\n      throw e;\n    } finally {\n      pendingBodySize -= requestSize;\n      pendingCount--;\n    }\n  }\n\n  return createTransport(\n    options,\n    makeRequest,\n    makePromiseBuffer(options.bufferSize || DEFAULT_BROWSER_TRANSPORT_BUFFER_SIZE),\n  );\n}\n","import { htmlTreeAsString, isElement } from '@sentry/browser-utils';\n\ntype Prototype = { constructor?: (...args: unknown[]) => unknown };\n\nconst HTML_ELEMENT_CONSTRUCTOR_NAME_REGEX = /^HTML(\\w*)Element$/;\n\n/**\n * Browser-specific contributions to `normalize()`'s `stringifyValue`. Plug into\n * `setNormalizeStringifier` from the browser SDK so DOM values get a useful string\n * representation without forcing core to carry the DOM-specific code.\n *\n * Handles:\n * - `window` → `[Window]`\n * - `document` → `[Document]`\n * - `HTMLElement` subclasses → `[HTMLElement: <css-selector-path>]` (via `htmlTreeAsString`)\n *\n * Vue ViewModels and React SyntheticEvents are not handled here — the Vue and React\n * SDKs wrap this function in their `init` and add their own checks on top.\n */\nexport function normalizeStringifyValue(value: Exclude<unknown, string | number | boolean | null>): string | undefined {\n  // oxlint-disable-next-line no-restricted-globals\n  if (typeof window !== 'undefined' && value === window) {\n    return '[Window]';\n  }\n  // oxlint-disable-next-line no-restricted-globals\n  if (typeof document !== 'undefined' && value === document) {\n    return '[Document]';\n  }\n\n  if (isElement(value)) {\n    const objName = getConstructorName(value);\n    if (HTML_ELEMENT_CONSTRUCTOR_NAME_REGEX.test(objName)) {\n      return `[HTMLElement: ${htmlTreeAsString(value)}]`;\n    }\n  }\n\n  return undefined;\n}\n\nfunction getConstructorName(value: unknown): string {\n  const prototype: Prototype | null = Object.getPrototypeOf(value);\n\n  return prototype?.constructor ? prototype.constructor.name : 'null prototype';\n}\n","/**\n * Checks whether given value's type is an Element instance.\n *\n * Returns false if `Element` is not available in the current runtime.\n */\nexport function isElement(wat: unknown): boolean {\n  if (typeof Element === 'undefined') {\n    return false;\n  }\n  try {\n    return wat instanceof Element;\n  } catch {\n    return false;\n  }\n}\n","import { consoleSandbox, getLocationHref } from '@sentry/core/browser';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\ntype ExtensionRuntime = {\n  runtime?: {\n    id?: string;\n  };\n};\ntype ExtensionProperties = {\n  chrome?: ExtensionRuntime;\n  browser?: ExtensionRuntime;\n  nw?: unknown;\n};\n\n/**\n * Returns true if the SDK is running in an embedded browser extension.\n * Stand-alone browser extensions (which do not share the same data as the main browser page) are fine.\n */\nexport function checkAndWarnIfIsEmbeddedBrowserExtension(): boolean {\n  if (_isEmbeddedBrowserExtension()) {\n    if (DEBUG_BUILD) {\n      consoleSandbox(() => {\n        // eslint-disable-next-line no-console\n        console.error(\n          '[Sentry] You cannot use Sentry.init() in a browser extension, see: https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/',\n        );\n      });\n    }\n\n    return true;\n  }\n\n  return false;\n}\n\nfunction _isEmbeddedBrowserExtension(): boolean {\n  if (typeof WINDOW.window === 'undefined') {\n    // No need to show the error if we're not in a browser window environment (e.g. service workers)\n    return false;\n  }\n\n  const _window = WINDOW as typeof WINDOW & ExtensionProperties;\n\n  // Running the SDK in NW.js, which appears like a browser extension but isn't, is also fine\n  // see: https://github.com/getsentry/sentry-javascript/issues/12668\n  if (_window.nw) {\n    return false;\n  }\n\n  const extensionObject = _window['chrome'] || _window['browser'];\n\n  if (!extensionObject?.runtime?.id) {\n    return false;\n  }\n\n  const href = getLocationHref();\n\n  // Running the SDK in a dedicated extension page and calling Sentry.init is fine; no risk of data leakage\n  const isDedicatedExtensionPage =\n    WINDOW === WINDOW.top &&\n    /^(?:chrome-extension|moz-extension|ms-browser-extension|safari-web-extension):\\/\\//.test(href);\n\n  return !isDedicatedExtensionPage;\n}\n","import type { Client, Integration, Options } from '@sentry/core/browser';\nimport {\n  conversationIdIntegration,\n  dedupeIntegration,\n  functionToStringIntegration,\n  getIntegrationsToSetup,\n  inboundFiltersIntegration,\n  initAndBind,\n  setNormalizeStringifier,\n  stackParserFromStackParserOptions,\n} from '@sentry/core/browser';\nimport type { BrowserClientOptions, BrowserOptions } from './client';\nimport { BrowserClient } from './client';\nimport { breadcrumbsIntegration } from './integrations/breadcrumbs';\nimport { browserApiErrorsIntegration } from './integrations/browserapierrors';\nimport { browserSessionIntegration } from './integrations/browsersession';\nimport { cultureContextIntegration } from './integrations/culturecontext';\nimport { globalHandlersIntegration } from './integrations/globalhandlers';\nimport { httpContextIntegration } from './integrations/httpcontext';\nimport { linkedErrorsIntegration } from './integrations/linkederrors';\nimport { spotlightBrowserIntegration } from './integrations/spotlight';\nimport { defaultStackParser } from './stack-parsers';\nimport { makeFetchTransport } from './transports/fetch';\nimport { normalizeStringifyValue } from './normalizeStringifyValue';\nimport { checkAndWarnIfIsEmbeddedBrowserExtension } from './utils/detectBrowserExtension';\n\n/** Get the default integrations for the browser SDK. */\nexport function getDefaultIntegrations(_options: Options): Integration[] {\n  /**\n   * Note: Please make sure this stays in sync with Angular SDK, which re-exports\n   * `getDefaultIntegrations` but with an adjusted set of integrations.\n   */\n  return [\n    // TODO(v11): Replace with `eventFiltersIntegration` once we remove the deprecated `inboundFiltersIntegration`\n    // eslint-disable-next-line typescript/no-deprecated\n    inboundFiltersIntegration(),\n    functionToStringIntegration(),\n    conversationIdIntegration(),\n    browserApiErrorsIntegration(),\n    breadcrumbsIntegration(),\n    globalHandlersIntegration(),\n    linkedErrorsIntegration(),\n    dedupeIntegration(),\n    httpContextIntegration(),\n    cultureContextIntegration(),\n    browserSessionIntegration(),\n  ];\n}\n\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n *   dsn: '__DSN__',\n *   // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n *   message: 'My Breadcrumb',\n *   // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n *   message: 'Manual',\n *   stacktrace: [\n *     // ...\n *   ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options: BrowserOptions = {}): Client | undefined {\n  const shouldDisableBecauseIsBrowserExtenstion =\n    !options.skipBrowserExtensionCheck && checkAndWarnIfIsEmbeddedBrowserExtension();\n\n  let defaultIntegrations =\n    options.defaultIntegrations == null ? getDefaultIntegrations(options) : options.defaultIntegrations;\n\n  /*! rollup-include-development-only */\n  if (options.spotlight) {\n    if (!defaultIntegrations) {\n      defaultIntegrations = [];\n    }\n    const args = typeof options.spotlight === 'string' ? { sidecarUrl: options.spotlight } : undefined;\n    defaultIntegrations.push(spotlightBrowserIntegration(args));\n  }\n  /*! rollup-include-development-only-end */\n\n  const clientOptions: BrowserClientOptions = {\n    ...options,\n    enabled: shouldDisableBecauseIsBrowserExtenstion ? false : options.enabled,\n    stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n    integrations: getIntegrationsToSetup({\n      integrations: options.integrations,\n      defaultIntegrations,\n    }),\n    transport: options.transport || makeFetchTransport,\n  };\n\n  setNormalizeStringifier(normalizeStringifyValue);\n\n  return initAndBind(BrowserClient, clientOptions);\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad(): void {\n  // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback: () => void): void {\n  callback();\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport * as Sentry from \"@sentry/browser\";\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport SdkConfig from \"./SdkConfig\";\nimport { MatrixClientPeg } from \"./MatrixClientPeg\";\nimport SettingsStore from \"./settings/SettingsStore\";\nimport { type IConfigOptions } from \"./IConfigOptions\";\n\n/* eslint-disable camelcase */\n\ntype StorageContext = {\n    storageManager_persisted?: string;\n    storageManager_quota?: string;\n    storageManager_usage?: string;\n    storageManager_usageDetails?: string;\n};\n\ntype UserContext = {\n    username: string;\n    enabled_labs: string;\n    low_bandwidth: string;\n};\n\ntype CryptoContext = {\n    crypto_version?: string;\n    device_keys?: string;\n    cross_signing_ready?: string;\n    cross_signing_supported_by_hs?: string;\n    cross_signing_key?: string;\n    cross_signing_privkey_in_secret_storage?: string;\n    cross_signing_master_privkey_cached?: string;\n    cross_signing_user_signing_privkey_cached?: string;\n    secret_storage_ready?: string;\n    secret_storage_key_in_account?: string;\n    session_backup_key_in_secret_storage?: string;\n    session_backup_key_cached?: string;\n    session_backup_key_well_formed?: string;\n};\n\ntype DeviceContext = {\n    device_id?: string;\n    mx_local_settings: string | null;\n    modernizr_missing_features?: string;\n};\n\ntype Contexts = {\n    user: UserContext;\n    crypto: CryptoContext;\n    device: DeviceContext;\n    storage: StorageContext;\n};\n\n/* eslint-enable camelcase */\n\nasync function getStorageContext(): Promise<StorageContext> {\n    const result: StorageContext = {};\n\n    // add storage persistence/quota information\n    if (navigator.storage && navigator.storage.persisted) {\n        try {\n            result[\"storageManager_persisted\"] = String(await navigator.storage.persisted());\n        } catch {}\n    } else if (document.hasStorageAccess) {\n        // Safari\n        try {\n            result[\"storageManager_persisted\"] = String(await document.hasStorageAccess());\n        } catch {}\n    }\n    if (navigator.storage && navigator.storage.estimate) {\n        try {\n            const estimate = await navigator.storage.estimate();\n            result[\"storageManager_quota\"] = String(estimate.quota);\n            result[\"storageManager_usage\"] = String(estimate.usage);\n            if (estimate.usageDetails) {\n                const usageDetails: string[] = [];\n                Object.keys(estimate.usageDetails).forEach((k) => {\n                    usageDetails.push(`${k}: ${String(estimate.usageDetails![k])}`);\n                });\n                result[`storageManager_usage`] = usageDetails.join(\", \");\n            }\n        } catch {}\n    }\n\n    return result;\n}\n\nfunction getUserContext(client: MatrixClient): UserContext {\n    return {\n        username: client.credentials.userId!,\n        enabled_labs: getEnabledLabs(),\n        low_bandwidth: SettingsStore.getValue(\"lowBandwidth\") ? \"enabled\" : \"disabled\",\n    };\n}\n\nfunction getEnabledLabs(): string {\n    const enabledLabs = SettingsStore.getFeatureSettingNames().filter((f) => SettingsStore.getValue(f));\n    if (enabledLabs.length) {\n        return enabledLabs.join(\", \");\n    }\n    return \"\";\n}\n\nasync function getCryptoContext(client: MatrixClient): Promise<CryptoContext> {\n    const cryptoApi = client.getCrypto();\n    if (!cryptoApi) {\n        return {};\n    }\n\n    const ownDeviceKeys = await cryptoApi.getOwnDeviceKeys();\n\n    const keys = [`curve25519:${ownDeviceKeys.curve25519}`, `ed25519:${ownDeviceKeys.ed25519}`];\n\n    const crossSigningStatus = await cryptoApi.getCrossSigningStatus();\n    const secretStorage = client.secretStorage;\n    const sessionBackupKeyFromCache = await cryptoApi.getSessionBackupPrivateKey();\n\n    return {\n        crypto_version: cryptoApi.getVersion(),\n        device_keys: keys.join(\", \"),\n        cross_signing_ready: String(await cryptoApi.isCrossSigningReady()),\n        cross_signing_key: (await cryptoApi.getCrossSigningKeyId()) ?? undefined,\n        cross_signing_privkey_in_secret_storage: String(crossSigningStatus.privateKeysInSecretStorage),\n        cross_signing_master_privkey_cached: String(crossSigningStatus.privateKeysCachedLocally.masterKey),\n        cross_signing_user_signing_privkey_cached: String(crossSigningStatus.privateKeysCachedLocally.userSigningKey),\n        secret_storage_ready: String(await cryptoApi.isSecretStorageReady()),\n        secret_storage_key_in_account: String(await secretStorage.hasKey()),\n        session_backup_key_in_secret_storage: String(!!(await client.isKeyBackupKeyStored())),\n        session_backup_key_cached: String(!!sessionBackupKeyFromCache),\n        session_backup_key_well_formed: String(sessionBackupKeyFromCache instanceof Uint8Array),\n    };\n}\n\nfunction getDeviceContext(client: MatrixClient): DeviceContext {\n    const result: DeviceContext = {\n        device_id: client?.deviceId ?? undefined,\n        mx_local_settings: SettingsStore.exportForRageshake(),\n    };\n\n    if (window.Modernizr) {\n        const missingFeatures = Object.keys(window.Modernizr).filter(\n            (key) => window.Modernizr[key as keyof ModernizrStatic] === false,\n        );\n        if (missingFeatures.length > 0) {\n            result[\"modernizr_missing_features\"] = missingFeatures.join(\", \");\n        }\n    }\n\n    return result;\n}\n\nasync function getContexts(): Promise<Contexts> {\n    const client = MatrixClientPeg.safeGet();\n    return {\n        user: getUserContext(client),\n        crypto: await getCryptoContext(client),\n        device: getDeviceContext(client),\n        storage: await getStorageContext(),\n    };\n}\n\nexport async function sendSentryReport(userText: string, issueUrl: string, error?: unknown): Promise<void> {\n    const sentryConfig = SdkConfig.getObject(\"sentry\");\n    if (!sentryConfig) return;\n\n    const captureContext = {\n        contexts: await getContexts(),\n        extra: {\n            user_text: userText,\n            issue_url: issueUrl,\n        },\n    };\n\n    // If there's no error and no issueUrl, the report will just produce non-grouped noise in Sentry, so don't\n    // upload it\n    if (error) {\n        Sentry.captureException(error, captureContext);\n    } else if (issueUrl) {\n        Sentry.captureMessage(`Issue: ${issueUrl}`, captureContext);\n    }\n}\n\nexport function setSentryUser(mxid: string): void {\n    if (SdkConfig.get().sentry) {\n        Sentry.setUser({ username: mxid });\n    }\n}\n\nexport async function initSentry(sentryConfig: IConfigOptions[\"sentry\"]): Promise<void> {\n    if (!sentryConfig) return;\n    const integrations = [\n        Sentry.inboundFiltersIntegration(),\n        Sentry.functionToStringIntegration(),\n        Sentry.breadcrumbsIntegration(),\n        Sentry.httpContextIntegration(),\n        Sentry.dedupeIntegration(),\n    ];\n\n    Sentry.init({\n        dsn: sentryConfig.dsn,\n        release: process.env.VERSION,\n        environment: sentryConfig.environment,\n        defaultIntegrations: false,\n        integrations,\n        // Set to 1.0 which is reasonable if we're only submitting Rageshakes; will need to be set < 1.0\n        // if we collect more frequently.\n        tracesSampleRate: 1.0,\n    });\n}\n\nwindow.mxSendSentryReport = sendSentryReport;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n */\n\nimport { type MatrixEvent, EventType, RelationType, M_POLL_END } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport SettingsStore from \"./settings/SettingsStore\";\nimport { type IRoomState } from \"./components/structures/RoomView\";\nimport { type SettingKey } from \"./settings/Settings.tsx\";\n\ninterface IDiff {\n    isMemberEvent: boolean;\n    isJoin?: boolean;\n    isPart?: boolean;\n    isDisplaynameChange?: boolean;\n    isAvatarChange?: boolean;\n}\n\nfunction memberEventDiff(ev: MatrixEvent): IDiff {\n    const diff: IDiff = {\n        isMemberEvent: ev.getType() === EventType.RoomMember,\n    };\n\n    // If is not a Member Event then the other checks do not apply, so bail early.\n    if (!diff.isMemberEvent) return diff;\n\n    const content = ev.getContent();\n    const prevContent = ev.getPrevContent();\n\n    const isMembershipChanged = content.membership !== prevContent.membership;\n    diff.isJoin = isMembershipChanged && content.membership === KnownMembership.Join;\n    diff.isPart =\n        isMembershipChanged && content.membership === KnownMembership.Leave && ev.getStateKey() === ev.getSender();\n\n    const isJoinToJoin = !isMembershipChanged && content.membership === KnownMembership.Join;\n    diff.isDisplaynameChange = isJoinToJoin && content.displayname !== prevContent.displayname;\n    diff.isAvatarChange = isJoinToJoin && content.avatar_url !== prevContent.avatar_url;\n    return diff;\n}\n\n/**\n * Determines whether the given event should be hidden from timelines.\n * @param ev The event\n * @param ctx An optional RoomContext to pull cached settings values from to avoid\n *     hitting the settings store\n */\nexport default function shouldHideEvent(ev: MatrixEvent, ctx?: IRoomState): boolean {\n    // Hide all poll end events\n    if (M_POLL_END.matches(ev.getType())) return true;\n\n    // Accessing the settings store directly can be expensive if done frequently,\n    // so we should prefer using cached values if a RoomContext is available\n    const isEnabled = ctx\n        ? (name: keyof IRoomState) => ctx[name]\n        : (name: SettingKey) => SettingsStore.getValue(name, ev.getRoomId());\n\n    // Hide redacted events\n    // Deleted events with a thread are always shown regardless of user preference\n    // to make sure that a thread can be accessible even if the root message is deleted\n    if (ev.isRedacted() && !isEnabled(\"showRedactions\") && !ev.getThread()) return true;\n\n    // Hide replacement events since they update the original tile (if enabled)\n    if (ev.isRelation(RelationType.Replace)) return true;\n\n    const eventDiff = memberEventDiff(ev);\n\n    if (eventDiff.isMemberEvent) {\n        if ((eventDiff.isJoin || eventDiff.isPart) && !isEnabled(\"showJoinLeaves\")) return true;\n        if (eventDiff.isAvatarChange && !isEnabled(\"showAvatarChanges\")) return true;\n        if (eventDiff.isDisplaynameChange && !isEnabled(\"showDisplaynameChanges\")) return true;\n    }\n\n    return false;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { type Command, CommandCategories, Commands } from \"../../../slash-commands/SlashCommands\";\nimport InfoDialog from \"./InfoDialog\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\n\n/**\n * Props for {@link SlashCommandHelpDialog}\n * @param roomId - The room ID to check whether commands are enabled\n * @param onFinished - Callback called when the dialog is closed\n */\ninterface IProps {\n    roomId: string;\n    onFinished(this: void): void;\n}\n\nconst SlashCommandHelpDialog: React.FC<IProps> = ({ roomId, onFinished }) => {\n    const categories: Record<string, Command[]> = {};\n    Commands.forEach((cmd) => {\n        if (!cmd.isEnabled(MatrixClientPeg.get(), roomId)) return;\n        if (!categories[cmd.category]) {\n            categories[cmd.category] = [];\n        }\n        categories[cmd.category].push(cmd);\n    });\n\n    const body = Object.values(CommandCategories)\n        .filter((c) => categories[c])\n        .map((category) => {\n            const rows = [\n                <tr key={\"_category_\" + category} className=\"mx_SlashCommandHelpDialog_headerRow\">\n                    <td colSpan={3}>\n                        <h2>{_t(category)}</h2>\n                    </td>\n                </tr>,\n            ];\n\n            categories[category].forEach((cmd) => {\n                rows.push(\n                    <tr key={cmd.command}>\n                        <td>\n                            <strong>{cmd.getCommand()}</strong>\n                        </td>\n                        <td>{cmd.args}</td>\n                        <td>{_t(cmd.description)}</td>\n                    </tr>,\n                );\n            });\n\n            return rows;\n        });\n\n    return (\n        <InfoDialog\n            className=\"mx_SlashCommandHelpDialog\"\n            title={_t(\"slash_command|help_dialog_title\")}\n            description={\n                <table>\n                    <tbody>{body}</tbody>\n                </table>\n            }\n            hasCloseButton={true}\n            onFinished={onFinished}\n        />\n    );\n};\n\nexport default SlashCommandHelpDialog;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020-2023 The Matrix.org Foundation C.I.C.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { EventType, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { SDKContextClass } from \"../contexts/SDKContextClass\";\nimport { isLocalRoom } from \"../utils/localRoom/isLocalRoom\";\nimport Modal from \"../Modal\";\nimport UploadConfirmDialog from \"../components/views/dialogs/UploadConfirmDialog\";\nimport { type RunResult } from \"./interface\";\n\nexport function reject(error?: any): RunResult {\n    return { error };\n}\n\nexport function success(promise: Promise<any> = Promise.resolve()): RunResult {\n    return { promise };\n}\n\nexport function successSync(value: any): RunResult {\n    return success(Promise.resolve(value));\n}\n\n/**\n * Check whether the user can affect power levels in the given room\n * @param cli - The Matrix client\n * @param roomId - The room ID\n * @returns True if the user can affect power levels, false otherwise\n */\nexport const canAffectPowerlevels = (cli: MatrixClient | null, roomId: string | null): boolean => {\n    if (!cli || !roomId) return false;\n    const room = cli?.getRoom(roomId);\n    return !!room?.currentState.maySendStateEvent(EventType.RoomPowerLevels, cli.getSafeUserId()) && !isLocalRoom(room);\n};\n\n// XXX: workaround for https://github.com/microsoft/TypeScript/issues/31816\ninterface HTMLInputEvent extends Event {\n    target: HTMLInputElement & EventTarget;\n}\n\nexport const singleMxcUpload = async (cli: MatrixClient): Promise<string | null> => {\n    return new Promise((resolve) => {\n        const fileSelector = document.createElement(\"input\");\n        fileSelector.setAttribute(\"type\", \"file\");\n        fileSelector.onchange = (ev: Event) => {\n            const file = (ev as HTMLInputEvent).target.files?.[0];\n            if (!file) return;\n\n            const { finished } = Modal.createDialog(UploadConfirmDialog, { file });\n            finished.then(async ([shouldContinue]) => {\n                if (shouldContinue) {\n                    const { content_uri: uri } = await cli.uploadContent(file);\n                    resolve(uri);\n                } else {\n                    resolve(null);\n                }\n            });\n        };\n\n        fileSelector.click();\n    });\n};\n\nexport const isCurrentLocalRoom = (cli: MatrixClient | null): boolean => {\n    const roomId = SDKContextClass.instance.roomViewStore.getRoomId();\n    if (!roomId) return false;\n    const room = cli?.getRoom(roomId);\n    if (!room) return false;\n    return isLocalRoom(room);\n};\n\n/**\n * Split the supplied string into one or two strings separated by the first\n * region of white space we can find.\n */\nexport function splitAtFirstSpace(args: string): [string, string?] {\n    const trimmedArgs = args.trim();\n    const i = trimmedArgs.search(/\\s+/);\n    if (i === -1) {\n        return [trimmedArgs];\n    } else {\n        const first = trimmedArgs.slice(0, i);\n        const second = trimmedArgs.slice(i + 1).trimStart();\n        if (second === \"\") {\n            return [first];\n        } else {\n            return [first, second];\n        }\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020-2023 The Matrix.org Foundation C.I.C.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type RoomMessageEventContent } from \"matrix-js-sdk/src/types\";\n\nimport { _td } from \"../languageHandler\";\nimport { type XOR } from \"../@types/common\";\n\nexport const CommandCategories = {\n    messages: _td(\"slash_command|category_messages\"),\n    actions: _td(\"slash_command|category_actions\"),\n    admin: _td(\"slash_command|category_admin\"),\n    advanced: _td(\"slash_command|category_advanced\"),\n    effects: _td(\"slash_command|category_effects\"),\n    other: _td(\"slash_command|category_other\"),\n};\n\nexport type RunResult = XOR<{ error: Error }, { promise: Promise<RoomMessageEventContent | undefined> }>;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020-2023 The Matrix.org Foundation C.I.C.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { type SlashCommand as SlashCommandEvent } from \"@matrix-org/analytics-events/types/typescript/SlashCommand\";\n\nimport { TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { reject } from \"./utils\";\nimport { _t, UserFriendlyError } from \"../languageHandler\";\nimport { PosthogAnalytics } from \"../PosthogAnalytics\";\nimport { CommandCategories, type RunResult } from \"./interface\";\n\n/**\n * The function signature for the run function of a {@link Command}\n * @param matrixClient - The Matrix client\n * @param roomId - The room ID where the command is run\n * @param threadId - The thread ID where the command is run, or null for room timeline\n * @param args - The arguments passed to the command\n * @returns The result of running the command\n */\ntype RunFn = (\n    this: Command,\n    matrixClient: MatrixClient,\n    roomId: string,\n    threadId: string | null,\n    args?: string,\n) => RunResult;\n\n/**\n * Options for {@link Command}\n * @param command - The command name, e.g. \"me\" for the /me command\n * @param aliases - Alternative names for the command\n * @param args - The arguments for the command, e.g. \"<message>\" for the /me command\n * @param description - A translation key describing the command\n * @param analyticsName - The name to use for analytics tracking\n * @param runFn - The function to execute when the command is run\n * @param category - The category of the command, e.g. CommandCategories.emoji\n * @param hideCompletionAfterSpace - Whether to hide autocomplete after a space is typed\n * @param isEnabled - A function to determine if the command is enabled in a given context\n * @param renderingTypes - The rendering types (room/thread) where this command is valid\n */\ninterface ICommandOpts {\n    command: string;\n    aliases?: string[];\n    args?: string;\n    description: TranslationKey;\n    analyticsName?: SlashCommandEvent[\"command\"];\n    runFn?: RunFn;\n    category: string;\n    hideCompletionAfterSpace?: boolean;\n    isEnabled?(this: void, matrixClient: MatrixClient | null, roomId: string | null): boolean;\n    renderingTypes?: TimelineRenderingType[];\n}\n\nexport class Command {\n    public readonly command: string;\n    public readonly aliases: string[];\n    public readonly args?: string;\n    public readonly description: TranslationKey;\n    public readonly runFn?: RunFn;\n    public readonly category: string;\n    public readonly hideCompletionAfterSpace: boolean;\n    public readonly renderingTypes?: TimelineRenderingType[];\n    public readonly analyticsName?: SlashCommandEvent[\"command\"];\n    private readonly _isEnabled?: (matrixClient: MatrixClient | null, roomId: string | null) => boolean;\n\n    public constructor(opts: ICommandOpts) {\n        this.command = opts.command;\n        this.aliases = opts.aliases || [];\n        this.args = opts.args || \"\";\n        this.description = opts.description;\n        this.runFn = opts.runFn?.bind(this);\n        this.category = opts.category || CommandCategories.other;\n        this.hideCompletionAfterSpace = opts.hideCompletionAfterSpace || false;\n        this._isEnabled = opts.isEnabled;\n        this.renderingTypes = opts.renderingTypes;\n        this.analyticsName = opts.analyticsName;\n    }\n\n    public getCommand(): string {\n        return `/${this.command}`;\n    }\n\n    public getCommandWithArgs(): string {\n        return this.getCommand() + \" \" + this.args;\n    }\n\n    public run(matrixClient: MatrixClient, roomId: string, threadId: string | null, args?: string): RunResult {\n        // if it has no runFn then its an ignored/nop command (autocomplete only) e.g `/me`\n        if (!this.runFn) {\n            return reject(new UserFriendlyError(\"slash_command|error_invalid_runfn\"));\n        }\n\n        const renderingType = threadId ? TimelineRenderingType.Thread : TimelineRenderingType.Room;\n        if (this.renderingTypes && !this.renderingTypes?.includes(renderingType)) {\n            return reject(\n                new UserFriendlyError(\"slash_command|error_invalid_rendering_type\", {\n                    renderingType,\n                    cause: undefined,\n                }),\n            );\n        }\n\n        if (this.analyticsName) {\n            PosthogAnalytics.instance.trackEvent<SlashCommandEvent>({\n                eventName: \"SlashCommand\",\n                command: this.analyticsName,\n            });\n        }\n\n        return this.runFn(matrixClient, roomId, threadId, args);\n    }\n\n    public getUsage(): string {\n        return _t(\"slash_command|usage\") + \": \" + this.getCommandWithArgs();\n    }\n\n    public isEnabled(cli: MatrixClient | null, roomId: string | null): boolean {\n        return this._isEnabled?.(cli, roomId) ?? true;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020-2023 The Matrix.org Foundation C.I.C.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient, type Room, type RoomMember } from \"matrix-js-sdk/src/matrix\";\n\nimport { _td, UserFriendlyError } from \"../languageHandler\";\nimport { EffectiveMembership, getEffectiveMembership } from \"../utils/membership\";\nimport { warnSelfDemote } from \"../components/views/right_panel/UserInfo\";\nimport { TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { canAffectPowerlevels, success, reject } from \"./utils\";\nimport { CommandCategories, type RunResult } from \"./interface\";\nimport { Command } from \"./command\";\n\nconst updatePowerLevel = async (room: Room, member: RoomMember, powerLevel: number | undefined): Promise<unknown> => {\n    // Only warn if the target is ourselves and the power level is decreasing or being unset\n    if (member.userId === room.client.getUserId() && (powerLevel === undefined || member.powerLevel > powerLevel)) {\n        const ok = await warnSelfDemote(room.isSpaceRoom());\n        if (!ok) return; // Nothing to do\n    }\n    return room.client.setPowerLevel(room.roomId, member.userId, powerLevel);\n};\n\nconst updatePowerLevelHelper = (\n    client: MatrixClient,\n    roomId: string,\n    userId: string,\n    powerLevel: number | undefined,\n): RunResult => {\n    const room = client.getRoom(roomId);\n    if (!room) {\n        return reject(\n            new UserFriendlyError(\"slash_command|error_invalid_room\", {\n                roomId,\n                cause: undefined,\n            }),\n        );\n    }\n    const member = room.getMember(userId);\n    if (!member?.membership || getEffectiveMembership(member.membership) === EffectiveMembership.Leave) {\n        return reject(new UserFriendlyError(\"slash_command|error_invalid_user_in_room\"));\n    }\n\n    return success(updatePowerLevel(room, member, powerLevel));\n};\n\nexport const op = new Command({\n    command: \"op\",\n    args: \"<user-id> [<power-level>]\",\n    description: _td(\"slash_command|op\"),\n    isEnabled: canAffectPowerlevels,\n    runFn: function (cli, roomId, threadId, args) {\n        if (args) {\n            const matches = args.match(/^(\\S+?)( +(-?\\d+))?$/);\n            let powerLevel = 50; // default power level for op\n            if (matches) {\n                const userId = matches[1];\n                if (matches.length === 4 && undefined !== matches[3]) {\n                    powerLevel = parseInt(matches[3], 10);\n                }\n                return updatePowerLevelHelper(cli, roomId, userId, powerLevel);\n            }\n        }\n        return reject(this.getUsage());\n    },\n    category: CommandCategories.admin,\n    renderingTypes: [TimelineRenderingType.Room],\n});\n\nexport const deop = new Command({\n    command: \"deop\",\n    args: \"<user-id>\",\n    description: _td(\"slash_command|deop\"),\n    isEnabled: canAffectPowerlevels,\n    runFn: function (cli, roomId, threadId, args) {\n        if (args) {\n            const matches = args.match(/^(\\S+)$/);\n            if (matches) {\n                return updatePowerLevelHelper(cli, roomId, args, undefined);\n            }\n        }\n        return reject(this.getUsage());\n    },\n    category: CommandCategories.admin,\n    renderingTypes: [TimelineRenderingType.Room],\n});\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { _td } from \"../languageHandler\";\nimport { reject, success } from \"./utils\";\nimport { isPermalinkHost, parsePermalink } from \"../utils/permalinks/Permalinks\";\nimport dis from \"../dispatcher/dispatcher\";\nimport { type ViewRoomPayload } from \"../dispatcher/payloads/ViewRoomPayload\";\nimport { Action } from \"../dispatcher/actions\";\nimport { TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { Command } from \"./command\";\nimport { CommandCategories, type RunResult } from \"./interface\";\n\n// A return of undefined here signals a usage error, where the command should return `reject(this.getUsage());`\nfunction openRoom(cli: MatrixClient, args: string | undefined, autoJoin: boolean): RunResult | undefined {\n    if (!args) return;\n    const params = args.split(\" \");\n    if (params.length < 1) return;\n\n    let isPermalink = false;\n    if (params[0].startsWith(\"http:\") || params[0].startsWith(\"https:\")) {\n        // It's at least a URL - try and pull out a hostname to check against the\n        // permalink handler\n        const parsedUrl = new URL(params[0]);\n        const hostname = parsedUrl.host || parsedUrl.hostname; // takes first non-falsey value\n\n        // if we're using a Element permalink handler, this will catch it before we get much further.\n        // see below where we make assumptions about parsing the URL.\n        if (isPermalinkHost(hostname)) {\n            isPermalink = true;\n        }\n    }\n\n    if (params[0][0] === \"#\") {\n        let roomAlias = params[0];\n        if (!roomAlias.includes(\":\")) {\n            roomAlias += \":\" + cli.getDomain();\n        }\n\n        dis.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            room_alias: roomAlias,\n            auto_join: autoJoin,\n            metricsTrigger: \"SlashCommand\",\n            metricsViaKeyboard: true,\n        });\n        return success();\n    }\n\n    if (params[0][0] === \"!\") {\n        const [roomId, ...viaServers] = params;\n\n        dis.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            room_id: roomId,\n            via_servers: viaServers, // for the rejoin button\n            auto_join: autoJoin,\n            metricsTrigger: \"SlashCommand\",\n            metricsViaKeyboard: true,\n        });\n        return success();\n    }\n\n    if (isPermalink) {\n        const permalinkParts = parsePermalink(params[0]);\n\n        // This check technically isn't needed because we already did our\n        // safety checks up above. However, for good measure, let's be sure.\n        if (!permalinkParts) {\n            return;\n        }\n\n        // If for some reason someone wanted to join a user, we should\n        // stop them now.\n        if (!permalinkParts.roomIdOrAlias) {\n            return;\n        }\n\n        const entity = permalinkParts.roomIdOrAlias;\n        const viaServers = permalinkParts.viaServers;\n        const eventId = permalinkParts.eventId;\n\n        const dispatch: ViewRoomPayload = {\n            action: Action.ViewRoom,\n            auto_join: autoJoin,\n            metricsTrigger: \"SlashCommand\",\n            metricsViaKeyboard: true,\n        };\n\n        if (entity[0] === \"!\") dispatch[\"room_id\"] = entity;\n        else dispatch[\"room_alias\"] = entity;\n\n        if (eventId) {\n            dispatch[\"event_id\"] = eventId;\n            dispatch[\"highlighted\"] = true;\n        }\n\n        if (viaServers) {\n            // For the join, these are passed down to the js-sdk's /join call\n            dispatch[\"opts\"] = { viaServers };\n\n            // For if the join fails (rejoin button)\n            dispatch[\"via_servers\"] = viaServers;\n        }\n\n        dis.dispatch(dispatch);\n        return success();\n    }\n\n    // Otherwise, it's a usage error. Return `undefined`.\n}\n\n// Note: we support 2 versions of this command. The first is\n// the public-facing one for most users and the other is a\n// power-user edition where someone may join via permalink or\n// room ID with optional servers. Practically, this results\n// in the following variations:\n//   /join #example:example.org\n//   /join !example:example.org\n//   /join !example:example.org altserver.com elsewhere.ca\n//   /join https://matrix.to/#/!example:example.org?via=altserver.com\n// The command also supports event permalinks transparently:\n//   /join https://matrix.to/#/!example:example.org/$something:example.org\n//   /join https://matrix.to/#/!example:example.org/$something:example.org?via=altserver.com\nexport const join = new Command({\n    command: \"join\",\n    aliases: [\"j\"],\n    args: \"<room-address>\",\n    description: _td(\"slash_command|join\"),\n    runFn: function (cli, roomId, threadId, args) {\n        return openRoom(cli, args, true) ?? reject(this.getUsage());\n    },\n    category: CommandCategories.actions,\n    renderingTypes: [TimelineRenderingType.Room],\n});\n\n// Similar to join but doesn't auto join the room if you aren't already joined to it\nexport const goto = new Command({\n    command: \"goto\",\n    aliases: [\"view\"],\n    args: \"<room-address>\",\n    description: _td(\"slash_command|view\"),\n    runFn: function (cli, roomId, threadId, args) {\n        return openRoom(cli, args, false) ?? reject(this.getUsage());\n    },\n    category: CommandCategories.actions,\n    renderingTypes: [TimelineRenderingType.Room],\n});\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { _td } from \"../../languageHandler\";\nimport { isCurrentLocalRoom } from \"../utils\";\nimport { runUpgradeRoomCommand } from \"./runUpgradeRoomCommand\";\nimport { Command } from \"../command\";\nimport { CommandCategories, type RunResult } from \"../interface\";\nimport { TimelineRenderingType } from \"../../contexts/RoomContext\";\n\nconst upgraderoom = new Command({\n    command: \"upgraderoom\",\n    args: \"<new_version> [<additional-creator-user-id> ...]\",\n    description: _td(\"slash_command|upgraderoom\"),\n    isEnabled: (cli: MatrixClient) => !isCurrentLocalRoom(cli),\n    runFn: function (cli: MatrixClient, roomId: string, threadId: string | null, args?: string): RunResult {\n        return runUpgradeRoomCommand(this, cli, roomId, threadId, args);\n    },\n    category: CommandCategories.admin,\n    renderingTypes: [TimelineRenderingType.Room],\n});\n\nexport default upgraderoom;\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { EventTimeline, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport Modal from \"../../Modal\";\nimport RoomUpgradeWarningDialog from \"../../components/views/dialogs/RoomUpgradeWarningDialog\";\nimport { type Command } from \"../command\";\nimport { UserFriendlyError } from \"../../languageHandler\";\nimport { parseUpgradeRoomArgs } from \"./parseUpgradeRoomArgs\";\nimport { reject, success } from \"../utils\";\nimport { type RunResult } from \"../interface\";\nimport { upgradeRoom } from \"../../utils/RoomUpgrade\";\n\nexport function runUpgradeRoomCommand(\n    command: Command,\n    cli: MatrixClient,\n    roomId: string,\n    _threadId: string | null,\n    args?: string,\n): RunResult {\n    if (!args) {\n        return reject(command.getUsage());\n    }\n    const parsedArgs = parseUpgradeRoomArgs(args);\n    if (parsedArgs) {\n        const room = cli.getRoom(roomId);\n        if (\n            !room?.getLiveTimeline().getState(EventTimeline.FORWARDS)?.mayClientSendStateEvent(\"m.room.tombstone\", cli)\n        ) {\n            return reject(new UserFriendlyError(\"slash_command|upgraderoom_permission_error\"));\n        }\n\n        const { finished } = Modal.createDialog(\n            RoomUpgradeWarningDialog,\n            { roomId: roomId, targetVersion: parsedArgs.targetVersion },\n            /*className=*/ undefined,\n            /*isPriority=*/ false,\n            /*isStatic=*/ true,\n        );\n\n        return success(\n            finished.then(async ([resp]): Promise<void> => {\n                if (!resp?.continue) return;\n                await upgradeRoom(\n                    room,\n                    parsedArgs.targetVersion,\n                    resp.invite,\n                    true,\n                    true,\n                    false,\n                    undefined,\n                    false,\n                    parsedArgs.additionalCreators,\n                );\n            }),\n        );\n    }\n    return reject(command.getUsage());\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nexport type UpgradeRoomParsedArgs = {\n    targetVersion: string;\n    additionalCreators?: string[];\n};\n\n/**\n * Parse the supplied arguments for a room upgrade, or return null if the\n * arguments are not valid. The arguments must be a room version followed by\n * zero or more valid user IDs.\n */\nexport function parseUpgradeRoomArgs(args: string): UpgradeRoomParsedArgs | null {\n    const parts = args.split(/\\s+/);\n    if (parts.length === 0 || parts[0] === \"\") {\n        return null;\n    } else {\n        const targetVersion = parts[0];\n        let additionalCreators: string[] | undefined;\n        for (let i = 1; i < parts.length; ++i) {\n            if (additionalCreators === undefined) {\n                additionalCreators = [];\n            }\n            additionalCreators.push(parts[i]);\n        }\n        return { targetVersion, additionalCreators };\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { ContentHelpers } from \"matrix-js-sdk/src/matrix\";\n\nimport { Command } from \"./command\";\nimport { successSync } from \"./utils\";\nimport { CommandCategories } from \"./interface\";\n\nexport function emoticon(command: string, description: TranslationKey, prefix: string): Command {\n    return new Command({\n        command,\n        args: \"<message>\",\n        description,\n        runFn: function (_cli, _roomId, _threadId, args) {\n            let message = prefix;\n            if (args) {\n                message += \" \" + args;\n            }\n            return successSync(ContentHelpers.makeTextMessage(message));\n        },\n        category: CommandCategories.messages,\n    });\n}\n","/*\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { _td } from \"@element-hq/web-shared-components\";\n\nimport { Command } from \"./command\";\nimport { CommandCategories } from \"./interface\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { reject, success, splitAtFirstSpace } from \"./utils\";\nimport { UserFriendlyError } from \"../languageHandler\";\nimport { TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { setUserStatus, userStatusTextWithinMaxLength } from \"../utils/userStatus\";\n\nexport const statusCommand = new Command({\n    command: \"status\",\n    args: \"<emoji> <text>\",\n    description: _td(\"slash_command|status|description\"),\n    isEnabled: () => SettingsStore.getValue(\"feature_user_status\"),\n    runFn: function (cli, _roomId, _threadId, args) {\n        if (!args) {\n            return reject(new UserFriendlyError(\"slash_command|status|no_args\"));\n        }\n        const [emojiText, text] = splitAtFirstSpace(args);\n        if (!emojiText) {\n            return reject(new UserFriendlyError(\"slash_command|status|no_emoji\"));\n        }\n        if (!text) {\n            return reject(new UserFriendlyError(\"slash_command|status|no_text\"));\n        }\n        const [emoji, additionalSegment] = [...new Intl.Segmenter().segment(emojiText)];\n        if (additionalSegment) {\n            // This is \"too long\" in that it's more than one grapheme, so the error we give is\n            // that it's \"not an emoji\".\n            return reject(new UserFriendlyError(\"slash_command|status|too_long_emoji\"));\n        }\n        if (!userStatusTextWithinMaxLength(text)) {\n            return reject(new UserFriendlyError(\"slash_command|status|too_long_text\"));\n        }\n        return success(\n            setUserStatus(cli, {\n                emoji: emoji.segment,\n                text,\n            }),\n        );\n    },\n    category: CommandCategories.actions,\n    renderingTypes: [TimelineRenderingType.Room],\n});\n","/*\nCopyright 2026 Element Creations Ltd.\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\nCopyright 2018 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport {\n    ContentHelpers,\n    Direction,\n    EventType,\n    type IContent,\n    type MRoomTopicEventContent,\n    type User,\n} from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { KnownMembership, type RoomMemberEventContent } from \"matrix-js-sdk/src/types\";\nimport { LinkedText } from \"@element-hq/web-shared-components\";\n\nimport dis from \"../dispatcher/dispatcher\";\nimport { _t, _td, UserFriendlyError } from \"../languageHandler\";\nimport Modal from \"../Modal\";\nimport MultiInviter from \"../utils/MultiInviter\";\nimport { topicToHtml } from \"../HtmlUtils\";\nimport QuestionDialog from \"../components/views/dialogs/QuestionDialog\";\nimport WidgetUtils from \"../utils/WidgetUtils\";\nimport { textToHtmlRainbow } from \"../utils/colour\";\nimport { AddressType, getAddressType } from \"../UserAddress\";\nimport { abbreviateUrl } from \"../utils/UrlUtils\";\nimport { getDefaultIdentityServerUrl, setToDefaultIdentityServer } from \"../utils/IdentityServerUtils\";\nimport { WidgetType } from \"../widgets/WidgetType\";\nimport { Jitsi } from \"../widgets/Jitsi\";\nimport BugReportDialog from \"../components/views/dialogs/BugReportDialog\";\nimport { ensureDMExists } from \"../createRoom\";\nimport { type ViewUserPayload } from \"../dispatcher/payloads/ViewUserPayload\";\nimport { Action } from \"../dispatcher/actions\";\nimport SdkConfig from \"../SdkConfig\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { UIComponent, UIFeature } from \"../settings/UIFeature\";\nimport { CHAT_EFFECTS } from \"../effects\";\nimport { guessAndSetDMRoom } from \"../Rooms\";\nimport DevtoolsDialog from \"../components/views/dialogs/DevtoolsDialog\";\nimport InfoDialog from \"../components/views/dialogs/InfoDialog\";\nimport SlashCommandHelpDialog from \"../components/views/dialogs/SlashCommandHelpDialog\";\nimport { shouldShowComponent } from \"../customisations/helpers/UIComponents\";\nimport { TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { type ViewRoomPayload } from \"../dispatcher/payloads/ViewRoomPayload\";\nimport { htmlSerializeFromMdIfNeeded } from \"../editor/serialize\";\nimport { leaveRoomBehaviour } from \"../utils/leave-behaviour\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport { isCurrentLocalRoom, reject, singleMxcUpload, success, successSync, splitAtFirstSpace } from \"./utils\";\nimport { deop, op } from \"./op\";\nimport { CommandCategories } from \"./interface\";\nimport { Command } from \"./command\";\nimport { goto, join } from \"./join\";\nimport { manuallyVerifyDevice } from \"../components/views/dialogs/ManualDeviceKeyVerificationDialog\";\nimport upgraderoom from \"./upgraderoom/upgraderoom\";\nimport { emoticon } from \"./emoticon\";\nimport { statusCommand } from \"./status\";\nimport { SDKContextClass } from \"../contexts/SDKContextClass.ts\";\n\nexport { CommandCategories, Command };\n\nexport const Commands = [\n    new Command({\n        command: \"spoiler\",\n        args: \"<message>\",\n        description: _td(\"slash_command|spoiler\"),\n        runFn: function (cli, roomId, threadId, message = \"\") {\n            return successSync(ContentHelpers.makeHtmlMessage(message, `<span data-mx-spoiler>${message}</span>`));\n        },\n        category: CommandCategories.messages,\n    }),\n    emoticon(\"shrug\", _td(\"slash_command|shrug\"), \"¯\\\\_(ツ)_/¯\"),\n    emoticon(\"tableflip\", _td(\"slash_command|tableflip\"), \"(╯°□°)╯︵ ┻━┻\"),\n    emoticon(\"unflip\", _td(\"slash_command|unflip\"), \"┬──┬ ノ( ゜-゜ノ)\"),\n    emoticon(\"lenny\", _td(\"slash_command|lenny\"), \"( ͡° ͜ʖ ͡°)\"),\n    new Command({\n        command: \"plain\",\n        args: \"<message>\",\n        description: _td(\"slash_command|plain\"),\n        runFn: function (cli, roomId, threadId, messages = \"\") {\n            return successSync(ContentHelpers.makeTextMessage(messages));\n        },\n        category: CommandCategories.messages,\n    }),\n    new Command({\n        command: \"html\",\n        args: \"<message>\",\n        description: _td(\"slash_command|html\"),\n        runFn: function (cli, roomId, threadId, messages = \"\") {\n            return successSync(ContentHelpers.makeHtmlMessage(messages, messages));\n        },\n        category: CommandCategories.messages,\n    }),\n    upgraderoom,\n    new Command({\n        command: \"jumptodate\",\n        args: \"<YYYY-MM-DD>\",\n        description: _td(\"slash_command|jumptodate\"),\n        isEnabled: () => SettingsStore.getValue(\"feature_jump_to_date\"),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                return success(\n                    (async (): Promise<void> => {\n                        const unixTimestamp = Date.parse(args);\n                        if (!unixTimestamp) {\n                            throw new UserFriendlyError(\"slash_command|jumptodate_invalid_input\", {\n                                inputDate: args,\n                                cause: undefined,\n                            });\n                        }\n\n                        const { event_id: eventId, origin_server_ts: originServerTs } = await cli.timestampToEvent(\n                            roomId,\n                            unixTimestamp,\n                            Direction.Forward,\n                        );\n                        logger.log(\n                            `/timestamp_to_event: found ${eventId} (${originServerTs}) for timestamp=${unixTimestamp}`,\n                        );\n                        dis.dispatch<ViewRoomPayload>({\n                            action: Action.ViewRoom,\n                            event_id: eventId,\n                            highlighted: true,\n                            room_id: roomId,\n                            metricsTrigger: \"SlashCommand\",\n                            metricsViaKeyboard: true,\n                        });\n                    })(),\n                );\n            }\n\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.actions,\n    }),\n    new Command({\n        command: \"nick\",\n        args: \"<display_name>\",\n        description: _td(\"slash_command|nick\"),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                return success(cli.setDisplayName(args));\n            }\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.actions,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"myroomnick\",\n        aliases: [\"roomnick\"],\n        args: \"<display_name>\",\n        description: _td(\"slash_command|myroomnick\"),\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                const ev = cli.getRoom(roomId)?.currentState.getStateEvents(EventType.RoomMember, cli.getSafeUserId());\n                const content: RoomMemberEventContent = {\n                    ...(ev ? ev.getContent() : { membership: KnownMembership.Join }),\n                    displayname: args,\n                };\n                return success(cli.sendStateEvent(roomId, EventType.RoomMember, content, cli.getSafeUserId()));\n            }\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.actions,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"roomavatar\",\n        args: \"[<mxc_url>]\",\n        description: _td(\"slash_command|roomavatar\"),\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            let promise = Promise.resolve(args ?? null);\n            if (!args) {\n                promise = singleMxcUpload(cli);\n            }\n\n            return success(\n                promise.then((url) => {\n                    if (!url) return;\n                    return cli.sendStateEvent(roomId, EventType.RoomAvatar, { url }, \"\");\n                }),\n            );\n        },\n        category: CommandCategories.actions,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"myroomavatar\",\n        args: \"[<mxc_url>]\",\n        description: _td(\"slash_command|myroomavatar\"),\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            const room = cli.getRoom(roomId);\n            const userId = cli.getSafeUserId();\n\n            let promise = Promise.resolve(args ?? null);\n            if (!args) {\n                promise = singleMxcUpload(cli);\n            }\n\n            return success(\n                promise.then((url) => {\n                    if (!url) return;\n                    const ev = room?.currentState.getStateEvents(EventType.RoomMember, userId);\n                    const content: RoomMemberEventContent = {\n                        ...(ev ? ev.getContent() : { membership: KnownMembership.Join }),\n                        avatar_url: url,\n                    };\n                    return cli.sendStateEvent(roomId, EventType.RoomMember, content, userId);\n                }),\n            );\n        },\n        category: CommandCategories.actions,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"myavatar\",\n        args: \"[<mxc_url>]\",\n        description: _td(\"slash_command|myavatar\"),\n        runFn: function (cli, roomId, threadId, args) {\n            let promise = Promise.resolve(args ?? null);\n            if (!args) {\n                promise = singleMxcUpload(cli);\n            }\n\n            return success(\n                promise.then((url) => {\n                    if (!url) return;\n                    return cli.setAvatarUrl(url);\n                }),\n            );\n        },\n        category: CommandCategories.actions,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"topic\",\n        args: \"[<topic>]\",\n        description: _td(\"slash_command|topic\"),\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                const html = htmlSerializeFromMdIfNeeded(args, { forceHTML: false });\n                return success(cli.setRoomTopic(roomId, args, html));\n            }\n            const room = cli.getRoom(roomId);\n            if (!room) {\n                return reject(\n                    new UserFriendlyError(\"slash_command|topic_room_error\", {\n                        roomId,\n                        cause: undefined,\n                    }),\n                );\n            }\n\n            const content = room.currentState.getStateEvents(\"m.room.topic\", \"\")?.getContent<MRoomTopicEventContent>();\n            const topic = !!content\n                ? ContentHelpers.parseTopicContent(content)\n                : { text: _t(\"slash_command|topic_none\") };\n\n            const body = topicToHtml(topic.text, topic.html, undefined, true);\n\n            Modal.createDialog(InfoDialog, {\n                title: room.name,\n                description: <LinkedText>{body}</LinkedText>,\n                hasCloseButton: true,\n                className: \"markdown-body\",\n            });\n            return success();\n        },\n        category: CommandCategories.admin,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"roomname\",\n        args: \"<name>\",\n        description: _td(\"slash_command|roomname\"),\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                return success(cli.setRoomName(roomId, args));\n            }\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.admin,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"invite\",\n        args: \"<user-id> [<reason>]\",\n        description: _td(\"slash_command|invite\"),\n        analyticsName: \"Invite\",\n        isEnabled: (cli) => !isCurrentLocalRoom(cli) && shouldShowComponent(UIComponent.InviteUsers),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                const [address, reason] = splitAtFirstSpace(args);\n                if (address) {\n                    // We use a MultiInviter to re-use the invite logic, even though\n                    // we're only inviting one user.\n                    // If we need an identity server but don't have one, things\n                    // get a bit more complex here, but we try to show something\n                    // meaningful.\n                    let prom = Promise.resolve();\n                    if (getAddressType(address) === AddressType.Email && !cli.getIdentityServerUrl()) {\n                        const defaultIdentityServerUrl = getDefaultIdentityServerUrl();\n                        if (defaultIdentityServerUrl) {\n                            const { finished } = Modal.createDialog(QuestionDialog, {\n                                title: _t(\"slash_command|invite_3pid_use_default_is_title\"),\n                                description: (\n                                    <p>\n                                        {_t(\"slash_command|invite_3pid_use_default_is_title_description\", {\n                                            defaultIdentityServerName: abbreviateUrl(defaultIdentityServerUrl),\n                                        })}\n                                    </p>\n                                ),\n                                button: _t(\"action|continue\"),\n                            });\n\n                            prom = finished.then(([useDefault]) => {\n                                if (useDefault) {\n                                    setToDefaultIdentityServer(cli);\n                                    return;\n                                }\n                                throw new UserFriendlyError(\"slash_command|invite_3pid_needs_is_error\");\n                            });\n                        } else {\n                            return reject(new UserFriendlyError(\"slash_command|invite_3pid_needs_is_error\"));\n                        }\n                    }\n                    const inviter = new MultiInviter(cli, roomId);\n                    return success(\n                        prom\n                            .then(() => {\n                                return inviter.invite([address], reason);\n                            })\n                            .then(() => {\n                                if (inviter.getCompletionState(address) !== \"invited\") {\n                                    const errorStringFromInviterUtility = inviter.getErrorText(address);\n                                    if (errorStringFromInviterUtility) {\n                                        throw new Error(errorStringFromInviterUtility);\n                                    } else {\n                                        throw new UserFriendlyError(\"slash_command|invite_failed\", {\n                                            user: address,\n                                            roomId,\n                                            cause: undefined,\n                                        });\n                                    }\n                                }\n                            }),\n                    );\n                }\n            }\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.actions,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    goto,\n    join,\n    new Command({\n        command: \"part\",\n        args: \"[<room-address>]\",\n        description: _td(\"action|leave_room\"),\n        analyticsName: \"Part\",\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            let targetRoomId: string | undefined;\n            if (args) {\n                const matches = args.match(/^(\\S+)$/);\n                if (matches) {\n                    let roomAlias = matches[1];\n                    if (!roomAlias.startsWith(\"#\")) return reject(this.getUsage());\n\n                    if (!roomAlias.includes(\":\")) {\n                        roomAlias += \":\" + cli.getDomain();\n                    }\n\n                    // Try to find a room with this alias\n                    const rooms = cli.getRooms();\n                    targetRoomId = rooms.find((room) => {\n                        return room.getCanonicalAlias() === roomAlias || room.getAltAliases().includes(roomAlias);\n                    })?.roomId;\n                    if (!targetRoomId) {\n                        return reject(\n                            new UserFriendlyError(\"slash_command|part_unknown_alias\", {\n                                roomAlias,\n                                cause: undefined,\n                            }),\n                        );\n                    }\n                }\n            }\n\n            if (!targetRoomId) targetRoomId = roomId;\n            return success(leaveRoomBehaviour(cli, targetRoomId));\n        },\n        category: CommandCategories.actions,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"remove\",\n        aliases: [\"kick\"],\n        args: \"<user-id> [reason]\",\n        description: _td(\"slash_command|remove\"),\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                const [userId, reason] = splitAtFirstSpace(args);\n                if (userId) {\n                    return success(cli.kick(roomId, userId, reason));\n                }\n            }\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.admin,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"ban\",\n        args: \"<user-id> [reason]\",\n        description: _td(\"slash_command|ban\"),\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                const [userId, reason] = splitAtFirstSpace(args);\n                if (userId) {\n                    return success(cli.ban(roomId, userId, reason));\n                }\n            }\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.admin,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"unban\",\n        args: \"<user-id>\",\n        description: _td(\"slash_command|unban\"),\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                const matches = args.match(/^(\\S+)$/);\n                if (matches) {\n                    // Reset the user membership to \"leave\" to unban him\n                    return success(cli.unban(roomId, matches[1]));\n                }\n            }\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.admin,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"ignore\",\n        args: \"<user-id>\",\n        description: _td(\"slash_command|ignore\"),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                const matches = args.match(/^(@[^:]+:\\S+)$/);\n                if (matches) {\n                    const userId = matches[1];\n                    const ignoredUsers = cli.getIgnoredUsers();\n                    ignoredUsers.push(userId); // de-duped internally in the js-sdk\n                    return success(\n                        cli.setIgnoredUsers(ignoredUsers).then(() => {\n                            Modal.createDialog(InfoDialog, {\n                                title: _t(\"slash_command|ignore_dialog_title\"),\n                                description: (\n                                    <div>\n                                        <p>{_t(\"slash_command|ignore_dialog_description\", { userId })}</p>\n                                    </div>\n                                ),\n                            });\n                        }),\n                    );\n                }\n            }\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.actions,\n    }),\n    new Command({\n        command: \"unignore\",\n        args: \"<user-id>\",\n        description: _td(\"slash_command|unignore\"),\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                const matches = args.match(/(^@[^:]+:\\S+$)/);\n                if (matches) {\n                    const userId = matches[1];\n                    const ignoredUsers = cli.getIgnoredUsers();\n                    const index = ignoredUsers.indexOf(userId);\n                    if (index !== -1) ignoredUsers.splice(index, 1);\n                    return success(\n                        cli.setIgnoredUsers(ignoredUsers).then(() => {\n                            Modal.createDialog(InfoDialog, {\n                                title: _t(\"slash_command|unignore_dialog_title\"),\n                                description: (\n                                    <div>\n                                        <p>{_t(\"slash_command|unignore_dialog_description\", { userId })}</p>\n                                    </div>\n                                ),\n                            });\n                        }),\n                    );\n                }\n            }\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.actions,\n    }),\n    op,\n    deop,\n    new Command({\n        command: \"devtools\",\n        description: _td(\"slash_command|devtools\"),\n        runFn: function (cli, roomId, threadRootId) {\n            Modal.createDialog(DevtoolsDialog, { roomId, threadRootId }, \"mx_DevtoolsDialog_wrapper\");\n            return success();\n        },\n        category: CommandCategories.advanced,\n    }),\n    new Command({\n        command: \"addwidget\",\n        args: \"<url | embed code | Jitsi url>\",\n        description: _td(\"slash_command|addwidget\"),\n        isEnabled: (cli) =>\n            SettingsStore.getValue(UIFeature.Widgets) &&\n            shouldShowComponent(UIComponent.AddIntegrations) &&\n            !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, widgetUrl) {\n            if (!widgetUrl) {\n                return reject(new UserFriendlyError(\"slash_command|addwidget_missing_url\"));\n            }\n\n            // Try and parse out a widget URL from iframes\n            if (widgetUrl.toLowerCase().startsWith(\"<iframe \")) {\n                const embed = new DOMParser().parseFromString(widgetUrl, \"text/html\").body;\n                if (embed?.childNodes?.length === 1) {\n                    const iframe = embed.firstElementChild;\n                    if (iframe?.tagName.toLowerCase() === \"iframe\") {\n                        logger.log(\"Pulling URL out of iframe (embed code)\");\n                        if (!iframe.hasAttribute(\"src\")) {\n                            return reject(new UserFriendlyError(\"slash_command|addwidget_iframe_missing_src\"));\n                        }\n                        widgetUrl = iframe.getAttribute(\"src\")!;\n                    }\n                }\n            }\n\n            if (!widgetUrl.startsWith(\"https://\") && !widgetUrl.startsWith(\"http://\")) {\n                return reject(new UserFriendlyError(\"slash_command|addwidget_invalid_protocol\"));\n            }\n            if (WidgetUtils.canUserModifyWidgets(cli, roomId)) {\n                const userId = cli.getUserId();\n                const nowMs = new Date().getTime();\n                const widgetId = encodeURIComponent(`${roomId}_${userId}_${nowMs}`);\n                let type = WidgetType.CUSTOM;\n                let name = \"Custom\";\n                let data = {};\n\n                // Make the widget a Jitsi widget if it looks like a Jitsi widget\n                const jitsiData = Jitsi.getInstance().parsePreferredConferenceUrl(widgetUrl);\n                if (jitsiData) {\n                    logger.log(\"Making /addwidget widget a Jitsi conference\");\n                    type = WidgetType.JITSI;\n                    name = \"Jitsi\";\n                    data = jitsiData;\n                    widgetUrl = WidgetUtils.getLocalJitsiWrapperUrl();\n                }\n\n                return success(WidgetUtils.setRoomWidget(cli, roomId, widgetId, type, widgetUrl, name, data));\n            } else {\n                return reject(new UserFriendlyError(\"slash_command|addwidget_no_permissions\"));\n            }\n        },\n        category: CommandCategories.admin,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"verify\",\n        args: \"<device-id> <device-fingerprint>\",\n        description: _td(\"slash_command|verify\"),\n        runFn: function (cli, _roomId, _threadId, args) {\n            if (args) {\n                const matches = args.match(/^(\\S+) +(\\S+)$/);\n                if (matches) {\n                    const deviceId = matches[1];\n                    const fingerprint = matches[2];\n\n                    const { finished } = Modal.createDialog(QuestionDialog, {\n                        title: _t(\"slash_command|manual_device_verification_confirm_title\"),\n                        description: _t(\"slash_command|manual_device_verification_confirm_description\"),\n                        button: _t(\"action|verify\"),\n                        danger: true,\n                    });\n\n                    return success(\n                        finished.then(([confirmed]) => {\n                            if (confirmed) manuallyVerifyDevice(cli, deviceId, fingerprint);\n                        }),\n                    );\n                }\n            }\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.advanced,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"discardsession\",\n        description: _td(\"slash_command|discardsession\"),\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId) {\n            try {\n                cli.getCrypto()?.forceDiscardSession(roomId);\n            } catch (e) {\n                return reject(e instanceof Error ? e.message : e);\n            }\n            return success();\n        },\n        category: CommandCategories.advanced,\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"rainbow\",\n        description: _td(\"slash_command|rainbow\"),\n        args: \"<message>\",\n        runFn: function (cli, roomId, threadId, args) {\n            if (!args) return reject(this.getUsage());\n            return successSync(ContentHelpers.makeHtmlMessage(args, textToHtmlRainbow(args)));\n        },\n        category: CommandCategories.messages,\n    }),\n    new Command({\n        command: \"rainbowme\",\n        description: _td(\"slash_command|rainbowme\"),\n        args: \"<message>\",\n        runFn: function (cli, roomId, threadId, args) {\n            if (!args) return reject(this.getUsage());\n            return successSync(ContentHelpers.makeHtmlEmote(args, textToHtmlRainbow(args)));\n        },\n        category: CommandCategories.messages,\n    }),\n    new Command({\n        command: \"help\",\n        description: _td(\"slash_command|help\"),\n        runFn: function (cli, roomId, threadId, args) {\n            Modal.createDialog(SlashCommandHelpDialog, { roomId });\n            return success();\n        },\n        category: CommandCategories.advanced,\n    }),\n    new Command({\n        command: \"whois\",\n        description: _td(\"slash_command|whois\"),\n        args: \"<user-id>\",\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, userId) {\n            if (!userId || !userId.startsWith(\"@\") || !userId.includes(\":\")) {\n                return reject(this.getUsage());\n            }\n\n            const member = cli.getRoom(roomId)?.getMember(userId);\n            dis.dispatch<ViewUserPayload>({\n                action: Action.ViewUser,\n                // XXX: We should be using a real member object and not assuming what the receiver wants.\n                member: member || ({ userId } as User),\n            });\n            return success();\n        },\n        category: CommandCategories.advanced,\n    }),\n    new Command({\n        command: \"rageshake\",\n        aliases: [\"bugreport\"],\n        description: _td(\"slash_command|rageshake\"),\n        isEnabled: () => !!SdkConfig.get().bug_report_endpoint_url,\n        args: \"<description>\",\n        runFn: function (cli, roomId, threadId, args) {\n            return success(\n                Modal.createDialog(BugReportDialog, {\n                    initialText: args,\n                }).finished,\n            );\n        },\n        category: CommandCategories.advanced,\n    }),\n    new Command({\n        command: \"query\",\n        description: _td(\"slash_command|query\"),\n        args: \"<user-id>\",\n        runFn: function (cli, roomId, threadId, userId) {\n            // easter-egg for now: look up phone numbers through the thirdparty API\n            // (very dumb phone number detection...)\n            const isPhoneNumber = userId && /^\\+?[0123456789]+$/.test(userId);\n            if (!userId || ((!userId.startsWith(\"@\") || !userId.includes(\":\")) && !isPhoneNumber)) {\n                return reject(this.getUsage());\n            }\n\n            return success(\n                (async (): Promise<void> => {\n                    if (isPhoneNumber) {\n                        const results = await SDKContextClass.instance.legacyCallHandler.pstnLookup(userId);\n                        if (!results || results.length === 0 || !results[0].userid) {\n                            throw new UserFriendlyError(\"slash_command|query_not_found_phone_number\");\n                        }\n                        userId = results[0].userid;\n                    }\n\n                    const roomId = await ensureDMExists(cli, userId);\n                    if (!roomId) throw new Error(\"Failed to ensure DM exists\");\n\n                    dis.dispatch<ViewRoomPayload>({\n                        action: Action.ViewRoom,\n                        room_id: roomId,\n                        metricsTrigger: \"SlashCommand\",\n                        metricsViaKeyboard: true,\n                    });\n                })(),\n            );\n        },\n        category: CommandCategories.actions,\n    }),\n    new Command({\n        command: \"msg\",\n        description: _td(\"slash_command|msg\"),\n        args: \"<user-id> [<message>]\",\n        runFn: function (cli, roomId, threadId, args) {\n            if (args) {\n                // matches the first whitespace delimited group and then the rest of the string\n                const [userId, msg] = splitAtFirstSpace(args);\n                if (userId !== \"\") {\n                    if (userId && userId.startsWith(\"@\") && userId.includes(\":\")) {\n                        return success(\n                            (async (): Promise<void> => {\n                                const roomId = await ensureDMExists(cli, userId);\n                                if (!roomId) throw new Error(\"Failed to ensure DM exists\");\n\n                                dis.dispatch<ViewRoomPayload>({\n                                    action: Action.ViewRoom,\n                                    room_id: roomId,\n                                    metricsTrigger: \"SlashCommand\",\n                                    metricsViaKeyboard: true,\n                                });\n                                if (msg) {\n                                    cli.sendTextMessage(roomId, msg);\n                                }\n                            })(),\n                        );\n                    }\n                }\n            }\n\n            return reject(this.getUsage());\n        },\n        category: CommandCategories.actions,\n    }),\n    new Command({\n        command: \"holdcall\",\n        description: _td(\"slash_command|holdcall\"),\n        category: CommandCategories.other,\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            const call = SDKContextClass.instance.legacyCallHandler.getCallForRoom(roomId);\n            if (!call) {\n                return reject(new UserFriendlyError(\"slash_command|no_active_call\"));\n            }\n            call.setRemoteOnHold(true);\n            return success();\n        },\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"unholdcall\",\n        description: _td(\"slash_command|unholdcall\"),\n        category: CommandCategories.other,\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            const call = SDKContextClass.instance.legacyCallHandler.getCallForRoom(roomId);\n            if (!call) {\n                return reject(new UserFriendlyError(\"slash_command|no_active_call\"));\n            }\n            call.setRemoteOnHold(false);\n            return success();\n        },\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"converttodm\",\n        description: _td(\"slash_command|converttodm\"),\n        category: CommandCategories.other,\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            const room = cli.getRoom(roomId);\n            if (!room) return reject(new UserFriendlyError(\"slash_command|could_not_find_room\"));\n            return success(guessAndSetDMRoom(room, true));\n        },\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    new Command({\n        command: \"converttoroom\",\n        description: _td(\"slash_command|converttoroom\"),\n        category: CommandCategories.other,\n        isEnabled: (cli) => !isCurrentLocalRoom(cli),\n        runFn: function (cli, roomId, threadId, args) {\n            const room = cli.getRoom(roomId);\n            if (!room) return reject(new UserFriendlyError(\"slash_command|could_not_find_room\"));\n            return success(guessAndSetDMRoom(room, false));\n        },\n        renderingTypes: [TimelineRenderingType.Room],\n    }),\n    statusCommand,\n\n    // Command definitions for autocompletion ONLY:\n    // /me is special because its not handled by SlashCommands.js and is instead done inside the Composer classes\n    new Command({\n        command: \"me\",\n        args: \"<message>\",\n        description: _td(\"slash_command|me\"),\n        category: CommandCategories.messages,\n        hideCompletionAfterSpace: true,\n    }),\n\n    ...CHAT_EFFECTS.map((effect) => {\n        return new Command({\n            command: effect.command,\n            description: effect.description(),\n            args: \"<message>\",\n            runFn: function (cli, roomId, threadId, args) {\n                let content: IContent;\n                if (!args) {\n                    content = ContentHelpers.makeEmoteMessage(effect.fallbackMessage());\n                } else {\n                    content = {\n                        msgtype: effect.msgType,\n                        body: args,\n                    };\n                }\n                dis.dispatch({ action: `effects.${effect.command}` });\n                return successSync(content);\n            },\n            category: CommandCategories.effects,\n            renderingTypes: [TimelineRenderingType.Room],\n        });\n    }),\n];\n\n// build a map from names and aliases to the Command objects.\nexport const CommandMap = new Map<string, Command>();\nCommands.forEach((cmd) => {\n    CommandMap.set(cmd.command, cmd);\n    cmd.aliases.forEach((alias) => {\n        CommandMap.set(alias, cmd);\n    });\n});\n\n/**\n * If the supplied input starts with \"/<command>\", returns an object with these\n * properties:\n *\n * cmd - the string following the / up to some whitespace\n * args - the string (if any) after first whitespace\n *\n * If not, returns {}\n */\nexport function parseCommandString(input: string): { cmd?: string; args?: string } {\n    const trimmedInput = input.trimStart();\n    if (trimmedInput.charAt(0) !== \"/\") {\n        return {};\n    }\n\n    const withoutSlash = trimmedInput.slice(1);\n    const [cmd, args] = splitAtFirstSpace(withoutSlash);\n\n    return { cmd, args };\n}\n\ninterface ICmd {\n    cmd?: Command;\n    args?: string;\n}\n\n/**\n * Process the given text for /commands and returns a parsed command that can be used for running the operation.\n * @param {string} roomId The room ID where the command was issued.\n * @param {string} input The raw text input by the user.\n * @returns {ICmd} The parsed command object.\n * Returns an empty object if the input didn't match a command.\n */\nexport function getCommand(roomId: string, input: string): ICmd {\n    const { cmd, args } = parseCommandString(input);\n\n    if (cmd && CommandMap.has(cmd) && CommandMap.get(cmd)!.isEnabled(MatrixClientPeg.get(), roomId)) {\n        return {\n            cmd: CommandMap.get(cmd),\n            args,\n        };\n    }\n    return {};\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type MatrixRTCSession, MatrixRTCSessionManagerEvents, type Transport } from \"matrix-js-sdk/src/matrixrtc\";\nimport { MatrixError, type EmptyObject, type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport { UPDATE_EVENT } from \"./AsyncStore\";\nimport { AsyncStoreWithClient } from \"./AsyncStoreWithClient\";\nimport WidgetStore from \"./WidgetStore\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { SettingLevel } from \"../settings/SettingLevel\";\nimport SdkConfig from \"../SdkConfig\";\nimport { Call, CallEvent, ConnectionState } from \"../models/Call\";\n\nexport enum CallStoreEvent {\n    // Signals a change in the call associated with a given room\n    Call = \"call\",\n    // Signals a change in the active calls\n    ConnectedCalls = \"connected_calls\",\n    // Signals a change in the configured RTC transports.\n    TransportsUpdated = \"transports_updated\",\n}\n\nexport class CallStore extends AsyncStoreWithClient<EmptyObject> {\n    private static _instance: CallStore;\n    public static get instance(): CallStore {\n        if (!this._instance) {\n            this._instance = new CallStore();\n            this._instance.start();\n        }\n        return this._instance;\n    }\n\n    private readonly configuredMatrixRTCTransports = new Set<Transport>();\n\n    private constructor() {\n        super(defaultDispatcher);\n        this.setMaxListeners(100); // One for each RoomTile\n    }\n\n    protected async onAction(): Promise<void> {\n        // nothing to do\n    }\n\n    /**\n     * Fetch transports used by MatrixRTC services, such as Element Call.\n     * This function is called once during Store startup which means we don't refetch\n     * transports every time we need to check for Element Call support.\n     */\n    protected async fetchTransports(): Promise<void> {\n        if (!this.matrixClient) return;\n        this.configuredMatrixRTCTransports.clear();\n        // Prefer checking the proper endpoint for transports.\n        try {\n            const transports = await this.matrixClient._unstable_getRTCTransports();\n            transports.forEach((t) => this.configuredMatrixRTCTransports.add(t));\n        } catch (ex) {\n            // Expected, MSC not implemented.\n            //\n            // Homeservers will return a 404 M_UNRECOGNIZED matrix error if they\n            // don't implement a requested endpoint.\n            if (ex instanceof MatrixError === false || ex.errcode !== \"M_UNRECOGNIZED\") {\n                logger.warn(\"Unexpected error when trying to fetch RTC transports\", ex);\n            }\n        }\n        // See https://github.com/matrix-org/matrix-spec-proposals/blob/d61969a9a3696b6c54d7987b1643b5bc03670927/proposals/4143-matrix-rtc.md#discovery-of-foci-using-well-knownmatrixclient\n        // This well-known option has since been removed from the spec but is still widely deployed.\n        // Reading it can be disabled via config; the modern endpoint above is unaffected.\n        if (SdkConfig.get(\"enable_client_well_known_lookups\")) {\n            await this.matrixClient.waitForClientWellKnown();\n            const foci = this.matrixClient.getClientWellKnown()?.[\"org.matrix.msc4143.rtc_foci\"];\n            if (Array.isArray(foci)) {\n                foci.forEach((foci) => this.configuredMatrixRTCTransports.add(foci));\n            }\n        }\n        this.emit(CallStoreEvent.TransportsUpdated);\n    }\n\n    protected async onReady(): Promise<any> {\n        if (!this.matrixClient) return;\n        // Fetch transports, but don't await the result.\n        void this.fetchTransports();\n        // We assume that the calls present in a room are a function of room\n        // widgets and group calls, so we initialize the room map here and then\n        // update it whenever those change\n        for (const room of this.matrixClient.getRooms()) {\n            this.updateRoom(room);\n        }\n        this.matrixClient.matrixRTC.on(MatrixRTCSessionManagerEvents.SessionStarted, this.onRTCSessionStart);\n        WidgetStore.instance.on(UPDATE_EVENT, this.onWidgets);\n\n        // If the room ID of a previously connected call is still in settings at\n        // this time, that's a sign that we failed to disconnect from it\n        // properly, and need to clean up after ourselves\n        const uncleanlyDisconnectedRoomIds = SettingsStore.getValue(\"activeCallRoomIds\");\n        if (uncleanlyDisconnectedRoomIds.length) {\n            await Promise.all([\n                ...uncleanlyDisconnectedRoomIds.map(async (uncleanlyDisconnectedRoomId): Promise<void> => {\n                    logger.log(`Cleaning up call state for room ${uncleanlyDisconnectedRoomId}`);\n                    await this.getCall(uncleanlyDisconnectedRoomId)?.clean();\n                }),\n                SettingsStore.setValue(\"activeCallRoomIds\", null, SettingLevel.DEVICE, []),\n            ]);\n        }\n    }\n\n    protected async onNotReady(): Promise<any> {\n        for (const [call, listenerMap] of this.callListeners) {\n            // It's important that we remove the listeners before destroying the\n            // call, because otherwise the call's onDestroy callback would fire\n            // and immediately repopulate the map\n            for (const [event, listener] of listenerMap) call.off(event, listener);\n            call.destroy();\n        }\n        this.callListeners.clear();\n        this.calls.clear();\n        this._connectedCalls.clear();\n        this.configuredMatrixRTCTransports.clear();\n\n        this.matrixClient?.matrixRTC.off(MatrixRTCSessionManagerEvents.SessionStarted, this.onRTCSessionStart);\n        WidgetStore.instance.off(UPDATE_EVENT, this.onWidgets);\n    }\n\n    private _connectedCalls: Set<Call> = new Set();\n    /**\n     * The calls to which the user is currently connected.\n     */\n    public get connectedCalls(): Set<Call> {\n        return this._connectedCalls;\n    }\n    private set connectedCalls(value: Set<Call>) {\n        this._connectedCalls = value;\n        this.emit(CallStoreEvent.ConnectedCalls, value);\n\n        // The room IDs are persisted to settings so we can detect unclean disconnects\n        SettingsStore.setValue(\n            \"activeCallRoomIds\",\n            null,\n            SettingLevel.DEVICE,\n            [...value].map((call) => call.roomId),\n        );\n    }\n\n    private calls = new Map<string, Call>(); // Key is room ID\n    private callListeners = new Map<Call, Map<CallEvent, (...args: unknown[]) => unknown>>();\n\n    private inUpdateRoom = false;\n    private updateRoom(room: Room): void {\n        // XXX: This method is guarded with the flag this.inUpdateRoom because\n        // we need to block this method from calling itself recursively. That\n        // could happen, for instance, if Call.get adds a new virtual widget to\n        // the WidgetStore, firing a WidgetStore update that we don't actually\n        // care about. Without the guard we could get duplicate Call objects\n        // fighting for control over the same widget.\n        if (!this.inUpdateRoom && !this.calls.has(room.roomId)) {\n            this.inUpdateRoom = true;\n            const call = Call.get(room);\n\n            if (call) {\n                const onConnectionState = (state: ConnectionState): void => {\n                    if (state === ConnectionState.Connected) {\n                        this.connectedCalls = new Set([...this.connectedCalls, call]);\n                    } else if (state === ConnectionState.Disconnected) {\n                        this.connectedCalls = new Set([...this.connectedCalls].filter((c) => c !== call));\n                    }\n                };\n                const onDestroy = (): void => {\n                    this.calls.delete(room.roomId);\n                    for (const [event, listener] of this.callListeners.get(call)!) call.off(event, listener);\n                    this.updateRoom(room);\n                };\n\n                call.on(CallEvent.ConnectionState, onConnectionState);\n                call.on(CallEvent.Destroy, onDestroy);\n\n                this.calls.set(room.roomId, call);\n                this.callListeners.set(\n                    call,\n                    new Map<CallEvent, (...args: any[]) => unknown>([\n                        [CallEvent.ConnectionState, onConnectionState],\n                        [CallEvent.Destroy, onDestroy],\n                    ]),\n                );\n            }\n\n            this.emit(CallStoreEvent.Call, call, room.roomId);\n            this.inUpdateRoom = false;\n        }\n    }\n\n    /**\n     * Gets the call associated with the given room, if any.\n     * @param {string} roomId The room's ID.\n     * @returns {Call | null} The call.\n     */\n    public getCall(roomId: string): Call | null {\n        return this.calls.get(roomId) ?? null;\n    }\n\n    /**\n     * Gets the active call associated with the given room, if any.\n     * @param roomId The room's ID.\n     * @returns The active call.\n     */\n    public getActiveCall(roomId: string): Call | null {\n        const call = this.getCall(roomId);\n        return call !== null && this.connectedCalls.has(call) ? call : null;\n    }\n\n    /**\n     * Get all the ongoing calls\n     * @returns Map from room-id to the ongoing call in that room\n     */\n    public getAllCalls(): Map<string, Call> {\n        return this.calls;\n    }\n\n    private onWidgets = (roomId: string | null): void => {\n        if (!this.matrixClient) return;\n        if (roomId === null) {\n            // This store happened to start before the widget store was done\n            // loading all rooms, so we need to initialize each room again\n            for (const room of this.matrixClient.getRooms()) {\n                this.updateRoom(room);\n            }\n        } else {\n            const room = this.matrixClient.getRoom(roomId);\n            // Widget updates can arrive before the room does, empirically\n            if (room !== null) this.updateRoom(room);\n        }\n    };\n\n    public getConfiguredRTCTransports(): Transport[] {\n        return [...this.configuredMatrixRTCTransports];\n    }\n\n    private onRTCSessionStart = (roomId: string, session: MatrixRTCSession): void => {\n        this.updateRoom(session.room);\n    };\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type EmptyObject, EventType, type MatrixEvent, type Room, RoomEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport { AsyncStoreWithClient } from \"./AsyncStoreWithClient\";\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport { type CallStore, CallStoreEvent } from \"./CallStore\";\nimport { CallEvent, type ElementCall } from \"../models/Call\";\n\n/**\n * The event that {@link LatestRtcNotificationEventStore} emits when the latest event id changes.\n */\nexport const LatestRtcNotificationEventUpdate = \"rtc_notification_updated\";\n\n/**\n * This store tracks the event-id of the {@link EventType.RTCNotification} event that\n * is related to an ongoing call.\n * This is required because the rtc notification arrives after the call has started.\n * Without this logic, we wouldn't know whether the last rtc notification tile in the\n * timeline is related to an ongoing call or if it is related to some other rtc notification\n * event that is yet to come through sync.\n */\nexport class LatestRtcNotificationEventStore extends AsyncStoreWithClient<EmptyObject> {\n    private eventIdMap = new Map<string, string>();\n\n    public constructor(private readonly callStore: CallStore) {\n        super(defaultDispatcher);\n    }\n\n    /**\n     * Get the event id of the latest rtc notification event corresponding to an ongoing call.\n     * @param roomId The id of the room where the call is taking place\n     * @returns event id or undefined\n     */\n    public getLatestEventId(roomId: string): string | undefined {\n        return this.eventIdMap.get(roomId);\n    }\n\n    private async populateMap(): Promise<void> {\n        if (!this.matrixClient) return;\n\n        // 1. Get all the calls\n        const callMap = this.callStore.getAllCalls();\n        // 2. Add the calls to our map\n        for (const roomId of callMap.keys()) {\n            const room = this.getRoom(roomId);\n            const eventId = (await getLastRtcNotificationEvent(room))?.getId();\n            if (eventId) {\n                this.eventIdMap.set(roomId, eventId);\n                // 3. Emit event so that the call tile can re-render\n                this.emit(LatestRtcNotificationEventUpdate, roomId, eventId);\n            }\n        }\n    }\n\n    private getRoom(roomId: string): Room {\n        if (!this.matrixClient) {\n            throw new Error(\"LatestRtcNotificationEventStore: this.matrixClient is undefined.\");\n        }\n\n        const room = this.matrixClient.getRoom(roomId);\n        if (!room) throw new Error(`No room associated with room-id ${roomId}`);\n        return room;\n    }\n\n    protected async onReady(): Promise<void> {\n        this.callStore.on(CallStoreEvent.Call, this.onCallStoreEvent);\n        this.populateMap();\n    }\n\n    protected async onNotReady(): Promise<void> {\n        this.callStore.off(CallStoreEvent.Call, this.onCallStoreEvent);\n        this.eventIdMap.clear();\n    }\n\n    protected async onAction(): Promise<void> {\n        // nothing to do\n    }\n\n    private onCallStoreEvent = async (_: unknown, roomId: string): Promise<void> => {\n        if (!this.matrixClient) return;\n        const call = this.callStore.getCall(roomId) as ElementCall;\n        if (!call) {\n            // If there's no longer a call in this room, remove entry from map\n            this.eventIdMap.delete(roomId);\n        } else if (call && !this.eventIdMap.has(roomId)) {\n            // If there's a call, find the event id and add it to the map.\n            if (call.participants.size) {\n                this.findAndSetNotificationEvent(call, roomId);\n            } else {\n                // This call just started but the participants haven't been added yet.\n                // So wait until participants are added and then compute the event id.\n                call.once(CallEvent.Participants, () => {\n                    this.findAndSetNotificationEvent(call, roomId);\n                });\n            }\n        }\n    };\n\n    private async findAndSetNotificationEvent(call: ElementCall, roomId: string): Promise<void> {\n        const room = this.getRoom(roomId);\n        // Since we're running this logic as the call just started, this membership\n        // event corresponds to the person who started the call.\n        // The rtc notification event corresponding to this ongoing call will have\n        // a reference relation to this membership event.\n        const callMembershipEventId = call.session.getOldestMembership()?.eventId;\n\n        if (callMembershipEventId) {\n            const eventId = await getNotificationEventId(room, callMembershipEventId);\n            this.eventIdMap.set(roomId, eventId);\n            this.emit(LatestRtcNotificationEventUpdate, roomId, eventId);\n        }\n    }\n}\n\n/**\n * Returns the first rtc notification event from the end of the timeline\n */\nasync function getLastRtcNotificationEvent(room: Room): Promise<MatrixEvent | undefined> {\n    const events = room.getLiveTimeline().getEvents();\n    for (let i = events.length - 1; i >= 0; i--) {\n        const event = events[i];\n        // Wait for decryption if necessary\n        await event.getDecryptionPromise();\n        if (event.getType() === EventType.RTCNotification) {\n            return event;\n        }\n    }\n}\n\n/**\n * Get the event id of the rtc notification event that has a relation to a given call membership event.\n * @param room The room in which this call is taking place\n * @param callMemberEventId The event id of the call membership event\n * @returns A promise that resolves to the event-id of the notification event.\n */\nasync function getNotificationEventId(room: Room, callMemberEventId: string): Promise<string> {\n    // We might already have the notification event in the timeline, so check that first.\n    const event = await getLastRtcNotificationEvent(room);\n    const relatedEventId = event?.getRelation()?.event_id;\n    const eventId = event?.getId();\n    if (relatedEventId === callMemberEventId && eventId) return eventId;\n\n    const { promise, resolve, reject } = Promise.withResolvers<string>();\n\n    // This callback will run with new events that are added to the timeline.\n    // We'll run some logic in the callback to see if we're receiving any\n    // new notification event that corresponds to the call membership event.\n    const onNewEvent = async (event: MatrixEvent): Promise<void> => {\n        // Wait for decryption if necessary\n        await event.getDecryptionPromise();\n\n        const type = event.getType();\n        const relatedEventId = event.getRelation()?.event_id;\n        const eventId = event.getId();\n\n        if (type === EventType.RTCNotification && relatedEventId === callMemberEventId && eventId) {\n            // Remove event listener\n            room.off(RoomEvent.Timeline, onNewEvent);\n            resolve(eventId);\n        }\n    };\n    room.on(RoomEvent.Timeline, onNewEvent);\n\n    // We won't wait for more than ten seconds for the notification event to come through.\n    setTimeout(() => {\n        reject(new Error(\"Timeout waiting for rtc notification event\"));\n    }, 10000);\n\n    return await promise;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport EventEmitter from \"events\";\n\nimport { type ComponentClass } from \"../@types/common\";\nimport { UPDATE_EVENT } from \"./AsyncStore\";\n\nexport type ToastReference = symbol;\n\nexport default class NonUrgentToastStore extends EventEmitter {\n    private static _instance: NonUrgentToastStore;\n\n    private toasts = new Map<ToastReference, ComponentClass>();\n\n    public static get instance(): NonUrgentToastStore {\n        if (!NonUrgentToastStore._instance) {\n            NonUrgentToastStore._instance = new NonUrgentToastStore();\n        }\n        return NonUrgentToastStore._instance;\n    }\n\n    public get components(): ComponentClass[] {\n        return Array.from(this.toasts.values());\n    }\n\n    public addToast(c: ComponentClass): ToastReference {\n        const ref: ToastReference = Symbol();\n        this.toasts.set(ref, c);\n        this.emit(UPDATE_EVENT);\n        return ref;\n    }\n\n    public removeToast(ref: ToastReference): void {\n        this.toasts.delete(ref);\n        this.emit(UPDATE_EVENT);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { debounce } from \"lodash\";\nimport {\n    type Beacon,\n    type BeaconIdentifier,\n    BeaconEvent,\n    type MatrixEvent,\n    type Room,\n    type RoomMember,\n    type RoomState,\n    RoomStateEvent,\n    ContentHelpers,\n    type MBeaconInfoEventContent,\n    M_BEACON,\n} from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport { type ActionPayload } from \"../dispatcher/payloads\";\nimport { AsyncStoreWithClient } from \"./AsyncStoreWithClient\";\nimport { arrayDiff } from \"../utils/arrays\";\nimport {\n    type ClearWatchCallback,\n    GeolocationError,\n    mapGeolocationPositionToTimedGeo,\n    sortBeaconsByLatestCreation,\n    type TimedGeoUri,\n    watchPosition,\n    getCurrentPosition,\n} from \"../utils/beacon\";\nimport { doMaybeLocalRoomAction } from \"../utils/local-room\";\nimport SettingsStore from \"../settings/SettingsStore\";\n\nconst isOwnBeacon = (beacon: Beacon, userId: string): boolean => beacon.beaconInfoOwner === userId;\n\nexport enum OwnBeaconStoreEvent {\n    LivenessChange = \"OwnBeaconStore.LivenessChange\",\n    MonitoringLivePosition = \"OwnBeaconStore.MonitoringLivePosition\",\n    LocationPublishError = \"LocationPublishError\",\n    BeaconUpdateError = \"BeaconUpdateError\",\n}\n\nconst MOVING_UPDATE_INTERVAL = 5000;\nconst STATIC_UPDATE_INTERVAL = 30000;\n\nconst BAIL_AFTER_CONSECUTIVE_ERROR_COUNT = 2;\n\ntype OwnBeaconStoreState = {\n    beacons: Map<BeaconIdentifier, Beacon>;\n    beaconLocationPublishErrorCounts: Map<BeaconIdentifier, number>;\n    beaconUpdateErrors: Map<BeaconIdentifier, Error>;\n    beaconsByRoomId: Map<Room[\"roomId\"], Set<BeaconIdentifier>>;\n    liveBeaconIds: BeaconIdentifier[];\n};\n\nconst CREATED_BEACONS_KEY = \"mx_live_beacon_created_id\";\nconst removeLocallyCreateBeaconEventId = (eventId: string): void => {\n    const ids = getLocallyCreatedBeaconEventIds();\n    window.localStorage.setItem(CREATED_BEACONS_KEY, JSON.stringify(ids.filter((id) => id !== eventId)));\n};\nconst storeLocallyCreateBeaconEventId = (eventId: string): void => {\n    const ids = getLocallyCreatedBeaconEventIds();\n    window.localStorage.setItem(CREATED_BEACONS_KEY, JSON.stringify([...ids, eventId]));\n};\n\nconst getLocallyCreatedBeaconEventIds = (): string[] => {\n    let ids: string[];\n    try {\n        ids = JSON.parse(window.localStorage.getItem(CREATED_BEACONS_KEY) ?? \"[]\");\n        if (!Array.isArray(ids)) {\n            throw new Error(\"Invalid stored value\");\n        }\n    } catch (error) {\n        logger.error(\"Failed to retrieve locally created beacon event ids\", error);\n        ids = [];\n    }\n    return ids;\n};\nexport class OwnBeaconStore extends AsyncStoreWithClient<OwnBeaconStoreState> {\n    private static readonly internalInstance = (() => {\n        const instance = new OwnBeaconStore();\n        instance.start();\n        return instance;\n    })();\n    // users beacons, keyed by event type\n    public readonly beacons = new Map<BeaconIdentifier, Beacon>();\n    public readonly beaconsByRoomId = new Map<Room[\"roomId\"], Set<BeaconIdentifier>>();\n    /**\n     * Track over the wire errors for published positions\n     * Counts consecutive wire errors per beacon\n     * Reset on successful publish of location\n     */\n    public readonly beaconLocationPublishErrorCounts = new Map<BeaconIdentifier, number>();\n    public readonly beaconUpdateErrors = new Map<BeaconIdentifier, unknown>();\n    /**\n     * ids of live beacons\n     * ordered by creation time descending\n     */\n    private liveBeaconIds: BeaconIdentifier[] = [];\n    private locationInterval?: number;\n    private clearPositionWatch?: ClearWatchCallback;\n    /**\n     * Track when the last position was published\n     * So we can manually get position on slow interval\n     * when the target is stationary\n     */\n    private lastPublishedPositionTimestamp?: number;\n    /**\n     * Ref returned from watchSetting for the MSC3946 labs flag\n     */\n    private dynamicWatcherRef: string | undefined;\n\n    public constructor() {\n        super(defaultDispatcher);\n    }\n\n    public static get instance(): OwnBeaconStore {\n        return OwnBeaconStore.internalInstance;\n    }\n\n    /**\n     * True when we have live beacons\n     * and geolocation.watchPosition is active\n     */\n    public get isMonitoringLiveLocation(): boolean {\n        return !!this.clearPositionWatch;\n    }\n\n    protected async onNotReady(): Promise<void> {\n        if (this.matrixClient) {\n            this.matrixClient.removeListener(BeaconEvent.LivenessChange, this.onBeaconLiveness);\n            this.matrixClient.removeListener(BeaconEvent.New, this.onNewBeacon);\n            this.matrixClient.removeListener(BeaconEvent.Update, this.onUpdateBeacon);\n            this.matrixClient.removeListener(BeaconEvent.Destroy, this.onDestroyBeacon);\n            this.matrixClient.removeListener(RoomStateEvent.Members, this.onRoomStateMembers);\n        }\n        SettingsStore.unwatchSetting(this.dynamicWatcherRef);\n\n        this.clearBeacons();\n    }\n\n    private clearBeacons(): void {\n        this.beacons.forEach((beacon) => beacon.destroy());\n\n        this.stopPollingLocation();\n        this.beacons.clear();\n        this.beaconsByRoomId.clear();\n        this.liveBeaconIds = [];\n        this.beaconLocationPublishErrorCounts.clear();\n        this.beaconUpdateErrors.clear();\n    }\n\n    protected async onReady(): Promise<void> {\n        if (this.matrixClient) {\n            this.matrixClient.on(BeaconEvent.LivenessChange, this.onBeaconLiveness);\n            this.matrixClient.on(BeaconEvent.New, this.onNewBeacon);\n            this.matrixClient.on(BeaconEvent.Update, this.onUpdateBeacon);\n            this.matrixClient.on(BeaconEvent.Destroy, this.onDestroyBeacon);\n            this.matrixClient.on(RoomStateEvent.Members, this.onRoomStateMembers);\n        }\n        this.dynamicWatcherRef = SettingsStore.watchSetting(\n            \"feature_dynamic_room_predecessors\",\n            null,\n            this.reinitialiseBeaconState,\n        );\n\n        this.initialiseBeaconState();\n    }\n\n    protected async onAction(payload: ActionPayload): Promise<void> {\n        // we don't actually do anything here\n    }\n\n    public hasLiveBeacons = (roomId?: string): boolean => {\n        return !!this.getLiveBeaconIds(roomId).length;\n    };\n\n    /**\n     * Some live beacon has a wire error\n     * Optionally filter by room\n     */\n    public hasLocationPublishErrors = (roomId?: string): boolean => {\n        return this.getLiveBeaconIds(roomId).some(this.beaconHasLocationPublishError);\n    };\n\n    /**\n     * If a beacon has failed to publish position\n     * past the allowed consecutive failure count (BAIL_AFTER_CONSECUTIVE_ERROR_COUNT)\n     * Then consider it to have an error\n     */\n    public beaconHasLocationPublishError = (beaconId: string): boolean => {\n        const counts = this.beaconLocationPublishErrorCounts.get(beaconId);\n        return counts !== undefined && counts >= BAIL_AFTER_CONSECUTIVE_ERROR_COUNT;\n    };\n\n    public resetLocationPublishError = (beaconId: string): void => {\n        this.incrementBeaconLocationPublishErrorCount(beaconId, false);\n\n        // always publish to all live beacons together\n        // instead of just one that was changed\n        // to keep lastPublishedTimestamp simple\n        // and extra published locations don't hurt\n        this.publishCurrentLocationToBeacons();\n    };\n\n    public getLiveBeaconIds = (roomId?: string): string[] => {\n        if (!roomId) {\n            return this.liveBeaconIds;\n        }\n        return this.liveBeaconIds.filter((beaconId) => this.beaconsByRoomId.get(roomId)?.has(beaconId));\n    };\n\n    public getLiveBeaconIdsWithLocationPublishError = (roomId?: string): string[] => {\n        return this.getLiveBeaconIds(roomId).filter(this.beaconHasLocationPublishError);\n    };\n\n    public getBeaconById = (beaconId: string): Beacon | undefined => {\n        return this.beacons.get(beaconId);\n    };\n\n    public stopBeacon = async (beaconIdentifier: string): Promise<void> => {\n        const beacon = this.beacons.get(beaconIdentifier);\n        // if no beacon, or beacon is already explicitly set isLive: false\n        // do nothing\n        if (!beacon?.beaconInfo?.live) {\n            return;\n        }\n\n        await this.updateBeaconEvent(beacon, { live: false });\n        // prune from local store\n        removeLocallyCreateBeaconEventId(beacon.beaconInfoId);\n    };\n\n    /**\n     * Listeners\n     */\n\n    private onNewBeacon = (_event: MatrixEvent, beacon: Beacon): void => {\n        if (!this.matrixClient || !isOwnBeacon(beacon, this.matrixClient.getUserId()!)) {\n            return;\n        }\n        this.addBeacon(beacon);\n        this.checkLiveness();\n    };\n\n    /**\n     * This will be called when a beacon is replaced\n     */\n    private onUpdateBeacon = (_event: MatrixEvent, beacon: Beacon): void => {\n        if (!this.matrixClient || !isOwnBeacon(beacon, this.matrixClient.getUserId()!)) {\n            return;\n        }\n\n        this.checkLiveness();\n        beacon.monitorLiveness();\n    };\n\n    private onDestroyBeacon = (beaconIdentifier: BeaconIdentifier): void => {\n        // check if we care about this beacon\n        if (!this.beacons.has(beaconIdentifier)) {\n            return;\n        }\n\n        this.checkLiveness();\n    };\n\n    private onBeaconLiveness = (isLive: boolean, beacon: Beacon): void => {\n        // check if we care about this beacon\n        if (!this.beacons.has(beacon.identifier)) {\n            return;\n        }\n\n        // beacon expired, update beacon to un-alive state\n        if (!isLive) {\n            this.stopBeacon(beacon.identifier);\n        }\n\n        this.checkLiveness();\n\n        this.emit(OwnBeaconStoreEvent.LivenessChange, this.getLiveBeaconIds());\n    };\n\n    /**\n     * Check for changes in membership in rooms with beacons\n     * and stop monitoring beacons in rooms user is no longer member of\n     */\n    private onRoomStateMembers = (_event: MatrixEvent, roomState: RoomState, member: RoomMember): void => {\n        // no beacons for this room, ignore\n        if (\n            !this.matrixClient ||\n            !this.beaconsByRoomId.has(roomState.roomId) ||\n            member.userId !== this.matrixClient.getUserId()\n        ) {\n            return;\n        }\n\n        // TODO check powerlevels here\n        // in PSF-797\n\n        // stop watching beacons in rooms where user is no longer a member\n        if (member.membership === KnownMembership.Leave || member.membership === KnownMembership.Ban) {\n            this.beaconsByRoomId.get(roomState.roomId)?.forEach(this.removeBeacon);\n            this.beaconsByRoomId.delete(roomState.roomId);\n        }\n    };\n\n    /**\n     * State management\n     */\n\n    /**\n     * Live beacon ids that do not have wire errors\n     */\n    private get healthyLiveBeaconIds(): string[] {\n        return this.liveBeaconIds.filter(\n            (beaconId) => !this.beaconHasLocationPublishError(beaconId) && !this.beaconUpdateErrors.has(beaconId),\n        );\n    }\n\n    /**\n     * @internal public for test only\n     */\n    public reinitialiseBeaconState = (): void => {\n        this.clearBeacons();\n        this.initialiseBeaconState();\n    };\n\n    private initialiseBeaconState = (): void => {\n        if (!this.matrixClient) return;\n        const userId = this.matrixClient.getSafeUserId();\n        const visibleRooms = this.matrixClient.getVisibleRooms(\n            SettingsStore.getValue(\"feature_dynamic_room_predecessors\"),\n        );\n\n        visibleRooms.forEach((room) => {\n            const roomState = room.currentState;\n            const beacons = roomState.beacons;\n            const ownBeaconsArray = [...beacons.values()].filter((beacon) => isOwnBeacon(beacon, userId));\n            ownBeaconsArray.forEach((beacon) => this.addBeacon(beacon));\n        });\n\n        this.checkLiveness();\n    };\n\n    private addBeacon = (beacon: Beacon): void => {\n        this.beacons.set(beacon.identifier, beacon);\n\n        if (!this.beaconsByRoomId.has(beacon.roomId)) {\n            this.beaconsByRoomId.set(beacon.roomId, new Set<string>());\n        }\n\n        this.beaconsByRoomId.get(beacon.roomId)!.add(beacon.identifier);\n\n        beacon.monitorLiveness();\n    };\n\n    /**\n     * Remove listeners for a given beacon\n     * remove from state\n     * and update liveness if changed\n     */\n    private removeBeacon = (beaconId: string): void => {\n        if (!this.beacons.has(beaconId)) {\n            return;\n        }\n        this.beacons.get(beaconId)!.destroy();\n        this.beacons.delete(beaconId);\n\n        this.checkLiveness();\n    };\n\n    private checkLiveness = (): void => {\n        const locallyCreatedBeaconEventIds = getLocallyCreatedBeaconEventIds();\n        const prevLiveBeaconIds = this.getLiveBeaconIds();\n        this.liveBeaconIds = [...this.beacons.values()]\n            .filter(\n                (beacon) =>\n                    beacon.isLive &&\n                    // only beacons created on this device should be shared to\n                    locallyCreatedBeaconEventIds.includes(beacon.beaconInfoId),\n            )\n            .sort(sortBeaconsByLatestCreation)\n            .map((beacon) => beacon.identifier);\n\n        const diff = arrayDiff(prevLiveBeaconIds, this.liveBeaconIds);\n\n        if (diff.added.length || diff.removed.length) {\n            this.emit(OwnBeaconStoreEvent.LivenessChange, this.liveBeaconIds);\n        }\n\n        // publish current location immediately\n        // when there are new live beacons\n        // and we already have a live monitor\n        // so first position is published quickly\n        // even when target is stationary\n        //\n        // when there is no existing live monitor\n        // it will be created below by togglePollingLocation\n        // and publish first position quickly\n        if (diff.added.length && this.isMonitoringLiveLocation) {\n            this.publishCurrentLocationToBeacons();\n        }\n\n        // if overall liveness changed\n        if (!!prevLiveBeaconIds?.length !== !!this.liveBeaconIds.length) {\n            this.togglePollingLocation();\n        }\n    };\n\n    public createLiveBeacon = async (\n        roomId: Room[\"roomId\"],\n        beaconInfoContent: MBeaconInfoEventContent,\n    ): Promise<void> => {\n        if (!this.matrixClient) return;\n        // explicitly stop any live beacons this user has\n        // to ensure they remain stopped\n        // if the new replacing beacon is redacted\n        const existingLiveBeaconIdsForRoom = this.getLiveBeaconIds(roomId);\n        await Promise.all(existingLiveBeaconIdsForRoom.map((beaconId) => this.stopBeacon(beaconId)));\n\n        // eslint-disable-next-line camelcase\n        const { event_id } = await doMaybeLocalRoomAction(\n            roomId,\n            (actualRoomId: string) => this.matrixClient!.unstable_createLiveBeacon(actualRoomId, beaconInfoContent),\n            this.matrixClient,\n        );\n\n        storeLocallyCreateBeaconEventId(event_id);\n    };\n\n    /**\n     * Geolocation\n     */\n\n    private togglePollingLocation = (): void => {\n        if (!!this.liveBeaconIds.length) {\n            this.startPollingLocation();\n        } else {\n            this.stopPollingLocation();\n        }\n    };\n\n    private startPollingLocation = async (): Promise<void> => {\n        // clear any existing interval\n        this.stopPollingLocation();\n\n        try {\n            this.clearPositionWatch = watchPosition(this.onWatchedPosition, this.onGeolocationError);\n        } catch (error) {\n            if (error instanceof Error) {\n                this.onGeolocationError(error.message as GeolocationError);\n            } else {\n                console.error(\"Unexpected error\", error);\n            }\n            // don't set locationInterval if geolocation failed to setup\n            return;\n        }\n\n        this.locationInterval = window.setInterval(() => {\n            if (!this.lastPublishedPositionTimestamp) {\n                return;\n            }\n            // if position was last updated STATIC_UPDATE_INTERVAL ms ago or more\n            // get our position and publish it\n            if (this.lastPublishedPositionTimestamp <= Date.now() - STATIC_UPDATE_INTERVAL) {\n                this.publishCurrentLocationToBeacons();\n            }\n        }, STATIC_UPDATE_INTERVAL);\n\n        this.emit(OwnBeaconStoreEvent.MonitoringLivePosition);\n    };\n\n    private stopPollingLocation = (): void => {\n        clearInterval(this.locationInterval);\n        this.locationInterval = undefined;\n        this.lastPublishedPositionTimestamp = undefined;\n\n        if (this.clearPositionWatch) {\n            this.clearPositionWatch();\n            this.clearPositionWatch = undefined;\n        }\n\n        this.emit(OwnBeaconStoreEvent.MonitoringLivePosition);\n    };\n\n    private onWatchedPosition = (position: GeolocationPosition): void => {\n        const timedGeoPosition = mapGeolocationPositionToTimedGeo(position);\n\n        // if this is our first position, publish immediately\n        if (!this.lastPublishedPositionTimestamp) {\n            this.publishLocationToBeacons(timedGeoPosition);\n        } else {\n            this.debouncedPublishLocationToBeacons(timedGeoPosition);\n        }\n    };\n\n    private onGeolocationError = async (error: GeolocationError): Promise<void> => {\n        logger.error(\"Geolocation failed\", error);\n\n        // other errors are considered non-fatal\n        // and self recovering\n        if (![GeolocationError.Unavailable, GeolocationError.PermissionDenied].includes(error)) {\n            return;\n        }\n\n        this.stopPollingLocation();\n        // kill live beacons when location permissions are revoked\n        await Promise.all(this.liveBeaconIds.map(this.stopBeacon));\n    };\n\n    /**\n     * Gets the current location\n     * (as opposed to using watched location)\n     * and publishes it to all live beacons\n     */\n    private publishCurrentLocationToBeacons = async (): Promise<void> => {\n        try {\n            const position = await getCurrentPosition();\n            this.publishLocationToBeacons(mapGeolocationPositionToTimedGeo(position));\n        } catch (error) {\n            if (error instanceof Error) {\n                this.onGeolocationError(error.message as GeolocationError);\n            } else {\n                console.error(\"Unexpected error\", error);\n            }\n        }\n    };\n\n    /**\n     * MatrixClient api\n     */\n\n    /**\n     * Updates beacon with provided content update\n     * Records error in beaconUpdateErrors\n     * rethrows\n     */\n    private updateBeaconEvent = async (\n        beacon: Beacon,\n        update: Partial<ContentHelpers.BeaconInfoState>,\n    ): Promise<void> => {\n        const { description, timeout, timestamp, live, assetType } = {\n            ...beacon.beaconInfo,\n            ...update,\n        };\n\n        const updateContent = ContentHelpers.makeBeaconInfoContent(timeout, live, description, assetType, timestamp);\n\n        try {\n            await this.matrixClient!.unstable_setLiveBeacon(beacon.roomId, updateContent);\n            // cleanup any errors\n            const hadError = this.beaconUpdateErrors.has(beacon.identifier);\n            if (hadError) {\n                this.beaconUpdateErrors.delete(beacon.identifier);\n                this.emit(OwnBeaconStoreEvent.BeaconUpdateError, beacon.identifier, false);\n            }\n        } catch (error) {\n            logger.error(\"Failed to update beacon\", error);\n            this.beaconUpdateErrors.set(beacon.identifier, error);\n            this.emit(OwnBeaconStoreEvent.BeaconUpdateError, beacon.identifier, true);\n\n            throw error;\n        }\n    };\n\n    /**\n     * Sends m.location events to all live beacons\n     * Sets last published beacon\n     */\n    private publishLocationToBeacons = async (position: TimedGeoUri): Promise<void> => {\n        this.lastPublishedPositionTimestamp = Date.now();\n        await Promise.all(\n            this.healthyLiveBeaconIds.map((beaconId) =>\n                this.beacons.has(beaconId)\n                    ? this.sendLocationToBeacon(this.beacons.get(beaconId)!, position)\n                    : Promise.resolve(),\n            ),\n        );\n    };\n\n    private debouncedPublishLocationToBeacons = debounce(this.publishLocationToBeacons, MOVING_UPDATE_INTERVAL);\n\n    /**\n     * Sends m.location event to referencing given beacon\n     */\n    private sendLocationToBeacon = async (beacon: Beacon, { geoUri, timestamp }: TimedGeoUri): Promise<void> => {\n        const content = ContentHelpers.makeBeaconContent(geoUri, timestamp, beacon.beaconInfoId);\n        try {\n            await this.matrixClient!.sendEvent(beacon.roomId, M_BEACON.name, content);\n            this.incrementBeaconLocationPublishErrorCount(beacon.identifier, false);\n        } catch (error) {\n            logger.error(error);\n            this.incrementBeaconLocationPublishErrorCount(beacon.identifier, true);\n        }\n    };\n\n    /**\n     * Manage beacon wire error count\n     * - clear count for beacon when not error\n     * - increment count for beacon when is error\n     * - emit if beacon error count crossed threshold\n     */\n    private incrementBeaconLocationPublishErrorCount = (beaconId: string, isError: boolean): void => {\n        const hadError = this.beaconHasLocationPublishError(beaconId);\n\n        if (isError) {\n            // increment error count\n            this.beaconLocationPublishErrorCounts.set(\n                beaconId,\n                (this.beaconLocationPublishErrorCounts.get(beaconId) ?? 0) + 1,\n            );\n        } else {\n            // clear any error count\n            this.beaconLocationPublishErrorCounts.delete(beaconId);\n        }\n\n        if (this.beaconHasLocationPublishError(beaconId) !== hadError) {\n            this.emit(OwnBeaconStoreEvent.LocationPublishError, beaconId);\n        }\n    };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { EchoTransaction, type RunFn, TransactionStatus } from \"./EchoTransaction\";\nimport { arrayFastClone } from \"../../utils/arrays\";\nimport { type IDestroyable } from \"../../utils/IDestroyable\";\nimport { Whenable } from \"../../utils/Whenable\";\n\nexport enum ContextTransactionState {\n    NotStarted,\n    PendingErrors,\n    AllSuccessful,\n}\n\nexport abstract class EchoContext extends Whenable<ContextTransactionState> implements IDestroyable {\n    private _transactions: EchoTransaction[] = [];\n    private _state = ContextTransactionState.NotStarted;\n\n    public get transactions(): EchoTransaction[] {\n        return arrayFastClone(this._transactions);\n    }\n\n    public get state(): ContextTransactionState {\n        return this._state;\n    }\n\n    public get firstFailedTime(): Date | null {\n        const failedTxn = this.transactions.find((t) => t.didPreviouslyFail || t.status === TransactionStatus.Error);\n        if (failedTxn) return failedTxn.startTime;\n        return null;\n    }\n\n    public disownTransaction(txn: EchoTransaction): void {\n        const idx = this._transactions.indexOf(txn);\n        if (idx >= 0) this._transactions.splice(idx, 1);\n        txn.destroy();\n        this.checkTransactions();\n    }\n\n    public beginTransaction(auditName: string, runFn: RunFn): EchoTransaction {\n        const txn = new EchoTransaction(auditName, runFn);\n        this._transactions.push(txn);\n        txn.whenAnything(this.checkTransactions);\n\n        // We have no intent to call the transaction again if it succeeds (in fact, it'll\n        // be really angry at us if we do), so call that the end of the road for the events.\n        txn.when(TransactionStatus.Success, () => txn.destroy());\n\n        return txn;\n    }\n\n    private checkTransactions = (): void => {\n        let status = ContextTransactionState.AllSuccessful;\n        for (const txn of this.transactions) {\n            if (txn.status === TransactionStatus.Error || txn.didPreviouslyFail) {\n                status = ContextTransactionState.PendingErrors;\n                break;\n            } else if (txn.status === TransactionStatus.Pending) {\n                status = ContextTransactionState.NotStarted;\n                // no break as we might hit something which broke\n            }\n        }\n        this._state = status;\n        this.notifyCondition(status);\n    };\n\n    public destroy(): void {\n        for (const txn of this.transactions) {\n            txn.destroy();\n        }\n        this._transactions = [];\n        super.destroy();\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { EchoContext } from \"./EchoContext\";\n\nexport class RoomEchoContext extends EchoContext {\n    public constructor(public readonly room: Room) {\n        super();\n    }\n}\n","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction OfflineIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M3.5 3.5a1 1 0 1 0-1.414 1.414l4.113 4.114a5.5 5.5 0 0 0-.184 1.07A5.002 5.002 0 0 0 7 20h10.172l1.914 1.914A1 1 0 1 0 20.5 20.5l-.979-.979.004-.001L7.145 7.14l-.002.003zm18.5 12a4.48 4.48 0 0 1-.928 2.738L8.637 5.803A5.47 5.47 0 0 1 11.5 5a5.49 5.49 0 0 1 4.25 2.008 4 4 0 0 1 4.187 4.708A4.5 4.5 0 0 1 22 15.5\"\n    })\n  });\n}\n;\nOfflineIcon.displayName = \"OfflineIcon\";\nexport default forwardRef(OfflineIcon);","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode } from \"react\";\n\nimport BaseDialog from \"./BaseDialog\";\nimport { _t } from \"../../../languageHandler\";\nimport { EchoStore } from \"../../../stores/local-echo/EchoStore\";\nimport { formatTime } from \"../../../DateUtils\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { RoomEchoContext } from \"../../../stores/local-echo/RoomEchoContext\";\nimport RoomAvatar from \"../avatars/RoomAvatar\";\nimport { TransactionStatus } from \"../../../stores/local-echo/EchoTransaction\";\nimport Spinner from \"../elements/Spinner\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport { UPDATE_EVENT } from \"../../../stores/AsyncStore\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\n\ninterface IProps {\n    onFinished(): void;\n}\n\nexport default class ServerOfflineDialog extends React.PureComponent<IProps> {\n    public componentDidMount(): void {\n        EchoStore.instance.on(UPDATE_EVENT, this.onEchosUpdated);\n    }\n\n    public componentWillUnmount(): void {\n        EchoStore.instance.off(UPDATE_EVENT, this.onEchosUpdated);\n    }\n\n    private onEchosUpdated = (): void => {\n        this.forceUpdate(); // no state to worry about\n    };\n\n    private renderTimeline(): ReactNode[] {\n        return EchoStore.instance.contexts.map((c, i) => {\n            if (!c.firstFailedTime) return null; // not useful\n            if (!(c instanceof RoomEchoContext))\n                throw new Error(\"Cannot render unknown context: \" + c.constructor.name);\n            const header = (\n                <div className=\"mx_ServerOfflineDialog_content_context_timeline_header\">\n                    <RoomAvatar size=\"24px\" room={c.room} />\n                    <span>{c.room.name}</span>\n                </div>\n            );\n            const entries = c.transactions\n                .filter((t) => t.status === TransactionStatus.Error || t.didPreviouslyFail)\n                .map((t, j) => {\n                    let button = <Spinner size={19} />;\n                    if (t.status === TransactionStatus.Error) {\n                        button = (\n                            <AccessibleButton kind=\"link\" onClick={() => t.run()}>\n                                {_t(\"action|resend\")}\n                            </AccessibleButton>\n                        );\n                    }\n                    return (\n                        <div className=\"mx_ServerOfflineDialog_content_context_txn\" key={`txn-${j}`}>\n                            <span className=\"mx_ServerOfflineDialog_content_context_txn_desc\">{t.auditName}</span>\n                            {button}\n                        </div>\n                    );\n                });\n            return (\n                <div className=\"mx_ServerOfflineDialog_content_context\" key={`context-${i}`}>\n                    <div className=\"mx_ServerOfflineDialog_content_context_timestamp\">\n                        {formatTime(c.firstFailedTime, SettingsStore.getValue(\"showTwelveHourTimestamps\"))}\n                    </div>\n                    <div className=\"mx_ServerOfflineDialog_content_context_timeline\">\n                        {header}\n                        {entries}\n                    </div>\n                </div>\n            );\n        });\n    }\n\n    public render(): React.ReactNode {\n        let timeline = this.renderTimeline().filter((c) => !!c); // remove nulls for next check\n        if (timeline.length === 0) {\n            timeline = [<div key={1}>{_t(\"server_offline|empty_timeline\")}</div>];\n        }\n\n        const serverName = MatrixClientPeg.safeGet().getDomain();\n        return (\n            <BaseDialog\n                title={_t(\"server_offline|title\")}\n                className=\"mx_ServerOfflineDialog\"\n                contentId=\"mx_Dialog_content\"\n                onFinished={this.props.onFinished}\n                hasCancel={true}\n            >\n                <div className=\"mx_ServerOfflineDialog_content\">\n                    <p>{_t(\"server_offline|description\")}</p>\n                    <ul>\n                        <li>{_t(\"server_offline|description_1\", { serverName })}</li>\n                        <li>{_t(\"server_offline|description_2\")}</li>\n                        <li>{_t(\"server_offline|description_3\")}</li>\n                        <li>{_t(\"server_offline|description_4\")}</li>\n                        <li>{_t(\"server_offline|description_5\")}</li>\n                        <li>{_t(\"server_offline|description_6\")}</li>\n                        <li>{_t(\"server_offline|description_7\")}</li>\n                        <li>{_t(\"server_offline|description_8\")}</li>\n                    </ul>\n                    <hr />\n                    <h2>{_t(\"server_offline|recent_changes_heading\")}</h2>\n                    {timeline}\n                </div>\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { OfflineIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport Modal from \"../../../Modal\";\nimport ServerOfflineDialog from \"../dialogs/ServerOfflineDialog\";\n\nexport default class NonUrgentEchoFailureToast extends React.PureComponent {\n    private openDialog = (): void => {\n        Modal.createDialog(ServerOfflineDialog, {});\n    };\n\n    public render(): React.ReactNode {\n        return (\n            <div className=\"mx_NonUrgentEchoFailureToast\">\n                <OfflineIcon />\n                {_t(\n                    \"error|non_urgent_echo_failure_toast\",\n                    {},\n                    {\n                        a: (sub) => (\n                            <AccessibleButton kind=\"link_inline\" onClick={this.openDialog}>\n                                {sub}\n                            </AccessibleButton>\n                        ),\n                    },\n                )}\n            </div>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { type GenericEchoChamber } from \"./GenericEchoChamber\";\nimport { RoomEchoChamber } from \"./RoomEchoChamber\";\nimport { RoomEchoContext } from \"./RoomEchoContext\";\nimport { AsyncStoreWithClient } from \"../AsyncStoreWithClient\";\nimport defaultDispatcher from \"../../dispatcher/dispatcher\";\nimport { type ActionPayload } from \"../../dispatcher/payloads\";\nimport { ContextTransactionState, type EchoContext } from \"./EchoContext\";\nimport NonUrgentToastStore, { type ToastReference } from \"../NonUrgentToastStore\";\nimport NonUrgentEchoFailureToast from \"../../components/views/toasts/NonUrgentEchoFailureToast\";\n\ninterface IState {\n    toastRef: ToastReference;\n}\n\ntype ContextKey = string;\n\nconst roomContextKey = (room: Room): ContextKey => `room-${room.roomId}`;\n\nexport class EchoStore extends AsyncStoreWithClient<IState> {\n    private static _instance: EchoStore;\n\n    private caches = new Map<ContextKey, GenericEchoChamber<any, any, any>>();\n\n    public constructor() {\n        super(defaultDispatcher);\n    }\n\n    public static get instance(): EchoStore {\n        if (!this._instance) {\n            this._instance = new EchoStore();\n            this._instance.start();\n        }\n        return this._instance;\n    }\n\n    public get contexts(): EchoContext[] {\n        return Array.from(this.caches.values()).map((e) => e.context);\n    }\n\n    public getOrCreateChamberForRoom(room: Room): RoomEchoChamber {\n        if (this.caches.has(roomContextKey(room))) {\n            return this.caches.get(roomContextKey(room)) as RoomEchoChamber;\n        }\n\n        const context = new RoomEchoContext(room);\n        context.whenAnything(() => this.checkContexts());\n\n        const echo = new RoomEchoChamber(context);\n        echo.setClient(this.matrixClient);\n        this.caches.set(roomContextKey(room), echo);\n\n        return echo;\n    }\n\n    private async checkContexts(): Promise<void> {\n        let hasOrHadError = false;\n        for (const echo of this.caches.values()) {\n            hasOrHadError = echo.context.state === ContextTransactionState.PendingErrors;\n            if (hasOrHadError) break;\n        }\n\n        if (hasOrHadError && !this.state.toastRef) {\n            const ref = NonUrgentToastStore.instance.addToast(NonUrgentEchoFailureToast);\n            await this.updateState({ toastRef: ref });\n        } else if (!hasOrHadError && this.state.toastRef) {\n            NonUrgentToastStore.instance.removeToast(this.state.toastRef);\n            await this.updateState({ toastRef: null });\n        }\n    }\n\n    protected async onReady(): Promise<any> {\n        if (!this.caches) return; // can only happen during initialization\n        for (const echo of this.caches.values()) {\n            echo.setClient(this.matrixClient);\n        }\n    }\n\n    protected async onNotReady(): Promise<any> {\n        for (const echo of this.caches.values()) {\n            echo.setClient(null);\n        }\n    }\n\n    protected async onAction(payload: ActionPayload): Promise<void> {}\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { type RoomEchoChamber } from \"./RoomEchoChamber\";\nimport { EchoStore } from \"./EchoStore\";\n\n/**\n * Semantic access to local echo\n */\nexport class EchoChamber {\n    private constructor() {}\n\n    public static forRoom(room: Room): RoomEchoChamber {\n        return EchoStore.instance.getOrCreateChamberForRoom(room);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { Whenable } from \"../../utils/Whenable\";\n\nexport type RunFn = () => Promise<void>;\n\nexport enum TransactionStatus {\n    Pending,\n    Success,\n    Error,\n}\n\nexport class EchoTransaction extends Whenable<TransactionStatus> {\n    private _status = TransactionStatus.Pending;\n    private didFail = false;\n\n    public readonly startTime = new Date();\n\n    public constructor(\n        public readonly auditName: string,\n        public runFn: RunFn,\n    ) {\n        super();\n    }\n\n    public get didPreviouslyFail(): boolean {\n        return this.didFail;\n    }\n\n    public get status(): TransactionStatus {\n        return this._status;\n    }\n\n    public run(): void {\n        if (this.status === TransactionStatus.Success) {\n            throw new Error(\"Cannot re-run a successful echo transaction\");\n        }\n        this.setStatus(TransactionStatus.Pending);\n        this.runFn()\n            .then(() => this.setStatus(TransactionStatus.Success))\n            .catch(() => this.setStatus(TransactionStatus.Error));\n    }\n\n    public cancel(): void {\n        // Success basically means \"done\"\n        this.setStatus(TransactionStatus.Success);\n    }\n\n    private setStatus(status: TransactionStatus): void {\n        this._status = status;\n        if (status === TransactionStatus.Error) {\n            this.didFail = true;\n        } else if (status === TransactionStatus.Success) {\n            this.didFail = false;\n        }\n        this.notifyCondition(status);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { EventEmitter } from \"events\";\n\nimport { type EchoContext } from \"./EchoContext\";\nimport { type EchoTransaction, type RunFn, TransactionStatus } from \"./EchoTransaction\";\n\nexport async function implicitlyReverted(): Promise<void> {\n    // do nothing :D\n}\n\nexport const PROPERTY_UPDATED = \"property_updated\";\n\nexport abstract class GenericEchoChamber<C extends EchoContext, K, V> extends EventEmitter {\n    private cache = new Map<K, { txn: EchoTransaction; val: V }>();\n    protected matrixClient: MatrixClient | null = null;\n\n    protected constructor(\n        public readonly context: C,\n        private lookupFn: (key: K) => V,\n    ) {\n        super();\n    }\n\n    public setClient(client: MatrixClient | null): void {\n        const oldClient = this.matrixClient;\n        this.matrixClient = client;\n        this.onClientChanged(oldClient, client);\n    }\n\n    protected abstract onClientChanged(oldClient: MatrixClient | null, newClient: MatrixClient | null): void;\n\n    /**\n     * Gets a value. If the key is in flight, the cached value will be returned. If\n     * the key is not in flight then the lookupFn provided to this class will be\n     * called instead.\n     * @param key The key to look up.\n     * @returns The value for the key.\n     */\n    public getValue(key: K): V {\n        return this.cache.has(key) ? this.cache.get(key)!.val : this.lookupFn(key);\n    }\n\n    private cacheVal(key: K, val: V, txn: EchoTransaction): void {\n        this.cache.set(key, { txn, val });\n        this.emit(PROPERTY_UPDATED, key);\n    }\n\n    private decacheKey(key: K): void {\n        if (this.cache.has(key)) {\n            this.context.disownTransaction(this.cache.get(key)!.txn);\n            this.cache.delete(key);\n            this.emit(PROPERTY_UPDATED, key);\n        }\n    }\n\n    protected markEchoReceived(key: K): void {\n        if (this.cache.has(key)) {\n            const txn = this.cache.get(key)!.txn;\n            this.context.disownTransaction(txn);\n            txn.cancel();\n        }\n        this.decacheKey(key);\n    }\n\n    public setValue(auditName: string, key: K, targetVal: V, runFn: RunFn, revertFn: RunFn): void {\n        // Cancel any pending transactions for the same key\n        if (this.cache.has(key)) {\n            this.cache.get(key)!.txn.cancel();\n        }\n\n        const ctxn = this.context.beginTransaction(auditName, runFn);\n        this.cacheVal(key, targetVal, ctxn); // set the cache now as it won't be updated by the .when() ladder below.\n\n        ctxn.when(TransactionStatus.Pending, () => this.cacheVal(key, targetVal, ctxn)).when(\n            TransactionStatus.Error,\n            () => revertFn(),\n        );\n\n        ctxn.run();\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, ClientEvent, type MatrixClient, EventType } from \"matrix-js-sdk/src/matrix\";\n\nimport { GenericEchoChamber, implicitlyReverted, PROPERTY_UPDATED } from \"./GenericEchoChamber\";\nimport { getRoomNotifsState, type RoomNotifState, setRoomNotifsState } from \"../../RoomNotifs\";\nimport { type RoomEchoContext } from \"./RoomEchoContext\";\nimport { _t } from \"../../languageHandler\";\n\nexport enum CachedRoomKey {\n    NotificationVolume,\n}\n\nexport class RoomEchoChamber extends GenericEchoChamber<RoomEchoContext, CachedRoomKey, RoomNotifState | undefined> {\n    private properties = new Map<CachedRoomKey, RoomNotifState>();\n\n    public constructor(context: RoomEchoContext) {\n        super(context, (k) => this.properties.get(k));\n    }\n\n    protected onClientChanged(oldClient: MatrixClient | null, newClient: MatrixClient | null): void {\n        this.properties.clear();\n        oldClient?.removeListener(ClientEvent.AccountData, this.onAccountData);\n        if (newClient) {\n            // Register the listeners first\n            newClient.on(ClientEvent.AccountData, this.onAccountData);\n\n            // Then populate the properties map\n            this.updateNotificationVolume();\n        }\n    }\n\n    private onAccountData = (event: MatrixEvent): void => {\n        if (!this.matrixClient) return;\n        if (event.getType() === EventType.PushRules) {\n            const currentVolume = this.properties.get(CachedRoomKey.NotificationVolume);\n            const newVolume = getRoomNotifsState(this.matrixClient, this.context.room.roomId);\n            if (currentVolume !== newVolume) {\n                this.updateNotificationVolume();\n            }\n        }\n    };\n\n    private updateNotificationVolume(): void {\n        const state = this.matrixClient ? getRoomNotifsState(this.matrixClient, this.context.room.roomId) : null;\n        if (state) this.properties.set(CachedRoomKey.NotificationVolume, state);\n        else this.properties.delete(CachedRoomKey.NotificationVolume);\n        this.markEchoReceived(CachedRoomKey.NotificationVolume);\n        this.emit(PROPERTY_UPDATED, CachedRoomKey.NotificationVolume);\n    }\n\n    // ---- helpers below here ----\n\n    public get notificationVolume(): RoomNotifState | undefined {\n        return this.getValue(CachedRoomKey.NotificationVolume);\n    }\n\n    public set notificationVolume(v: RoomNotifState | undefined) {\n        if (v === undefined) return;\n        this.setValue(\n            _t(\"notifications|error_change_title\"),\n            CachedRoomKey.NotificationVolume,\n            v,\n            async (): Promise<void> => {\n                return setRoomNotifsState(this.context.room.client, this.context.room.roomId, v);\n            },\n            implicitlyReverted,\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { _t } from \"../../languageHandler\";\n\nexport enum NotificationLevel {\n    Muted,\n    // Inverted (None -> Red) because we do integer comparisons on this\n    None, // nothing special\n    // TODO: Remove bold with notifications: https://github.com/vector-im/element-web/issues/14227\n    Activity, // no badge, show as unread\n    Notification, // unread notified messages\n    Highlight, // unread pings\n    Unsent, // some messages failed to send\n}\n\nexport function humanReadableNotificationLevel(level: NotificationLevel): string {\n    switch (level) {\n        case NotificationLevel.None:\n            return _t(\"notifications|level_none\");\n        case NotificationLevel.Activity:\n            return _t(\"notifications|level_activity\");\n        case NotificationLevel.Notification:\n            return _t(\"notifications|level_notification\");\n        case NotificationLevel.Highlight:\n            return _t(\"notifications|level_highlight\");\n        case NotificationLevel.Unsent:\n            return _t(\"notifications|level_unsent\");\n        case NotificationLevel.Muted:\n            return _t(\"notifications|level_muted\");\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { TypedEventEmitter } from \"matrix-js-sdk/src/matrix\";\n\nimport { NotificationLevel } from \"./NotificationLevel\";\nimport { type IDestroyable } from \"../../utils/IDestroyable\";\nimport SettingsStore from \"../../settings/SettingsStore\";\n\nexport interface INotificationStateSnapshotParams {\n    symbol: string | null;\n    count: number;\n    level: NotificationLevel;\n    muted: boolean;\n    knocked: boolean;\n    invited: boolean;\n}\n\nexport enum NotificationStateEvents {\n    Update = \"update\",\n}\n\ntype EventHandlerMap = {\n    [NotificationStateEvents.Update]: () => void;\n};\n\nexport abstract class NotificationState\n    extends TypedEventEmitter<NotificationStateEvents, EventHandlerMap>\n    implements INotificationStateSnapshotParams, IDestroyable\n{\n    //\n    protected _symbol: string | null = null;\n    protected _count = 0;\n    protected _level: NotificationLevel = NotificationLevel.None;\n    protected _muted = false;\n    protected _knocked = false;\n    protected _invited = false;\n\n    private watcherReferences: string[] = [];\n\n    public constructor() {\n        super();\n        this.watcherReferences.push(\n            SettingsStore.watchSetting(\"feature_hidebold\", null, () => {\n                this.emit(NotificationStateEvents.Update);\n            }),\n        );\n    }\n\n    public get symbol(): string | null {\n        return this._symbol;\n    }\n\n    public get count(): number {\n        return this._count;\n    }\n\n    public get level(): NotificationLevel {\n        return this._level;\n    }\n\n    public get muted(): boolean {\n        return this._muted;\n    }\n\n    public get knocked(): boolean {\n        return this._knocked;\n    }\n\n    /**\n     * True if the notification is an invitation notification.\n     * Invite notifications are a special case of highlight notifications\n     */\n    public get invited(): boolean {\n        return this._invited;\n    }\n\n    public get isIdle(): boolean {\n        return this.level <= NotificationLevel.None;\n    }\n\n    /**\n     * True if the notification is higher than an activity notification or if the feature_hidebold is disabled with an activity notification.\n     * The \"unread\" term used here is different from the \"Unread\" in the UI. Unread in the UI doesn't include activity notifications even with feature_hidebold disabled.\n     */\n    public get isUnread(): boolean {\n        if (this.level > NotificationLevel.Activity) {\n            return true;\n        } else {\n            const hideBold = SettingsStore.getValue(\"feature_hidebold\");\n            return this.level === NotificationLevel.Activity && !hideBold;\n        }\n    }\n\n    /**\n     * True if the notification has a count or a symbol and is equal or greater than an NotificationLevel.Notification.\n     */\n    public get hasUnreadCount(): boolean {\n        return this.level >= NotificationLevel.Notification && (!!this.count || !!this.symbol);\n    }\n\n    /**\n     * True if the notification is a mention, an invitation, a knock or a unset message.\n     *\n     * @deprecated because the name is confusing. A mention is not an invitation, a knock or an unsent message.\n     * In case of a {@link RoomNotificationState}, use {@link RoomNotificationState.isMention} instead.\n     */\n    public get hasMentions(): boolean {\n        return this.level >= NotificationLevel.Highlight;\n    }\n\n    protected emitIfUpdated(snapshot: NotificationStateSnapshot): void {\n        if (snapshot.isDifferentFrom(this)) {\n            this.emit(NotificationStateEvents.Update);\n        }\n    }\n\n    protected snapshot(): NotificationStateSnapshot {\n        return new NotificationStateSnapshot(this);\n    }\n\n    public destroy(): void {\n        this.removeAllListeners(NotificationStateEvents.Update);\n        for (const watcherReference of this.watcherReferences) {\n            SettingsStore.unwatchSetting(watcherReference);\n        }\n        this.watcherReferences = [];\n    }\n}\n\nexport class NotificationStateSnapshot {\n    private readonly symbol: string | null;\n    private readonly count: number;\n    private readonly level: NotificationLevel;\n    private readonly muted: boolean;\n    private readonly knocked: boolean;\n    private readonly isInvitation: boolean;\n\n    public constructor(state: INotificationStateSnapshotParams) {\n        this.symbol = state.symbol;\n        this.count = state.count;\n        this.level = state.level;\n        this.muted = state.muted;\n        this.knocked = state.knocked;\n        this.isInvitation = state.invited;\n    }\n\n    public isDifferentFrom(other: INotificationStateSnapshotParams): boolean {\n        const before = {\n            count: this.count,\n            symbol: this.symbol,\n            level: this.level,\n            muted: this.muted,\n            knocked: this.knocked,\n            is: this.isInvitation,\n        };\n        const after = {\n            count: other.count,\n            symbol: other.symbol,\n            level: other.level,\n            muted: other.muted,\n            knocked: other.knocked,\n        };\n        return JSON.stringify(before) !== JSON.stringify(after);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020-2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { NotificationLevel } from \"./NotificationLevel\";\nimport { arrayDiff } from \"../../utils/arrays\";\nimport { type RoomNotificationState } from \"./RoomNotificationState\";\nimport { NotificationState, NotificationStateEvents } from \"./NotificationState\";\n\nexport type FetchRoomFn = (room: Room) => RoomNotificationState;\n\nexport class ListNotificationState extends NotificationState {\n    private rooms: Room[] = [];\n    private states: { [roomId: string]: RoomNotificationState } = {};\n\n    public constructor(\n        private byTileCount = false,\n        private getRoomFn: FetchRoomFn,\n    ) {\n        super();\n    }\n\n    public get symbol(): string | null {\n        return this._level === NotificationLevel.Unsent ? \"!\" : null;\n    }\n\n    public setRooms(rooms: Room[]): void {\n        // If we're only concerned about the tile count, don't bother setting up listeners.\n        if (this.byTileCount) {\n            this.rooms = rooms;\n            this.calculateTotalState();\n            return;\n        }\n\n        const oldRooms = this.rooms;\n        const diff = arrayDiff(oldRooms, rooms);\n        this.rooms = [...rooms];\n        for (const oldRoom of diff.removed) {\n            const state = this.states[oldRoom.roomId];\n            if (!state) continue; // We likely just didn't have a badge (race condition)\n            delete this.states[oldRoom.roomId];\n            state.off(NotificationStateEvents.Update, this.onRoomNotificationStateUpdate);\n        }\n        for (const newRoom of diff.added) {\n            const state = this.getRoomFn(newRoom);\n            state.on(NotificationStateEvents.Update, this.onRoomNotificationStateUpdate);\n            this.states[newRoom.roomId] = state;\n        }\n\n        this.calculateTotalState();\n    }\n\n    public getForRoom(room: Room): RoomNotificationState {\n        const state = this.states[room.roomId];\n        if (!state) throw new Error(\"Unknown room for notification state\");\n        return state;\n    }\n\n    public destroy(): void {\n        super.destroy();\n        for (const state of Object.values(this.states)) {\n            state.off(NotificationStateEvents.Update, this.onRoomNotificationStateUpdate);\n        }\n        this.states = {};\n    }\n\n    private onRoomNotificationStateUpdate = (): void => {\n        this.calculateTotalState();\n    };\n\n    private calculateTotalState(): void {\n        const snapshot = this.snapshot();\n\n        if (this.byTileCount) {\n            this._level = NotificationLevel.Highlight;\n            this._count = this.rooms.length;\n        } else {\n            this._count = 0;\n            this._level = NotificationLevel.None;\n            for (const state of Object.values(this.states)) {\n                this._count += state.count;\n                this._level = Math.max(this.level, state.level);\n            }\n        }\n\n        // finally, publish an update if needed\n        this.emitIfUpdated(snapshot);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020-2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { MatrixEventEvent, RoomEvent, ClientEvent } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport type { Room, MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport type { IDestroyable } from \"../../utils/IDestroyable\";\nimport { MatrixClientPeg } from \"../../MatrixClientPeg\";\nimport { readReceiptChangeIsFor } from \"../../utils/read-receipts\";\nimport * as RoomNotifs from \"../../RoomNotifs\";\nimport { NotificationState } from \"./NotificationState\";\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport { MARKED_UNREAD_TYPE_STABLE, MARKED_UNREAD_TYPE_UNSTABLE } from \"../../utils/notifications\";\nimport { NotificationLevel } from \"./NotificationLevel\";\n\nexport class RoomNotificationState extends NotificationState implements IDestroyable {\n    public constructor(\n        public readonly room: Room,\n        private includeThreads: boolean,\n    ) {\n        super();\n        const cli = this.room.client;\n        this.room.on(RoomEvent.Receipt, this.handleReadReceipt);\n        this.room.on(RoomEvent.MyMembership, this.handleMembershipUpdate);\n        this.room.on(RoomEvent.LocalEchoUpdated, this.handleLocalEchoUpdated);\n        this.room.on(RoomEvent.Timeline, this.handleRoomEventUpdate);\n        this.room.on(RoomEvent.Redaction, this.handleRoomEventUpdate);\n        this.room.on(RoomEvent.AccountData, this.handleRoomAccountDataUpdate);\n\n        this.room.on(RoomEvent.UnreadNotifications, this.handleNotificationCountUpdate); // for server-sent counts\n        cli.on(MatrixEventEvent.Decrypted, this.onEventDecrypted);\n        cli.on(ClientEvent.AccountData, this.handleAccountDataUpdate);\n        this.updateNotificationState();\n    }\n\n    public destroy(): void {\n        super.destroy();\n        const cli = this.room.client;\n        this.room.removeListener(RoomEvent.Receipt, this.handleReadReceipt);\n        this.room.removeListener(RoomEvent.MyMembership, this.handleMembershipUpdate);\n        this.room.removeListener(RoomEvent.LocalEchoUpdated, this.handleLocalEchoUpdated);\n        this.room.removeListener(RoomEvent.Timeline, this.handleRoomEventUpdate);\n        this.room.removeListener(RoomEvent.Redaction, this.handleRoomEventUpdate);\n        this.room.removeListener(RoomEvent.AccountData, this.handleRoomAccountDataUpdate);\n        cli.removeListener(MatrixEventEvent.Decrypted, this.onEventDecrypted);\n        cli.removeListener(ClientEvent.AccountData, this.handleAccountDataUpdate);\n    }\n\n    /**\n     * True if the notification is a mention.\n     */\n    public get isMention(): boolean {\n        if (this.invited || this.knocked) return false;\n\n        return this.level === NotificationLevel.Highlight;\n    }\n\n    /**\n     * True if the notification is an unsent message.\n     */\n    public get isUnsentMessage(): boolean {\n        return this.level === NotificationLevel.Unsent;\n    }\n\n    /**\n     * Activity notifications are the lowest level of notification (except none and muted)\n     */\n    public get isActivityNotification(): boolean {\n        return this.level === NotificationLevel.Activity;\n    }\n\n    /**\n     * This is the case for notifications with a level:\n     * - is a knock\n     * - greater Activity\n     * - equal Activity and feature_hidebold is disabled.\n     */\n    public get hasAnyNotificationOrActivity(): boolean {\n        if (this.knocked) return true;\n\n        // If the feature_hidebold is enabled, we don't want to show activity notifications\n        const hideBold = SettingsStore.getValue(\"feature_hidebold\");\n        if (!hideBold && this.level === NotificationLevel.Activity) return true;\n\n        return this.level >= NotificationLevel.Notification;\n    }\n\n    /**\n     * True if the notification is a NotificationLevel.Notification.\n     */\n    public get isNotification(): boolean {\n        return this.level === NotificationLevel.Notification;\n    }\n\n    private handleLocalEchoUpdated = (): void => {\n        this.updateNotificationState();\n    };\n\n    private handleReadReceipt = (event: MatrixEvent, room: Room): void => {\n        if (!readReceiptChangeIsFor(event, MatrixClientPeg.safeGet())) return; // not our own - ignore\n        if (room.roomId !== this.room.roomId) return; // not for us - ignore\n        this.updateNotificationState();\n    };\n\n    private handleMembershipUpdate = (): void => {\n        this.updateNotificationState();\n    };\n\n    private handleNotificationCountUpdate = (): void => {\n        this.updateNotificationState();\n    };\n\n    private onEventDecrypted = (event: MatrixEvent): void => {\n        if (event.getRoomId() !== this.room.roomId) return; // ignore - not for us or notifications timeline\n\n        this.updateNotificationState();\n    };\n\n    private handleRoomEventUpdate = (event: MatrixEvent): void => {\n        if (event?.getRoomId() !== this.room.roomId) return; // ignore - not for us or notifications timeline\n        this.updateNotificationState();\n    };\n\n    private handleAccountDataUpdate = (ev: MatrixEvent): void => {\n        if (ev.getType() === \"m.push_rules\") {\n            this.updateNotificationState();\n        }\n    };\n\n    private handleRoomAccountDataUpdate = (ev: MatrixEvent): void => {\n        if ([MARKED_UNREAD_TYPE_STABLE, MARKED_UNREAD_TYPE_UNSTABLE].includes(ev.getType())) {\n            this.updateNotificationState();\n        }\n    };\n\n    private updateNotificationState(): void {\n        const snapshot = this.snapshot();\n        const { level, symbol, count, invited } = RoomNotifs.determineUnreadState(\n            this.room,\n            undefined,\n            this.includeThreads,\n        );\n        const muted =\n            RoomNotifs.getRoomNotifsState(this.room.client, this.room.roomId) === RoomNotifs.RoomNotifState.Mute;\n        const knocked =\n            SettingsStore.getValue(\"feature_ask_to_join\") && this.room.getMyMembership() === KnownMembership.Knock;\n        this._level = level;\n        this._symbol = symbol;\n        this._count = count;\n        this._muted = muted;\n        this._knocked = knocked;\n        this._invited = invited;\n\n        // finally, publish an update if needed\n        this.emitIfUpdated(snapshot);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { NotificationLevel } from \"./NotificationLevel\";\nimport { NotificationState } from \"./NotificationState\";\n\n/**\n * Summarizes a number of states into a unique snapshot. To populate, call\n * the add() function with the notification states to be included.\n *\n * Useful for community notification counts, global notification counts, etc.\n */\nexport class SummarizedNotificationState extends NotificationState {\n    private totalStatesWithUnread = 0;\n\n    public constructor() {\n        super();\n        this._symbol = null;\n        this._count = 0;\n        this._level = NotificationLevel.None;\n    }\n\n    public get numUnreadStates(): number {\n        return this.totalStatesWithUnread;\n    }\n\n    /**\n     * Append a notification state to this snapshot, taking the loudest NotificationColor\n     * of the two. By default this will not adopt the symbol of the other notification\n     * state to prevent the count from being lost in typical usage.\n     * @param other The other notification state to append.\n     * @param includeSymbol If true, the notification state's symbol will be taken if one\n     * is present.\n     */\n    public add(other: NotificationState, includeSymbol = false): void {\n        if (other.symbol && includeSymbol) {\n            this._symbol = other.symbol;\n        }\n        if (other.count) {\n            this._count += other.count;\n        }\n        if (other.level > this.level) {\n            this._level = other.level;\n        }\n        if (other.hasUnreadCount) {\n            this.totalStatesWithUnread++;\n        }\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020-2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room, ClientEvent, SyncState, type EmptyObject } from \"matrix-js-sdk/src/matrix\";\n\nimport { type ActionPayload } from \"../../dispatcher/payloads\";\nimport { AsyncStoreWithClient } from \"../AsyncStoreWithClient\";\nimport defaultDispatcher, { type MatrixDispatcher } from \"../../dispatcher/dispatcher\";\nimport { DefaultTagID, type TagID } from \"../room-list-v3/skip-list/tag\";\nimport { type FetchRoomFn, ListNotificationState } from \"./ListNotificationState\";\nimport { RoomNotificationState } from \"./RoomNotificationState\";\nimport { SummarizedNotificationState } from \"./SummarizedNotificationState\";\nimport { isRoomVisible } from \"../room-list-v3/isRoomVisible\";\nimport { PosthogAnalytics } from \"../../PosthogAnalytics\";\nimport SettingsStore from \"../../settings/SettingsStore\";\n\nexport const UPDATE_STATUS_INDICATOR = Symbol(\"update-status-indicator\");\n\nexport class RoomNotificationStateStore extends AsyncStoreWithClient<EmptyObject> {\n    private static readonly internalInstance = (() => {\n        const instance = new RoomNotificationStateStore();\n        instance.start();\n        return instance;\n    })();\n    private roomMap = new Map<Room, RoomNotificationState>();\n\n    private listMap = new Map<TagID, ListNotificationState>();\n    private _globalState = new SummarizedNotificationState();\n\n    private constructor(dispatcher = defaultDispatcher) {\n        super(dispatcher, {});\n        SettingsStore.watchSetting(\"feature_dynamic_room_predecessors\", null, () => {\n            // We pass SyncState.Syncing here to \"simulate\" a sync happening.\n            // The code that receives these events actually doesn't care\n            // what state we pass, except that it behaves differently if we\n            // pass SyncState.Error.\n            this.emitUpdateIfStateChanged(SyncState.Syncing, false);\n        });\n    }\n\n    /**\n     * @internal Public for test only\n     */\n    public static testInstance(dispatcher: MatrixDispatcher): RoomNotificationStateStore {\n        return new RoomNotificationStateStore();\n    }\n\n    /**\n     * Gets a snapshot of notification state for all visible rooms. The number of states recorded\n     * on the SummarizedNotificationState is equivalent to rooms.\n     */\n    public get globalState(): SummarizedNotificationState {\n        return this._globalState;\n    }\n\n    /**\n     * Gets an instance of the list state class for the given tag.\n     * @param tagId The tag to get the notification state for.\n     * @returns The notification state for the tag.\n     */\n    public getListState(tagId: TagID): ListNotificationState {\n        if (this.listMap.has(tagId)) {\n            return this.listMap.get(tagId)!;\n        }\n\n        // TODO: Update if/when invites move out of the room list.\n        const useTileCount = tagId === DefaultTagID.Invite;\n        const getRoomFn: FetchRoomFn = (room: Room) => {\n            return this.getRoomState(room);\n        };\n        const state = new ListNotificationState(useTileCount, getRoomFn);\n        this.listMap.set(tagId, state);\n        return state;\n    }\n\n    /**\n     * Gets a copy of the notification state for a room. The consumer should not\n     * attempt to destroy the returned state as it may be shared with other\n     * consumers.\n     * @param room The room to get the notification state for.\n     * @returns The room's notification state.\n     */\n    public getRoomState(room: Room): RoomNotificationState {\n        if (!this.roomMap.has(room)) {\n            this.roomMap.set(room, new RoomNotificationState(room, false));\n        }\n        return this.roomMap.get(room)!;\n    }\n\n    public static get instance(): RoomNotificationStateStore {\n        return RoomNotificationStateStore.internalInstance;\n    }\n\n    private onSync = (state: SyncState, prevState: SyncState | null): void => {\n        this.emitUpdateIfStateChanged(state, state !== prevState);\n    };\n\n    /**\n     * If the SummarizedNotificationState of this room has changed, or forceEmit\n     * is true, emit an UPDATE_STATUS_INDICATOR event.\n     *\n     * @internal public for test\n     */\n    public emitUpdateIfStateChanged = (state: SyncState, forceEmit: boolean): void => {\n        if (!this.matrixClient) return;\n        // Only count visible rooms to not torment the user with notification counts in rooms they can't see.\n        // This will include highlights from the previous version of the room internally\n        const msc3946ProcessDynamicPredecessor = SettingsStore.getValue(\"feature_dynamic_room_predecessors\");\n        const globalState = new SummarizedNotificationState();\n        const visibleRooms = this.matrixClient.getVisibleRooms(msc3946ProcessDynamicPredecessor);\n\n        let numFavourites = 0;\n        for (const room of visibleRooms) {\n            if (isRoomVisible(room)) {\n                globalState.add(this.getRoomState(room));\n\n                if (room.tags[DefaultTagID.Favourite] && !room.getType()) numFavourites++;\n            }\n        }\n\n        PosthogAnalytics.instance.setProperty(\"numFavouriteRooms\", numFavourites);\n\n        if (\n            this.globalState.symbol !== globalState.symbol ||\n            this.globalState.count !== globalState.count ||\n            this.globalState.level !== globalState.level ||\n            this.globalState.numUnreadStates !== globalState.numUnreadStates ||\n            forceEmit\n        ) {\n            this._globalState = globalState;\n            this.emit(UPDATE_STATUS_INDICATOR, globalState, state);\n        }\n    };\n\n    protected async onReady(): Promise<void> {\n        this.matrixClient?.on(ClientEvent.Sync, this.onSync);\n    }\n\n    protected async onNotReady(): Promise<any> {\n        this.matrixClient?.off(ClientEvent.Sync, this.onSync);\n        for (const roomState of this.roomMap.values()) {\n            roomState.destroy();\n        }\n    }\n\n    // We don't need this, but our contract says we do.\n    protected async onAction(payload: ActionPayload): Promise<void> {}\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, type Room, type RoomMember, type User } from \"matrix-js-sdk/src/matrix\";\nimport { type VerificationRequest } from \"matrix-js-sdk/src/crypto-api\";\n\nimport { type RightPanelPhases } from \"./RightPanelStorePhases\";\n\nexport interface IRightPanelCardState {\n    member?: RoomMember | User;\n    verificationRequest?: VerificationRequest;\n    verificationRequestPromise?: Promise<VerificationRequest>;\n    widgetId?: string;\n    // Room3pidMemberInfo, Space3pidMemberInfo,\n    memberInfoEvent?: MatrixEvent;\n    // threads\n    threadHeadEvent?: MatrixEvent;\n    initialEvent?: MatrixEvent;\n    isInitialEventHighlighted?: boolean;\n    initialEventScrollIntoView?: boolean;\n    // room summary\n    focusRoomSearch?: boolean;\n}\n\nexport interface IRightPanelCardStateStored {\n    memberId?: string;\n    // we do not store the things associated with verification\n    widgetId?: string;\n    // 3pidMemberInfo\n    memberInfoEventId?: string;\n    // threads\n    threadHeadEventId?: string;\n    initialEventId?: string;\n    isInitialEventHighlighted?: boolean;\n    initialEventScrollIntoView?: boolean;\n}\n\nexport interface IRightPanelCard {\n    phase: RightPanelPhases | null;\n    state?: IRightPanelCardState;\n}\n\nexport interface IRightPanelCardStored {\n    phase: RightPanelPhases | null;\n    state?: IRightPanelCardStateStored;\n}\n\nexport interface IRightPanelForRoom {\n    isOpen: boolean;\n    history: Array<IRightPanelCard>;\n}\n\nexport type IRightPanelForRoomStored = {\n    isOpen: boolean;\n    history: Array<IRightPanelCardStored>;\n};\n\nexport function convertToStorePanel(cacheRoom?: IRightPanelForRoom): IRightPanelForRoomStored | null {\n    if (!cacheRoom) return null;\n    const storeHistory = [...cacheRoom.history].map((panelState) => convertCardToStore(panelState));\n    return { isOpen: cacheRoom.isOpen, history: storeHistory };\n}\n\nexport function convertToStatePanel(storeRoom: IRightPanelForRoomStored | null, room: Room): IRightPanelForRoom | null {\n    if (!storeRoom) return storeRoom;\n    const stateHistory = [...storeRoom.history].map((panelStateStore) => convertStoreToCard(panelStateStore, room));\n    return { history: stateHistory, isOpen: storeRoom.isOpen };\n}\n\nexport function convertCardToStore(panelState: IRightPanelCard): IRightPanelCardStored {\n    const state = panelState.state ?? {};\n    const stateStored: IRightPanelCardStateStored = {\n        widgetId: state.widgetId,\n        isInitialEventHighlighted: state.isInitialEventHighlighted,\n        initialEventScrollIntoView: state.initialEventScrollIntoView,\n        threadHeadEventId: !!state?.threadHeadEvent?.getId() ? state.threadHeadEvent.getId() : undefined,\n        memberInfoEventId: !!state?.memberInfoEvent?.getId() ? state.memberInfoEvent.getId() : undefined,\n        initialEventId: !!state?.initialEvent?.getId() ? state.initialEvent.getId() : undefined,\n        memberId: !!state?.member?.userId ? state.member.userId : undefined,\n    };\n\n    return { state: stateStored, phase: panelState.phase };\n}\n\nfunction convertStoreToCard(panelStateStore: IRightPanelCardStored, room: Room): IRightPanelCard {\n    const stateStored = panelStateStore.state ?? {};\n    const state: IRightPanelCardState = {\n        widgetId: stateStored.widgetId,\n        isInitialEventHighlighted: stateStored.isInitialEventHighlighted,\n        initialEventScrollIntoView: stateStored.initialEventScrollIntoView,\n        threadHeadEvent: !!stateStored?.threadHeadEventId\n            ? room.findEventById(stateStored.threadHeadEventId)\n            : undefined,\n        memberInfoEvent: !!stateStored?.memberInfoEventId\n            ? room.findEventById(stateStored.memberInfoEventId)\n            : undefined,\n        initialEvent: !!stateStored?.initialEventId ? room.findEventById(stateStored.initialEventId) : undefined,\n        member: (!!stateStored?.memberId && room.getMember(stateStored.memberId)) || undefined,\n    };\n\n    return { state: state, phase: panelStateStore.phase };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { CryptoEvent } from \"matrix-js-sdk/src/crypto-api\";\n\nimport defaultDispatcher from \"../../dispatcher/dispatcher\";\nimport { pendingVerificationRequestForUser } from \"../../verification\";\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport { RightPanelPhases } from \"./RightPanelStorePhases\";\nimport { SettingLevel } from \"../../settings/SettingLevel\";\nimport { UPDATE_EVENT } from \"../AsyncStore\";\nimport { ReadyWatchingStore } from \"../ReadyWatchingStore\";\nimport {\n    convertToStatePanel,\n    convertToStorePanel,\n    type IRightPanelCard,\n    type IRightPanelCardState,\n    type IRightPanelForRoom,\n} from \"./RightPanelStoreIPanelState\";\nimport { type ActionPayload } from \"../../dispatcher/payloads\";\nimport { Action } from \"../../dispatcher/actions\";\nimport { type ActiveRoomChangedPayload } from \"../../dispatcher/payloads/ActiveRoomChangedPayload\";\nimport { SDKContextClass } from \"../../contexts/SDKContextClass\";\nimport { MatrixClientPeg } from \"../../MatrixClientPeg\";\n\n/**\n * @see RightPanelStore#generateHistoryForPhase\n */\nfunction getPhasesForPhase(phase: IRightPanelCard[\"phase\"]): RightPanelPhases[] {\n    switch (phase) {\n        case RightPanelPhases.ThreadPanel:\n        case RightPanelPhases.MemberList:\n        case RightPanelPhases.PinnedMessages:\n            return [RightPanelPhases.RoomSummary];\n        case RightPanelPhases.MemberInfo:\n        case RightPanelPhases.ThreePidMemberInfo:\n            return [RightPanelPhases.RoomSummary, RightPanelPhases.MemberList];\n        default:\n            return [];\n    }\n}\n\n/**\n * A class for tracking the state of the right panel between layouts and\n * sessions. This state includes a history for each room. Each history element\n * contains the phase (e.g. RightPanelPhase.RoomMemberInfo) and the state (e.g.\n * the member) associated with it.\n */\nexport default class RightPanelStore extends ReadyWatchingStore {\n    private static internalInstance: RightPanelStore;\n\n    private global?: IRightPanelForRoom;\n    private byRoom: { [roomId: string]: IRightPanelForRoom } = {};\n    private viewedRoomId: string | null = null;\n\n    private constructor() {\n        super(defaultDispatcher);\n        this.reset();\n    }\n\n    /**\n     * Resets the store. Intended for test usage only.\n     */\n    public reset(): void {\n        this.global = undefined;\n        this.byRoom = {};\n        this.viewedRoomId = null;\n    }\n\n    protected async onReady(): Promise<any> {\n        this.viewedRoomId = SDKContextClass.instance.roomViewStore.getRoomId();\n        this.matrixClient?.on(CryptoEvent.VerificationRequestReceived, this.onVerificationRequestUpdate);\n        this.loadCacheFromSettings();\n        this.emitAndUpdateSettings();\n    }\n\n    protected async onNotReady(): Promise<any> {\n        this.matrixClient?.off(CryptoEvent.VerificationRequestReceived, this.onVerificationRequestUpdate);\n    }\n\n    protected onDispatcherAction(payload: ActionPayload): void {\n        switch (payload.action) {\n            case Action.ActiveRoomChanged: {\n                const changePayload = <ActiveRoomChangedPayload>payload;\n                this.handleViewedRoomChange(changePayload.oldRoomId, changePayload.newRoomId);\n                break;\n            }\n\n            case Action.FocusMessageSearch: {\n                if (this.currentCard.phase !== RightPanelPhases.RoomSummary) {\n                    this.setCard({ phase: RightPanelPhases.RoomSummary, state: { focusRoomSearch: true } });\n                }\n                this.show(null);\n            }\n        }\n    }\n\n    // Getters\n    /**\n     * If you are calling this from a component that already knows about a\n     * specific room from props / state, then it's best to prefer\n     * `isOpenForRoom` below to ensure all your data is for a single room\n     * during room changes.\n     */\n    public get isOpen(): boolean {\n        return this.byRoom[this.viewedRoomId ?? \"\"]?.isOpen ?? false;\n    }\n\n    public isOpenForRoom(roomId: string): boolean {\n        return this.byRoom[roomId]?.isOpen ?? false;\n    }\n\n    public get roomPhaseHistory(): Array<IRightPanelCard> {\n        return this.byRoom[this.viewedRoomId ?? \"\"]?.history ?? [];\n    }\n\n    /**\n     * If you are calling this from a component that already knows about a\n     * specific room from props / state, then it's best to prefer\n     * `currentCardForRoom` below to ensure all your data is for a single room\n     * during room changes.\n     */\n    public get currentCard(): IRightPanelCard {\n        const hist = this.roomPhaseHistory;\n        if (hist.length >= 1) {\n            return hist[hist.length - 1];\n        }\n        return { state: {}, phase: null };\n    }\n\n    public currentCardForRoom(roomId: string): IRightPanelCard {\n        const hist = this.byRoom[roomId]?.history ?? [];\n        if (hist.length > 0) {\n            return hist[hist.length - 1];\n        }\n        return { state: {}, phase: null };\n    }\n\n    public get previousCard(): IRightPanelCard {\n        const hist = this.roomPhaseHistory;\n        if (hist?.length >= 2) {\n            return hist[hist.length - 2];\n        }\n        return { state: {}, phase: null };\n    }\n\n    /**\n     * This function behaves as following:\n     * - If the same phase is sent along with a non-empty state, only the state is updated and history is retained.\n     * - If the provided phase is different to the current phase:\n     *     - Existing history is thrown away.\n     *     - New card is added along with a different history, see {@link generateHistoryForPhase}\n     *\n     * If the right panel was set, this function also shows the right panel.\n     */\n    public setCard(card: IRightPanelCard, allowClose = true, roomId?: string): void {\n        const rId = roomId ?? this.viewedRoomId ?? \"\";\n        const redirect = this.getVerificationRedirect(card);\n        const targetPhase = redirect?.phase ?? card.phase;\n        const cardState = redirect?.state ?? (Object.keys(card.state ?? {}).length === 0 ? undefined : card.state);\n\n        // Checks for wrong SetRightPanelPhase requests\n        if (!this.isPhaseValid(targetPhase, Boolean(rId))) return;\n\n        if (targetPhase === this.currentCardForRoom(rId)?.phase && !!cardState) {\n            // Update state: set right panel with a new state but keep the phase (don't know it this is ever needed...)\n            const hist = this.byRoom[rId]?.history ?? [];\n            hist[hist.length - 1].state = cardState;\n            this.emitAndUpdateSettings();\n        } else if (targetPhase !== this.currentCardForRoom(rId)?.phase || !this.byRoom[rId]) {\n            // Set right panel and initialize/erase history\n            const history = this.generateHistoryForPhase(targetPhase!, cardState ?? {});\n            this.byRoom[rId] = { history, isOpen: true };\n            this.emitAndUpdateSettings();\n        } else {\n            this.show(rId);\n            this.emitAndUpdateSettings();\n        }\n    }\n\n    public setCards(cards: IRightPanelCard[], allowClose = true, roomId: string | null = null): void {\n        // This function sets the history of the right panel and shows the right panel if not already visible.\n        const rId = roomId ?? this.viewedRoomId ?? \"\";\n        const history = cards.map((c) => ({ phase: c.phase, state: c.state ?? {} }));\n        this.byRoom[rId] = { history, isOpen: true };\n        this.show(rId);\n        this.emitAndUpdateSettings();\n    }\n\n    // Appends a card to the history and shows the right panel if not already visible\n    public pushCard(card: IRightPanelCard, allowClose = true, roomId: string | null = null): void {\n        const rId = roomId ?? this.viewedRoomId ?? \"\";\n        const redirect = this.getVerificationRedirect(card);\n        const targetPhase = redirect?.phase ?? card.phase;\n        const pState = redirect?.state ?? card.state ?? {};\n\n        // Checks for wrong SetRightPanelPhase requests\n        if (!this.isPhaseValid(targetPhase, Boolean(rId))) return;\n\n        const roomCache = this.byRoom[rId];\n        if (!!roomCache) {\n            // append new phase\n            roomCache.history.push({ state: pState, phase: targetPhase });\n            roomCache.isOpen = allowClose ? roomCache.isOpen : true;\n        } else {\n            // setup room panel cache with the new card\n            this.byRoom[rId] = {\n                history: [{ phase: targetPhase, state: pState }],\n                // if there was no right panel store object the the panel was closed -> keep it closed, except if allowClose==false\n                isOpen: !allowClose,\n            };\n        }\n        this.show(rId);\n        this.emitAndUpdateSettings();\n    }\n\n    public popCard(roomId: string | null = null): IRightPanelCard | undefined {\n        const rId = roomId ?? this.viewedRoomId ?? \"\";\n        if (!this.byRoom[rId]) return;\n\n        const removedCard = this.byRoom[rId].history.pop();\n        this.emitAndUpdateSettings();\n        return removedCard;\n    }\n\n    public togglePanel(roomId: string | null): void {\n        const rId = roomId ?? this.viewedRoomId ?? \"\";\n        if (!this.byRoom[rId]) return;\n\n        this.byRoom[rId].isOpen = !this.byRoom[rId].isOpen;\n        this.emitAndUpdateSettings();\n    }\n\n    public show(roomId: string | null): void {\n        if (!this.isOpenForRoom(roomId ?? this.viewedRoomId ?? \"\")) {\n            this.togglePanel(roomId);\n        }\n    }\n\n    public hide(roomId: string | null): void {\n        if (this.isOpenForRoom(roomId ?? this.viewedRoomId ?? \"\")) {\n            this.togglePanel(roomId);\n        }\n    }\n\n    /**\n     * Helper to show a right panel phase.\n     * If the UI is already showing that phase, the right panel will be hidden.\n     *\n     * Calling the same phase twice with a different state will update the current\n     * phase and push the old state in the right panel history.\n     * @param phase The right panel phase.\n     * @param cardState The state within the phase.\n     */\n    public showOrHidePhase(phase: RightPanelPhases, cardState?: Partial<IRightPanelCardState>): void {\n        if (this.currentCard.phase === phase && !cardState && this.isOpen) {\n            this.togglePanel(null);\n        } else {\n            this.setCard({ phase, state: cardState });\n            if (!this.isOpen) this.togglePanel(null);\n        }\n    }\n\n    /**\n     * For a given phase, generates card history such that it looks\n     * similar to how an user typically would reach said phase in the app.\n     * eg: User would usually reach the memberlist via room-info panel, so\n     * that history is added.\n     */\n    private generateHistoryForPhase(\n        phase: IRightPanelCard[\"phase\"],\n        cardState?: Partial<IRightPanelCardState>,\n    ): IRightPanelCard[] {\n        const card = { phase, state: cardState };\n        if (!this.isCardStateValid(card)) {\n            /**\n             * If the card we're adding is not valid, then we just return\n             * an empty history.\n             * This is to avoid a scenario where, for eg, you set a member info\n             * card with invalid card state (no member) but the member list is\n             * shown since the created history is valid except for the last card.\n             */\n            return [];\n        }\n        const cards = getPhasesForPhase(phase).map((p) => ({ phase: p, state: {} }));\n        return [...cards, card];\n    }\n\n    private loadCacheFromSettings(): void {\n        if (this.viewedRoomId) {\n            const room = this.mxClient?.getRoom(this.viewedRoomId);\n            if (!!room) {\n                this.global =\n                    this.global ??\n                    convertToStatePanel(SettingsStore.getValue(\"RightPanel.phasesGlobal\"), room) ??\n                    undefined;\n                this.byRoom[this.viewedRoomId] =\n                    this.byRoom[this.viewedRoomId] ??\n                    convertToStatePanel(SettingsStore.getValue(\"RightPanel.phases\", this.viewedRoomId), room) ??\n                    undefined;\n            } else {\n                logger.warn(\n                    \"Could not restore the right panel after load because there was no associated room object.\",\n                );\n            }\n        }\n    }\n\n    private emitAndUpdateSettings(): void {\n        this.filterValidCards(this.global);\n        const storePanelGlobal = convertToStorePanel(this.global);\n        SettingsStore.setValue(\"RightPanel.phasesGlobal\", null, SettingLevel.DEVICE, storePanelGlobal);\n\n        if (!!this.viewedRoomId) {\n            const panelThisRoom = this.byRoom[this.viewedRoomId];\n            this.filterValidCards(panelThisRoom);\n            const storePanelThisRoom = convertToStorePanel(panelThisRoom);\n            SettingsStore.setValue(\n                \"RightPanel.phases\",\n                this.viewedRoomId,\n                SettingLevel.ROOM_DEVICE,\n                storePanelThisRoom,\n            );\n        }\n        this.emit(UPDATE_EVENT, null);\n    }\n\n    private filterValidCards(rightPanelForRoom?: IRightPanelForRoom): void {\n        if (!rightPanelForRoom?.history) return;\n        rightPanelForRoom.history = rightPanelForRoom.history.filter((card) => this.isCardStateValid(card));\n        if (!rightPanelForRoom.history.length) {\n            rightPanelForRoom.isOpen = false;\n        }\n    }\n\n    private isCardStateValid(card: IRightPanelCard): boolean {\n        // this function does a sanity check on the card. this is required because\n        // some phases require specific state properties that might not be available.\n        // This can be caused on if element is reloaded and the tries to reload right panel data from id's stored in the local storage.\n        // we store id's of users and matrix events. If are not yet fetched on reload the right panel cannot display them.\n        // or potentially other errors.\n        // (A nicer fix could be to indicate, that the right panel is loading if there is missing state data and re-emit if the data is available)\n        switch (card.phase) {\n            case RightPanelPhases.ThreadView:\n                if (!card.state?.threadHeadEvent) {\n                    logger.warn(\"removed card from right panel because of missing threadHeadEvent in card state\");\n                }\n                return !!card.state?.threadHeadEvent;\n            case RightPanelPhases.MemberInfo:\n            case RightPanelPhases.EncryptionPanel:\n                if (!card.state?.member) {\n                    logger.warn(\"removed card from right panel because of missing member in card state\");\n                }\n                return !!card.state?.member;\n            case RightPanelPhases.ThreePidMemberInfo:\n                if (!card.state?.memberInfoEvent) {\n                    logger.warn(\"removed card from right panel because of missing memberInfoEvent in card state\");\n                }\n                return !!card.state?.memberInfoEvent;\n            case RightPanelPhases.Widget:\n                if (!card.state?.widgetId) {\n                    logger.warn(\"removed card from right panel because of missing widgetId in card state\");\n                }\n                return !!card.state?.widgetId;\n        }\n        return true;\n    }\n\n    private getVerificationRedirect(card: IRightPanelCard): IRightPanelCard | null {\n        if (card.phase === RightPanelPhases.MemberInfo && card.state) {\n            // RightPanelPhases.RoomMemberInfo -> needs to be changed to RightPanelPhases.EncryptionPanel if there is a pending verification request\n            const { member } = card.state;\n            const pendingRequest = member\n                ? pendingVerificationRequestForUser(MatrixClientPeg.safeGet(), member)\n                : undefined;\n            if (pendingRequest) {\n                return {\n                    phase: RightPanelPhases.EncryptionPanel,\n                    state: {\n                        verificationRequest: pendingRequest,\n                        member,\n                    },\n                };\n            }\n        }\n        return null;\n    }\n\n    private isPhaseValid(targetPhase: RightPanelPhases | null, isViewingRoom: boolean): boolean {\n        if (!targetPhase || !RightPanelPhases[targetPhase]) {\n            logger.warn(`Tried to switch right panel to unknown phase: ${targetPhase}`);\n            return false;\n        }\n        if (!isViewingRoom) {\n            logger.warn(\n                `Tried to switch right panel to a room phase: ${targetPhase}, ` +\n                    `but we are currently not viewing a room`,\n            );\n            return false;\n        }\n        return true;\n    }\n\n    private onVerificationRequestUpdate = (): void => {\n        if (!this.currentCard?.state) return;\n        const { member } = this.currentCard.state;\n        if (!member) return;\n        const pendingRequest = pendingVerificationRequestForUser(MatrixClientPeg.safeGet(), member);\n        if (pendingRequest) {\n            this.currentCard.state.verificationRequest = pendingRequest;\n            this.emitAndUpdateSettings();\n        }\n    };\n\n    private handleViewedRoomChange(oldRoomId: string | null, newRoomId: string | null): void {\n        if (!this.mxClient) return; // not ready, onReady will handle the first room\n        this.viewedRoomId = newRoomId;\n        // load values from byRoomCache with the viewedRoomId.\n        this.loadCacheFromSettings();\n\n        // when we're switching to a room, clear out any stale MemberInfo cards\n        // in order to fix https://github.com/vector-im/element-web/issues/21487\n        if (this.currentCard?.phase !== RightPanelPhases.EncryptionPanel) {\n            const panel = this.byRoom[this.viewedRoomId ?? \"\"];\n            if (panel?.history) {\n                panel.history = panel.history.filter(\n                    (card: IRightPanelCard) =>\n                        card.phase != RightPanelPhases.MemberInfo && card.phase != RightPanelPhases.ThreePidMemberInfo,\n                );\n            }\n        }\n        // when we're switching to a room, clear out thread permalinks to not get you stuck in the middle of the thread\n        // in order to fix https://github.com/matrix-org/matrix-react-sdk/pull/11011\n        if (this.currentCard?.phase === RightPanelPhases.ThreadView && this.currentCard.state) {\n            this.currentCard.state.initialEvent = undefined;\n            this.currentCard.state.isInitialEventHighlighted = undefined;\n            this.currentCard.state.initialEventScrollIntoView = undefined;\n        }\n\n        this.emitAndUpdateSettings();\n    }\n\n    public static get instance(): RightPanelStore {\n        if (!this.internalInstance) {\n            this.internalInstance = new RightPanelStore();\n            this.internalInstance.start();\n        }\n        return this.internalInstance;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { _t } from \"../../languageHandler\";\n\n// These are in their own file because of circular imports being a problem.\nexport enum RightPanelPhases {\n    // Room & Space stuff\n    MemberList = \"MemberList\",\n    MemberInfo = \"MemberInfo\",\n    ThreePidMemberInfo = \"ThreePidMemberInfo\",\n\n    // Room stuff\n    FilePanel = \"FilePanel\",\n    NotificationPanel = \"NotificationPanel\",\n    EncryptionPanel = \"EncryptionPanel\",\n    RoomSummary = \"RoomSummary\",\n    Widget = \"Widget\",\n    PinnedMessages = \"PinnedMessages\",\n    Timeline = \"Timeline\",\n    Extensions = \"Extensions\",\n\n    // Thread stuff\n    ThreadView = \"ThreadView\",\n    ThreadPanel = \"ThreadPanel\",\n}\n\nexport function backLabelForPhase(phase: RightPanelPhases | null): string | null {\n    switch (phase) {\n        case RightPanelPhases.ThreadPanel:\n            return _t(\"common|threads\");\n        case RightPanelPhases.Timeline:\n            return _t(\"chat_card_back_action_label\");\n        case RightPanelPhases.RoomSummary:\n            return _t(\"room_summary_card_back_action_label\");\n        case RightPanelPhases.MemberList:\n            return _t(\"member_list_back_action_label\");\n        case RightPanelPhases.ThreadView:\n            return _t(\"thread_view_back_action_label\");\n    }\n    return null;\n}\n","/*\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport type { Sorter, SortingAlgorithm } from \".\";\nimport { getLastTimestamp } from \"./utils/getLastTimestamp\";\n\nexport abstract class BaseRecencySorter implements Sorter {\n    public constructor(protected myUserId: string) {}\n\n    public sort(rooms: Room[]): Room[] {\n        const tsCache: { [roomId: string]: number } = {};\n        return [...rooms].sort((a, b) => this.comparator(a, b, tsCache));\n    }\n\n    public comparator(roomA: Room, roomB: Room, cache?: any): number {\n        // First check if any of the rooms are special cases\n        const exceptionalOrdering = this.getScore(roomA) - this.getScore(roomB);\n        if (exceptionalOrdering !== 0) return exceptionalOrdering;\n\n        // Then check recency; recent rooms should be at the top\n        const roomALastTs = this.getTs(roomA, cache);\n        const roomBLastTs = this.getTs(roomB, cache);\n        return roomBLastTs - roomALastTs;\n    }\n\n    private getTs(room: Room, cache?: { [roomId: string]: number }): number {\n        const ts = cache?.[room.roomId] ?? getLastTimestamp(room, this.myUserId);\n        if (cache) {\n            cache[room.roomId] = ts;\n        }\n        return ts;\n    }\n\n    public abstract get type(): SortingAlgorithm;\n\n    /**\n     * Rooms are sorted based on:\n     * - the score of the room\n     * - the timestamp of the last message in that room\n     *\n     * The score takes precedence over the timestamp of the last message. This allows\n     * some rooms to be sorted before/after others regardless of when the last message\n     * was received in that room. Eg: muted rooms can be placed at the bottom of the list\n     * even if they received messages recently.\n     */\n    protected abstract getScore(room: Room): number;\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport { type Sorter, SortingAlgorithm } from \".\";\nimport { RoomNotificationStateStore } from \"../../../notifications/RoomNotificationStateStore\";\nimport { BaseRecencySorter } from \"./BaseRecencySorter\";\nimport { DefaultTagID } from \"../tag\";\n\nexport class RecencySorter extends BaseRecencySorter implements Sorter {\n    public get type(): SortingAlgorithm.Recency {\n        return SortingAlgorithm.Recency;\n    }\n\n    /**\n     * This sorter mostly sorts rooms by recency but there are two exceptions:\n     * 1. Muted rooms are sorted to the bottom of the list.\n     * 2. Low priority rooms are sorted to the bottom of the list but before muted rooms.\n     *\n     * The following method provides a numerical value that takes care of this\n     * exceptional ordering. For two rooms A and B, it works as follows:\n     * - If getScore(A) - getScore(B) > 0, A should come after B\n     * - If getScore(A) - getScore(B) < 0, A should come before B\n     * - If getScore(A) - getScore(B) = 0, no special ordering needed, just use recency\n     */\n    protected getScore(room: Room): number {\n        const isLowPriority = !!room.tags[DefaultTagID.LowPriority];\n        const isMuted = RoomNotificationStateStore.instance.getRoomState(room).muted;\n        // These constants are chosen so that the following order is maintained:\n        // Low priority rooms -> Low priority and muted rooms -> Muted rooms\n        if (isMuted && isLowPriority) return 5;\n        else if (isMuted) return 10;\n        else if (isLowPriority) return 2;\n        else return 0;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport { type Sorter, SortingAlgorithm } from \".\";\n\nexport class AlphabeticSorter implements Sorter {\n    private readonly collator = new Intl.Collator();\n\n    public sort(rooms: Room[]): Room[] {\n        return [...rooms].sort((a, b) => {\n            return this.comparator(a, b);\n        });\n    }\n\n    public comparator(roomA: Room, roomB: Room): number {\n        return this.collator.compare(roomA.name, roomB.name);\n    }\n\n    public get type(): SortingAlgorithm.Alphabetic {\n        return SortingAlgorithm.Alphabetic;\n    }\n}\n","/*\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { KnownMembership, RoomType, type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { type Sorter, SortingAlgorithm } from \".\";\nimport { RoomNotificationStateStore } from \"../../../notifications/RoomNotificationStateStore\";\nimport { CallStore } from \"../../../CallStore\";\nimport { getMarkedUnreadState } from \"../../../../utils/notifications\";\nimport { BaseRecencySorter } from \"./BaseRecencySorter\";\nimport { DefaultTagID } from \"../tag\";\n\n/**\n * Similar to RecencySorter but with the following special order:\n * Invites -> Calls (new and ongoing) -> Mentions (@) -> Count ([1])/ Marked as unread -> Activity (dot) -> None -> Low Priority -> Mute\n */\nexport class UnreadSorter extends BaseRecencySorter implements Sorter {\n    public get type(): SortingAlgorithm.Unread {\n        return SortingAlgorithm.Unread;\n    }\n\n    protected getScore(room: Room): number {\n        // Invites first\n        if (room.getMyMembership() === KnownMembership.Invite) return 100;\n\n        // Then rooms that have calls (but not video rooms)\n        const roomType = room.getType();\n        const isVideoRoom = roomType === RoomType.UnstableCall || roomType === RoomType.ElementVideo;\n        if (!isVideoRoom && !!CallStore.instance.getCall(room.roomId)) return 101;\n\n        const roomNotificationState = RoomNotificationStateStore.instance.getRoomState(room);\n        // Then mentions\n        if (roomNotificationState.isMention) return 102;\n\n        // Then rooms that have a count or was marked as unread\n        if (roomNotificationState.hasUnreadCount || !!getMarkedUnreadState(room)) return 103;\n\n        // Then rooms that have a dot\n        if (roomNotificationState.isActivityNotification) return 104;\n\n        // Then all other non special rooms, see last return\n\n        // Then low priority rooms\n        if (!!room.tags[DefaultTagID.LowPriority]) return 106;\n\n        // Muted rooms at the bottom\n        if (roomNotificationState.muted) return 107;\n\n        return 105;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport type { Filter, FilterKey } from \"./filters\";\nimport { SDKContextClass } from \"../../../contexts/SDKContextClass.ts\";\n\n/**\n * Room skip list stores room nodes.\n * These hold the actual room object and provides references to other nodes\n * in different levels.\n */\nexport class RoomNode {\n    private _isInActiveSpace: boolean = false;\n\n    public constructor(public readonly room: Room) {}\n\n    /**\n     * This array holds references to the next node in a given level.\n     * eg: next[i] gives the next room node from this room node in level i.\n     */\n    public next: RoomNode[] = [];\n\n    /**\n     * This array holds references to the previous node in a given level.\n     * eg: previous[i] gives the previous room node from this room node in level i.\n     */\n    public previous: RoomNode[] = [];\n\n    /**\n     * Whether the room associated with this room node belongs to\n     * the currently active space.\n     * @see {@link SpaceStore#activeSpace} to understand what active\n     * space means.\n     */\n    public get isInActiveSpace(): boolean {\n        return this._isInActiveSpace;\n    }\n\n    /**\n     * Check if this room belongs to the active space and store the result\n     * in {@link RoomNode#isInActiveSpace}.\n     */\n    public checkIfRoomBelongsToActiveSpace(): void {\n        const activeSpace = SDKContextClass.instance.spaceStore.activeSpace;\n        this._isInActiveSpace = SDKContextClass.instance.spaceStore.isRoomInSpace(activeSpace, this.room.roomId);\n    }\n\n    /**\n     * Aggregates all the filter keys that apply to this room.\n     * eg: if filterKeysSet.has(Filter.FavouriteFilter) is true, then this room is a favourite room.\n     */\n    private filterKeysSet: Set<FilterKey> = new Set();\n\n    /**\n     * Returns true if the associated room matches all the provided filters.\n     * Returns false otherwise.\n     * @param filterKeys An array of filter keys to check against.\n     */\n    public doesRoomMatchFilters(filterKeys: FilterKey[]): boolean {\n        return !filterKeys.some((key) => !this.filterKeysSet.has(key));\n    }\n\n    /**\n     * Populates {@link RoomNode#filterKeysSet} by checking if the associated room\n     * satisfies the given filters.\n     * @param filters A list of filters\n     */\n    public applyFilters(filters: Filter[]): void {\n        this.filterKeysSet = new Set();\n        for (const filter of filters) {\n            if (filter.matches(this.room)) this.filterKeysSet.add(filter.key);\n        }\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport function shouldPromote(): boolean {\n    return Math.random() < 0.5;\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { RoomNode } from \"./RoomNode\";\nimport { shouldPromote } from \"./utils\";\n\n/**\n * Represents one level of the skip list\n */\nexport class Level {\n    public head?: RoomNode;\n    private current?: RoomNode;\n    private _size: number = 0;\n\n    /**\n     * The number of elements in this level\n     */\n    public get size(): number {\n        return this._size;\n    }\n\n    public constructor(public readonly level: number) {}\n\n    /**\n     * Insert node after current\n     */\n    public setNext(node: RoomNode): void {\n        if (!this.head) this.head = node;\n        if (!this.current) {\n            this.current = node;\n        } else {\n            node.previous[this.level] = this.current;\n            this.current.next[this.level] = node;\n            this.current = node;\n        }\n        this._size++;\n    }\n\n    /**\n     * Iterate through the elements in this level and create\n     * a new level above this level by probabilistically determining\n     * whether a given element must be promoted to the new level.\n     */\n    public generateNextLevel(): Level {\n        const nextLevelSentinel = new Level(this.level + 1);\n        let current = this.head;\n        while (current) {\n            if (shouldPromote()) {\n                nextLevelSentinel.setNext(current);\n            }\n            current = current.next[this.level];\n        }\n        return nextLevelSentinel;\n    }\n\n    /**\n     * Removes a given node from this level.\n     * Does nothing if the given node is not present in this level.\n     */\n    public removeNode(node: RoomNode): void {\n        // Let's first see if this node is even in this level\n        const nodeInThisLevel = this.head === node || node.previous[this.level];\n        if (!nodeInThisLevel) {\n            // This node is not in this sentinel level, so nothing to do.\n            return;\n        }\n        const prev = node.previous[this.level];\n        if (prev) {\n            const nextNode = node.next[this.level];\n            prev.next[this.level] = nextNode;\n            if (nextNode) nextNode.previous[this.level] = prev;\n        } else {\n            // This node was the head since it has no back links!\n            // so update the head.\n            const next = node.next[this.level];\n            this.head = next;\n            if (next) next.previous[this.level] = node.previous[this.level];\n        }\n        this._size--;\n    }\n\n    /**\n     * Put newNode after node in this level. No checks are done to ensure\n     * that node is actually present in this level.\n     */\n    public insertAfter(node: RoomNode, newNode: RoomNode): void {\n        const level = this.level;\n        const nextNode = node.next[level];\n        if (nextNode) {\n            newNode.next[level] = nextNode;\n            nextNode.previous[level] = newNode;\n        }\n        node.next[level] = newNode;\n        newNode.previous[level] = node;\n        this._size++;\n    }\n\n    /**\n     *  Insert a given node at the head of this level.\n     */\n    public insertAtHead(newNode: RoomNode): void {\n        const existingNode = this.head;\n        this.head = newNode;\n        if (existingNode) {\n            newNode.next[this.level] = existingNode;\n            existingNode.previous[this.level] = newNode;\n        }\n        this._size++;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport type { RoomNode } from \"./RoomNode\";\nimport type { FilterKey } from \"./filters\";\n\nexport class SortedRoomIterator implements Iterator<Room> {\n    public constructor(private current: RoomNode) {}\n\n    public next(): IteratorResult<Room> {\n        const current = this.current;\n        if (!current) return { value: undefined, done: true };\n        this.current = current.next[0];\n        return {\n            value: current.room,\n        };\n    }\n}\n\nexport class SortedSpaceFilteredIterator implements Iterator<Room> {\n    public constructor(\n        private current: RoomNode,\n        private readonly filters: FilterKey[],\n    ) {}\n\n    public [Symbol.iterator](): SortedSpaceFilteredIterator {\n        return this;\n    }\n\n    public next(): IteratorResult<Room> {\n        let current = this.current;\n        while (current) {\n            if (current.isInActiveSpace && current.doesRoomMatchFilters(this.filters)) break;\n            current = current.next[0];\n        }\n        if (!current) return { value: undefined, done: true };\n        this.current = current.next[0];\n        return {\n            value: current.room,\n        };\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport type { Sorter, SortingAlgorithm } from \"./sorters\";\nimport type { Filter, FilterKey } from \"./filters\";\nimport { RoomNode } from \"./RoomNode\";\nimport { shouldPromote } from \"./utils\";\nimport { Level } from \"./Level\";\nimport { SortedRoomIterator, SortedSpaceFilteredIterator } from \"./iterators\";\n\n/**\n * Implements a skip list that stores rooms using a given sorting algorithm.\n * See See https://en.wikipedia.org/wiki/Skip_list\n */\nexport class RoomSkipList implements Iterable<Room> {\n    private levels: Level[] = [new Level(0)];\n    private roomNodeMap: Map<string, RoomNode> = new Map();\n    public initialized: boolean = false;\n\n    public constructor(\n        private sorter: Sorter,\n        private filters: Filter[] = [],\n    ) {}\n\n    private reset(): void {\n        this.levels = [new Level(0)];\n        this.roomNodeMap = new Map();\n    }\n\n    /**\n     * Seed the list with an initial list of rooms.\n     */\n    public seed(rooms: Room[]): void {\n        // 1. First sort the rooms and create a base sorted linked list\n        const sortedRoomNodes = this.sorter.sort(rooms).map((room) => new RoomNode(room));\n        let currentLevel = this.levels[0];\n        for (const node of sortedRoomNodes) {\n            node.applyFilters(this.filters);\n            currentLevel.setNext(node);\n            this.roomNodeMap.set(node.room.roomId, node);\n        }\n\n        // 2. Create the rest of the sub linked lists\n        do {\n            this.levels[currentLevel.level] = currentLevel;\n            currentLevel = currentLevel.generateNextLevel();\n        } while (currentLevel.size > 1);\n\n        // 3. Go through the list of rooms and mark nodes in active space\n        this.calculateActiveSpaceForNodes();\n\n        this.initialized = true;\n    }\n\n    /**\n     * Go through all the room nodes and check if they belong to the active space.\n     */\n    public calculateActiveSpaceForNodes(): void {\n        for (const node of this.roomNodeMap.values()) {\n            node.checkIfRoomBelongsToActiveSpace();\n        }\n    }\n\n    /**\n     * Change the sorting algorithm used by the skip list.\n     * This will reset the list and will rebuild from scratch.\n     */\n    public useNewSorter(sorter: Sorter, rooms: Room[]): void {\n        this.reset();\n        this.sorter = sorter;\n        this.seed(rooms);\n    }\n\n    /**\n     * Change the filters used by the skip list.\n     * This will apply the new filters to all existing nodes.\n     */\n    public useNewFilters(filters: Filter[]): void {\n        this.filters = filters;\n        for (const node of this.roomNodeMap.values()) {\n            node.applyFilters(this.filters);\n        }\n    }\n\n    /**\n     * Removes a given room from the skip list.\n     */\n    public removeRoom(room: Room): void {\n        const existingNode = this.roomNodeMap.get(room.roomId);\n        this.roomNodeMap.delete(room.roomId);\n        if (existingNode) {\n            for (const level of this.levels) {\n                level.removeNode(existingNode);\n            }\n        }\n    }\n\n    /**\n     * Re-inserts a room that is already in the skiplist.\n     * This method does nothing if the room isn't already in the skiplist.\n     * @param room the room to add\n     */\n    public reInsertRoom(room: Room): void {\n        if (!this.roomNodeMap.has(room.roomId)) {\n            return;\n        }\n        this.removeRoom(room);\n        this.addNewRoom(room);\n    }\n\n    /**\n     * Adds a new room to the skiplist.\n     * This method will throw an error if the room is already in the skiplist.\n     * @param room the room to add\n     */\n    public addNewRoom(room: Room): void {\n        if (this.roomNodeMap.has(room.roomId)) {\n            throw new Error(`Can't add room to skiplist: ${room.roomId} is already in the skiplist!`);\n        }\n        this.insertRoom(room);\n    }\n\n    /**\n     * Adds a given room to the correct sorted position in the list.\n     */\n    private insertRoom(room: Room): void {\n        const newNode = new RoomNode(room);\n        newNode.checkIfRoomBelongsToActiveSpace();\n        newNode.applyFilters(this.filters);\n        this.roomNodeMap.set(room.roomId, newNode);\n\n        /**\n         * This array tracks where the new node must be inserted in a\n         * given level.\n         * The index is the level and the value represents where the\n         * insertion must happen.\n         * If the value is null, it simply means that we need to insert\n         * at the head.\n         * If the value is a RoomNode, simply insert after this node.\n         */\n        const insertionNodes: (RoomNode | null)[] = [];\n\n        /**\n         * Now we'll do the actual work of finding where to insert this\n         * node.\n         *\n         * We start at the top most level and move downwards ...\n         */\n        for (let j = this.levels.length - 1; j >= 0; --j) {\n            const level = this.levels[j];\n\n            /**\n             * If the head is undefined, that means this level is empty.\n             * So mark it as such in insertionNodes and skip over this\n             * level.\n             */\n            if (!level.head) {\n                insertionNodes[j] = null;\n                continue;\n            }\n\n            /**\n             * So there's actually some nodes in this level ...\n             * All we need to do is find the node that is smaller or\n             * equal to the node that we wish to insert.\n             */\n            let current = level.head;\n            let previous: RoomNode | null = null;\n            while (current) {\n                if (this.sorter.comparator(current.room, room) < 0) {\n                    previous = current;\n                    current = current.next[j];\n                } else break;\n            }\n\n            /**\n             * previous will now be null if there's no node in this level\n             * smaller than the node we wish to insert or it will be a\n             * RoomNode.\n             * This is exactly what we need to track in insertionNodes!\n             */\n            insertionNodes[j] = previous;\n        }\n\n        /**\n         * We're done with difficult part, now we just need to do the\n         * actual node insertion.\n         */\n        for (const [level, node] of insertionNodes.entries()) {\n            /**\n             * Whether our new node should be present in a level\n             * is decided by coin toss.\n             */\n            if (level === 0 || shouldPromote()) {\n                const levelObj = this.levels[level];\n                if (node) levelObj.insertAfter(node, newNode);\n                else levelObj.insertAtHead(newNode);\n            } else {\n                break;\n            }\n        }\n    }\n\n    public [Symbol.iterator](): SortedRoomIterator {\n        return new SortedRoomIterator(this.levels[0].head!);\n    }\n\n    /**\n     * Returns an iterator that can be used to generate a list of sorted rooms that belong\n     * to the currently active space. Passing filterKeys will further filter the list such\n     * that only rooms that match the filters are returned.\n     *\n     * @example To get an array of rooms:\n     * Array.from(RLS.getRoomsInActiveSpace());\n     *\n     * @example Use a for ... of loop to iterate over rooms:\n     * for(const room of RLS.getRoomsInActiveSpace()) { something(room); }\n     *\n     * @example Additional filtering:\n     * Array.from(RLS.getRoomsInActiveSpace([FilterKeys.Favourite]));\n     */\n    public getRoomsInActiveSpace(filterKeys: FilterKey[] = []): SortedSpaceFilteredIterator {\n        return new SortedSpaceFilteredIterator(this.levels[0].head!, filterKeys);\n    }\n\n    /**\n     * The number of rooms currently in the skip list.\n     */\n    public get size(): number {\n        return this.levels[0].size;\n    }\n\n    /**\n     * The currently active sorting algorithm.\n     */\n    public get activeSortAlgorithm(): SortingAlgorithm {\n        return this.sorter.type;\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { type Filter, FilterEnum } from \".\";\n\nexport class ExcludeTagsFilter implements Filter {\n    public constructor(private readonly tags: string[]) {}\n\n    public matches(room: Room): boolean {\n        return !this.tags.some((tag) => room.tags[tag]);\n    }\n\n    public get key(): FilterEnum.ExcludeTagsFilter {\n        return FilterEnum.ExcludeTagsFilter;\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { type Filter } from \".\";\n\nexport class TagFilter implements Filter {\n    public constructor(private readonly tag: string) {}\n\n    public matches(room: Room): boolean {\n        return !!room.tags[this.tag];\n    }\n\n    public get key(): string {\n        return this.tag;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { EventType } from \"matrix-js-sdk/src/matrix\";\n\nimport type { EmptyObject, Room } from \"matrix-js-sdk/src/matrix\";\nimport type { MatrixDispatcher } from \"../../dispatcher/dispatcher\";\nimport type { ActionPayload } from \"../../dispatcher/payloads\";\nimport type { Filter, FilterKey } from \"./skip-list/filters\";\nimport { AsyncStoreWithClient } from \"../AsyncStoreWithClient\";\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport defaultDispatcher from \"../../dispatcher/dispatcher\";\nimport { RecencySorter } from \"./skip-list/sorters/RecencySorter\";\nimport { AlphabeticSorter } from \"./skip-list/sorters/AlphabeticSorter\";\nimport { readReceiptChangeIsFor } from \"../../utils/read-receipts\";\nimport { EffectiveMembership, getEffectiveMembership, getEffectiveMembershipTag } from \"../../utils/membership\";\nimport { type SpaceKey, UPDATE_HOME_BEHAVIOUR, UPDATE_SELECTED_SPACE } from \"../spaces\";\nimport { FavouriteFilter } from \"./skip-list/filters/FavouriteFilter\";\nimport { UnreadFilter } from \"./skip-list/filters/UnreadFilter\";\nimport { PeopleFilter } from \"./skip-list/filters/PeopleFilter\";\nimport { RoomsFilter } from \"./skip-list/filters/RoomsFilter\";\nimport { InvitesFilter } from \"./skip-list/filters/InvitesFilter\";\nimport { MentionsFilter } from \"./skip-list/filters/MentionsFilter\";\nimport { LowPriorityFilter } from \"./skip-list/filters/LowPriorityFilter\";\nimport { type Sorter, SortingAlgorithm } from \"./skip-list/sorters\";\nimport { SettingLevel } from \"../../settings/SettingLevel\";\nimport { MARKED_UNREAD_TYPE_STABLE, MARKED_UNREAD_TYPE_UNSTABLE } from \"../../utils/notifications\";\nimport { Action } from \"../../dispatcher/actions\";\nimport { UnreadSorter } from \"./skip-list/sorters/UnreadSorter\";\nimport { getChangedOverrideRoomMutePushRules } from \"./utils\";\nimport { isRoomVisible } from \"./isRoomVisible\";\nimport { RoomSkipList } from \"./skip-list/RoomSkipList\";\nimport { getTagsForRoom } from \"../../utils/room/getTagsForRoom\";\nimport { ExcludeTagsFilter } from \"./skip-list/filters/ExcludeTagsFilter\";\nimport { TagFilter } from \"./skip-list/filters/TagFilter\";\nimport { filterBoolean } from \"../../utils/arrays\";\nimport {\n    CHATS_TAG,\n    createSection,\n    deleteSection,\n    editSection,\n    getOrderedReorderableSections,\n    reorderSection,\n} from \"./section\";\nimport { DefaultTagID, type TagID } from \"./skip-list/tag\";\nimport { SDKContextClass } from \"../../contexts/SDKContextClass.ts\";\n\n/**\n * These are the filters passed to the room skip list.\n */\nconst FILTERS = [\n    new FavouriteFilter(),\n    new UnreadFilter(),\n    new PeopleFilter(),\n    new RoomsFilter(),\n    new InvitesFilter(),\n    new MentionsFilter(),\n    new LowPriorityFilter(),\n];\n\nexport enum RoomListStoreV3Event {\n    // The event/channel which is called when the room lists have been changed.\n    ListsUpdate = \"lists_update\",\n    // The event which is called when the room list is loaded.\n    ListsLoaded = \"lists_loaded\",\n    /** Fired when a new section is created in the room list. */\n    SectionCreated = \"section_created\",\n    /** Fired when a room's tags change. */\n    RoomTagged = \"room_tagged\",\n}\n\n// The result object for returning rooms from the store\nexport type RoomsResult = {\n    // The ID of the active space queried\n    spaceId: SpaceKey;\n    // The filter queried\n    filterKeys?: FilterKey[];\n    // The resulting list of rooms\n    sections: Section[];\n};\n\n/**\n * Represents a named section of rooms in the room list, identified by a tag.\n */\nexport interface Section {\n    /** The tag that identifies this section. */\n    tag: string;\n    /** The ordered list of rooms belonging to this section. */\n    rooms: Room[];\n}\n\nexport const LISTS_UPDATE_EVENT = RoomListStoreV3Event.ListsUpdate;\nexport const LISTS_LOADED_EVENT = RoomListStoreV3Event.ListsLoaded;\nexport const SECTION_CREATED_EVENT = RoomListStoreV3Event.SectionCreated;\nexport const ROOM_TAGGED_EVENT = RoomListStoreV3Event.RoomTagged;\n\n/**\n * This store allows for fast retrieval of the room list in a sorted and filtered manner.\n * This is the third such implementation hence the \"V3\".\n * This store is being actively developed so expect the methods to change in future.\n */\nexport class RoomListStoreV3Class extends AsyncStoreWithClient<EmptyObject> {\n    /**\n     * Contains all the rooms in the active space\n     */\n    private roomSkipList?: RoomSkipList;\n\n    /**\n     * Maps section tags to their corresponding tag filters, used to determine which rooms belong in which sections.\n     */\n    private readonly filterByTag: Map<string, Filter> = new Map();\n\n    /**\n     * Defines the display order of sections.\n     */\n    private sortedTags: string[] = [];\n\n    private readonly msc3946ProcessDynamicPredecessor: boolean;\n\n    /**\n     * Whether a batched LISTS_UPDATE_EVENT emission is pending.\n     * Used by {@link scheduleEmit} to coalesce rapid-fire updates into a single emit per frame.\n     */\n    private pendingEmit = false;\n\n    public constructor(dispatcher: MatrixDispatcher) {\n        super(dispatcher);\n        this.msc3946ProcessDynamicPredecessor = SettingsStore.getValue(\"feature_dynamic_room_predecessors\");\n        SDKContextClass.instance.spaceStore.on(UPDATE_SELECTED_SPACE, () => {\n            this.onActiveSpaceChanged();\n        });\n        SDKContextClass.instance.spaceStore.on(UPDATE_HOME_BEHAVIOUR, () => this.onActiveSpaceChanged());\n        SettingsStore.watchSetting(\"RoomList.OrderedCustomSections\", null, () => this.onOrderedCustomSectionsChange());\n        this.loadCustomSections();\n\n        SettingsStore.watchSetting(\"RoomList.showSections\", null, () => this.scheduleEmit());\n    }\n\n    /**\n     * Get a list of unsorted, unfiltered rooms.\n     */\n    public getRooms(): Room[] {\n        let rooms = this.matrixClient?.getVisibleRooms(this.msc3946ProcessDynamicPredecessor) ?? [];\n        rooms = rooms.filter((r) => isRoomVisible(r));\n        return rooms;\n    }\n\n    /**\n     * Check whether the initial list of rooms has loaded.\n     */\n    public get isLoadingRooms(): boolean {\n        return !this.roomSkipList?.initialized;\n    }\n\n    /**\n     * Get a list of sorted rooms.\n     */\n    public getSortedRooms(): Room[] {\n        if (this.roomSkipList?.initialized) return Array.from(this.roomSkipList);\n        else return [];\n    }\n\n    /**\n     * Get a list of sorted rooms that belong to the currently active space.\n     * If filterKeys is passed, only the rooms that match the given filters are\n     * returned.\n\n     * @param filterKeys Optional array of filters that the rooms must match against.\n     */\n    public getSortedRoomsInActiveSpace(filterKeys?: FilterKey[]): RoomsResult {\n        const spaceId = SDKContextClass.instance.spaceStore.activeSpace;\n        const areSectionsEnabled = SettingsStore.getValue(\"RoomList.showSections\");\n\n        const sections = areSectionsEnabled\n            ? this.getSections(filterKeys)\n            : [{ tag: CHATS_TAG, rooms: Array.from(this.roomSkipList?.getRoomsInActiveSpace(filterKeys) ?? []) }];\n\n        return {\n            spaceId: spaceId,\n            filterKeys,\n            sections,\n        };\n    }\n\n    /**\n     * Get the rooms in the currently active space that are tagged with the given tag.\n     * @param tag The tag to filter the rooms by.\n     */\n    private getRoomsWithTagInActiveSpace(tag: TagID): Room[] {\n        return this.getSortedRoomsInActiveSpace()\n            .sections.flatMap((s) => s.rooms)\n            .filter((room) => getTagsForRoom(room).includes(tag));\n    }\n\n    /**\n     * Get the server notice rooms in the currently active space.\n     */\n    public getServerNoticeRooms(): Room[] {\n        return this.getRoomsWithTagInActiveSpace(DefaultTagID.ServerNotice);\n    }\n\n    /**\n     * Get the direct message (DM) rooms in the currently active space.\n     */\n    public getDmRooms(): Room[] {\n        return this.getRoomsWithTagInActiveSpace(DefaultTagID.DM);\n    }\n\n    /**\n     * Resort the list of rooms using a different algorithm.\n     * @param algorithm The sorting algorithm to use.\n     */\n    public resort(algorithm: SortingAlgorithm): void {\n        if (!this.roomSkipList) throw new Error(\"Cannot resort room list before skip list is created.\");\n        if (!this.matrixClient) throw new Error(\"Cannot resort room list without matrix client.\");\n        if (this.roomSkipList.activeSortAlgorithm === algorithm) return;\n        const sorter = this.getSorterFromSortingAlgorithm(algorithm, this.matrixClient.getSafeUserId());\n        this.roomSkipList.useNewSorter(sorter, this.getRooms());\n        this.emit(LISTS_UPDATE_EVENT);\n        SettingsStore.setValue(\"RoomList.preferredSorting\", null, SettingLevel.DEVICE, algorithm);\n    }\n\n    /**\n     * Currently active sorting algorithm if the store is ready or undefined otherwise.\n     */\n    public get activeSortAlgorithm(): SortingAlgorithm | undefined {\n        return this.roomSkipList?.activeSortAlgorithm;\n    }\n\n    protected async onReady(): Promise<any> {\n        if (this.roomSkipList?.initialized || !this.matrixClient) return;\n        const sorter = this.getPreferredSorter(this.matrixClient.getSafeUserId());\n\n        this.roomSkipList = new RoomSkipList(sorter, this.getSkipListFilters());\n\n        await SDKContextClass.instance.spaceStore.storeReadyPromise;\n        const rooms = this.getRooms();\n        this.roomSkipList.seed(rooms);\n        this.emit(LISTS_LOADED_EVENT);\n        this.emit(LISTS_UPDATE_EVENT);\n    }\n\n    protected async onNotReady(): Promise<void> {\n        this.roomSkipList = undefined;\n    }\n\n    protected async onAction(payload: ActionPayload): Promise<void> {\n        if (!this.matrixClient || !this.roomSkipList?.initialized) return;\n\n        /**\n         * For the kind of updates that we care about (represented by the cases below),\n         * we try to find the associated room and simply re-insert it into the\n         * skiplist. If the position of said room in the sorted list changed, re-inserting\n         * would put it in the correct place.\n         */\n        switch (payload.action) {\n            case \"MatrixActions.Room.receipt\": {\n                if (readReceiptChangeIsFor(payload.event, this.matrixClient)) {\n                    const room = payload.room;\n                    if (!room) {\n                        logger.warn(`Own read receipt was in unknown room ${room.roomId}`);\n                        return;\n                    }\n                    this.addRoomAndEmit(room);\n                }\n                break;\n            }\n\n            case \"MatrixActions.Room.tags\": {\n                const room = payload.room;\n                this.addRoomAndEmit(room);\n                this.emit(ROOM_TAGGED_EVENT);\n                break;\n            }\n\n            case \"MatrixActions.Room.accountData\": {\n                const eventType = payload.event_type;\n                if (eventType === MARKED_UNREAD_TYPE_STABLE || eventType === MARKED_UNREAD_TYPE_UNSTABLE) {\n                    const room = payload.room;\n                    this.addRoomAndEmit(room);\n                }\n                break;\n            }\n\n            case \"MatrixActions.Event.decrypted\": {\n                const roomId = payload.event.getRoomId();\n                if (!roomId) return;\n                const room = this.matrixClient.getRoom(roomId);\n                if (!room) {\n                    logger.warn(`Event ${payload.event.getId()} was decrypted in an unknown room ${roomId}`);\n                    return;\n                }\n                this.addRoomAndEmit(room);\n                break;\n            }\n\n            case \"MatrixActions.accountData\": {\n                this.handleAccountDataPayload(payload);\n                break;\n            }\n\n            case \"MatrixActions.Room.timeline\": {\n                // Ignore non-live events (backfill) and notification timeline set events (without a room)\n                if (!payload.isLiveEvent || !payload.isLiveUnfilteredRoomTimelineEvent || !payload.room) return;\n                this.addRoomAndEmit(payload.room);\n                break;\n            }\n\n            case \"MatrixActions.Room.myMembership\": {\n                const oldMembership = getEffectiveMembership(payload.oldMembership);\n                const newMembership = getEffectiveMembershipTag(payload.room, payload.membership);\n\n                // If the user is kicked, re-insert the room and do nothing more.\n                const ownUserId = this.matrixClient.getSafeUserId();\n                const isKicked = (payload.room as Room).getMember(ownUserId)?.isKicked();\n                if (isKicked) {\n                    this.addRoomAndEmit(payload.room);\n                    return;\n                }\n                // If the user has left this room, remove it from the skiplist.\n                if (\n                    (oldMembership === EffectiveMembership.Invite || oldMembership === EffectiveMembership.Join) &&\n                    newMembership === EffectiveMembership.Leave\n                ) {\n                    this.roomSkipList.removeRoom(payload.room);\n                    this.scheduleEmit();\n                    return;\n                }\n\n                // If we're joining an upgraded room, we'll want to make sure we don't proliferate\n                // the dead room in the list.\n                if (oldMembership !== EffectiveMembership.Join && newMembership === EffectiveMembership.Join) {\n                    const room: Room = payload.room;\n                    const roomUpgradeHistory = room.client.getRoomUpgradeHistory(\n                        room.roomId,\n                        true,\n                        this.msc3946ProcessDynamicPredecessor,\n                    );\n                    const predecessors = roomUpgradeHistory.slice(0, roomUpgradeHistory.indexOf(room));\n                    for (const predecessor of predecessors) {\n                        this.roomSkipList.removeRoom(predecessor);\n                    }\n                }\n\n                this.addRoomAndEmit(payload.room, oldMembership === EffectiveMembership.Leave);\n                break;\n            }\n\n            case Action.AfterForgetRoom: {\n                const room = payload.room;\n                this.roomSkipList.removeRoom(room);\n                this.scheduleEmit();\n                break;\n            }\n        }\n    }\n\n    /**\n     * This method deals with the two types of account data payloads that we care about.\n     */\n    private handleAccountDataPayload(payload: ActionPayload): void {\n        const eventType = payload.event_type;\n        let needsEmit = false;\n        switch (eventType) {\n            // When we're told about new DMs, insert the associated dm rooms.\n            case EventType.Direct: {\n                const dmMap = payload.event.getContent();\n                for (const userId of Object.keys(dmMap)) {\n                    const roomIds = dmMap[userId];\n                    for (const roomId of roomIds) {\n                        const room = this.matrixClient!.getRoom(roomId);\n                        if (!room) {\n                            logger.warn(`${roomId} was found in DMs but the room is not in the store`);\n                            continue;\n                        }\n                        this.roomSkipList?.reInsertRoom(room);\n                        needsEmit = true;\n                    }\n                }\n                break;\n            }\n            case EventType.PushRules: {\n                // When a room becomes muted/unmuted, re-insert that room.\n                const possibleMuteChangeRoomIds = getChangedOverrideRoomMutePushRules(payload);\n                if (!possibleMuteChangeRoomIds) return;\n                const rooms = possibleMuteChangeRoomIds\n                    .map((id) => this.matrixClient?.getRoom(id))\n                    .filter((room) => !!room);\n                for (const room of rooms) {\n                    this.roomSkipList?.reInsertRoom(room);\n                    needsEmit = true;\n                }\n                break;\n            }\n        }\n        if (needsEmit) this.scheduleEmit();\n    }\n\n    /**\n     * Create the correct sorter depending on the persisted user preference.\n     * @param myUserId The user-id of our user.\n     * @returns Sorter object that can be passed to the skip list.\n     */\n    private getPreferredSorter(myUserId: string): Sorter {\n        const preferred = SettingsStore.getValue(\"RoomList.preferredSorting\");\n        return this.getSorterFromSortingAlgorithm(preferred, myUserId);\n    }\n\n    /**\n     * Get a sorter instance from the sorting algorithm enum value.\n     * @param algorithm The sorting algorithm\n     * @param myUserId The user-id of the current user\n     * @returns the sorter instance\n     */\n    private getSorterFromSortingAlgorithm(algorithm: SortingAlgorithm, myUserId: string): Sorter {\n        switch (algorithm) {\n            case SortingAlgorithm.Alphabetic:\n                return new AlphabeticSorter();\n            case SortingAlgorithm.Recency:\n                return new RecencySorter(myUserId);\n            case SortingAlgorithm.Unread:\n                return new UnreadSorter(myUserId);\n            default:\n                logger.info(\n                    `RoomListStoreV3: There is no sorting implementation for algorithm ${algorithm}, defaulting to recency sorter`,\n                );\n                return new RecencySorter(myUserId);\n        }\n    }\n\n    /**\n     * Schedule a batched emission of LISTS_UPDATE_EVENT using requestAnimationFrame.\n     * Multiple calls within the same frame are coalesced into a single emit.\n     */\n    private scheduleEmit(): void {\n        if (!this.pendingEmit) {\n            this.pendingEmit = true;\n            requestAnimationFrame(() => {\n                this.pendingEmit = false;\n                this.emit(LISTS_UPDATE_EVENT);\n            });\n        }\n    }\n\n    /**\n     * Add a room to the skiplist and emit an update.\n     * @param room The room to add to the skiplist\n     * @param isNewRoom Set this to true if this a new room that the isn't already in the skiplist\n     */\n    private addRoomAndEmit(room: Room, isNewRoom = false): void {\n        if (!this.roomSkipList) throw new Error(\"roomSkipList hasn't been created yet!\");\n        if (isNewRoom) {\n            if (!isRoomVisible(room)) {\n                logger.info(\n                    `RoomListStoreV3: Refusing to add new room ${room.roomId} because isRoomVisible returned false.`,\n                );\n                return;\n            }\n            this.roomSkipList.addNewRoom(room);\n        } else {\n            this.roomSkipList.reInsertRoom(room);\n        }\n        this.scheduleEmit();\n    }\n\n    private onActiveSpaceChanged(): void {\n        if (!this.roomSkipList) return;\n        this.roomSkipList.calculateActiveSpaceForNodes();\n        this.scheduleEmit();\n    }\n\n    /**\n     * Get the list of filters to be used in the skip list, including the tag filters for sectioning.\n     */\n    private getSkipListFilters(): Filter[] {\n        const tagsToExclude = this.sortedTags.filter((tag) => tag !== CHATS_TAG);\n        const tagFilters = this.sortedTags.map((tag) =>\n            tag === CHATS_TAG ? new ExcludeTagsFilter(tagsToExclude) : new TagFilter(tag),\n        );\n        this.sortedTags.forEach((tag, index) => this.filterByTag.set(tag, tagFilters[index]));\n\n        return [...FILTERS, ...tagFilters];\n    }\n\n    /**\n     * Get the sections to display in the room list, based on the current active space and the provided filters.\n     * @param filterKeys - Optional array of filters that the rooms must match against to be included in the sections.\n     * @returns An array of sections\n     */\n    private getSections(filterKeys?: FilterKey[]): Section[] {\n        return this.sortedTags\n            .map((tag) => {\n                const filters = filterBoolean([this.filterByTag.get(tag)?.key, ...(filterKeys ?? [])]);\n\n                return {\n                    tag,\n                    rooms: Array.from(this.roomSkipList?.getRoomsInActiveSpace(filters) || []),\n                };\n            })\n            .filter((section) => !filterKeys || section.rooms.length > 0);\n    }\n\n    /**\n     * Handle changes to the order of custom sections.\n     * Reloads the custom sections, updates the skip list filters to reflect the new order and emits an update.\n     * Emit {@link LISTS_UPDATE_EVENT}.\n     */\n    private onOrderedCustomSectionsChange(): void {\n        this.loadCustomSections();\n        if (!this.roomSkipList) return;\n        this.roomSkipList.useNewFilters(this.getSkipListFilters());\n        this.scheduleEmit();\n    }\n\n    /**\n     * Create a new section.\n     * Emits {@link SECTION_CREATED_EVENT} if the section was successfully created.\n     */\n    public async createSection(): Promise<string | undefined> {\n        const tag = await createSection(SDKContextClass.instance.spaceStore.activeSpace);\n        if (!tag) return;\n        this.emit(SECTION_CREATED_EVENT, tag);\n        return tag;\n    }\n\n    /**\n     * Edit a section's name.\n     * @param tag The tag of the section to edit\n     */\n    public async editSection(tag: string): Promise<void> {\n        await editSection(tag);\n    }\n\n    /**\n     * Remove a section\n     * Emits {@link LISTS_UPDATE_EVENT} if the section was successfully removed.\n     * @param tag The tag of the section to remove\n     * @param isEmpty Whether the section is empty\n     */\n    public async removeSection(tag: string, isEmpty: boolean): Promise<void> {\n        await deleteSection(tag, isEmpty);\n        this.scheduleEmit();\n    }\n\n    /**\n     * Reorder custom sections by moving sourceTag to the position of targetTag.\n     * @param sourceTag The tag of the section to move\n     * @param targetTag The tag of the section to move to\n     */\n    public async reorderSection(sourceTag: string, targetTag: string): Promise<void> {\n        await reorderSection(sourceTag, targetTag);\n    }\n\n    /**\n     * Returns the ordered section tags.\n     */\n    public get orderedSectionTags(): string[] {\n        return this.sortedTags;\n    }\n\n    /**\n     * Load the custom sections from the settings store and update the sorted tags.\n     */\n    private loadCustomSections(): void {\n        // Favourite is pinned to the top and LowPriority to the bottom. Everything in between\n        // (custom sections + Chats) is user-reorderable.\n        const reorderable = getOrderedReorderableSections();\n        this.sortedTags = [DefaultTagID.Favourite, ...reorderable, DefaultTagID.LowPriority];\n    }\n}\n\nexport default class RoomListStoreV3 {\n    private static internalInstance: RoomListStoreV3Class;\n\n    public static get instance(): RoomListStoreV3Class {\n        if (!RoomListStoreV3.internalInstance) {\n            const instance = new RoomListStoreV3Class(defaultDispatcher);\n            instance.start();\n            RoomListStoreV3.internalInstance = instance;\n        }\n\n        return this.internalInstance;\n    }\n}\n\nwindow.getRoomListStoreV3 = () => RoomListStoreV3.instance;\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport { FilterEnum, type Filter } from \".\";\nimport { DefaultTagID } from \"../tag\";\n\nexport class FavouriteFilter implements Filter {\n    public matches(room: Room): boolean {\n        return !!room.tags[DefaultTagID.Favourite];\n    }\n\n    public get key(): FilterEnum.FavouriteFilter {\n        return FilterEnum.FavouriteFilter;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport { type Filter, FilterEnum } from \".\";\nimport { RoomNotificationStateStore } from \"../../../notifications/RoomNotificationStateStore\";\nimport { getMarkedUnreadState } from \"../../../../utils/notifications\";\n\nexport class UnreadFilter implements Filter {\n    public matches(room: Room): boolean {\n        return RoomNotificationStateStore.instance.getRoomState(room).hasUnreadCount || !!getMarkedUnreadState(room);\n    }\n\n    public get key(): FilterEnum.UnreadFilter {\n        return FilterEnum.UnreadFilter;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport { type Filter, FilterEnum } from \".\";\nimport DMRoomMap from \"../../../../utils/DMRoomMap\";\n\nexport class PeopleFilter implements Filter {\n    public matches(room: Room): boolean {\n        // Match rooms that are DMs\n        return !!DMRoomMap.shared().getUserIdForRoomId(room.roomId);\n    }\n\n    public get key(): FilterEnum.PeopleFilter {\n        return FilterEnum.PeopleFilter;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport { type Filter, FilterEnum } from \".\";\nimport DMRoomMap from \"../../../../utils/DMRoomMap\";\n\nexport class RoomsFilter implements Filter {\n    public matches(room: Room): boolean {\n        // This should filter rooms that are not DMs\n        return !DMRoomMap.shared().getUserIdForRoomId(room.roomId);\n    }\n\n    public get key(): FilterEnum.RoomsFilter {\n        return FilterEnum.RoomsFilter;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room, KnownMembership } from \"matrix-js-sdk/src/matrix\";\n\nimport { type Filter, FilterEnum } from \".\";\n\nexport class InvitesFilter implements Filter {\n    public matches(room: Room): boolean {\n        return room.getMyMembership() === KnownMembership.Invite;\n    }\n\n    public get key(): FilterEnum.InvitesFilter {\n        return FilterEnum.InvitesFilter;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport { type Filter, FilterEnum } from \".\";\nimport { RoomNotificationStateStore } from \"../../../notifications/RoomNotificationStateStore\";\n\nexport class MentionsFilter implements Filter {\n    public matches(room: Room): boolean {\n        return RoomNotificationStateStore.instance.getRoomState(room).isMention;\n    }\n\n    public get key(): FilterEnum.MentionsFilter {\n        return FilterEnum.MentionsFilter;\n    }\n}\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport { type Filter, FilterEnum } from \".\";\nimport { DefaultTagID } from \"../tag\";\n\nexport class LowPriorityFilter implements Filter {\n    public matches(room: Room): boolean {\n        return !!room.tags[DefaultTagID.LowPriority];\n    }\n\n    public get key(): FilterEnum.LowPriorityFilter {\n        return FilterEnum.LowPriorityFilter;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, EventType, type IPushRules } from \"matrix-js-sdk/src/matrix\";\n\nimport { type ActionPayload } from \"../../dispatcher/payloads\";\nimport { isRuleMaybeRoomMuteRule } from \"../../RoomNotifs\";\nimport { arrayDiff } from \"../../utils/arrays\";\n\n/**\n * Gets any changed push rules that are room specific overrides\n * that mute notifications\n * @param actionPayload\n * @returns {string[]} ruleIds of added or removed rules\n */\nexport const getChangedOverrideRoomMutePushRules = (actionPayload: ActionPayload): string[] | undefined => {\n    if (\n        actionPayload.action !== \"MatrixActions.accountData\" ||\n        actionPayload.event?.getType() !== EventType.PushRules\n    ) {\n        return undefined;\n    }\n    const event = actionPayload.event as MatrixEvent;\n    const prevEvent = actionPayload.previousEvent as MatrixEvent | undefined;\n\n    if (!event || !prevEvent) {\n        return undefined;\n    }\n\n    const roomPushRules = (event.getContent() as IPushRules)?.global?.override?.filter(isRuleMaybeRoomMuteRule);\n    const prevRoomPushRules = (prevEvent?.getContent() as IPushRules)?.global?.override?.filter(\n        isRuleMaybeRoomMuteRule,\n    );\n\n    const { added, removed } = arrayDiff(\n        prevRoomPushRules?.map((rule) => rule.rule_id) || [],\n        roomPushRules?.map((rule) => rule.rule_id) || [],\n    );\n\n    return [...added, ...removed];\n};\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { isLocalRoom } from \"../../utils/localRoom/isLocalRoom\";\nimport { RoomListCustomisations } from \"../../customisations/RoomList\";\n\n/**\n * Determines whether a room should be visible in the room list\n * @param room - The room to check for visibility\n */\nexport function isRoomVisible(room?: Room): boolean {\n    if (!room) return false;\n\n    // hide space rooms as they'll be shown in the SpacePanel\n    if (room.isSpaceRoom()) return false;\n\n    // local rooms shouldn't show up anywhere\n    if (isLocalRoom(room)) return false;\n\n    if (RoomListCustomisations.isRoomVisible) return RoomListCustomisations.isRoomVisible(room);\n\n    return true; // default\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport React, { useState, type JSX } from \"react\";\nimport { Flex } from \"@element-hq/web-shared-components\";\nimport { Form, Text } from \"@vector-im/compound-web\";\nimport classNames from \"classnames\";\n\nimport BaseDialog from \"./BaseDialog\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport { _t } from \"../../../languageHandler\";\n\ninterface CreateSectionDialogProps {\n    /**\n     * The name of the section being edited if defined. Otherwise, create a new section.\n     */\n    sectionToEdit?: string;\n\n    /**\n     * Callback called when the dialog is closed.\n     * @param shouldCreateSection Whether a section should be created or not. This will be false if the user cancels the dialog.\n     * @param sectionName The name of the section to create.\n     */\n    onFinished: (shouldCreateSection: boolean, sectionName: string) => void;\n}\n\n/**\n * Dialog shown to the user to create a new section in the room list.\n */\nexport function CreateSectionDialog({ onFinished, sectionToEdit }: CreateSectionDialogProps): JSX.Element {\n    const isEdition = Boolean(sectionToEdit);\n    const [value, setValue] = useState(sectionToEdit ?? \"\");\n    const isInvalid = Boolean(value.trim().length === 0);\n\n    return (\n        <BaseDialog\n            className={classNames(\"mx_CreateSectionDialog\", {\n                mx_CreateSectionDialog_edition: isEdition,\n            })}\n            onFinished={() => onFinished(false, value)}\n            title={isEdition ? _t(\"create_section_dialog|title_edition\") : _t(\"create_section_dialog|title\")}\n            hasCancel={true}\n        >\n            <Flex gap=\"var(--cpd-space-6x)\" direction=\"column\" className=\"mx_CreateSectionDialog_content\">\n                {!isEdition && (\n                    <Text as=\"span\" weight=\"medium\">\n                        {_t(\"create_section_dialog|description\")}\n                    </Text>\n                )}\n                <Form.Root\n                    className=\"mx_CreateSectionDialog_form\"\n                    onSubmit={(e) => {\n                        e.preventDefault();\n                        if (!isInvalid) onFinished(true, value);\n                    }}\n                >\n                    <Form.Field name=\"sectionName\">\n                        <Form.Label> {_t(\"create_section_dialog|label\")}</Form.Label>\n                        <Form.TextControl\n                            value={value}\n                            onChange={(evt) => setValue(evt.target.value)}\n                            required={true}\n                        />\n                    </Form.Field>\n                </Form.Root>\n            </Flex>\n            <DialogButtons\n                primaryButton={\n                    isEdition ? _t(\"create_section_dialog|edit_section\") : _t(\"create_section_dialog|create_section\")\n                }\n                primaryDisabled={isInvalid}\n                hasCancel={true}\n                onCancel={() => onFinished(false, \"\")}\n                onPrimaryButtonClick={() => onFinished(true, value)}\n            />\n        </BaseDialog>\n    );\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport React from \"react\";\nimport { type JSX } from \"react\";\nimport { Text } from \"@vector-im/compound-web\";\n\nimport { _t } from \"../../../languageHandler\";\nimport BaseDialog from \"./BaseDialog\";\nimport DialogButtons from \"../elements/DialogButtons\";\n\ninterface RemoveSectionDialogProps {\n    onFinished: (shouldRemoveSection: boolean) => void;\n    /** Whether the section is empty */\n    isEmpty: boolean;\n}\n\n/**\n * Dialog shown to the user to remove section in the room list.\n */\nexport function RemoveSectionDialog({ onFinished, isEmpty }: RemoveSectionDialogProps): JSX.Element {\n    return (\n        <BaseDialog\n            className=\"mx_RemoveSectionDialog\"\n            onFinished={() => onFinished(false)}\n            title={_t(\"remove_section_dialog|title\")}\n            hasCancel={true}\n        >\n            <Text as=\"span\">{_t(\"remove_section_dialog|confirmation\")}</Text>\n            {!isEmpty && (\n                <>\n                    <br />\n                    <Text as=\"span\">{_t(\"remove_section_dialog|description\")}</Text>\n                </>\n            )}\n            <DialogButtons\n                primaryButton={_t(\"remove_section_dialog|remove_section\")}\n                hasCancel={true}\n                onCancel={() => onFinished(false)}\n                onPrimaryButtonClick={() => onFinished(true)}\n            />\n        </BaseDialog>\n    );\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { SettingLevel } from \"../../settings/SettingLevel\";\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport Modal from \"../../Modal\";\nimport { CreateSectionDialog } from \"../../components/views/dialogs/CreateSectionDialog\";\nimport { RemoveSectionDialog } from \"../../components/views/dialogs/RemoveSectionDialog\";\nimport { DefaultTagID, type TagID } from \"./skip-list/tag\";\nimport { isMetaSpace, MetaSpace, type SpaceKey } from \"../spaces\";\nimport { SDKContextClass } from \"../../contexts/SDKContextClass.ts\";\n\n/**\n * A synthetic tag used to represent the \"Chats\" section, which contains\n * every room that does not belong to any other explicit tag section.\n */\nexport const CHATS_TAG = \"chats\";\n\n/**\n * Prefix for custom section tags.\n */\nexport const CUSTOM_SECTION_TAG_PREFIX = \"element.io.section.\";\n\ntype CustomTag = `${typeof CUSTOM_SECTION_TAG_PREFIX}${string}`;\n\n/**\n * Checks if a given tag is a custom section tag.\n * @param tag - The tag to check.\n * @returns True if the tag is a custom section tag, false otherwise.\n */\nexport function isCustomSectionTag(tag: string): tag is CustomTag {\n    return tag.startsWith(CUSTOM_SECTION_TAG_PREFIX);\n}\n\n/**\n * Checks if a given tag is a default section tag.\n * @param tagId - The tag to check.\n * @returns True if the tag is a default section tag, false otherwise.\n */\nexport function isDefaultSectionTag(tagId: TagID): boolean {\n    return tagId === DefaultTagID.Favourite || tagId === DefaultTagID.LowPriority || tagId === CHATS_TAG;\n}\n\n/**\n * Checks if a given tag is a section tag.\n * @param tagId - The tag to check.\n * @returns True if the tag is a section tag, false otherwise.\n */\nexport function isSectionTag(tagId: TagID): boolean {\n    return isCustomSectionTag(tagId) || isDefaultSectionTag(tagId);\n}\n\n/**\n * Structure of the custom section stored in the settings. The tag is used as a unique identifier for the section, and the name is given by the user.\n */\ntype CustomSection = {\n    tag: CustomTag;\n    name: string;\n    /** The space in which this section was created. Used to control visibility of empty sections. */\n    spaceId?: SpaceKey;\n};\n\n/**\n * Type guard to check if a value is a valid CustomSection object.\n */\nfunction isValidCustomSection(value: unknown): value is CustomSection {\n    return (\n        typeof value === \"object\" &&\n        value !== null &&\n        isCustomSectionTag((value as Record<string, unknown>).tag as string) &&\n        typeof (value as Record<string, unknown>).name === \"string\"\n    );\n}\n\n/**\n * The custom sections data is stored as a record in the settings, where the key is the section tag and the value is the section data (name and tag).\n */\nexport type CustomSectionsData = Record<CustomTag, CustomSection>;\n\n/**\n * Ordered list of custom section tags.\n */\nexport type OrderedCustomSections = CustomTag[];\n\n/**\n * Tags that can be reordered relative to each other (everything except Favourite and LowPriority,\n * which are pinned to the top and bottom respectively).\n */\nexport type ReorderableSection = CustomTag | typeof CHATS_TAG;\n\n/**\n * Returns true if the given tag is a tag that can be reordered (custom section or the Chats tag).\n */\nfunction isReorderableSection(tag: string, customData: CustomSectionsData): tag is ReorderableSection {\n    return tag === CHATS_TAG || (isCustomSectionTag(tag) && tag in customData);\n}\n\n/**\n * Returns true if the given space key corresponds to an enabled meta-space or a known top-level space room.\n */\nfunction doesSpaceExist(spaceId: SpaceKey): boolean {\n    if (isMetaSpace(spaceId)) return SDKContextClass.instance.spaceStore.enabledMetaSpaces.includes(spaceId);\n    return SDKContextClass.instance.spaceStore.spacePanelSpaces.some((room) => room.roomId === spaceId);\n}\n\n/**\n * Retrieves the custom sections data from the settings.\n * Invalid or malformed entries are dropped and the cleaned data is persisted back to settings.\n */\nexport function getCustomSectionData(): CustomSectionsData {\n    const raw = SettingsStore.getValue(\"RoomList.CustomSectionData\");\n    // Data are malformed\n    if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) return {};\n\n    return Object.fromEntries(\n        Object.entries(raw)\n            .filter(([key, value]) => isValidCustomSection(value) && value.tag === key)\n            .map(([key, value]) => [\n                key,\n                {\n                    ...value,\n                    // Default to MetaSpace.Home for legacy sections (no spaceId) or if the stored space no longer exists\n                    spaceId: value.spaceId && doesSpaceExist(value.spaceId) ? value.spaceId : MetaSpace.Home,\n                },\n            ]),\n    ) as CustomSectionsData;\n}\n\n/**\n * Retrieves the ordered list of custom section tags from the settings.\n * If the settings contain tags that are not present in the custom section data, they will be filtered out and the settings will be updated to remove the unknown tags.\n *\n * @knipignore - exported for tests\n */\nexport function getOrderedCustomSections(): OrderedCustomSections {\n    const sectionData = getCustomSectionData();\n    const rawValue = SettingsStore.getValue(\"RoomList.OrderedCustomSections\");\n    const orderedSections = Array.isArray(rawValue) ? rawValue : [];\n    return orderedSections.filter((tag): tag is CustomTag => isCustomSectionTag(tag) && tag in sectionData);\n}\n\n/**\n * Returns the ordered list of reorderable section tags (custom sections + the Chats tag).\n * Favourite and LowPriority are not included — they are pinned at the top and bottom respectively.\n *\n * If `CHATS_TAG` is missing from the stored order (e.g. legacy data or a freshly created custom\n * section), it is appended at the end so that custom sections sit above Chats by default.\n */\nexport function getOrderedReorderableSections(): ReorderableSection[] {\n    const sectionData = getCustomSectionData();\n    const rawValue = SettingsStore.getValue(\"RoomList.OrderedCustomSections\");\n    const stored = Array.isArray(rawValue) ? rawValue : [];\n\n    const result = stored.filter((tag): tag is ReorderableSection => isReorderableSection(tag, sectionData));\n    if (!result.includes(CHATS_TAG)) result.push(CHATS_TAG);\n    return result;\n}\n\n/**\n * Creates a new custom section by showing a dialog to the user to enter the section name.\n * If the user confirms, it generates a unique tag for the section, saves the section data in the settings, and updates the ordered list of sections.\n *\n * @param spaceId The space in which the section is being created. Used to control visibility of the empty section.\n * @returns A promise that resolves to the new section tag if created, or undefined if cancelled.\n */\nexport async function createSection(spaceId: SpaceKey): Promise<string | undefined> {\n    const modal = Modal.createDialog(CreateSectionDialog);\n\n    const [shouldCreateSection, sectionName] = await modal.finished;\n    if (!shouldCreateSection || !sectionName) return undefined;\n\n    const tag: CustomTag = `${CUSTOM_SECTION_TAG_PREFIX}${window.crypto.randomUUID()}`;\n    const newSection: CustomSection = { tag, name: sectionName, spaceId };\n\n    // Save the new section data\n    const sectionData = getCustomSectionData();\n    sectionData[tag] = newSection;\n    await SettingsStore.setValue(\"RoomList.CustomSectionData\", null, SettingLevel.ACCOUNT, sectionData);\n\n    // Add the new section to the ordered list of reorderable sections, just before CHATS_TAG\n    // so that newly-created sections appear above Chats by default.\n    const reorderable = getOrderedReorderableSections();\n    const chatsIndex = reorderable.indexOf(CHATS_TAG);\n    reorderable.splice(chatsIndex === -1 ? reorderable.length : chatsIndex, 0, tag);\n    await SettingsStore.setValue(\"RoomList.OrderedCustomSections\", null, SettingLevel.ACCOUNT, reorderable);\n    return tag;\n}\n\n/**\n * Edits an existing custom section by showing a dialog to the user to enter the new section name. If the user confirms, it updates the section data in the settings.\n * @param tag - The tag of the section to edit.\n */\nexport async function editSection(tag: string): Promise<void> {\n    if (!isCustomSectionTag(tag)) {\n        logger.info(\"Unknown section tag, cannot edit section\", tag);\n        return;\n    }\n    const sectionData = getCustomSectionData();\n    const section = sectionData[tag];\n    if (!section) {\n        logger.info(\"Unknown section tag, cannot edit section\", tag);\n        return;\n    }\n\n    const modal = Modal.createDialog(CreateSectionDialog, { sectionToEdit: section.name });\n\n    const [shouldEditSection, newName] = await modal.finished;\n    const isSameName = newName === section.name;\n    if (!shouldEditSection || !newName || isSameName) return;\n\n    // Save the new name\n    sectionData[tag].name = newName;\n    await SettingsStore.setValue(\"RoomList.CustomSectionData\", null, SettingLevel.ACCOUNT, sectionData);\n}\n\n/**\n * Deletes a custom section by showing a confirmation dialog to the user. If the user confirms, it removes the section data from the settings and updates the ordered list of sections.\n * @param tag - The tag of the section to delete.\n * @param isEmpty - Whether the section is empty (has no rooms). If the section is not empty, the confirmation dialog will show a warning message.\n */\nexport async function deleteSection(tag: string, isEmpty: boolean): Promise<void> {\n    if (!isCustomSectionTag(tag)) {\n        logger.info(\"Unknown section tag, cannot delete section\", tag);\n        return;\n    }\n    const sectionData = getCustomSectionData();\n    if (!sectionData[tag]) {\n        logger.info(\"Unknown section tag, cannot delete section\", tag);\n        return;\n    }\n\n    const modal = Modal.createDialog(RemoveSectionDialog, { isEmpty });\n    const [shouldRemoveSection] = await modal.finished;\n    if (!shouldRemoveSection) return;\n\n    // Remove the section from the ordered list of reorderable sections (preserves CHATS_TAG position)\n    const newOrderedSections = getOrderedReorderableSections().filter((sectionTag) => sectionTag !== tag);\n    await SettingsStore.setValue(\"RoomList.OrderedCustomSections\", null, SettingLevel.ACCOUNT, newOrderedSections);\n\n    // Remove the section data\n    delete sectionData[tag];\n    await SettingsStore.setValue(\"RoomList.CustomSectionData\", null, SettingLevel.ACCOUNT, sectionData);\n}\n\n/**\n * Reorders sections by moving sourceTag relative to targetTag within the set of reorderable\n * sections (custom sections and the Chats tag). Favourite and LowPriority are not reorderable\n * and are rejected as either source or target.\n *\n * If the source was below the target, it is inserted before the target; otherwise after.\n * @param sourceTag - The tag of the section to move.\n * @param targetTag - The tag of the section to move relative to.\n */\nexport async function reorderSection(sourceTag: string, targetTag: string): Promise<void> {\n    const ordered = getOrderedReorderableSections();\n    const fromIndex = ordered.indexOf(sourceTag as ReorderableSection);\n\n    if (fromIndex === -1 || !ordered.includes(targetTag as ReorderableSection) || sourceTag === targetTag) return;\n\n    const toIndex = ordered.indexOf(targetTag as ReorderableSection);\n    const insertBefore = fromIndex > toIndex;\n\n    ordered.splice(fromIndex, 1);\n    const newToIndex = ordered.indexOf(targetTag as ReorderableSection);\n    ordered.splice(insertBefore ? newToIndex : newToIndex + 1, 0, sourceTag as ReorderableSection);\n    await SettingsStore.setValue(\"RoomList.OrderedCustomSections\", null, SettingLevel.ACCOUNT, ordered);\n}\n","/*\nCopyright 2025 New Vector Ltd.\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\n\nexport const enum FilterEnum {\n    FavouriteFilter = \"favourite\",\n    UnreadFilter = \"unread\",\n    PeopleFilter = \"people\",\n    RoomsFilter = \"rooms\",\n    LowPriorityFilter = \"low_priority\",\n    MentionsFilter = \"mentions\",\n    InvitesFilter = \"invites\",\n    ExcludeTagsFilter = \"exclude_tags\",\n}\n\nexport type FilterKey = FilterEnum | string;\n\nexport interface Filter {\n    /**\n     * Boolean return value indicates whether this room satisfies\n     * the filter condition.\n     */\n    matches(room: Room): boolean;\n\n    /**\n     * Used to identify this particular filter.\n     */\n    key: FilterKey;\n}\n","/*\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { EventTimeline, EventType, type MatrixEvent, type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { EffectiveMembership, getEffectiveMembership } from \"../../../../../utils/membership\";\nimport * as Unread from \"../../../../../Unread\";\n\nfunction shouldCauseReorder(event: MatrixEvent): boolean {\n    const type = event.getType();\n    const content = event.getContent();\n    const prevContent = event.getPrevContent();\n\n    // Never ignore membership changes\n    if (type === EventType.RoomMember && prevContent.membership !== content.membership) return true;\n\n    // Ignore display name changes\n    if (type === EventType.RoomMember && prevContent.displayname !== content.displayname) return false;\n    // Ignore avatar changes\n    if (type === EventType.RoomMember && prevContent.avatar_url !== content.avatar_url) return false;\n\n    return true;\n}\n\n/**\n * For a given room, this function returns a timestamp that can be used for recency sorting.\n * @param r room for which the timestamp is calculated\n * @param userId mxId of the current user\n * @returns timestamp\n */\nexport const getLastTimestamp = (r: Room, userId: string): number => {\n    const mainTimelineLastTs = ((): number => {\n        const timeline = r.getLiveTimeline().getEvents();\n\n        // MSC4186: Simplified Sliding Sync sets this.\n        // If it's present, sort by it.\n        const bumpStamp = r.getBumpStamp();\n        if (bumpStamp) {\n            return bumpStamp;\n        }\n\n        // If the room hasn't been joined yet, it probably won't have a timeline to\n        // parse. We'll still fall back to the timeline if this fails, but chances\n        // are we'll at least have our own membership event to go off of.\n        const effectiveMembership = getEffectiveMembership(r.getMyMembership());\n        if (effectiveMembership !== EffectiveMembership.Join) {\n            const membershipEvent = r\n                .getLiveTimeline()\n                .getState(EventTimeline.FORWARDS)\n                ?.getStateEvents(EventType.RoomMember, userId);\n            if (membershipEvent && !Array.isArray(membershipEvent)) {\n                return membershipEvent.getTs();\n            }\n        }\n\n        for (let i = timeline.length - 1; i >= 0; --i) {\n            const ev = timeline[i];\n            if (!ev.getTs()) continue; // skip events that don't have timestamps (tests only?)\n\n            if (\n                (ev.getSender() === userId && shouldCauseReorder(ev)) ||\n                Unread.eventTriggersUnreadCount(r.client, ev)\n            ) {\n                return ev.getTs();\n            }\n        }\n\n        // we might only have events that don't trigger the unread indicator,\n        // in which case use the oldest event even if normally it wouldn't count.\n        // This is better than just assuming the last event was forever ago.\n        return timeline[0]?.getTs() ?? 0;\n    })();\n\n    const threadLastEventTimestamps = r.getThreads().map((thread) => {\n        const event = thread.replyToEvent ?? thread.rootEvent;\n        return event?.getTs() ?? 0;\n    });\n\n    return Math.max(mainTimelineLastTs, ...threadLastEventTimestamps);\n};\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\n/**\n * Default tags that are used for rooms that don't have a user defined tag. These are used to determine where a room should be placed in the room list and how it should be sorted.\n */\nexport enum DefaultTagID {\n    Invite = \"im.vector.fake.invite\",\n    Untagged = \"im.vector.fake.recent\", // legacy: used to just be 'recent rooms' but now it's all untagged rooms\n    Archived = \"im.vector.fake.archived\",\n    LowPriority = \"m.lowpriority\",\n    Favourite = \"m.favourite\",\n    DM = \"im.vector.fake.direct\",\n    Conference = \"im.vector.fake.conferences\",\n    ServerNotice = \"m.server_notice\",\n}\n\n/**\n * A tag ID is either a user defined tag (which is just a string) or one of the default tags defined in DefaultTagID.\n */\nexport type TagID = string | DefaultTagID;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021, 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { throttle } from \"lodash\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { NotificationLevel } from \"./NotificationLevel\";\nimport { arrayDiff } from \"../../utils/arrays\";\nimport { type RoomNotificationState } from \"./RoomNotificationState\";\nimport { NotificationState, NotificationStateEvents } from \"./NotificationState\";\nimport { DefaultTagID } from \"../room-list-v3/skip-list/tag\";\nimport { RoomNotificationStateStore } from \"./RoomNotificationStateStore\";\nimport { getTagsForRoom } from \"../../utils/room/getTagsForRoom\";\n\nexport class SpaceNotificationState extends NotificationState {\n    public rooms: Room[] = []; // exposed only for tests\n    private states: { [spaceId: string]: RoomNotificationState } = {};\n\n    public constructor() {\n        super();\n    }\n\n    public get symbol(): string | null {\n        return this._level === NotificationLevel.Unsent ? \"!\" : null;\n    }\n\n    public setRooms(rooms: Room[]): void {\n        const oldRooms = this.rooms;\n        const diff = arrayDiff(oldRooms, rooms);\n        this.rooms = rooms;\n        for (const oldRoom of diff.removed) {\n            const state = this.states[oldRoom.roomId];\n            if (!state) continue; // We likely just didn't have a badge (race condition)\n            delete this.states[oldRoom.roomId];\n            state.off(NotificationStateEvents.Update, this.onRoomNotificationStateUpdate);\n        }\n        for (const newRoom of diff.added) {\n            const state = RoomNotificationStateStore.instance.getRoomState(newRoom);\n            state.on(NotificationStateEvents.Update, this.onRoomNotificationStateUpdate);\n            this.states[newRoom.roomId] = state;\n        }\n\n        this.calculateTotalState();\n    }\n\n    public getFirstRoomWithNotifications(): string | undefined {\n        return Object.values(this.states).find((state) => state.level >= this.level)?.room.roomId;\n    }\n\n    public destroy(): void {\n        super.destroy();\n        for (const state of Object.values(this.states)) {\n            state.off(NotificationStateEvents.Update, this.onRoomNotificationStateUpdate);\n        }\n        this.states = {};\n    }\n\n    private onRoomNotificationStateUpdate = (): void => {\n        this.calculateTotalState();\n    };\n\n    private calculateTotalState = throttle(\n        (): void => {\n            const snapshot = this.snapshot();\n\n            this._count = 0;\n            this._level = NotificationLevel.None;\n            for (const [roomId, state] of Object.entries(this.states)) {\n                const room = this.rooms.find((r) => r.roomId === roomId);\n                const roomTags = room ? getTagsForRoom(room) : [];\n\n                // We ignore unreads in LowPriority rooms, see https://github.com/vector-im/element-web/issues/16836\n                if (roomTags.includes(DefaultTagID.LowPriority) && state.level === NotificationLevel.Activity) continue;\n\n                this._count += state.count;\n                this._level = Math.max(this.level, state.level);\n            }\n\n            // finally, publish an update if needed\n            this.emitIfUpdated(snapshot);\n        },\n        100,\n        { leading: false, trailing: true },\n    );\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { arrayDiff, type Diff } from \"./arrays\";\n\n/**\n * Determines if two sets are different through a shallow comparison.\n * @param a The first set. Must be defined.\n * @param b The second set. Must be defined.\n * @returns True if they are different, false otherwise.\n */\nexport function setHasDiff<T>(a: Set<T>, b: Set<T>): boolean {\n    if (a.size === b.size) {\n        // When the lengths are equal, check to see if either set is missing an element from the other.\n        if (Array.from(b).some((i) => !a.has(i))) return true;\n        if (Array.from(a).some((i) => !b.has(i))) return true;\n\n        // if all the keys are common, say so\n        return false;\n    } else {\n        return true; // different lengths means they are naturally diverged\n    }\n}\n\n/**\n * Determines the values added and removed between two sets.\n * @param a The first set. Must be defined.\n * @param b The second set. Must be defined.\n * @returns The difference between the values in each set.\n */\nexport function setDiff<T>(a: Set<T>, b: Set<T>): Diff<T> {\n    return arrayDiff(Array.from(a), Array.from(b));\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { alphabetPad, baseToString, stringToBase, DEFAULT_ALPHABET } from \"matrix-js-sdk/src/utils\";\n\nimport { moveElement } from \"./arrays\";\n\nexport function midPointsBetweenStrings(\n    a: string,\n    b: string,\n    count: number,\n    maxLen: number,\n    alphabet = DEFAULT_ALPHABET,\n): string[] {\n    const padN = Math.min(Math.max(a.length, b.length), maxLen);\n    const padA = alphabetPad(a, padN, alphabet);\n    const padB = alphabetPad(b, padN, alphabet);\n    const baseA = stringToBase(padA, alphabet);\n    const baseB = stringToBase(padB, alphabet);\n\n    if (baseB - baseA - BigInt(1) < count) {\n        if (padN < maxLen) {\n            // this recurses once at most due to the new limit of n+1\n            return midPointsBetweenStrings(\n                alphabetPad(padA, padN + 1, alphabet),\n                alphabetPad(padB, padN + 1, alphabet),\n                count,\n                padN + 1,\n                alphabet,\n            );\n        }\n        return [];\n    }\n\n    const step = (baseB - baseA) / BigInt(count + 1);\n    const start = BigInt(baseA + step);\n    return Array(count)\n        .fill(undefined)\n        .map((_, i) => baseToString(start + BigInt(i) * step, alphabet));\n}\n\ninterface IEntry {\n    index: number;\n    order?: string;\n}\n\nexport const reorderLexicographically = (\n    orders: Array<string | undefined>,\n    fromIndex: number,\n    toIndex: number,\n    maxLen = 50,\n): Required<IEntry>[] => {\n    // sanity check inputs\n    if (fromIndex < 0 || toIndex < 0 || fromIndex > orders.length || toIndex > orders.length || fromIndex === toIndex) {\n        return [];\n    }\n\n    // zip orders with their indices to simplify later index wrangling\n    const ordersWithIndices: IEntry[] = orders.map((order, index) => ({ index, order }));\n    // apply the fundamental order update to the zipped array\n    const newOrder = moveElement(ordersWithIndices, fromIndex, toIndex);\n\n    // check if we have to fill undefined orders to complete placement\n    const orderToLeftUndefined = newOrder[toIndex - 1]?.order === undefined;\n\n    let leftBoundIdx = toIndex;\n    let rightBoundIdx = toIndex;\n\n    let canMoveLeft = true;\n    const nextBase =\n        newOrder[toIndex + 1]?.order !== undefined\n            ? stringToBase(newOrder[toIndex + 1].order!)\n            : BigInt(Number.MAX_VALUE);\n\n    // check how far left we would have to mutate to fit in that direction\n    for (let i = toIndex - 1, j = 1; i >= 0; i--, j++) {\n        if (newOrder[i]?.order !== undefined && nextBase - stringToBase(newOrder[i].order!) > j) break;\n        leftBoundIdx = i;\n    }\n\n    // verify the left move would be sufficient\n    const firstOrderBase = newOrder[0].order === undefined ? undefined : stringToBase(newOrder[0].order);\n    const bigToIndex = BigInt(toIndex);\n    if (\n        leftBoundIdx === 0 &&\n        firstOrderBase !== undefined &&\n        nextBase - firstOrderBase <= bigToIndex &&\n        firstOrderBase <= bigToIndex\n    ) {\n        canMoveLeft = false;\n    }\n\n    const canDisplaceRight = !orderToLeftUndefined;\n    let canMoveRight = canDisplaceRight;\n    if (canDisplaceRight) {\n        const prevBase =\n            newOrder[toIndex - 1]?.order !== undefined\n                ? stringToBase(newOrder[toIndex - 1].order!)\n                : BigInt(Number.MIN_VALUE);\n\n        // check how far right we would have to mutate to fit in that direction\n        for (let i = toIndex + 1, j = 1; i < newOrder.length; i++, j++) {\n            if (newOrder[i]?.order === undefined || stringToBase(newOrder[i].order!) - prevBase > j) break;\n            rightBoundIdx = i;\n        }\n\n        // verify the right move would be sufficient\n        if (\n            rightBoundIdx === newOrder.length - 1 &&\n            (newOrder[rightBoundIdx]?.order ? stringToBase(newOrder[rightBoundIdx].order!) : BigInt(Number.MAX_VALUE)) -\n                prevBase <=\n                rightBoundIdx - toIndex\n        ) {\n            canMoveRight = false;\n        }\n    }\n\n    // pick the cheaper direction\n    const leftDiff = canMoveLeft ? toIndex - leftBoundIdx : Number.MAX_SAFE_INTEGER;\n    const rightDiff = canMoveRight ? rightBoundIdx - toIndex : Number.MAX_SAFE_INTEGER;\n    if (orderToLeftUndefined || leftDiff < rightDiff) {\n        rightBoundIdx = toIndex;\n    } else {\n        leftBoundIdx = toIndex;\n    }\n\n    const prevOrder = newOrder[leftBoundIdx - 1]?.order ?? \"\";\n    const nextOrder =\n        newOrder[rightBoundIdx + 1]?.order ??\n        DEFAULT_ALPHABET.charAt(DEFAULT_ALPHABET.length - 1).repeat(prevOrder.length || 1);\n\n    const changes = midPointsBetweenStrings(prevOrder, nextOrder, 1 + rightBoundIdx - leftBoundIdx, maxLen);\n\n    return changes.map((order, i) => ({\n        index: newOrder[leftBoundIdx + i].index,\n        order,\n    }));\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type SpaceKey } from \".\";\n\nexport type SpaceEntityMap = Map<SpaceKey, Set<string>>;\nexport type SpaceDescendantMap = Map<SpaceKey, Set<SpaceKey>>;\n\nconst traverseSpaceDescendants = (\n    spaceDescendantMap: SpaceDescendantMap,\n    spaceId: SpaceKey,\n    flatSpace = new Set<SpaceKey>(),\n): Set<SpaceKey> => {\n    flatSpace.add(spaceId);\n    const descendentSpaces = spaceDescendantMap.get(spaceId);\n    descendentSpaces?.forEach((descendantSpaceId) => {\n        if (!flatSpace.has(descendantSpaceId)) {\n            traverseSpaceDescendants(spaceDescendantMap, descendantSpaceId, flatSpace);\n        }\n    });\n\n    return flatSpace;\n};\n\n/**\n * Helper function to traverse space hierarchy and flatten\n * @param spaceEntityMap ie map of rooms or dm userIds\n * @param spaceDescendantMap map of spaces and their children\n * @returns set of all rooms\n */\nexport const flattenSpaceHierarchy = (\n    spaceEntityMap: SpaceEntityMap,\n    spaceDescendantMap: SpaceDescendantMap,\n    spaceId: SpaceKey,\n): Set<string> => {\n    const flattenedSpaceIds = traverseSpaceDescendants(spaceDescendantMap, spaceId);\n    const flattenedRooms = new Set<string>();\n\n    flattenedSpaceIds.forEach((id) => {\n        const roomIds = spaceEntityMap.get(id);\n        roomIds?.forEach((roomId) => flattenedRooms.add(roomId), flattenedRooms);\n    });\n\n    return flattenedRooms;\n};\n\nexport const flattenSpaceHierarchyWithCache =\n    (cache: SpaceEntityMap) =>\n    (\n        spaceEntityMap: SpaceEntityMap,\n        spaceDescendantMap: SpaceDescendantMap,\n        spaceId: SpaceKey,\n        useCache = true,\n    ): Set<string> => {\n        if (useCache && cache.has(spaceId)) {\n            return cache.get(spaceId)!;\n        }\n        const result = flattenSpaceHierarchy(spaceEntityMap, spaceDescendantMap, spaceId);\n        cache.set(spaceId, result);\n\n        return result;\n    };\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021, 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type ListIteratee, type Many, sortBy } from \"lodash\";\nimport {\n    EventType,\n    RoomType,\n    type Room,\n    RoomEvent,\n    type RoomMember,\n    RoomStateEvent,\n    type MatrixEvent,\n    ClientEvent,\n    type ISendEventResponse,\n    type EmptyObject,\n} from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { AsyncStoreWithClient } from \"../AsyncStoreWithClient\";\nimport { type MatrixDispatcher } from \"../../dispatcher/dispatcher.ts\";\nimport RoomListStoreV3 from \"../room-list-v3/RoomListStoreV3\";\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport DMRoomMap from \"../../utils/DMRoomMap\";\nimport { SpaceNotificationState } from \"../notifications/SpaceNotificationState\";\nimport { RoomNotificationStateStore } from \"../notifications/RoomNotificationStateStore\";\nimport { EnhancedMap, mapDiff } from \"../../utils/maps\";\nimport { setDiff, setHasDiff } from \"../../utils/sets\";\nimport { Action } from \"../../dispatcher/actions\";\nimport { arrayHasDiff, arrayHasOrderChange, filterBoolean } from \"../../utils/arrays\";\nimport { reorderLexicographically } from \"../../utils/stringOrderField\";\nimport { type SettingUpdatedPayload } from \"../../dispatcher/payloads/SettingUpdatedPayload\";\nimport {\n    isMetaSpace,\n    type ISuggestedRoom,\n    MetaSpace,\n    type SpaceKey,\n    UPDATE_HOME_BEHAVIOUR,\n    UPDATE_INVITED_SPACES,\n    UPDATE_SELECTED_SPACE,\n    UPDATE_SUGGESTED_ROOMS,\n    UPDATE_TOP_LEVEL_SPACES,\n} from \".\";\nimport { getCachedRoomIdForAlias } from \"../../RoomAliasCache\";\nimport { EffectiveMembership, getEffectiveMembership } from \"../../utils/membership\";\nimport {\n    flattenSpaceHierarchyWithCache,\n    type SpaceEntityMap,\n    type SpaceDescendantMap,\n    flattenSpaceHierarchy,\n} from \"./flattenSpaceHierarchy\";\nimport { PosthogAnalytics } from \"../../PosthogAnalytics\";\nimport { type ViewRoomPayload } from \"../../dispatcher/payloads/ViewRoomPayload\";\nimport { type ViewHomePagePayload } from \"../../dispatcher/payloads/ViewHomePagePayload\";\nimport { type SwitchSpacePayload } from \"../../dispatcher/payloads/SwitchSpacePayload\";\nimport { type AfterLeaveRoomPayload } from \"../../dispatcher/payloads/AfterLeaveRoomPayload\";\nimport { type SDKContextClass } from \"../../contexts/SDKContextClass\";\nimport { ModuleApi } from \"../../modules/Api.ts\";\n\nconst ACTIVE_SPACE_LS_KEY = \"mx_active_space\";\n\nconst metaSpaceOrder: MetaSpace[] = [MetaSpace.Home, MetaSpace.Orphans, MetaSpace.VideoRooms];\n\nconst MAX_SUGGESTED_ROOMS = 20;\n\nconst getSpaceContextKey = (space: SpaceKey): string => `mx_space_context_${space}`;\n\nconst partitionSpacesAndRooms = (arr: Room[]): [Room[], Room[]] => {\n    // [spaces, rooms]\n    return arr.reduce<[Room[], Room[]]>(\n        (result, room: Room) => {\n            result[room.isSpaceRoom() ? 0 : 1].push(room);\n            return result;\n        },\n        [[], []],\n    );\n};\n\nconst validOrder = (order?: string): string | undefined => {\n    if (\n        typeof order === \"string\" &&\n        order.length <= 50 &&\n        Array.from(order).every((c: string) => {\n            const charCode = c.charCodeAt(0);\n            return charCode >= 0x20 && charCode <= 0x7e;\n        })\n    ) {\n        return order;\n    }\n};\n\n// For sorting space children using a validated `order`, `origin_server_ts`, `room_id`\nexport const getChildOrder = (\n    order: string | undefined,\n    ts: number,\n    roomId: string,\n): Array<Many<ListIteratee<unknown>>> => {\n    return [validOrder(order) ?? NaN, ts, roomId]; // NaN has lodash sort it at the end in asc\n};\n\ntype SpaceStoreActions =\n    | SettingUpdatedPayload\n    | ViewRoomPayload\n    | ViewHomePagePayload\n    | SwitchSpacePayload\n    | AfterLeaveRoomPayload;\n\nexport default class SpaceStore extends AsyncStoreWithClient<EmptyObject> {\n    // The spaces representing the roots of the various tree-like hierarchies\n    private rootSpaces: Room[] = [];\n    // Map from room/space ID to set of spaces which list it as a child\n    private parentMap = new EnhancedMap<string, Set<string>>();\n    // Map from SpaceKey to SpaceNotificationState instance representing that space\n    private notificationStateMap = new Map<SpaceKey, SpaceNotificationState>();\n    // Map from SpaceKey to Set of room IDs that are direct descendants of that space\n    private roomIdsBySpace: SpaceEntityMap = new Map<SpaceKey, Set<string>>(); // won't contain MetaSpace.People\n    // Map from space id to Set of space keys that are direct descendants of that space\n    // meta spaces do not have descendants\n    private childSpacesBySpace: SpaceDescendantMap = new Map<Room[\"roomId\"], Set<Room[\"roomId\"]>>();\n    // Map from space id to Set of user IDs that are direct descendants of that space\n    private userIdsBySpace: SpaceEntityMap = new Map<Room[\"roomId\"], Set<string>>();\n    // cache that stores the aggregated lists of roomIdsBySpace and userIdsBySpace\n    // cleared on changes\n    private _aggregatedSpaceCache = {\n        roomIdsBySpace: new Map<SpaceKey, Set<string>>(),\n        userIdsBySpace: new Map<Room[\"roomId\"], Set<string>>(),\n    };\n    // The space currently selected in the Space Panel\n    private _activeSpace: SpaceKey = MetaSpace.Home; // set properly by onReady\n    private _suggestedRooms: ISuggestedRoom[] = [];\n    private _invitedSpaces = new Set<Room>();\n    private spaceOrderLocalEchoMap = new Map<string, string | undefined>();\n    // The following properties are set by onReady as they live in account_data\n    private _allRoomsInHome = false;\n    private _enabledMetaSpaces: MetaSpace[] = [];\n    /** Whether the feature flag is set for MSC3946 */\n    private _msc3946ProcessDynamicPredecessor: boolean = SettingsStore.getValue(\"feature_dynamic_room_predecessors\");\n    private _storeReadyDeferred = Promise.withResolvers<void>();\n\n    public constructor(\n        dispatcher: MatrixDispatcher,\n        private readonly sdkContext: SDKContextClass,\n    ) {\n        super(dispatcher, {});\n\n        SettingsStore.monitorSetting(\"Spaces.allRoomsInHome\", null);\n        SettingsStore.monitorSetting(\"Spaces.enabledMetaSpaces\", null);\n        SettingsStore.monitorSetting(\"Spaces.showPeopleInSpace\", null);\n        SettingsStore.monitorSetting(\"feature_dynamic_room_predecessors\", null);\n    }\n\n    /**\n     * A promise that resolves when the space store is ready.\n     * This happens after an initial hierarchy of spaces and rooms has been computed.\n     */\n    public get storeReadyPromise(): Promise<void> {\n        return this._storeReadyDeferred.promise;\n    }\n\n    public get invitedSpaces(): Room[] {\n        return Array.from(this._invitedSpaces);\n    }\n\n    public get enabledMetaSpaces(): MetaSpace[] {\n        return this._enabledMetaSpaces;\n    }\n\n    public get spacePanelSpaces(): Room[] {\n        return this.rootSpaces;\n    }\n\n    public get activeSpace(): SpaceKey {\n        return this._activeSpace;\n    }\n\n    public get activeSpaceRoom(): Room | null {\n        if (isMetaSpace(this._activeSpace)) return null;\n        return this.matrixClient?.getRoom(this._activeSpace) ?? null;\n    }\n\n    public get suggestedRooms(): ISuggestedRoom[] {\n        return this._suggestedRooms;\n    }\n\n    public get allRoomsInHome(): boolean {\n        return this._allRoomsInHome;\n    }\n\n    public setActiveRoomInSpace(space: SpaceKey): void {\n        if (!isMetaSpace(space) && !this.matrixClient?.getRoom(space)?.isSpaceRoom()) return;\n        if (space !== this.activeSpace) this.setActiveSpace(space, false);\n\n        let roomId: string | undefined;\n        if (space === MetaSpace.Home && this.allRoomsInHome) {\n            const hasMentions = RoomNotificationStateStore.instance.globalState.hasMentions;\n            const rooms = RoomListStoreV3.instance.getSortedRoomsInActiveSpace().sections.flatMap((s) => s.rooms);\n            for (const room of rooms) {\n                const state = RoomNotificationStateStore.instance.getRoomState(room);\n                if (hasMentions ? state.hasMentions : state.isUnread) {\n                    roomId = room.roomId;\n                    break;\n                }\n            }\n        } else {\n            roomId = this.getNotificationState(space).getFirstRoomWithNotifications();\n        }\n\n        if (!!roomId) {\n            this.dispatcher.dispatch<ViewRoomPayload>({\n                action: Action.ViewRoom,\n                room_id: roomId,\n                context_switch: true,\n                metricsTrigger: \"WebSpacePanelNotificationBadge\",\n            });\n        }\n    }\n\n    /**\n     * Sets the active space, updates room list filters,\n     * optionally switches the user's room back to where they were when they last viewed that space.\n     * @param space which space to switch to.\n     * @param contextSwitch whether to switch the user's context,\n     * should not be done when the space switch is done implicitly due to another event like switching room.\n     */\n    public setActiveSpace(space: SpaceKey, contextSwitch = true): void {\n        if (!space || !this.matrixClient || space === this.activeSpace) return;\n\n        let cliSpace: Room | null = null;\n        if (ModuleApi.instance.extras.spacePanelItems.has(space)) {\n            // it's a \"space\" provided by a module: that's good enough\n        } else if (!isMetaSpace(space)) {\n            cliSpace = this.matrixClient.getRoom(space);\n            if (!cliSpace?.isSpaceRoom()) return;\n        } else if (!this.enabledMetaSpaces.includes(space)) {\n            return;\n        }\n\n        window.localStorage.setItem(ACTIVE_SPACE_LS_KEY, (this._activeSpace = space)); // Update & persist selected space\n\n        if (contextSwitch) {\n            // view last selected room from space\n            const roomId = this.getLastSelectedRoomIdForSpace(space);\n\n            // if the space being selected is an invite then always view that invite\n            // else if the last viewed room in this space is joined then view that\n            // else view space home or home depending on what is being clicked on\n            if (\n                roomId &&\n                cliSpace?.getMyMembership() !== KnownMembership.Invite &&\n                this.matrixClient.getRoom(roomId)?.getMyMembership() === KnownMembership.Join &&\n                this.isRoomInSpace(space, roomId)\n            ) {\n                this.dispatcher.dispatch<ViewRoomPayload>({\n                    action: Action.ViewRoom,\n                    room_id: roomId,\n                    context_switch: true,\n                    metricsTrigger: \"WebSpaceContextSwitch\",\n                });\n            } else if (cliSpace) {\n                this.dispatcher.dispatch<ViewRoomPayload>({\n                    action: Action.ViewRoom,\n                    room_id: space,\n                    context_switch: true,\n                    metricsTrigger: \"WebSpaceContextSwitch\",\n                });\n            } else if (ModuleApi.instance.extras.spacePanelItems.has(space)) {\n                // module will handle this\n            } else {\n                this.dispatcher.dispatch<ViewHomePagePayload>({\n                    action: Action.ViewHomePage,\n                    context_switch: true,\n                });\n            }\n        }\n\n        this.emit(UPDATE_SELECTED_SPACE, this.activeSpace);\n        this.emit(UPDATE_SUGGESTED_ROOMS, (this._suggestedRooms = []));\n\n        if (cliSpace) {\n            this.loadSuggestedRooms(cliSpace);\n\n            // Load all members for the selected space and its subspaces,\n            // so we can correctly show DMs we have with members of this space.\n            this.traverseSpace(\n                space,\n                (roomId) => {\n                    this.matrixClient?.getRoom(roomId)?.loadMembersIfNeeded();\n                },\n                false,\n            );\n        }\n    }\n\n    /**\n     * Returns the room-id of the last active room in a given space.\n     * This is the room that would be opened when you switch to a given space.\n     * @param space The space you're interested in.\n     * @returns room-id of the room or null if there's no last active room.\n     */\n    public getLastSelectedRoomIdForSpace(space: SpaceKey): string | null {\n        const roomId = window.localStorage.getItem(getSpaceContextKey(space));\n        return roomId;\n    }\n\n    private async loadSuggestedRooms(space: Room): Promise<void> {\n        const suggestedRooms = await this.fetchSuggestedRooms(space);\n        if (this._activeSpace === space.roomId) {\n            this._suggestedRooms = suggestedRooms;\n            this.emit(UPDATE_SUGGESTED_ROOMS, this._suggestedRooms);\n        }\n    }\n\n    public fetchSuggestedRooms = async (space: Room, limit = MAX_SUGGESTED_ROOMS): Promise<ISuggestedRoom[]> => {\n        try {\n            const { rooms } = await this.matrixClient!.getRoomHierarchy(space.roomId, limit, 1, true);\n\n            const viaMap = new EnhancedMap<string, Set<string>>();\n            rooms.forEach((room) => {\n                room.children_state.forEach((ev) => {\n                    if (ev.type === EventType.SpaceChild && ev.content.via?.length) {\n                        ev.content.via.forEach((via) => {\n                            viaMap.getOrCreate(ev.state_key, new Set()).add(via);\n                        });\n                    }\n                });\n            });\n\n            return rooms\n                .filter((roomInfo) => {\n                    return (\n                        roomInfo.room_type !== RoomType.Space &&\n                        this.matrixClient?.getRoom(roomInfo.room_id)?.getMyMembership() !== KnownMembership.Join\n                    );\n                })\n                .map((roomInfo) => ({\n                    ...roomInfo,\n                    viaServers: Array.from(viaMap.get(roomInfo.room_id) || []),\n                }));\n        } catch (e) {\n            logger.error(e);\n        }\n        return [];\n    };\n\n    public addRoomToSpace(space: Room, roomId: string, via: string[], suggested = false): Promise<ISendEventResponse> {\n        return this.matrixClient!.sendStateEvent(\n            space.roomId,\n            EventType.SpaceChild,\n            {\n                via,\n                suggested,\n            },\n            roomId,\n        );\n    }\n\n    public getChildren(spaceId: string): Room[] {\n        const room = this.matrixClient?.getRoom(spaceId);\n        const childEvents = room?.currentState\n            .getStateEvents(EventType.SpaceChild)\n            .filter((ev) => ev.getContent()?.via);\n        return (\n            sortBy(childEvents, (ev) => {\n                return getChildOrder(ev.getContent().order, ev.getTs(), ev.getStateKey()!);\n            })\n                .map((ev) => {\n                    const history = this.matrixClient!.getRoomUpgradeHistory(\n                        ev.getStateKey()!,\n                        true,\n                        this._msc3946ProcessDynamicPredecessor,\n                    );\n                    return history[history.length - 1];\n                })\n                .filter((room) => {\n                    return (\n                        room?.getMyMembership() === KnownMembership.Join ||\n                        room?.getMyMembership() === KnownMembership.Invite\n                    );\n                }) || []\n        );\n    }\n\n    public getChildRooms(spaceId: string): Room[] {\n        return this.getChildren(spaceId).filter((r) => !r.isSpaceRoom());\n    }\n\n    public getChildSpaces(spaceId: string): Room[] {\n        // don't show invited subspaces as they surface at the top level for better visibility\n        return this.getChildren(spaceId).filter((r) => r.isSpaceRoom() && r.getMyMembership() === KnownMembership.Join);\n    }\n\n    public getParents(roomId: string, canonicalOnly = false): Room[] {\n        if (!this.matrixClient) return [];\n        const userId = this.matrixClient.getSafeUserId();\n        const room = this.matrixClient.getRoom(roomId);\n        const events = room?.currentState.getStateEvents(EventType.SpaceParent) ?? [];\n        return filterBoolean(\n            events.map((ev) => {\n                const content = ev.getContent();\n                if (!Array.isArray(content.via) || (canonicalOnly && !content.canonical)) {\n                    return; // skip\n                }\n\n                // only respect the relationship if the sender has sufficient permissions in the parent to set\n                // child relations, as per MSC1772.\n                // https://github.com/matrix-org/matrix-doc/blob/main/proposals/1772-groups-as-rooms.md#relationship-between-rooms-and-spaces\n                const parent = this.matrixClient?.getRoom(ev.getStateKey());\n                const relation = parent?.currentState.getStateEvents(EventType.SpaceChild, roomId);\n                if (\n                    !parent?.currentState.maySendStateEvent(EventType.SpaceChild, userId) ||\n                    // also skip this relation if the parent had this child added but then since removed it\n                    (relation && !Array.isArray(relation.getContent().via))\n                ) {\n                    return; // skip\n                }\n\n                return parent;\n            }),\n        );\n    }\n\n    public getCanonicalParent(roomId: string): Room | null {\n        const parents = this.getParents(roomId, true);\n        return sortBy(parents, (r) => r.roomId)?.[0] || null;\n    }\n\n    public getKnownParents(roomId: string, includeAncestors?: boolean): Set<string> {\n        if (includeAncestors) {\n            return flattenSpaceHierarchy(this.parentMap, this.parentMap, roomId);\n        }\n        return this.parentMap.get(roomId) || new Set();\n    }\n\n    public isRoomInSpace(space: SpaceKey, roomId: string, includeDescendantSpaces = true): boolean {\n        if (space === MetaSpace.Home && this.allRoomsInHome) {\n            return true;\n        }\n        if (space === MetaSpace.VideoRooms) {\n            return !!this.matrixClient?.getRoom(roomId)?.isCallRoom();\n        }\n        if (this.getSpaceFilteredRoomIds(space, includeDescendantSpaces)?.has(roomId)) {\n            return true;\n        }\n\n        const dmPartner = DMRoomMap.shared().getUserIdForRoomId(roomId);\n        if (!dmPartner) {\n            return false;\n        }\n        // beyond this point we know this is a DM\n\n        if (space === MetaSpace.Home) {\n            // these spaces contain all DMs\n            return true;\n        }\n\n        if (\n            !isMetaSpace(space) &&\n            this.getSpaceFilteredUserIds(space, includeDescendantSpaces)?.has(dmPartner) &&\n            SettingsStore.getValue(\"Spaces.showPeopleInSpace\", space)\n        ) {\n            return true;\n        }\n\n        return false;\n    }\n\n    // get all rooms in a space\n    // including descendant spaces\n    public getSpaceFilteredRoomIds = (\n        space: SpaceKey,\n        includeDescendantSpaces = true,\n        useCache = true,\n    ): Set<string> => {\n        if (space === MetaSpace.Home && this.allRoomsInHome) {\n            return new Set(\n                this.matrixClient!.getVisibleRooms(this._msc3946ProcessDynamicPredecessor).map((r) => r.roomId),\n            );\n        }\n\n        // meta spaces never have descendants\n        // and the aggregate cache is not managed for meta spaces\n        if (!includeDescendantSpaces || isMetaSpace(space)) {\n            return this.roomIdsBySpace.get(space) || new Set();\n        }\n\n        return this.getAggregatedRoomIdsBySpace(this.roomIdsBySpace, this.childSpacesBySpace, space, useCache);\n    };\n\n    public getSpaceFilteredUserIds = (\n        space: SpaceKey,\n        includeDescendantSpaces = true,\n        useCache = true,\n    ): Set<string> | undefined => {\n        if (space === MetaSpace.Home && this.allRoomsInHome) {\n            return undefined;\n        }\n        if (isMetaSpace(space)) {\n            return undefined;\n        }\n\n        // meta spaces never have descendants\n        // and the aggregate cache is not managed for meta spaces\n        if (!includeDescendantSpaces || isMetaSpace(space)) {\n            return this.userIdsBySpace.get(space) || new Set();\n        }\n\n        return this.getAggregatedUserIdsBySpace(this.userIdsBySpace, this.childSpacesBySpace, space, useCache);\n    };\n\n    private getAggregatedRoomIdsBySpace = flattenSpaceHierarchyWithCache(this._aggregatedSpaceCache.roomIdsBySpace);\n    private getAggregatedUserIdsBySpace = flattenSpaceHierarchyWithCache(this._aggregatedSpaceCache.userIdsBySpace);\n\n    private markTreeChildren = (rootSpace: Room, unseen: Set<Room>): void => {\n        const stack = [rootSpace];\n        while (stack.length) {\n            const space = stack.pop()!;\n            unseen.delete(space);\n            this.getChildSpaces(space.roomId).forEach((space) => {\n                if (unseen.has(space)) {\n                    stack.push(space);\n                }\n            });\n        }\n    };\n\n    private findRootSpaces = (joinedSpaces: Room[]): Room[] => {\n        // exclude invited spaces from unseenChildren as they will be forcibly shown at the top level of the treeview\n        const unseenSpaces = new Set(joinedSpaces);\n\n        joinedSpaces.forEach((space) => {\n            this.getChildSpaces(space.roomId).forEach((subspace) => {\n                unseenSpaces.delete(subspace);\n            });\n        });\n\n        // Consider any spaces remaining in unseenSpaces as root,\n        // given they are not children of any known spaces.\n        // The hierarchy from these roots may not yet be exhaustive due to the possibility of full-cycles.\n        const rootSpaces = Array.from(unseenSpaces);\n\n        // Next we need to determine the roots of any remaining full-cycles.\n        // We sort spaces by room ID to force the cycle breaking to be deterministic.\n        const detachedNodes = new Set<Room>(sortBy(joinedSpaces, (space) => space.roomId));\n\n        // Mark any nodes which are children of our existing root spaces as attached.\n        rootSpaces.forEach((rootSpace) => {\n            this.markTreeChildren(rootSpace, detachedNodes);\n        });\n\n        // Handle spaces forming fully cyclical relationships.\n        // In order, assume each remaining detachedNode is a root unless it has already\n        // been claimed as the child of prior detached node.\n        // Work from a copy of the detachedNodes set as it will be mutated as part of this operation.\n        // TODO consider sorting by number of in-refs to favour nodes with fewer parents.\n        Array.from(detachedNodes).forEach((detachedNode) => {\n            if (!detachedNodes.has(detachedNode)) return; // already claimed, skip\n            // declare this detached node a new root, find its children, without ever looping back to it\n            rootSpaces.push(detachedNode); // consider this node a new root space\n            this.markTreeChildren(detachedNode, detachedNodes); // declare this node and its children attached\n        });\n\n        return rootSpaces;\n    };\n\n    private rebuildSpaceHierarchy = (): void => {\n        if (!this.matrixClient) return;\n        const visibleSpaces = this.matrixClient\n            .getVisibleRooms(this._msc3946ProcessDynamicPredecessor)\n            .filter((r) => r.isSpaceRoom());\n        const [joinedSpaces, invitedSpaces] = visibleSpaces.reduce(\n            ([joined, invited], s) => {\n                switch (getEffectiveMembership(s.getMyMembership())) {\n                    case EffectiveMembership.Join:\n                        joined.push(s);\n                        break;\n                    case EffectiveMembership.Invite:\n                        invited.push(s);\n                        break;\n                }\n                return [joined, invited];\n            },\n            [[], []] as [Room[], Room[]],\n        );\n\n        const rootSpaces = this.findRootSpaces(joinedSpaces);\n        const oldRootSpaces = this.rootSpaces;\n        this.rootSpaces = this.sortRootSpaces(rootSpaces);\n\n        this.onRoomsUpdate();\n\n        if (arrayHasOrderChange(oldRootSpaces, this.rootSpaces)) {\n            this.emit(UPDATE_TOP_LEVEL_SPACES, this.spacePanelSpaces, this.enabledMetaSpaces);\n        }\n\n        const oldInvitedSpaces = this._invitedSpaces;\n        this._invitedSpaces = new Set(this.sortRootSpaces(invitedSpaces));\n        if (setHasDiff(oldInvitedSpaces, this._invitedSpaces)) {\n            this.emit(UPDATE_INVITED_SPACES, this.invitedSpaces);\n        }\n    };\n\n    private rebuildParentMap = (): void => {\n        if (!this.matrixClient) return;\n        const joinedSpaces = this.matrixClient.getVisibleRooms(this._msc3946ProcessDynamicPredecessor).filter((r) => {\n            return r.isSpaceRoom() && r.getMyMembership() === KnownMembership.Join;\n        });\n\n        this.parentMap = new EnhancedMap<string, Set<string>>();\n        joinedSpaces.forEach((space) => {\n            const children = this.getChildren(space.roomId);\n            children.forEach((child) => {\n                this.parentMap.getOrCreate(child.roomId, new Set()).add(space.roomId);\n            });\n        });\n\n        PosthogAnalytics.instance.setProperty(\"numSpaces\", joinedSpaces.length);\n    };\n\n    private rebuildHomeSpace = (): void => {\n        if (this.allRoomsInHome) {\n            // this is a special-case to not have to maintain a set of all rooms\n            this.roomIdsBySpace.delete(MetaSpace.Home);\n        } else {\n            const rooms = new Set(\n                this.matrixClient!.getVisibleRooms(this._msc3946ProcessDynamicPredecessor)\n                    .filter(this.showInHomeSpace)\n                    .map((r) => r.roomId),\n            );\n            this.roomIdsBySpace.set(MetaSpace.Home, rooms);\n        }\n\n        if (this.activeSpace === MetaSpace.Home) {\n            this.switchSpaceIfNeeded();\n        }\n    };\n\n    private rebuildMetaSpaces = (): void => {\n        if (!this.matrixClient) return;\n        const enabledMetaSpaces = new Set(this.enabledMetaSpaces);\n        const visibleRooms = this.matrixClient.getVisibleRooms(this._msc3946ProcessDynamicPredecessor);\n\n        if (enabledMetaSpaces.has(MetaSpace.Home)) {\n            this.rebuildHomeSpace();\n        } else {\n            this.roomIdsBySpace.delete(MetaSpace.Home);\n        }\n\n        // The People metaspace doesn't need maintaining\n\n        // Populate the orphans space if the Home space is enabled as it is a superset of it.\n        // Home is effectively a super set of People + Orphans with the addition of having all invites too.\n        if (enabledMetaSpaces.has(MetaSpace.Orphans) || enabledMetaSpaces.has(MetaSpace.Home)) {\n            const orphans = visibleRooms.filter((r) => {\n                // filter out DMs and rooms with >0 parents\n                return !this.parentMap.get(r.roomId)?.size && !DMRoomMap.shared().getUserIdForRoomId(r.roomId);\n            });\n            this.roomIdsBySpace.set(MetaSpace.Orphans, new Set(orphans.map((r) => r.roomId)));\n        }\n\n        if (isMetaSpace(this.activeSpace)) {\n            this.switchSpaceIfNeeded();\n        }\n    };\n\n    private updateNotificationStates = (spaces?: SpaceKey[]): void => {\n        if (!this.matrixClient) return;\n        const enabledMetaSpaces = new Set(this.enabledMetaSpaces);\n        const visibleRooms = this.matrixClient.getVisibleRooms(this._msc3946ProcessDynamicPredecessor);\n\n        let dmBadgeSpace: MetaSpace | undefined;\n        // only show badges on home\n        if (enabledMetaSpaces.has(MetaSpace.Home)) {\n            dmBadgeSpace = MetaSpace.Home;\n        }\n\n        if (!spaces) {\n            spaces = [...this.roomIdsBySpace.keys()];\n            if (enabledMetaSpaces.has(MetaSpace.Home) && !this.allRoomsInHome) {\n                spaces.push(MetaSpace.Home);\n            }\n        }\n\n        spaces.forEach((s) => {\n            if (this.allRoomsInHome && s === MetaSpace.Home) return; // we'll be using the global notification state, skip\n\n            const flattenedRoomsForSpace = this.getSpaceFilteredRoomIds(s, true);\n\n            // Update NotificationStates\n            this.getNotificationState(s).setRooms(\n                visibleRooms.filter((room) => {\n                    if (room.isSpaceRoom() || !flattenedRoomsForSpace.has(room.roomId)) return false;\n\n                    if (dmBadgeSpace && DMRoomMap.shared().getUserIdForRoomId(room.roomId)) {\n                        return s === dmBadgeSpace;\n                    }\n\n                    return true;\n                }),\n            );\n        });\n    };\n\n    private showInHomeSpace = (room: Room): boolean => {\n        if (this.allRoomsInHome) return true;\n        if (room.isSpaceRoom()) return false;\n        return (\n            !this.parentMap.get(room.roomId)?.size || // put all orphaned rooms in the Home Space\n            !!DMRoomMap.shared().getUserIdForRoomId(room.roomId) || // put all DMs in the Home Space\n            room.getMyMembership() === KnownMembership.Invite\n        ); // put all invites in the Home Space\n    };\n\n    private static isInSpace(member?: RoomMember | null): boolean {\n        return member?.membership === KnownMembership.Join || member?.membership === KnownMembership.Invite;\n    }\n\n    // Method for resolving the impact of a single user's membership change in the given Space and its hierarchy\n    private onMemberUpdate = (space: Room, userId: string): void => {\n        const inSpace = SpaceStore.isInSpace(space.getMember(userId));\n\n        if (inSpace) {\n            this.userIdsBySpace.get(space.roomId)?.add(userId);\n        } else {\n            this.userIdsBySpace.get(space.roomId)?.delete(userId);\n        }\n\n        // bust cache\n        this._aggregatedSpaceCache.userIdsBySpace.clear();\n\n        const affectedParentSpaceIds = this.getKnownParents(space.roomId, true);\n        this.emit(space.roomId);\n        affectedParentSpaceIds.forEach((spaceId) => this.emit(spaceId));\n\n        if (!inSpace) {\n            // switch space if the DM is no longer considered part of the space\n            this.switchSpaceIfNeeded();\n        }\n    };\n\n    private onRoomsUpdate = (): void => {\n        if (!this.matrixClient) return;\n        const visibleRooms = this.matrixClient.getVisibleRooms(this._msc3946ProcessDynamicPredecessor);\n\n        const prevRoomsBySpace = this.roomIdsBySpace;\n        const prevUsersBySpace = this.userIdsBySpace;\n        const prevChildSpacesBySpace = this.childSpacesBySpace;\n\n        this.roomIdsBySpace = new Map();\n        this.userIdsBySpace = new Map();\n        this.childSpacesBySpace = new Map();\n\n        this.rebuildParentMap();\n        // mutates this.roomIdsBySpace\n        this.rebuildMetaSpaces();\n\n        const hiddenChildren = new EnhancedMap<string, Set<string>>();\n        visibleRooms.forEach((room) => {\n            if (!([KnownMembership.Join, KnownMembership.Invite] as Array<string>).includes(room.getMyMembership()))\n                return;\n            this.getParents(room.roomId).forEach((parent) => {\n                hiddenChildren.getOrCreate(parent.roomId, new Set()).add(room.roomId);\n            });\n        });\n\n        this.rootSpaces.forEach((s) => {\n            // traverse each space tree in DFS to build up the supersets as you go up,\n            // reusing results from like subtrees.\n            const traverseSpace = (\n                spaceId: string,\n                parentPath: Set<string>,\n            ): [Set<string>, Set<string>] | undefined => {\n                if (parentPath.has(spaceId)) return; // prevent cycles\n                // reuse existing results if multiple similar branches exist\n                if (this.roomIdsBySpace.has(spaceId) && this.userIdsBySpace.has(spaceId)) {\n                    return [this.roomIdsBySpace.get(spaceId)!, this.userIdsBySpace.get(spaceId)!];\n                }\n\n                const [childSpaces, childRooms] = partitionSpacesAndRooms(this.getChildren(spaceId));\n\n                this.childSpacesBySpace.set(spaceId, new Set(childSpaces.map((space) => space.roomId)));\n\n                const roomIds = new Set(childRooms.map((r) => r.roomId));\n\n                const space = this.matrixClient?.getRoom(spaceId);\n                const userIds = new Set(\n                    space\n                        ?.getMembers()\n                        .filter((m) => {\n                            return m.membership === KnownMembership.Join || m.membership === KnownMembership.Invite;\n                        })\n                        .map((m) => m.userId),\n                );\n\n                const newPath = new Set(parentPath).add(spaceId);\n\n                childSpaces.forEach((childSpace) => {\n                    traverseSpace(childSpace.roomId, newPath);\n                });\n                hiddenChildren.get(spaceId)?.forEach((roomId) => {\n                    roomIds.add(roomId);\n                });\n\n                // Expand room IDs to all known versions of the given rooms\n                const expandedRoomIds = new Set(\n                    Array.from(roomIds).flatMap((roomId) => {\n                        return this.matrixClient!.getRoomUpgradeHistory(\n                            roomId,\n                            true,\n                            this._msc3946ProcessDynamicPredecessor,\n                        ).map((r) => r.roomId);\n                    }),\n                );\n\n                this.roomIdsBySpace.set(spaceId, expandedRoomIds);\n\n                this.userIdsBySpace.set(spaceId, userIds);\n                return [expandedRoomIds, userIds];\n            };\n\n            traverseSpace(s.roomId, new Set());\n        });\n\n        const roomDiff = mapDiff(prevRoomsBySpace, this.roomIdsBySpace);\n        const userDiff = mapDiff(prevUsersBySpace, this.userIdsBySpace);\n        const spaceDiff = mapDiff(prevChildSpacesBySpace, this.childSpacesBySpace);\n        // filter out keys which changed by reference only by checking whether the sets differ\n        const roomsChanged = roomDiff.changed.filter((k) => {\n            return setHasDiff(prevRoomsBySpace.get(k)!, this.roomIdsBySpace.get(k)!);\n        });\n        const usersChanged = userDiff.changed.filter((k) => {\n            return setHasDiff(prevUsersBySpace.get(k)!, this.userIdsBySpace.get(k)!);\n        });\n        const spacesChanged = spaceDiff.changed.filter((k) => {\n            return setHasDiff(prevChildSpacesBySpace.get(k)!, this.childSpacesBySpace.get(k)!);\n        });\n\n        const changeSet = new Set([\n            ...roomDiff.added,\n            ...userDiff.added,\n            ...spaceDiff.added,\n            ...roomDiff.removed,\n            ...userDiff.removed,\n            ...spaceDiff.removed,\n            ...roomsChanged,\n            ...usersChanged,\n            ...spacesChanged,\n        ]);\n\n        const affectedParents = Array.from(changeSet).flatMap((changedId) => [\n            ...this.getKnownParents(changedId, true),\n        ]);\n        affectedParents.forEach((parentId) => changeSet.add(parentId));\n        // bust aggregate cache\n        this._aggregatedSpaceCache.roomIdsBySpace.clear();\n        this._aggregatedSpaceCache.userIdsBySpace.clear();\n\n        changeSet.forEach((k) => {\n            this.emit(k);\n        });\n\n        if (changeSet.has(this.activeSpace)) {\n            this.switchSpaceIfNeeded();\n        }\n\n        this.updateNotificationStates([...changeSet]);\n    };\n\n    private switchSpaceIfNeeded = (roomId = this.sdkContext.roomViewStore.getRoomId()): void => {\n        if (!roomId) return;\n        if (!this.isRoomInSpace(this.activeSpace, roomId) && !this.matrixClient?.getRoom(roomId)?.isSpaceRoom()) {\n            this.switchToRelatedSpace(roomId);\n        }\n    };\n\n    private switchToRelatedSpace = (roomId: string): void => {\n        if (this.suggestedRooms.find((r) => r.room_id === roomId)) return;\n\n        // try to find the canonical parent first\n        let parent: SpaceKey | undefined = this.getCanonicalParent(roomId)?.roomId;\n\n        // otherwise, try to find a root space which contains this room\n        if (!parent) {\n            parent = this.rootSpaces.find((s) => this.isRoomInSpace(s.roomId, roomId))?.roomId;\n        }\n\n        // otherwise, try to find a metaspace which contains this room\n        if (!parent) {\n            // search meta spaces in reverse as Home is the first and least specific one\n            parent = [...this.enabledMetaSpaces].reverse().find((s) => this.isRoomInSpace(s, roomId));\n        }\n\n        // don't trigger a context switch when we are switching a space to match the chosen room\n        if (parent) {\n            this.setActiveSpace(parent, false);\n        } else {\n            this.goToFirstSpace();\n        }\n    };\n\n    private onRoom = (room: Room, newMembership?: string, oldMembership?: string): void => {\n        const roomMembership = room.getMyMembership();\n        if (!roomMembership) {\n            // room is still being baked in the js-sdk, we'll process it at Room.myMembership instead\n            return;\n        }\n        const membership = newMembership || roomMembership;\n\n        if (!room.isSpaceRoom()) {\n            this.onRoomsUpdate();\n\n            if (membership === KnownMembership.Join) {\n                // the user just joined a room, remove it from the suggested list if it was there\n                const numSuggestedRooms = this._suggestedRooms.length;\n                this._suggestedRooms = this._suggestedRooms.filter((r) => r.room_id !== room.roomId);\n                if (numSuggestedRooms !== this._suggestedRooms.length) {\n                    this.emit(UPDATE_SUGGESTED_ROOMS, this._suggestedRooms);\n                    // If the suggested room was present in the list then we know we don't need to switch space\n                    return;\n                }\n\n                // if the room currently being viewed was just joined then switch to its related space\n                if (\n                    newMembership === KnownMembership.Join &&\n                    room.roomId === this.sdkContext.roomViewStore.getRoomId()\n                ) {\n                    this.switchSpaceIfNeeded(room.roomId);\n                }\n            }\n            return;\n        }\n\n        // Space\n        if (membership === KnownMembership.Invite) {\n            const len = this._invitedSpaces.size;\n            this._invitedSpaces.add(room);\n            if (len !== this._invitedSpaces.size) {\n                this.emit(UPDATE_INVITED_SPACES, this.invitedSpaces);\n            }\n        } else if (oldMembership === KnownMembership.Invite && membership !== KnownMembership.Join) {\n            if (this._invitedSpaces.delete(room)) {\n                this.emit(UPDATE_INVITED_SPACES, this.invitedSpaces);\n            }\n        } else {\n            this.rebuildSpaceHierarchy();\n            // fire off updates to all parent listeners\n            this.parentMap.get(room.roomId)?.forEach((parentId) => {\n                this.emit(parentId);\n            });\n            this.emit(room.roomId);\n        }\n\n        if (membership === KnownMembership.Join && room.roomId === this.sdkContext.roomViewStore.getRoomId()) {\n            // if the user was looking at the space and then joined: select that space\n            this.setActiveSpace(room.roomId, false);\n        } else if (membership === KnownMembership.Leave && room.roomId === this.activeSpace) {\n            // user's active space has gone away, go back to home\n            this.goToFirstSpace(true);\n        }\n    };\n\n    private notifyIfOrderChanged(): void {\n        const rootSpaces = this.sortRootSpaces(this.rootSpaces);\n        if (arrayHasOrderChange(this.rootSpaces, rootSpaces)) {\n            this.rootSpaces = rootSpaces;\n            this.emit(UPDATE_TOP_LEVEL_SPACES, this.spacePanelSpaces, this.enabledMetaSpaces);\n        }\n    }\n\n    private onRoomState = (ev: MatrixEvent): void => {\n        const room = this.matrixClient?.getRoom(ev.getRoomId());\n\n        if (!this.matrixClient || !room) return;\n\n        switch (ev.getType()) {\n            case EventType.SpaceChild: {\n                const target = this.matrixClient.getRoom(ev.getStateKey());\n\n                if (room.isSpaceRoom()) {\n                    if (target?.isSpaceRoom()) {\n                        this.rebuildSpaceHierarchy();\n                        this.emit(target.roomId);\n                    } else {\n                        this.onRoomsUpdate();\n                    }\n                    this.emit(room.roomId);\n                }\n\n                if (\n                    room.roomId === this.activeSpace && // current space\n                    target?.getMyMembership() !== KnownMembership.Join && // target not joined\n                    ev.getPrevContent().suggested !== ev.getContent().suggested // suggested flag changed\n                ) {\n                    this.loadSuggestedRooms(room);\n                }\n\n                break;\n            }\n\n            case EventType.SpaceParent:\n                // TODO rebuild the space parent and not the room - check permissions?\n                // TODO confirm this after implementing parenting behaviour\n                if (room.isSpaceRoom()) {\n                    this.rebuildSpaceHierarchy();\n                } else {\n                    this.onRoomsUpdate();\n                }\n                this.emit(room.roomId);\n                break;\n\n            case EventType.RoomPowerLevels:\n                if (room.isSpaceRoom()) {\n                    this.onRoomsUpdate();\n                }\n                break;\n            case EventType.RoomCreate:\n                // The room might become a video room. We need to tag it for that videoRooms space.\n                this.onRoomsUpdate();\n                break;\n        }\n    };\n\n    // listening for m.room.member events in onRoomState above doesn't work as the Member object isn't updated by then\n    private onRoomStateMembers = (ev: MatrixEvent): void => {\n        const room = this.matrixClient?.getRoom(ev.getRoomId());\n\n        const userId = ev.getStateKey()!;\n        if (\n            room?.isSpaceRoom() && // only consider space rooms\n            DMRoomMap.shared().getDMRoomsForUserId(userId).length > 0 && // only consider members we have a DM with\n            ev.getPrevContent().membership !== ev.getContent().membership // only consider when membership changes\n        ) {\n            this.onMemberUpdate(room, userId);\n        }\n    };\n\n    private onRoomAccountData = (ev: MatrixEvent, room: Room, lastEv?: MatrixEvent): void => {\n        if (room.isSpaceRoom() && ev.getType() === EventType.SpaceOrder) {\n            this.spaceOrderLocalEchoMap.delete(room.roomId); // clear any local echo\n            const order = ev.getContent()?.order;\n            const lastOrder = lastEv?.getContent()?.order;\n            if (order !== lastOrder) {\n                this.notifyIfOrderChanged();\n            }\n        }\n    };\n\n    private onRoomDmChange(room: Room, isDm: boolean): void {\n        const enabledMetaSpaces = new Set(this.enabledMetaSpaces);\n\n        if (!this.allRoomsInHome && enabledMetaSpaces.has(MetaSpace.Home)) {\n            const homeRooms = this.roomIdsBySpace.get(MetaSpace.Home);\n            if (this.showInHomeSpace(room)) {\n                homeRooms?.add(room.roomId);\n            } else if (!this.roomIdsBySpace.get(MetaSpace.Orphans)?.has(room.roomId)) {\n                this.roomIdsBySpace.get(MetaSpace.Home)?.delete(room.roomId);\n            }\n\n            this.emit(MetaSpace.Home);\n        }\n\n        if (enabledMetaSpaces.has(MetaSpace.Orphans) || enabledMetaSpaces.has(MetaSpace.Home)) {\n            if (isDm && this.roomIdsBySpace.get(MetaSpace.Orphans)?.delete(room.roomId)) {\n                this.emit(MetaSpace.Orphans);\n                this.emit(MetaSpace.Home);\n            }\n        }\n    }\n\n    private onAccountData = (ev: MatrixEvent, prevEv?: MatrixEvent): void => {\n        if (ev.getType() === EventType.Direct) {\n            const previousRooms = new Set(Object.values(prevEv?.getContent<Record<string, string[]>>() ?? {}).flat());\n            const currentRooms = new Set(Object.values(ev.getContent<Record<string, string[]>>()).flat());\n\n            const diff = setDiff(previousRooms, currentRooms);\n            [...diff.added, ...diff.removed].forEach((roomId) => {\n                const room = this.matrixClient?.getRoom(roomId);\n                if (room) {\n                    this.onRoomDmChange(room, currentRooms.has(roomId));\n                }\n            });\n\n            if (diff.removed.length > 0) {\n                this.switchSpaceIfNeeded();\n            }\n        }\n    };\n\n    protected async reset(): Promise<void> {\n        this.rootSpaces = [];\n        this.parentMap = new EnhancedMap();\n        this.notificationStateMap = new Map();\n        this.roomIdsBySpace = new Map();\n        this.userIdsBySpace = new Map();\n        this._aggregatedSpaceCache.roomIdsBySpace.clear();\n        this._aggregatedSpaceCache.userIdsBySpace.clear();\n        this._activeSpace = MetaSpace.Home; // set properly by onReady\n        this._suggestedRooms = [];\n        this._invitedSpaces = new Set();\n        this._enabledMetaSpaces = [];\n    }\n\n    protected async onNotReady(): Promise<void> {\n        if (this.matrixClient) {\n            this.matrixClient.removeListener(ClientEvent.Room, this.onRoom);\n            this.matrixClient.removeListener(RoomEvent.MyMembership, this.onRoom);\n            this.matrixClient.removeListener(RoomEvent.AccountData, this.onRoomAccountData);\n            this.matrixClient.removeListener(RoomStateEvent.Events, this.onRoomState);\n            this.matrixClient.removeListener(RoomStateEvent.Members, this.onRoomStateMembers);\n            this.matrixClient.removeListener(ClientEvent.AccountData, this.onAccountData);\n        }\n        await this.reset();\n    }\n\n    protected async onReady(): Promise<void> {\n        if (!this.matrixClient) return;\n        this.matrixClient.on(ClientEvent.Room, this.onRoom);\n        this.matrixClient.on(RoomEvent.MyMembership, this.onRoom);\n        this.matrixClient.on(RoomEvent.AccountData, this.onRoomAccountData);\n        this.matrixClient.on(RoomStateEvent.Events, this.onRoomState);\n        this.matrixClient.on(RoomStateEvent.Members, this.onRoomStateMembers);\n        this.matrixClient.on(ClientEvent.AccountData, this.onAccountData);\n\n        const oldMetaSpaces = this._enabledMetaSpaces;\n        const enabledMetaSpaces = SettingsStore.getValue(\"Spaces.enabledMetaSpaces\");\n        this._enabledMetaSpaces = metaSpaceOrder.filter((k) => enabledMetaSpaces[k]);\n\n        this._allRoomsInHome = SettingsStore.getValue(\"Spaces.allRoomsInHome\");\n        this.sendUserProperties();\n\n        this.rebuildSpaceHierarchy(); // trigger an initial update\n        // rebuildSpaceHierarchy will only send an update if the spaces have changed.\n        // If only the meta spaces have changed, we need to send an update ourselves.\n        if (arrayHasDiff(oldMetaSpaces, this._enabledMetaSpaces)) {\n            this.emit(UPDATE_TOP_LEVEL_SPACES, this.spacePanelSpaces, this.enabledMetaSpaces);\n        }\n\n        // restore selected state from last session if any and still valid\n        const lastSpaceId = window.localStorage.getItem(ACTIVE_SPACE_LS_KEY) as MetaSpace;\n        const valid =\n            lastSpaceId &&\n            (ModuleApi.instance.extras.spacePanelItems.has(lastSpaceId) ||\n                (!isMetaSpace(lastSpaceId) ? this.matrixClient.getRoom(lastSpaceId) : enabledMetaSpaces[lastSpaceId]));\n        if (valid) {\n            // don't context switch here as it may break permalinks\n            this.setActiveSpace(lastSpaceId, false);\n        } else {\n            this.switchSpaceIfNeeded();\n        }\n        this._storeReadyDeferred.resolve();\n    }\n\n    private sendUserProperties(): void {\n        const enabled = new Set(this.enabledMetaSpaces);\n        PosthogAnalytics.instance.setProperty(\"WebMetaSpaceHomeEnabled\", enabled.has(MetaSpace.Home));\n        PosthogAnalytics.instance.setProperty(\"WebMetaSpaceHomeAllRooms\", this.allRoomsInHome);\n        PosthogAnalytics.instance.setProperty(\"WebMetaSpaceOrphansEnabled\", enabled.has(MetaSpace.Orphans));\n    }\n\n    private goToFirstSpace(contextSwitch = false): void {\n        this.setActiveSpace(this.enabledMetaSpaces[0] ?? this.spacePanelSpaces[0]?.roomId, contextSwitch);\n    }\n\n    protected async onAction(payload: SpaceStoreActions): Promise<void> {\n        if (!this.matrixClient) return;\n\n        switch (payload.action) {\n            case Action.ViewRoom: {\n                // Don't auto-switch rooms when reacting to a context-switch or for new rooms being created\n                // as this is not helpful and can create loops of rooms/space switching\n                const isSpace = payload.justCreatedOpts?.roomType === RoomType.Space;\n                if (payload.context_switch || (payload.justCreatedOpts && !isSpace)) break;\n                let roomId = payload.room_id;\n\n                if (payload.room_alias && !roomId) {\n                    const result = getCachedRoomIdForAlias(payload.room_alias);\n                    if (result) roomId = result.roomId;\n                }\n\n                if (!roomId) return; // we'll get re-fired with the room ID shortly\n\n                const room = this.matrixClient.getRoom(roomId);\n                if (room?.isSpaceRoom()) {\n                    // Don't context switch when navigating to the space room\n                    // as it will cause you to end up in the wrong room\n                    this.setActiveSpace(room.roomId, false);\n                } else {\n                    this.switchSpaceIfNeeded(roomId);\n                }\n\n                // Persist last viewed room from a space\n                // we don't await setActiveSpace above as we only care about this.activeSpace being up to date\n                // synchronously for the below code - everything else can and should be async.\n                window.localStorage.setItem(getSpaceContextKey(this.activeSpace), payload.room_id ?? \"\");\n                break;\n            }\n\n            case Action.ViewHomePage:\n                if (!payload.context_switch && this.enabledMetaSpaces.includes(MetaSpace.Home)) {\n                    this.setActiveSpace(MetaSpace.Home, false);\n                    window.localStorage.setItem(getSpaceContextKey(this.activeSpace), \"\");\n                }\n                break;\n\n            case Action.AfterLeaveRoom:\n                if (!isMetaSpace(this._activeSpace) && payload.room_id === this._activeSpace) {\n                    // User has left the current space, go to first space\n                    this.goToFirstSpace(true);\n                }\n                break;\n\n            case Action.SwitchSpace: {\n                // Metaspaces start at 1, Spaces follow\n                if (payload.num < 1 || payload.num > 9) break;\n                const numMetaSpaces = this.enabledMetaSpaces.length;\n                if (payload.num <= numMetaSpaces) {\n                    this.setActiveSpace(this.enabledMetaSpaces[payload.num - 1]);\n                } else if (this.spacePanelSpaces.length > payload.num - numMetaSpaces - 1) {\n                    this.setActiveSpace(this.spacePanelSpaces[payload.num - numMetaSpaces - 1].roomId);\n                }\n                break;\n            }\n\n            case Action.SettingUpdated: {\n                switch (payload.settingName) {\n                    case \"Spaces.allRoomsInHome\": {\n                        const newValue = SettingsStore.getValue(\"Spaces.allRoomsInHome\");\n                        if (this.allRoomsInHome !== newValue) {\n                            this._allRoomsInHome = newValue;\n                            if (this.enabledMetaSpaces.includes(MetaSpace.Home)) {\n                                this.rebuildHomeSpace();\n                            }\n                            this.sendUserProperties();\n                            this.emit(UPDATE_HOME_BEHAVIOUR, this.allRoomsInHome);\n                        }\n                        break;\n                    }\n\n                    case \"Spaces.enabledMetaSpaces\": {\n                        const newValue = SettingsStore.getValue(\"Spaces.enabledMetaSpaces\");\n                        const enabledMetaSpaces = metaSpaceOrder.filter((k) => newValue[k]);\n                        if (arrayHasDiff(this._enabledMetaSpaces, enabledMetaSpaces)) {\n                            const hadHomeEnabled = this.enabledMetaSpaces.some((s) => s === MetaSpace.Home);\n                            this._enabledMetaSpaces = enabledMetaSpaces;\n                            const hasHomeEnabled = this.enabledMetaSpaces.some((s) => s === MetaSpace.Home);\n\n                            // if a metaspace currently being viewed was removed, go to another one\n                            if (isMetaSpace(this.activeSpace) && !newValue[this.activeSpace]) {\n                                this.switchSpaceIfNeeded();\n                            }\n                            this.rebuildMetaSpaces();\n\n                            if (hadHomeEnabled !== hasHomeEnabled) {\n                                // in this case we have to rebuild everything as DM badges will move to/from real spaces\n                                this.updateNotificationStates();\n                            } else {\n                                this.updateNotificationStates(enabledMetaSpaces);\n                            }\n\n                            this.emit(UPDATE_TOP_LEVEL_SPACES, this.spacePanelSpaces, this.enabledMetaSpaces);\n                            this.sendUserProperties();\n                        }\n                        break;\n                    }\n\n                    case \"Spaces.showPeopleInSpace\":\n                        if (payload.roomId) {\n                            // getSpaceFilteredUserIds will return the appropriate value\n                            this.emit(payload.roomId);\n                            if (!this.enabledMetaSpaces.some((s) => s === MetaSpace.Home)) {\n                                this.updateNotificationStates([payload.roomId]);\n                            }\n                        }\n                        break;\n\n                    case \"feature_dynamic_room_predecessors\":\n                        this._msc3946ProcessDynamicPredecessor = SettingsStore.getValue(\n                            \"feature_dynamic_room_predecessors\",\n                        );\n                        this.rebuildSpaceHierarchy();\n                        break;\n                }\n            }\n        }\n    }\n\n    public getNotificationState(key: SpaceKey): SpaceNotificationState {\n        if (this.notificationStateMap.has(key)) {\n            return this.notificationStateMap.get(key)!;\n        }\n\n        const state = new SpaceNotificationState();\n        this.notificationStateMap.set(key, state);\n        return state;\n    }\n\n    // traverse space tree with DFS calling fn on each space including the given root one,\n    // if includeRooms is true then fn will be called on each leaf room, if it is present in multiple sub-spaces\n    // then fn will be called with it multiple times.\n    public traverseSpace(\n        spaceId: string,\n        fn: (roomId: string) => void,\n        includeRooms = false,\n        parentPath?: Set<string>,\n    ): void {\n        if (parentPath && parentPath.has(spaceId)) return; // prevent cycles\n\n        fn(spaceId);\n\n        const newPath = new Set(parentPath).add(spaceId);\n        const [childSpaces, childRooms] = partitionSpacesAndRooms(this.getChildren(spaceId));\n\n        if (includeRooms) {\n            childRooms.forEach((r) => fn(r.roomId));\n        }\n        childSpaces.forEach((s) => this.traverseSpace(s.roomId, fn, includeRooms, newPath));\n    }\n\n    private getSpaceTagOrdering = (space: Room): string | undefined => {\n        if (this.spaceOrderLocalEchoMap.has(space.roomId)) return this.spaceOrderLocalEchoMap.get(space.roomId);\n        return validOrder(space.getAccountData(EventType.SpaceOrder)?.getContent()?.order);\n    };\n\n    private sortRootSpaces(spaces: Room[]): Room[] {\n        return sortBy(spaces, [this.getSpaceTagOrdering, \"roomId\"]);\n    }\n\n    private async setRootSpaceOrder(space: Room, order: string): Promise<void> {\n        this.spaceOrderLocalEchoMap.set(space.roomId, order);\n        try {\n            await this.matrixClient?.setRoomAccountData(space.roomId, EventType.SpaceOrder, { order });\n        } catch (e) {\n            logger.warn(\"Failed to set root space order\", e);\n            if (this.spaceOrderLocalEchoMap.get(space.roomId) === order) {\n                this.spaceOrderLocalEchoMap.delete(space.roomId);\n            }\n        }\n    }\n\n    public moveRootSpace(fromIndex: number, toIndex: number): void {\n        const currentOrders = this.rootSpaces.map(this.getSpaceTagOrdering);\n        const changes = reorderLexicographically(currentOrders, fromIndex, toIndex);\n\n        changes.forEach(({ index, order }) => {\n            this.setRootSpaceOrder(this.rootSpaces[index], order);\n        });\n\n        this.notifyIfOrderChanged();\n    }\n}\n","/*\n * Copyright 2024 New Vector Ltd.\n * Copyright 2020-2022 The Matrix.org Foundation C.I.C.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type IWidgetApiRequest } from \"matrix-widget-api\";\n\nexport enum ElementWidgetActions {\n    // All of these actions are currently specific to Jitsi and Element Call\n    JoinCall = \"io.element.join\",\n    HangupCall = \"im.vector.hangup\",\n    Close = \"io.element.close\",\n    CallParticipants = \"io.element.participants\",\n    StartLiveStream = \"im.vector.start_live_stream\",\n\n    // Actions for switching layouts\n    TileLayout = \"io.element.tile_layout\",\n    SpotlightLayout = \"io.element.spotlight_layout\",\n\n    OpenIntegrationManager = \"integration_manager_open\",\n    /**\n     * @deprecated Use MSC2931 instead\n     */\n    ViewRoom = \"io.element.view_room\",\n\n    // This action type is used as a `fromWidget` and a `toWidget` action.\n    // fromWidget: updates the client about the current device mute state\n    // toWidget: the client requests a specific device mute configuration\n    //   The reply will always be the resulting configuration\n    //   It is possible to sent an empty configuration to retrieve the current values or\n    //   just one of the fields to update that particular value\n    //   An undefined field means that EC will keep the mute state as is.\n    //   -> this will allow the client to only get the current state\n    //\n    // The data of the widget action request and the response are:\n    // {\n    //   audio_enabled?: boolean,\n    //   video_enabled?: boolean\n    // }\n    // NOTE: this is currently unused. Its only here to make EW aware\n    // of this action so it does not throw errors.\n    DeviceMute = \"io.element.device_mute\",\n}\n\nexport interface IHangupCallApiRequest extends IWidgetApiRequest {\n    data: {\n        errorMessage?: string;\n    };\n}\n\n/**\n * @deprecated Use MSC2931 instead\n */\nexport interface IViewRoomApiRequest extends IWidgetApiRequest {\n    data: {\n        room_id: string; // eslint-disable-line camelcase\n    };\n}\n","/*\n * Copyright 2024 New Vector Ltd.\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nexport enum ElementWidgetCapabilities {\n    /**\n     * @deprecated Use MSC2931 instead.\n     */\n    CanChangeViewedRoom = \"io.element.view_room\",\n    /**\n     * Ask Element to not give the option to move the widget into a separate tab.\n     * This replaces RequiresClient in MatrixCapabilities.\n     */\n    RequiresClient = \"io.element.requires_client\",\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\nCopyright 2019 Travis Ralston\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEventHandler } from \"react\";\nimport { type Widget, type WidgetKind } from \"matrix-widget-api\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { Form, SettingsToggleInput } from \"@vector-im/compound-web\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { OIDCState } from \"../../../stores/widgets/WidgetPermissionStore\";\nimport BaseDialog from \"./BaseDialog\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport { SDKContextClass } from \"../../../contexts/SDKContextClass\";\n\ninterface IProps {\n    widget: Widget;\n    widgetKind: WidgetKind;\n    inRoomId?: string;\n    onFinished(allowed?: boolean): void;\n}\n\ninterface IState {\n    rememberSelection: boolean;\n}\n\nexport default class WidgetOpenIDPermissionsDialog extends React.PureComponent<IProps, IState> {\n    public constructor(props: IProps) {\n        super(props);\n\n        this.state = {\n            rememberSelection: false,\n        };\n    }\n\n    private onAllow = (): void => {\n        this.onPermissionSelection(true);\n    };\n\n    private onDeny = (): void => {\n        this.onPermissionSelection(false);\n    };\n\n    private onPermissionSelection(allowed: boolean): void {\n        if (this.state.rememberSelection) {\n            logger.log(`Remembering ${this.props.widget.id} as allowed=${allowed} for OpenID`);\n\n            SDKContextClass.instance.widgetPermissionStore.setOIDCState(\n                this.props.widget,\n                this.props.widgetKind,\n                this.props.inRoomId,\n                allowed ? OIDCState.Allowed : OIDCState.Denied,\n            );\n        }\n\n        this.props.onFinished(allowed);\n    }\n\n    private onRememberSelectionChange: ChangeEventHandler<HTMLInputElement> = (evt): void => {\n        this.setState({ rememberSelection: evt.target.checked });\n    };\n\n    public render(): React.ReactNode {\n        return (\n            <BaseDialog\n                className=\"mx_WidgetOpenIDPermissionsDialog\"\n                hasCancel={true}\n                onFinished={this.props.onFinished}\n                title={_t(\"widget|open_id_permissions_dialog|title\")}\n            >\n                <div className=\"mx_WidgetOpenIDPermissionsDialog_content\">\n                    <p>{_t(\"widget|open_id_permissions_dialog|starting_text\")}</p>\n                    <p className=\"text-muted\">\n                        {/* cheap trim to just get the path */}\n                        {this.props.widget.templateUrl.split(\"?\")[0].split(\"#\")[0]}\n                    </p>\n                </div>\n                <DialogButtons\n                    primaryButton={_t(\"action|continue\")}\n                    onPrimaryButtonClick={this.onAllow}\n                    onCancel={this.onDeny}\n                    additive={\n                        <Form.Root\n                            onSubmit={(evt) => {\n                                evt.preventDefault();\n                                evt.stopPropagation();\n                            }}\n                        >\n                            <SettingsToggleInput\n                                name=\"remember-selection\"\n                                checked={this.state.rememberSelection}\n                                onChange={this.onRememberSelectionChange}\n                                label={_t(\"widget|open_id_permissions_dialog|remember_selection\")}\n                            />\n                        </Form.Root>\n                    }\n                />\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020, 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n    type Capability,\n    EventDirection,\n    EventKind,\n    getTimelineRoomIDFromCapability,\n    isTimelineCapability,\n    isTimelineCapabilityFor,\n    MatrixCapabilities,\n    Symbols,\n    WidgetEventCapability,\n    WidgetKind,\n} from \"matrix-widget-api\";\nimport { EventType, MsgType } from \"matrix-js-sdk/src/matrix\";\nimport React from \"react\";\n\nimport { _t, _td, type TranslatedString } from \"../languageHandler\";\nimport { ElementWidgetCapabilities } from \"../stores/widgets/ElementWidgetCapabilities\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport TextWithTooltip from \"../components/views/elements/TextWithTooltip\";\n\ntype GENERIC_WIDGET_KIND = \"generic\"; // eslint-disable-line @typescript-eslint/naming-convention\nconst GENERIC_WIDGET_KIND: GENERIC_WIDGET_KIND = \"generic\";\n\ntype SendRecvStaticCapText = Partial<\n    Record<\n        EventType | string,\n        Partial<Record<WidgetKind | GENERIC_WIDGET_KIND, Record<EventDirection, TranslationKey>>>\n    >\n>;\n\nexport interface TranslatedCapabilityText {\n    primary: TranslatedString;\n    byline?: TranslatedString;\n}\n\nexport class CapabilityText {\n    private static simpleCaps: Record<Capability, Partial<Record<WidgetKind | GENERIC_WIDGET_KIND, TranslationKey>>> = {\n        [MatrixCapabilities.AlwaysOnScreen]: {\n            [WidgetKind.Room]: _td(\"widget|capability|always_on_screen_viewing_another_room\"),\n            [GENERIC_WIDGET_KIND]: _td(\"widget|capability|always_on_screen_generic\"),\n        },\n        [MatrixCapabilities.StickerSending]: {\n            [WidgetKind.Room]: _td(\"widget|capability|send_stickers_this_room\"),\n            [GENERIC_WIDGET_KIND]: _td(\"widget|capability|send_stickers_active_room\"),\n        },\n        [ElementWidgetCapabilities.CanChangeViewedRoom]: {\n            [GENERIC_WIDGET_KIND]: _td(\"widget|capability|switch_room\"),\n        },\n        [MatrixCapabilities.MSC2931Navigate]: {\n            [GENERIC_WIDGET_KIND]: _td(\"widget|capability|switch_room_message_user\"),\n        },\n        [MatrixCapabilities.MSC4039DownloadFile]: {\n            [GENERIC_WIDGET_KIND]: _td(\"widget|capability|download_file\"),\n        },\n    };\n\n    private static stateSendRecvCaps: SendRecvStaticCapText = {\n        [EventType.RoomTopic]: {\n            [WidgetKind.Room]: {\n                [EventDirection.Send]: _td(\"widget|capability|change_topic_this_room\"),\n                [EventDirection.Receive]: _td(\"widget|capability|see_topic_change_this_room\"),\n            },\n            [GENERIC_WIDGET_KIND]: {\n                [EventDirection.Send]: _td(\"widget|capability|change_topic_active_room\"),\n                [EventDirection.Receive]: _td(\"widget|capability|see_topic_change_active_room\"),\n            },\n        },\n        [EventType.RoomName]: {\n            [WidgetKind.Room]: {\n                [EventDirection.Send]: _td(\"widget|capability|change_name_this_room\"),\n                [EventDirection.Receive]: _td(\"widget|capability|see_name_change_this_room\"),\n            },\n            [GENERIC_WIDGET_KIND]: {\n                [EventDirection.Send]: _td(\"widget|capability|change_name_active_room\"),\n                [EventDirection.Receive]: _td(\"widget|capability|see_name_change_active_room\"),\n            },\n        },\n        [EventType.RoomAvatar]: {\n            [WidgetKind.Room]: {\n                [EventDirection.Send]: _td(\"widget|capability|change_avatar_this_room\"),\n                [EventDirection.Receive]: _td(\"widget|capability|see_avatar_change_this_room\"),\n            },\n            [GENERIC_WIDGET_KIND]: {\n                [EventDirection.Send]: _td(\"widget|capability|change_avatar_active_room\"),\n                [EventDirection.Receive]: _td(\"widget|capability|see_avatar_change_active_room\"),\n            },\n        },\n        [EventType.RoomMember]: {\n            [WidgetKind.Room]: {\n                [EventDirection.Send]: _td(\"widget|capability|remove_ban_invite_leave_this_room\"),\n                [EventDirection.Receive]: _td(\"widget|capability|receive_membership_this_room\"),\n            },\n            [GENERIC_WIDGET_KIND]: {\n                [EventDirection.Send]: _td(\"widget|capability|remove_ban_invite_leave_active_room\"),\n                [EventDirection.Receive]: _td(\"widget|capability|receive_membership_active_room\"),\n            },\n        },\n    };\n\n    private static nonStateSendRecvCaps: SendRecvStaticCapText = {\n        [EventType.Sticker]: {\n            [WidgetKind.Room]: {\n                [EventDirection.Send]: _td(\"widget|capability|send_stickers_this_room_as_you\"),\n                [EventDirection.Receive]: _td(\"widget|capability|see_sticker_posted_this_room\"),\n            },\n            [GENERIC_WIDGET_KIND]: {\n                [EventDirection.Send]: _td(\"widget|capability|send_stickers_active_room_as_you\"),\n                [EventDirection.Receive]: _td(\"widget|capability|see_sticker_posted_active_room\"),\n            },\n        },\n    };\n\n    private static bylineFor(eventCap: WidgetEventCapability): TranslatedString {\n        if (eventCap.kind === EventKind.State) {\n            return !eventCap.keyStr\n                ? _t(\"widget|capability|byline_empty_state_key\")\n                : _t(\"widget|capability|byline_state_key\", { stateKey: eventCap.keyStr });\n        }\n        return null; // room messages are handled specially\n    }\n\n    public static for(capability: Capability, kind: WidgetKind): TranslatedCapabilityText {\n        // TODO: Support MSC3819 (to-device capabilities)\n\n        // First see if we have a super simple line of text to provide back\n        if (CapabilityText.simpleCaps[capability]) {\n            const textForKind = CapabilityText.simpleCaps[capability];\n            if (textForKind[kind]) return { primary: _t(textForKind[kind]!) };\n            if (textForKind[GENERIC_WIDGET_KIND]) return { primary: _t(textForKind[GENERIC_WIDGET_KIND]) };\n\n            // ... we'll fall through to the generic capability processing at the end of this\n            // function if we fail to generate a string for the capability.\n        }\n\n        // Try to handle timeline capabilities. The text here implies that the caller has sorted\n        // the timeline caps to the end for UI purposes.\n        if (isTimelineCapability(capability)) {\n            if (isTimelineCapabilityFor(capability, Symbols.AnyRoom)) {\n                return { primary: _t(\"widget|capability|any_room\") };\n            } else {\n                const roomId = getTimelineRoomIDFromCapability(capability);\n                const room = MatrixClientPeg.safeGet().getRoom(roomId);\n                return {\n                    primary: _t(\n                        \"widget|capability|specific_room\",\n                        {},\n                        {\n                            Room: () => {\n                                if (room) {\n                                    return (\n                                        <TextWithTooltip tooltip={room.getCanonicalAlias() ?? roomId}>\n                                            <strong>{room.name}</strong>\n                                        </TextWithTooltip>\n                                    );\n                                } else {\n                                    return (\n                                        <strong>\n                                            <code>{roomId}</code>\n                                        </strong>\n                                    );\n                                }\n                            },\n                        },\n                    ),\n                };\n            }\n        }\n\n        // We didn't have a super simple line of text, so try processing the capability as the\n        // more complex event send/receive permission type.\n        const [eventCap] = WidgetEventCapability.findEventCapabilities([capability]);\n        if (eventCap) {\n            // Special case room messages so they show up a bit cleaner to the user. Result is\n            // effectively \"Send images\" instead of \"Send messages... of type images\" if we were\n            // to handle the msgtype nuances in this function.\n            if (eventCap.kind === EventKind.Event && eventCap.eventType === EventType.RoomMessage) {\n                return CapabilityText.forRoomMessageCap(eventCap, kind);\n            }\n\n            // See if we have a static line of text to provide for the given event type and\n            // direction. The hope is that we do for common event types for friendlier copy.\n            const evSendRecv =\n                eventCap.kind === EventKind.State\n                    ? CapabilityText.stateSendRecvCaps\n                    : CapabilityText.nonStateSendRecvCaps;\n            if (evSendRecv[eventCap.eventType]) {\n                const textForKind = evSendRecv[eventCap.eventType];\n                const textForDirection = textForKind?.[kind] || textForKind?.[GENERIC_WIDGET_KIND];\n                if (textForDirection?.[eventCap.direction]) {\n                    return {\n                        primary: _t(textForDirection[eventCap.direction]),\n                        // no byline because we would have already represented the event properly\n                    };\n                }\n            }\n\n            // We don't have anything simple, so just return a generic string for the event cap\n            if (kind === WidgetKind.Room) {\n                if (eventCap.direction === EventDirection.Send) {\n                    return {\n                        primary: _t(\n                            \"widget|capability|send_event_type_this_room\",\n                            {\n                                eventType: eventCap.eventType,\n                            },\n                            {\n                                b: (sub) => <strong>{sub}</strong>,\n                            },\n                        ),\n                        byline: CapabilityText.bylineFor(eventCap),\n                    };\n                } else {\n                    return {\n                        primary: _t(\n                            \"widget|capability|see_event_type_sent_this_room\",\n                            {\n                                eventType: eventCap.eventType,\n                            },\n                            {\n                                b: (sub) => <strong>{sub}</strong>,\n                            },\n                        ),\n                        byline: CapabilityText.bylineFor(eventCap),\n                    };\n                }\n            } else {\n                // assume generic\n                if (eventCap.direction === EventDirection.Send) {\n                    return {\n                        primary: _t(\n                            \"widget|capability|send_event_type_active_room\",\n                            {\n                                eventType: eventCap.eventType,\n                            },\n                            {\n                                b: (sub) => <strong>{sub}</strong>,\n                            },\n                        ),\n                        byline: CapabilityText.bylineFor(eventCap),\n                    };\n                } else {\n                    return {\n                        primary: _t(\n                            \"widget|capability|see_event_type_sent_active_room\",\n                            {\n                                eventType: eventCap.eventType,\n                            },\n                            {\n                                b: (sub) => <strong>{sub}</strong>,\n                            },\n                        ),\n                        byline: CapabilityText.bylineFor(eventCap),\n                    };\n                }\n            }\n        }\n\n        // We don't have enough context to render this capability specially, so we'll present it as-is\n        return {\n            primary: _t(\n                \"widget|capability|capability\",\n                { capability },\n                {\n                    b: (sub) => <strong>{sub}</strong>,\n                },\n            ),\n        };\n    }\n\n    private static forRoomMessageCap(eventCap: WidgetEventCapability, kind: WidgetKind): TranslatedCapabilityText {\n        // First handle the case of \"all messages\" to make the switch later on a bit clearer\n        if (!eventCap.keyStr) {\n            if (eventCap.direction === EventDirection.Send) {\n                return {\n                    primary:\n                        kind === WidgetKind.Room\n                            ? _t(\"widget|capability|send_messages_this_room\")\n                            : _t(\"widget|capability|send_messages_active_room\"),\n                };\n            } else {\n                return {\n                    primary:\n                        kind === WidgetKind.Room\n                            ? _t(\"widget|capability|see_messages_sent_this_room\")\n                            : _t(\"widget|capability|see_messages_sent_active_room\"),\n                };\n            }\n        }\n\n        // Now handle all the message types we care about. There are more message types available, however\n        // they are not as common so we don't bother rendering them. They'll fall into the generic case.\n        switch (eventCap.keyStr) {\n            case MsgType.Text: {\n                if (eventCap.direction === EventDirection.Send) {\n                    return {\n                        primary:\n                            kind === WidgetKind.Room\n                                ? _t(\"widget|capability|send_text_messages_this_room\")\n                                : _t(\"widget|capability|send_text_messages_active_room\"),\n                    };\n                } else {\n                    return {\n                        primary:\n                            kind === WidgetKind.Room\n                                ? _t(\"widget|capability|see_text_messages_sent_this_room\")\n                                : _t(\"widget|capability|see_text_messages_sent_active_room\"),\n                    };\n                }\n            }\n            case MsgType.Emote: {\n                if (eventCap.direction === EventDirection.Send) {\n                    return {\n                        primary:\n                            kind === WidgetKind.Room\n                                ? _t(\"widget|capability|send_emotes_this_room\")\n                                : _t(\"widget|capability|send_emotes_active_room\"),\n                    };\n                } else {\n                    return {\n                        primary:\n                            kind === WidgetKind.Room\n                                ? _t(\"widget|capability|see_sent_emotes_this_room\")\n                                : _t(\"widget|capability|see_sent_emotes_active_room\"),\n                    };\n                }\n            }\n            case MsgType.Image: {\n                if (eventCap.direction === EventDirection.Send) {\n                    return {\n                        primary:\n                            kind === WidgetKind.Room\n                                ? _t(\"widget|capability|send_images_this_room\")\n                                : _t(\"widget|capability|send_images_active_room\"),\n                    };\n                } else {\n                    return {\n                        primary:\n                            kind === WidgetKind.Room\n                                ? _t(\"widget|capability|see_images_sent_this_room\")\n                                : _t(\"widget|capability|see_images_sent_active_room\"),\n                    };\n                }\n            }\n            case MsgType.Video: {\n                if (eventCap.direction === EventDirection.Send) {\n                    return {\n                        primary:\n                            kind === WidgetKind.Room\n                                ? _t(\"widget|capability|send_videos_this_room\")\n                                : _t(\"widget|capability|send_videos_active_room\"),\n                    };\n                } else {\n                    return {\n                        primary:\n                            kind === WidgetKind.Room\n                                ? _t(\"widget|capability|see_videos_sent_this_room\")\n                                : _t(\"widget|capability|see_videos_sent_active_room\"),\n                    };\n                }\n            }\n            case MsgType.File: {\n                if (eventCap.direction === EventDirection.Send) {\n                    return {\n                        primary:\n                            kind === WidgetKind.Room\n                                ? _t(\"widget|capability|send_files_this_room\")\n                                : _t(\"widget|capability|send_files_active_room\"),\n                    };\n                } else {\n                    return {\n                        primary:\n                            kind === WidgetKind.Room\n                                ? _t(\"widget|capability|see_sent_files_this_room\")\n                                : _t(\"widget|capability|see_sent_files_active_room\"),\n                    };\n                }\n            }\n            default: {\n                let primary: TranslatedString;\n                if (eventCap.direction === EventDirection.Send) {\n                    if (kind === WidgetKind.Room) {\n                        primary = _t(\n                            \"widget|capability|send_msgtype_this_room\",\n                            {\n                                msgtype: eventCap.keyStr,\n                            },\n                            {\n                                b: (sub) => <strong>{sub}</strong>,\n                            },\n                        );\n                    } else {\n                        primary = _t(\n                            \"widget|capability|send_msgtype_active_room\",\n                            {\n                                msgtype: eventCap.keyStr,\n                            },\n                            {\n                                b: (sub) => <strong>{sub}</strong>,\n                            },\n                        );\n                    }\n                } else {\n                    if (kind === WidgetKind.Room) {\n                        primary = _t(\n                            \"widget|capability|see_msgtype_sent_this_room\",\n                            {\n                                msgtype: eventCap.keyStr,\n                            },\n                            {\n                                b: (sub) => <strong>{sub}</strong>,\n                            },\n                        );\n                    } else {\n                        primary = _t(\n                            \"widget|capability|see_msgtype_sent_active_room\",\n                            {\n                                msgtype: eventCap.keyStr,\n                            },\n                            {\n                                b: (sub) => <strong>{sub}</strong>,\n                            },\n                        );\n                    }\n                }\n                return { primary };\n            }\n        }\n    }\n}\n","/*\nCopyright 2024,2025 New Vector Ltd.\nCopyright 2020, 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ChangeEventHandler } from \"react\";\nimport { type Capability, isTimelineCapability, WidgetEventCapability, type WidgetKind } from \"matrix-widget-api\";\nimport { lexicographicCompare } from \"matrix-js-sdk/src/utils\";\nimport { Form, SettingsToggleInput } from \"@vector-im/compound-web\";\n\nimport BaseDialog from \"./BaseDialog\";\nimport { _t } from \"../../../languageHandler\";\nimport { objectShallowClone } from \"../../../utils/objects\";\nimport StyledCheckbox from \"../elements/StyledCheckbox\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport { CapabilityText } from \"../../../widgets/CapabilityText\";\n\ninterface IProps {\n    requestedCapabilities: Set<Capability>;\n    widgetKind: WidgetKind; // TODO: Refactor into the Widget class\n    onFinished(result?: { approved: Capability[]; remember: boolean }): void;\n}\n\ntype BooleanStates = Partial<{\n    [capability in Capability]: boolean;\n}>;\n\ninterface IState {\n    booleanStates: BooleanStates;\n    rememberSelection: boolean;\n}\n\nexport default class WidgetCapabilitiesPromptDialog extends React.PureComponent<IProps, IState> {\n    private eventPermissionsMap = new Map<Capability, WidgetEventCapability>();\n\n    public constructor(props: IProps) {\n        super(props);\n\n        const parsedEvents = WidgetEventCapability.findEventCapabilities(this.props.requestedCapabilities);\n        parsedEvents.forEach((e) => this.eventPermissionsMap.set(e.raw, e));\n\n        const states: BooleanStates = {};\n        this.props.requestedCapabilities.forEach((c) => (states[c] = true));\n\n        this.state = {\n            booleanStates: states,\n            rememberSelection: true,\n        };\n    }\n\n    private onToggle = (capability: Capability): void => {\n        const newStates = objectShallowClone(this.state.booleanStates);\n        newStates[capability] = !newStates[capability];\n        this.setState({ booleanStates: newStates });\n    };\n\n    private onRememberSelectionChange: ChangeEventHandler<HTMLInputElement> = (evt): void => {\n        this.setState({ rememberSelection: evt.target.checked });\n    };\n\n    private onSubmit = async (): Promise<void> => {\n        this.closeAndTryRemember(\n            Object.entries(this.state.booleanStates)\n                .filter(([_, isSelected]) => isSelected)\n                .map(([cap]) => cap),\n        );\n    };\n\n    private onReject = async (): Promise<void> => {\n        this.closeAndTryRemember([]); // nothing was approved\n    };\n\n    private closeAndTryRemember(approved: Capability[]): void {\n        this.props.onFinished({ approved, remember: this.state.rememberSelection });\n    }\n\n    public render(): React.ReactNode {\n        // We specifically order the timeline capabilities down to the bottom. The capability text\n        // generation cares strongly about this.\n        const orderedCapabilities = Object.entries(this.state.booleanStates).sort(([capA], [capB]) => {\n            const isTimelineA = isTimelineCapability(capA);\n            const isTimelineB = isTimelineCapability(capB);\n\n            // Sort timeline capabilities to the bottom, non-timeline to the top\n            if (isTimelineA !== isTimelineB) {\n                return isTimelineA ? 1 : -1;\n            }\n\n            // Both are the same type (both timeline or both non-timeline), sort lexicographically\n            return lexicographicCompare(capA, capB);\n        });\n        const checkboxRows = orderedCapabilities.map(([cap, isChecked], i) => {\n            const text = CapabilityText.for(cap, this.props.widgetKind);\n\n            return (\n                <div className=\"mx_WidgetCapabilitiesPromptDialog_cap\" key={cap + i}>\n                    <StyledCheckbox\n                        checked={isChecked}\n                        onChange={() => this.onToggle(cap)}\n                        description={text.byline}\n                        formWrap={false}\n                    >\n                        {text.primary}\n                    </StyledCheckbox>\n                </div>\n            );\n        });\n\n        return (\n            <BaseDialog\n                className=\"mx_WidgetCapabilitiesPromptDialog\"\n                onFinished={this.props.onFinished}\n                title={_t(\"widget|capabilities_dialog|title\")}\n            >\n                <Form.Root onSubmit={this.onSubmit}>\n                    <div className=\"mx_Dialog_content\">\n                        <div className=\"text-muted\">{_t(\"widget|capabilities_dialog|content_starting_text\")}</div>\n                        {checkboxRows}\n                        <DialogButtons\n                            primaryButton={_t(\"action|approve\")}\n                            cancelButton={_t(\"widget|capabilities_dialog|decline_all_permission\")}\n                            onPrimaryButtonClick={this.onSubmit}\n                            onCancel={this.onReject}\n                            additive={\n                                <SettingsToggleInput\n                                    name=\"remember-selection\"\n                                    checked={this.state.rememberSelection}\n                                    onChange={this.onRememberSelectionChange}\n                                    label={_t(\"widget|capabilities_dialog|remember_Selection\")}\n                                />\n                            }\n                        />\n                    </div>\n                </Form.Root>\n            </BaseDialog>\n        );\n    }\n}\n","/*\n * Copyright 2024 New Vector Ltd.\n * Copyright 2020-2023 The Matrix.org Foundation C.I.C.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport {\n    type Capability,\n    EventDirection,\n    type IOpenIDCredentials,\n    type IOpenIDUpdate,\n    type ISendDelayedEventDetails,\n    type ISendEventDetails,\n    type ITurnServer,\n    type IReadEventRelationsResult,\n    type IRoomEvent,\n    MatrixCapabilities,\n    OpenIDRequestState,\n    type SimpleObservable,\n    type Widget,\n    WidgetDriver,\n    WidgetEventCapability,\n    WidgetKind,\n    type IWidgetApiErrorResponseDataDetails,\n    type ISearchUserDirectoryResult,\n    type IGetMediaConfigResult,\n} from \"matrix-widget-api\";\nimport {\n    ClientEvent,\n    type ITurnServer as IClientTurnServer,\n    EventType,\n    type IContent,\n    MatrixError,\n    Direction,\n    THREAD_RELATION_TYPE,\n    type SendDelayedEventResponse,\n    type StateEvents,\n    type TimelineEvents,\n    type Room,\n    type SendDelayedEventRequestOpts,\n    type MatrixClient,\n} from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport {\n    type ApprovalOpts,\n    type CapabilitiesOpts,\n    WidgetLifecycle,\n} from \"@matrix-org/react-sdk-module-api/lib/lifecycles/WidgetLifecycle\";\n\nimport { iterableDiff, iterableIntersection } from \"../../utils/iterables\";\nimport { MatrixClientPeg } from \"../../MatrixClientPeg\";\nimport Modal from \"../../Modal\";\nimport WidgetOpenIDPermissionsDialog from \"../../components/views/dialogs/WidgetOpenIDPermissionsDialog\";\nimport WidgetCapabilitiesPromptDialog from \"../../components/views/dialogs/WidgetCapabilitiesPromptDialog\";\nimport { WidgetPermissionCustomisations } from \"../../customisations/WidgetPermissions\";\nimport { OIDCState } from \"./WidgetPermissionStore\";\nimport { WidgetType } from \"../../widgets/WidgetType\";\nimport { CHAT_EFFECTS } from \"../../effects\";\nimport { containsEmoji } from \"../../effects/utils\";\nimport dis from \"../../dispatcher/dispatcher\";\nimport { ElementWidgetCapabilities } from \"./ElementWidgetCapabilities\";\nimport { navigateToPermalink } from \"../../utils/permalinks/navigator\";\nimport { SDKContextClass } from \"../../contexts/SDKContextClass\";\nimport { ModuleRunner } from \"../../modules/ModuleRunner\";\nimport { ModuleApi } from \"../../modules/Api\";\nimport { toWidgetDescriptor } from \"../../modules/WidgetLifecycleApi\";\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport { mediaFromMxc } from \"../../customisations/Media\";\n\nfunction getRememberedCapabilitiesForWidget(widget: Widget): Capability[] {\n    return JSON.parse(localStorage.getItem(`widget_${widget.id}_approved_caps`) || \"[]\");\n}\n\nfunction setRememberedCapabilitiesForWidget(widget: Widget, caps: Capability[]): void {\n    localStorage.setItem(`widget_${widget.id}_approved_caps`, JSON.stringify(caps));\n}\n\nconst normalizeTurnServer = ({ urls, username, credential }: IClientTurnServer): ITurnServer => ({\n    uris: urls,\n    username,\n    password: credential,\n});\n\n/**\n * Element Web's implementation of a widget driver (the object that\n * matrix-widget-api uses to retrieve information from the client and carry out\n * authorized actions on the widget's behalf). Essentially this is a glorified\n * set of callbacks.\n */\n// TODO: Consider alternative designs for matrix-widget-api?\n// Replace with matrix-rust-sdk?\nexport class ElementWidgetDriver extends WidgetDriver {\n    private allowedCapabilities: Set<Capability>;\n\n    // TODO: Refactor widgetKind into the Widget class\n    public constructor(\n        private forWidget: Widget,\n        private forWidgetKind: WidgetKind,\n        virtual: boolean,\n        private inRoomId?: string,\n    ) {\n        super();\n\n        // Always allow screenshots to be taken because it's a client-induced flow. The widget can't\n        // spew screenshots at us and can't request screenshots of us, so it's up to us to provide the\n        // button if the widget says it supports screenshots.\n        this.allowedCapabilities = new Set([MatrixCapabilities.Screenshots, ElementWidgetCapabilities.RequiresClient]);\n\n        // Grant the permissions that are specific to given widget types\n        if (WidgetType.JITSI.matches(this.forWidget.type) && forWidgetKind === WidgetKind.Room) {\n            this.allowedCapabilities.add(MatrixCapabilities.AlwaysOnScreen);\n        } else if (WidgetType.STICKERPICKER.matches(this.forWidget.type) && forWidgetKind === WidgetKind.Account) {\n            const stickerSendingCap = WidgetEventCapability.forRoomEvent(EventDirection.Send, EventType.Sticker).raw;\n            this.allowedCapabilities.add(MatrixCapabilities.StickerSending); // legacy as far as MSC2762 is concerned\n            this.allowedCapabilities.add(stickerSendingCap);\n\n            // Auto-approve the legacy visibility capability. We send it regardless of capability.\n            // Widgets don't technically need to request this capability, but Scalar still does.\n            this.allowedCapabilities.add(\"visibility\");\n        } else if (virtual && WidgetType.CALL.matches(this.forWidget.type) && forWidgetKind === WidgetKind.Room) {\n            // This is a trusted Element Call widget that we control\n            this.allowedCapabilities.add(MatrixCapabilities.AlwaysOnScreen);\n            this.allowedCapabilities.add(MatrixCapabilities.MSC3846TurnServers);\n            this.allowedCapabilities.add(`org.matrix.msc2762.timeline:${inRoomId}`);\n            this.allowedCapabilities.add(MatrixCapabilities.MSC4157SendDelayedEvent);\n            this.allowedCapabilities.add(MatrixCapabilities.MSC4157UpdateDelayedEvent);\n            this.allowedCapabilities.add(MatrixCapabilities.MSC4407SendStickyEvent);\n            this.allowedCapabilities.add(MatrixCapabilities.MSC4407ReceiveStickyEvent);\n            this.allowedCapabilities.add(MatrixCapabilities.MSC4039DownloadFile);\n\n            this.allowedCapabilities.add(\n                WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomName).raw,\n            );\n            this.allowedCapabilities.add(\n                WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomMember).raw,\n            );\n            this.allowedCapabilities.add(\n                WidgetEventCapability.forStateEvent(EventDirection.Receive, \"org.matrix.msc3401.call\").raw,\n            );\n            this.allowedCapabilities.add(\n                WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomEncryption).raw,\n            );\n            const clientUserId = MatrixClientPeg.safeGet().getSafeUserId();\n            // For the legacy membership type\n            this.allowedCapabilities.add(\n                WidgetEventCapability.forStateEvent(EventDirection.Send, \"org.matrix.msc3401.call.member\", clientUserId)\n                    .raw,\n            );\n            const clientDeviceId = MatrixClientPeg.safeGet().getDeviceId();\n            if (clientDeviceId !== null) {\n                // For the session membership type compliant with MSC4143\n                // Note MSC4143 still uses the org.matrix.msc3401 unstable prefix\n                this.allowedCapabilities.add(\n                    WidgetEventCapability.forStateEvent(\n                        EventDirection.Send,\n                        \"org.matrix.msc3401.call.member\",\n                        `_${clientUserId}_${clientDeviceId}`,\n                    ).raw,\n                );\n                this.allowedCapabilities.add(\n                    WidgetEventCapability.forStateEvent(\n                        EventDirection.Send,\n                        \"org.matrix.msc3401.call.member\",\n                        `_${clientUserId}_${clientDeviceId}_m.call`,\n                    ).raw,\n                );\n                // Version with no leading underscore, for room versions whose auth rules allow it\n                this.allowedCapabilities.add(\n                    WidgetEventCapability.forStateEvent(\n                        EventDirection.Send,\n                        \"org.matrix.msc3401.call.member\",\n                        `${clientUserId}_${clientDeviceId}`,\n                    ).raw,\n                );\n                this.allowedCapabilities.add(\n                    WidgetEventCapability.forStateEvent(\n                        EventDirection.Send,\n                        \"org.matrix.msc3401.call.member\",\n                        `${clientUserId}_${clientDeviceId}_m.call`,\n                    ).raw,\n                );\n            }\n            this.allowedCapabilities.add(\n                WidgetEventCapability.forStateEvent(EventDirection.Receive, \"org.matrix.msc3401.call.member\").raw,\n            );\n            // for determining auth rules specific to the room version\n            this.allowedCapabilities.add(\n                WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomCreate).raw,\n            );\n\n            const sendRoomEvents = [EventType.CallNotify, EventType.RTCNotification];\n            const sendRecvRoomEvents = [\n                \"io.element.call.encryption_keys\",\n                \"org.matrix.rageshake_request\",\n                EventType.Reaction,\n                EventType.RoomRedaction,\n                \"io.element.call.reaction\",\n                //  MSC4310: Add dev and final event to ease future transition,\n                EventType.RTCDecline,\n                \"m.rtc.decline\",\n                // MSC4310 The main membership event is sent via a room sticky event.\n                EventType.RTCMembership,\n                \"m.rtc.member\",\n            ];\n            for (const eventType of [...sendRoomEvents, ...sendRecvRoomEvents])\n                this.allowedCapabilities.add(WidgetEventCapability.forRoomEvent(EventDirection.Send, eventType).raw);\n            for (const eventType of sendRecvRoomEvents)\n                this.allowedCapabilities.add(WidgetEventCapability.forRoomEvent(EventDirection.Receive, eventType).raw);\n\n            const sendRecvToDevice = [\n                EventType.CallInvite,\n                EventType.CallCandidates,\n                EventType.CallAnswer,\n                EventType.CallHangup,\n                EventType.CallReject,\n                EventType.CallSelectAnswer,\n                EventType.CallNegotiate,\n                EventType.CallSDPStreamMetadataChanged,\n                EventType.CallSDPStreamMetadataChangedPrefix,\n                EventType.CallReplaces,\n                EventType.CallEncryptionKeysPrefix,\n            ];\n            for (const eventType of sendRecvToDevice) {\n                this.allowedCapabilities.add(\n                    WidgetEventCapability.forToDeviceEvent(EventDirection.Send, eventType).raw,\n                );\n                this.allowedCapabilities.add(\n                    WidgetEventCapability.forToDeviceEvent(EventDirection.Receive, eventType).raw,\n                );\n            }\n\n            // To always allow OIDC requests for element call, the widgetPermissionStore is used:\n            SDKContextClass.instance.widgetPermissionStore.setOIDCState(\n                forWidget,\n                forWidgetKind,\n                inRoomId,\n                OIDCState.Allowed,\n            );\n        }\n    }\n\n    public async validateCapabilities(requested: Set<Capability>): Promise<Set<Capability>> {\n        // Check to see if any capabilities aren't automatically accepted (such as sticker pickers\n        // allowing stickers to be sent). If there are excess capabilities to be approved, the user\n        // will be prompted to accept them.\n        const diff = iterableDiff(requested, this.allowedCapabilities);\n        const missing = new Set(diff.removed); // \"removed\" is \"in A (requested) but not in B (allowed)\"\n        const allowedSoFar = new Set(this.allowedCapabilities);\n        getRememberedCapabilitiesForWidget(this.forWidget).forEach((cap) => {\n            allowedSoFar.add(cap);\n            missing.delete(cap);\n        });\n\n        // Try the new module API first, then fall back to legacy paths\n        let approved: Set<string> | undefined;\n        approved = await ModuleApi.instance.widgetLifecycle.preapproveCapabilities(\n            toWidgetDescriptor(this.forWidget, this.inRoomId),\n            requested,\n        );\n        if (!approved) {\n            if (WidgetPermissionCustomisations.preapproveCapabilities) {\n                approved = await WidgetPermissionCustomisations.preapproveCapabilities(this.forWidget, requested);\n            } else {\n                const opts: CapabilitiesOpts = { approvedCapabilities: undefined };\n                ModuleRunner.instance.invoke(WidgetLifecycle.CapabilitiesRequest, opts, this.forWidget, requested);\n                approved = opts.approvedCapabilities;\n            }\n        }\n        if (approved) {\n            approved.forEach((cap) => {\n                allowedSoFar.add(cap);\n                missing.delete(cap);\n            });\n        }\n\n        // TODO: Do something when the widget requests new capabilities not yet asked for\n        let rememberApproved = false;\n        if (missing.size > 0) {\n            try {\n                const [result] = await Modal.createDialog(WidgetCapabilitiesPromptDialog, {\n                    requestedCapabilities: missing,\n                    widgetKind: this.forWidgetKind,\n                }).finished;\n                result?.approved?.forEach((cap) => allowedSoFar.add(cap));\n                rememberApproved = !!result?.remember;\n            } catch (e) {\n                logger.error(\"Non-fatal error getting capabilities: \", e);\n            }\n        }\n\n        // discard all previously allowed capabilities if they are not requested\n        // TODO: this results in an unexpected behavior when this function is called during the capabilities renegotiation of MSC2974 that will be resolved later.\n        const allAllowed = new Set(iterableIntersection(allowedSoFar, requested));\n\n        if (rememberApproved) {\n            setRememberedCapabilitiesForWidget(this.forWidget, Array.from(allAllowed));\n        }\n\n        return allAllowed;\n    }\n\n    private getSendEventTarget(roomId: string | null = null): { client: MatrixClient; roomId: string } {\n        const client = MatrixClientPeg.safeGet();\n        roomId = roomId || SDKContextClass.instance.roomViewStore.getRoomId() || null;\n        if (!roomId) throw new Error(\"No room specified and no room in RoomViewStore focus.\");\n        return { client, roomId };\n    }\n\n    public async sendEvent<K extends keyof StateEvents>(\n        eventType: K,\n        content: StateEvents[K],\n        stateKey: string | null,\n        targetRoomId: string | null,\n    ): Promise<ISendEventDetails>;\n    public async sendEvent<K extends keyof TimelineEvents>(\n        eventType: K,\n        content: TimelineEvents[K],\n        stateKey: null,\n        targetRoomId: string | null,\n    ): Promise<ISendEventDetails>;\n    public async sendEvent(\n        eventType: string,\n        content: IContent,\n        stateKey: string | null = null,\n        targetRoomId: string | null = null,\n    ): Promise<ISendEventDetails> {\n        const { client, roomId } = this.getSendEventTarget(targetRoomId);\n\n        let r: { event_id: string } | null;\n        if (stateKey !== null) {\n            // state event\n            r = await client.sendStateEvent(\n                roomId,\n                eventType as keyof StateEvents,\n                content as StateEvents[keyof StateEvents],\n                stateKey,\n            );\n        } else if (eventType === EventType.RoomRedaction) {\n            // special case: extract the `redacts` property and call redact\n            r = await client.redactEvent(roomId, content[\"redacts\"]);\n        } else {\n            // message event\n            r = await client.sendEvent(\n                roomId,\n                eventType as keyof TimelineEvents,\n                content as TimelineEvents[keyof TimelineEvents],\n            );\n\n            if (eventType === EventType.RoomMessage) {\n                CHAT_EFFECTS.forEach((effect) => {\n                    if (containsEmoji(content, effect.emojis)) {\n                        // For initial threads launch, chat effects are disabled\n                        // see #19731\n                        const isNotThread = content[\"m.relates_to\"]?.rel_type !== THREAD_RELATION_TYPE.name;\n                        if (isNotThread) {\n                            dis.dispatch({ action: `effects.${effect.command}` });\n                        }\n                    }\n                });\n            }\n        }\n\n        return { roomId, eventId: r.event_id };\n    }\n\n    /**\n     * @experimental Part of MSC4354\n     * @see {@link WidgetDriver#sendStickyEvent}\n     */\n    public async sendStickyEvent(\n        stickyDurationMs: number,\n        eventType: string,\n        content: unknown,\n        targetRoomId?: string | null,\n    ): Promise<ISendEventDetails> {\n        const { client, roomId } = this.getSendEventTarget(targetRoomId);\n\n        const r = await client._unstable_sendStickyEvent(\n            roomId,\n            stickyDurationMs,\n            null,\n            eventType as keyof TimelineEvents,\n            content as TimelineEvents[keyof TimelineEvents] & { msc4354_sticky_key: string },\n        );\n        return { roomId, eventId: r.event_id };\n    }\n\n    public async readStickyEvents(roomId: string): Promise<IRoomEvent[]> {\n        const room = MatrixClientPeg.safeGet().getRoom(roomId);\n        if (!room) {\n            logger.warn(`[ElementWidgetDriver] readStickyEvents: room ${roomId} not found`);\n            return Promise.resolve([]);\n        }\n        const stickyEvents: IRoomEvent[] = [];\n        for (const ev of room._unstable_getStickyEvents()) {\n            stickyEvents.push(ev.getEffectiveEvent() as IRoomEvent);\n        }\n        // Notice that the capability checks are not done here; they are done in the matrix-widget-api.\n        // The ClientWidgetAPI will do the filtering of events based on the capabilities advertised by the driver.\n        return stickyEvents;\n    }\n\n    private getSendDelayedEventOpts(delay: number | null, parentDelayId: string | null): SendDelayedEventRequestOpts {\n        if (delay !== null) {\n            return {\n                delay,\n                ...(parentDelayId !== null && { parent_delay_id: parentDelayId }),\n            };\n        } else if (parentDelayId !== null) {\n            return {\n                parent_delay_id: parentDelayId,\n            };\n        }\n        throw new Error(\"Must provide at least one of delay or parentDelayId\");\n    }\n\n    /**\n     * @experimental Part of MSC4140 & MSC4157\n     * @see {@link WidgetDriver#sendDelayedEvent}\n     */\n    public async sendDelayedEvent<K extends keyof StateEvents>(\n        delay: number | null,\n        parentDelayId: string | null,\n        eventType: K,\n        content: StateEvents[K],\n        stateKey: string | null,\n        targetRoomId: string | null,\n    ): Promise<ISendDelayedEventDetails>;\n    /**\n     * @experimental Part of MSC4140 & MSC4157\n     */\n    public async sendDelayedEvent<K extends keyof TimelineEvents>(\n        delay: number | null,\n        parentDelayId: string | null,\n        eventType: K,\n        content: TimelineEvents[K],\n        stateKey: null,\n        targetRoomId: string | null,\n    ): Promise<ISendDelayedEventDetails>;\n    public async sendDelayedEvent(\n        delay: number | null,\n        parentDelayId: string | null,\n        eventType: string,\n        content: IContent,\n        stateKey: string | null = null,\n        targetRoomId: string | null = null,\n    ): Promise<ISendDelayedEventDetails> {\n        const { client, roomId } = this.getSendEventTarget(targetRoomId);\n        const delayOpts = this.getSendDelayedEventOpts(delay, parentDelayId);\n\n        let r: SendDelayedEventResponse | null;\n        if (stateKey !== null) {\n            // state event\n            r = await client._unstable_sendDelayedStateEvent(\n                roomId,\n                delayOpts,\n                eventType as keyof StateEvents,\n                content as StateEvents[keyof StateEvents],\n                stateKey,\n            );\n        } else {\n            // message event\n            r = await client._unstable_sendDelayedEvent(\n                roomId,\n                delayOpts,\n                null,\n                eventType as keyof TimelineEvents,\n                content as TimelineEvents[keyof TimelineEvents],\n            );\n        }\n\n        return {\n            roomId,\n            delayId: r.delay_id,\n        };\n    }\n\n    /**\n     * @experimental Part of MSC4354\n     * @see {@link WidgetDriver#sendStickyEvent}\n     */\n    public async sendDelayedStickyEvent(\n        delay: number | null,\n        parentDelayId: string | null,\n        stickyDurationMs: number,\n        eventType: string,\n        content: unknown,\n        targetRoomId?: string | null,\n    ): Promise<ISendDelayedEventDetails> {\n        const { client, roomId } = this.getSendEventTarget(targetRoomId);\n        const delayOpts = this.getSendDelayedEventOpts(delay, parentDelayId);\n\n        const r = await client._unstable_sendStickyDelayedEvent(\n            roomId,\n            stickyDurationMs,\n            delayOpts,\n            null,\n            eventType as keyof TimelineEvents,\n            content as TimelineEvents[keyof TimelineEvents] & { msc4354_sticky_key: string },\n        );\n        return { roomId, delayId: r.delay_id };\n    }\n\n    /**\n     * @experimental Part of MSC4140 & MSC4157\n     */\n    public async cancelScheduledDelayedEvent(delayId: string): Promise<void> {\n        const client = MatrixClientPeg.get();\n\n        if (!client) throw new Error(\"Not attached to a client\");\n\n        await client._unstable_cancelScheduledDelayedEvent(delayId);\n    }\n\n    /**\n     * @experimental Part of MSC4140 & MSC4157\n     */\n    public async restartScheduledDelayedEvent(delayId: string): Promise<void> {\n        const client = MatrixClientPeg.get();\n\n        if (!client) throw new Error(\"Not attached to a client\");\n\n        await client._unstable_restartScheduledDelayedEvent(delayId);\n    }\n\n    /**\n     * @experimental Part of MSC4140 & MSC4157\n     */\n    public async sendScheduledDelayedEvent(delayId: string): Promise<void> {\n        const client = MatrixClientPeg.get();\n\n        if (!client) throw new Error(\"Not attached to a client\");\n\n        await client._unstable_sendScheduledDelayedEvent(delayId);\n    }\n\n    /**\n     * Implements {@link WidgetDriver#sendToDevice}\n     */\n    public async sendToDevice(\n        eventType: string,\n        encrypted: boolean,\n        contentMap: { [userId: string]: { [deviceId: string]: object } },\n    ): Promise<void> {\n        const client = MatrixClientPeg.safeGet();\n\n        if (encrypted) {\n            const crypto = client.getCrypto();\n            if (!crypto) throw new Error(\"E2EE not enabled\");\n\n            // attempt to re-batch these up into a single request\n            const invertedContentMap: { [content: string]: { userId: string; deviceId: string }[] } = {};\n\n            for (const userId of Object.keys(contentMap)) {\n                const userContentMap = contentMap[userId];\n                for (const deviceId of Object.keys(userContentMap)) {\n                    const content = userContentMap[deviceId];\n                    const stringifiedContent = JSON.stringify(content);\n                    invertedContentMap[stringifiedContent] = invertedContentMap[stringifiedContent] || [];\n                    invertedContentMap[stringifiedContent].push({ userId, deviceId });\n                }\n            }\n\n            await Promise.all(\n                Object.entries(invertedContentMap).map(async ([stringifiedContent, recipients]) => {\n                    const batch = await crypto.encryptToDeviceMessages(\n                        eventType,\n                        recipients,\n                        JSON.parse(stringifiedContent),\n                    );\n\n                    await client.queueToDevice(batch);\n                }),\n            );\n        } else {\n            await client.queueToDevice({\n                eventType,\n                batch: Object.entries(contentMap).flatMap(([userId, userContentMap]) =>\n                    Object.entries(userContentMap).map(([deviceId, content]) => ({\n                        userId,\n                        deviceId,\n                        payload: content,\n                    })),\n                ),\n            });\n        }\n    }\n\n    /**\n     * Generator function that retrieves events for readRoomTimeline\n     * @param room The room to check the timeline of.\n     * @param eventType The event type to be read.\n     * @param msgtype The msgtype of the events to be read, if applicable/defined.\n     * @param stateKey The state key of the events to be read, if applicable/defined.\n     * @param limit The maximum number of events to retrieve. Will be zero to denote \"as many as\n     * possible\".\n     * @param since When null, retrieves the number of events specified by the \"limit\" parameter.\n     * Otherwise, the event ID at which only subsequent events will be returned, as many as specified\n     * in \"limit\".\n     * @returns A generator that emits events.\n     * @yields IRoomEvents from the room timeline\n     */\n    private *readRoomTimelineIterator(\n        room: Room,\n        eventType: string,\n        msgtype: string | undefined,\n        stateKey: string | undefined,\n        limit: number,\n        since: string | undefined,\n    ): Generator<IRoomEvent, void, void> {\n        let resultCount: number = 0;\n        const events = [...room.getLiveTimeline().getEvents()]; // timelines are most recent last\n        for (let ev = events.pop(); ev && resultCount < limit && ev.getId() !== since; ev = events.pop()) {\n            if (ev.getType() !== eventType) continue;\n            if (eventType === EventType.RoomMessage && msgtype && msgtype !== ev.getContent()[\"msgtype\"]) continue;\n            if (stateKey !== undefined && ev.getStateKey() !== stateKey) continue;\n            yield ev.getEffectiveEvent() as IRoomEvent;\n            resultCount++;\n        }\n    }\n\n    /**\n     * Reads all events of the given type, and optionally `msgtype` (if applicable/defined),\n     * the user has access to. The widget API will have already verified that the widget is\n     * capable of receiving the events. Less events than the limit are allowed to be returned,\n     * but not more.\n     * @param roomId The ID of the room to look within.\n     * @param eventType The event type to be read.\n     * @param msgtype The msgtype of the events to be read, if applicable/defined.\n     * @param stateKey The state key of the events to be read, if applicable/defined.\n     * @param limit The maximum number of events to retrieve. Will be zero to denote \"as many as\n     * possible\".\n     * @param since When null, retrieves the number of events specified by the \"limit\" parameter.\n     * Otherwise, the event ID at which only subsequent events will be returned, as many as specified\n     * in \"limit\".\n     * @returns {Promise<IRoomEvent[]>} Resolves to the room events, or an empty array.\n     */\n    public async readRoomTimeline(\n        roomId: string,\n        eventType: string,\n        msgtype: string | undefined,\n        stateKey: string | undefined,\n        limit: number,\n        since: string | undefined,\n    ): Promise<IRoomEvent[]> {\n        limit = limit > 0 ? Math.min(limit, Number.MAX_SAFE_INTEGER) : Number.MAX_SAFE_INTEGER; // relatively arbitrary\n        const room = MatrixClientPeg.safeGet().getRoom(roomId);\n        if (room === null) return [];\n        return [...this.readRoomTimelineIterator(room, eventType, msgtype, stateKey, limit, since)];\n    }\n\n    /**\n     * Reads the current values of all matching room state entries.\n     * @param roomId The ID of the room.\n     * @param eventType The event type of the entries to be read.\n     * @param stateKey The state key of the entry to be read. If undefined,\n     * all room state entries with a matching event type should be returned.\n     * @returns {Promise<IRoomEvent[]>} Resolves to the events representing the\n     * current values of the room state entries.\n     */\n    public async readRoomState(roomId: string, eventType: string, stateKey: string | undefined): Promise<IRoomEvent[]> {\n        const room = MatrixClientPeg.safeGet().getRoom(roomId);\n        if (room === null) return [];\n        const state = room.getLiveTimeline().getState(Direction.Forward);\n        if (state === undefined) return [];\n\n        if (stateKey === undefined)\n            return state.getStateEvents(eventType).map((e) => e.getEffectiveEvent() as IRoomEvent);\n        const event = state.getStateEvents(eventType, stateKey);\n        return event === null ? [] : [event.getEffectiveEvent() as IRoomEvent];\n    }\n\n    public async askOpenID(observer: SimpleObservable<IOpenIDUpdate>): Promise<void> {\n        // Try the new module API first, then fall back to legacy path\n        let approved: boolean | undefined = await ModuleApi.instance.widgetLifecycle.preapproveIdentity(\n            toWidgetDescriptor(this.forWidget, this.inRoomId),\n        );\n\n        if (!approved) {\n            // Legacy module API fallback\n            const legacyOpts: ApprovalOpts = { approved: undefined };\n            ModuleRunner.instance.invoke(WidgetLifecycle.IdentityRequest, legacyOpts, this.forWidget);\n            approved = legacyOpts.approved;\n        }\n\n        if (approved) {\n            return observer.update({\n                state: OpenIDRequestState.Allowed,\n                token: await MatrixClientPeg.safeGet().getOpenIdToken(),\n            });\n        }\n\n        const oidcState = SDKContextClass.instance.widgetPermissionStore.getOIDCState(\n            this.forWidget,\n            this.forWidgetKind,\n            this.inRoomId,\n        );\n\n        const getToken = (): Promise<IOpenIDCredentials> => {\n            return MatrixClientPeg.safeGet().getOpenIdToken();\n        };\n\n        if (oidcState === OIDCState.Denied) {\n            return observer.update({ state: OpenIDRequestState.Blocked });\n        }\n        if (oidcState === OIDCState.Allowed) {\n            return observer.update({ state: OpenIDRequestState.Allowed, token: await getToken() });\n        }\n\n        observer.update({ state: OpenIDRequestState.PendingUserConfirmation });\n\n        const { finished } = Modal.createDialog(WidgetOpenIDPermissionsDialog, {\n            widget: this.forWidget,\n            widgetKind: this.forWidgetKind,\n            inRoomId: this.inRoomId,\n        });\n        const [confirm] = await finished;\n        if (!confirm) {\n            observer.update({ state: OpenIDRequestState.Blocked });\n        } else {\n            observer.update({ state: OpenIDRequestState.Allowed, token: await getToken() });\n        }\n    }\n\n    public async navigate(uri: string): Promise<void> {\n        navigateToPermalink(uri);\n    }\n\n    public async *getTurnServers(): AsyncGenerator<ITurnServer> {\n        const client = MatrixClientPeg.safeGet();\n        if (!client.pollingTurnServers || !client.getTurnServers().length) return;\n\n        let setTurnServer: (server: ITurnServer) => void;\n        let setError: (error: Error) => void;\n\n        const onTurnServers = ([server]: IClientTurnServer[]): void => setTurnServer(normalizeTurnServer(server));\n        const onTurnServersError = (error: Error, fatal: boolean): void => {\n            if (fatal) setError(error);\n        };\n\n        client.on(ClientEvent.TurnServers, onTurnServers);\n        client.on(ClientEvent.TurnServersError, onTurnServersError);\n\n        try {\n            const initialTurnServer = client.getTurnServers()[0];\n            yield normalizeTurnServer(initialTurnServer);\n\n            // Repeatedly listen for new TURN servers until an error occurs or\n            // the caller stops this generator\n            while (true) {\n                yield await new Promise<ITurnServer>((resolve, reject) => {\n                    setTurnServer = resolve;\n                    setError = reject;\n                });\n            }\n        } finally {\n            // The loop was broken - clean up\n            client.off(ClientEvent.TurnServers, onTurnServers);\n            client.off(ClientEvent.TurnServersError, onTurnServersError);\n        }\n    }\n\n    public async readEventRelations(\n        eventId: string,\n        roomId?: string,\n        relationType?: string,\n        eventType?: string,\n        from?: string,\n        to?: string,\n        limit?: number,\n        direction?: \"f\" | \"b\",\n    ): Promise<IReadEventRelationsResult> {\n        const client = MatrixClientPeg.safeGet();\n        const dir = direction as Direction;\n        roomId = roomId ?? SDKContextClass.instance.roomViewStore.getRoomId() ?? undefined;\n\n        if (typeof roomId !== \"string\") {\n            throw new Error(\"Error while reading the current room\");\n        }\n\n        const { events, nextBatch, prevBatch } = await client.relations(\n            roomId,\n            eventId,\n            relationType ?? null,\n            eventType ?? null,\n            { from, to, limit, dir },\n        );\n\n        return {\n            chunk: events.map((e) => e.getEffectiveEvent() as IRoomEvent),\n            nextBatch: nextBatch ?? undefined,\n            prevBatch: prevBatch ?? undefined,\n        };\n    }\n\n    public async searchUserDirectory(searchTerm: string, limit?: number): Promise<ISearchUserDirectoryResult> {\n        const client = MatrixClientPeg.safeGet();\n\n        const { limited, results } = await client.searchUserDirectory({ term: searchTerm, limit });\n\n        return {\n            limited,\n            results: results.map((r) => ({\n                userId: r.user_id,\n                displayName: r.display_name,\n                avatarUrl: r.avatar_url,\n            })),\n        };\n    }\n\n    public async getMediaConfig(): Promise<IGetMediaConfigResult> {\n        const client = MatrixClientPeg.safeGet();\n\n        return await client.getMediaConfig();\n    }\n\n    public async uploadFile(file: XMLHttpRequestBodyInit): Promise<{ contentUri: string }> {\n        const client = MatrixClientPeg.safeGet();\n\n        const uploadResult = await client.uploadContent(file);\n\n        return { contentUri: uploadResult.content_uri };\n    }\n\n    /**\n     * Download a file from the media repository on the homeserver.\n     *\n     * @param contentUri - the MXC URI of the file to download\n     * @returns an object with: file - response contents as Blob\n     */\n    public async downloadFile(contentUri: string): Promise<{ file: XMLHttpRequestBodyInit }> {\n        const client = MatrixClientPeg.safeGet();\n        const media = mediaFromMxc(contentUri, client);\n        const response = await media.downloadSource();\n        const blob = await response.blob();\n        return { file: blob };\n    }\n\n    /**\n     * Gets the IDs of all joined or invited rooms currently known to the\n     * client.\n     * @returns The room IDs.\n     */\n    public getKnownRooms(): string[] {\n        return MatrixClientPeg.safeGet()\n            .getVisibleRooms(SettingsStore.getValue(\"feature_dynamic_room_predecessors\"))\n            .map((r) => r.roomId);\n    }\n\n    /**\n     * Expresses a {@link MatrixError} as a JSON payload\n     * for use by Widget API error responses.\n     * @param error The error to handle.\n     * @returns The error expressed as a JSON payload,\n     * or undefined if it is not a {@link MatrixError}.\n     */\n    public processError(error: unknown): IWidgetApiErrorResponseDataDetails | undefined {\n        return error instanceof MatrixError ? { matrix_api_error: error.asWidgetApiErrorData() } : undefined;\n    }\n}\n","/*\n * Copyright 2024 New Vector Ltd.\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { arrayDiff, arrayIntersection } from \"./arrays\";\n\nexport function iterableIntersection<T>(a: Iterable<T>, b: Iterable<T>): Iterable<T> {\n    return arrayIntersection(Array.from(a), Array.from(b));\n}\n\nexport function iterableDiff<T>(a: Iterable<T>, b: Iterable<T>): { added: Iterable<T>; removed: Iterable<T> } {\n    return arrayDiff(Array.from(a), Array.from(b));\n}\n","/*\n * Copyright 2024 New Vector Ltd.\n * Copyright 2021 The Matrix.org Foundation C.I.C.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nexport const ELEMENT_CLIENT_ID = \"io.element.web\";\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020, 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport {\n    ClientWidgetApi,\n    type IModalWidgetCloseRequest,\n    type IModalWidgetOpenRequestData,\n    type IModalWidgetReturnData,\n    type ISetModalButtonEnabledActionRequest,\n    type IWidgetApiAcknowledgeResponseData,\n    type IWidgetApiErrorResponseData,\n    BuiltInModalButtonID,\n    type ModalButtonID,\n    ModalButtonKind,\n    type Widget,\n    WidgetApiFromWidgetAction,\n    WidgetKind,\n} from \"matrix-widget-api\";\nimport { ErrorIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport BaseDialog from \"./BaseDialog\";\nimport { _t } from \"../../../languageHandler\";\nimport { getUserLanguage } from \"../../../i18n/settings\";\nimport AccessibleButton, { type AccessibleButtonKind } from \"../elements/AccessibleButton\";\nimport { ElementWidgetDriver } from \"../../../stores/widgets/ElementWidgetDriver\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport { OwnProfileStore } from \"../../../stores/OwnProfileStore\";\nimport { arrayFastClone } from \"../../../utils/arrays\";\nimport { ElementWidget } from \"../../../stores/widgets/WidgetMessaging\";\nimport { ELEMENT_CLIENT_ID } from \"../../../identifiers\";\nimport ThemeWatcher, { ThemeWatcherEvent } from \"../../../settings/watchers/ThemeWatcher\";\n\ninterface IProps {\n    widgetDefinition: IModalWidgetOpenRequestData;\n    widgetRoomId?: string;\n    sourceWidgetId: string;\n    onFinished(success: true, data: IModalWidgetReturnData): void;\n    onFinished(success?: false, data?: void): void;\n}\n\ninterface IState {\n    messaging?: ClientWidgetApi;\n    disabledButtonIds: ModalButtonID[];\n}\n\nconst MAX_BUTTONS = 3;\n\nexport default class ModalWidgetDialog extends React.PureComponent<IProps, IState> {\n    private readonly widget: Widget;\n    private readonly possibleButtons: ModalButtonID[];\n    private appFrame = React.createRef<HTMLIFrameElement>();\n    private readonly themeWatcher = new ThemeWatcher();\n\n    public state: IState = {\n        disabledButtonIds: (this.props.widgetDefinition.buttons || []).filter((b) => b.disabled).map((b) => b.id),\n    };\n\n    public constructor(props: IProps) {\n        super(props);\n\n        this.widget = new ElementWidget({\n            ...this.props.widgetDefinition,\n            creatorUserId: MatrixClientPeg.safeGet().getSafeUserId(),\n            id: `modal_${this.props.sourceWidgetId}`,\n        });\n        this.possibleButtons = (this.props.widgetDefinition.buttons || []).map((b) => b.id);\n    }\n\n    public componentDidMount(): void {\n        const driver = new ElementWidgetDriver(this.widget, WidgetKind.Modal, false);\n        const messaging = new ClientWidgetApi(this.widget, this.appFrame.current!, driver);\n        this.setState({ messaging });\n    }\n\n    public componentWillUnmount(): void {\n        this.themeWatcher.off(ThemeWatcherEvent.Change, this.onThemeChange);\n        this.themeWatcher.stop();\n        if (!this.state.messaging) return;\n        this.state.messaging.off(\"ready\", this.onReady);\n        this.state.messaging.off(`action:${WidgetApiFromWidgetAction.CloseModalWidget}`, this.onWidgetClose);\n        this.state.messaging.stop();\n    }\n\n    private onReady = (): void => {\n        this.themeWatcher.start();\n        this.themeWatcher.on(ThemeWatcherEvent.Change, this.onThemeChange);\n        // Theme may have changed while messaging was starting\n        this.onThemeChange(this.themeWatcher.getEffectiveTheme());\n        this.state.messaging?.sendWidgetConfig(this.props.widgetDefinition);\n    };\n\n    private onLoad = (): void => {\n        if (!this.state.messaging) return;\n        this.state.messaging.once(\"ready\", this.onReady);\n        this.state.messaging.on(`action:${WidgetApiFromWidgetAction.CloseModalWidget}`, this.onWidgetClose);\n        this.state.messaging.on(`action:${WidgetApiFromWidgetAction.SetModalButtonEnabled}`, this.onButtonEnableToggle);\n    };\n\n    private onThemeChange = (theme: string): void => {\n        this.state.messaging?.updateTheme({ name: theme });\n    };\n\n    private onWidgetClose = (ev: CustomEvent<IModalWidgetCloseRequest>): void => {\n        this.props.onFinished(true, ev.detail.data);\n    };\n\n    private onButtonEnableToggle = (ev: CustomEvent<ISetModalButtonEnabledActionRequest>): void => {\n        ev.preventDefault();\n        const isClose = ev.detail.data.button === BuiltInModalButtonID.Close;\n        if (isClose || !this.possibleButtons.includes(ev.detail.data.button)) {\n            return this.state.messaging?.transport.reply(ev.detail, {\n                error: { message: \"Invalid button\" },\n            } as IWidgetApiErrorResponseData);\n        }\n\n        let buttonIds: ModalButtonID[];\n        if (ev.detail.data.enabled) {\n            buttonIds = arrayFastClone(this.state.disabledButtonIds).filter((i) => i !== ev.detail.data.button);\n        } else {\n            // use a set to swap the operation to avoid memory leaky arrays.\n            const tempSet = new Set(this.state.disabledButtonIds);\n            tempSet.add(ev.detail.data.button);\n            buttonIds = Array.from(tempSet);\n        }\n        this.setState({ disabledButtonIds: buttonIds });\n        this.state.messaging?.transport.reply(ev.detail, {} as IWidgetApiAcknowledgeResponseData);\n    };\n\n    public render(): React.ReactNode {\n        const templated = this.widget.getCompleteUrl({\n            widgetRoomId: this.props.widgetRoomId,\n            currentUserId: MatrixClientPeg.safeGet().getSafeUserId(),\n            userDisplayName: OwnProfileStore.instance.displayName ?? undefined,\n            userHttpAvatarUrl: OwnProfileStore.instance.getHttpAvatarUrl() ?? undefined,\n            clientId: ELEMENT_CLIENT_ID,\n            clientTheme: this.themeWatcher.getEffectiveTheme(),\n            clientLanguage: getUserLanguage(),\n            baseUrl: MatrixClientPeg.safeGet().baseUrl,\n        });\n\n        const parsed = new URL(templated);\n\n        // Add in some legacy support sprinkles (for non-popout widgets)\n        // TODO: Replace these with proper widget params\n        // See https://github.com/matrix-org/matrix-doc/pull/1958/files#r405714833\n        parsed.searchParams.set(\"widgetId\", this.widget.id);\n        parsed.searchParams.set(\"parentUrl\", window.location.href.split(\"#\", 2)[0]);\n\n        // Replace the encoded dollar signs back to dollar signs. They have no special meaning\n        // in HTTP, but URL parsers encode them anyways.\n        const widgetUrl = parsed.toString().replace(/%24/g, \"$\");\n\n        let buttons;\n        if (this.props.widgetDefinition.buttons) {\n            // show first button rightmost for a more natural specification\n            buttons = this.props.widgetDefinition.buttons\n                .slice(0, MAX_BUTTONS)\n                .reverse()\n                .map((def) => {\n                    let kind: AccessibleButtonKind = \"secondary\";\n                    switch (def.kind) {\n                        case ModalButtonKind.Primary:\n                            kind = \"primary\";\n                            break;\n                        case ModalButtonKind.Secondary:\n                            kind = \"primary_outline\";\n                            break;\n                        case ModalButtonKind.Danger:\n                            kind = \"danger\";\n                            break;\n                    }\n\n                    const onClick = (): void => {\n                        this.state.messaging?.notifyModalWidgetButtonClicked(def.id);\n                    };\n\n                    const isDisabled = this.state.disabledButtonIds.includes(def.id);\n\n                    return (\n                        <AccessibleButton key={def.id} kind={kind} onClick={onClick} disabled={isDisabled}>\n                            {def.label}\n                        </AccessibleButton>\n                    );\n                });\n        }\n\n        return (\n            <BaseDialog\n                title={this.props.widgetDefinition.name || _t(\"widget|modal_title_default\")}\n                className=\"mx_ModalWidgetDialog\"\n                contentId=\"mx_Dialog_content\"\n                onFinished={this.props.onFinished}\n            >\n                <div className=\"mx_ModalWidgetDialog_warning\">\n                    <ErrorIcon width=\"16px\" height=\"16px\" />\n                    {_t(\"widget|modal_data_warning\", {\n                        widgetDomain: parsed.hostname,\n                    })}\n                </div>\n                <div>\n                    <iframe\n                        title={this.widget.name ?? undefined}\n                        ref={this.appFrame}\n                        sandbox=\"allow-forms allow-scripts allow-same-origin\"\n                        src={widgetUrl}\n                        onLoad={this.onLoad}\n                    />\n                </div>\n                <div className=\"mx_ModalWidgetDialog_buttons\">{buttons}</div>\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type IModalWidgetOpenRequestData, type IModalWidgetReturnData, type Widget } from \"matrix-widget-api\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { AsyncStoreWithClient } from \"./AsyncStoreWithClient\";\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport { type ActionPayload } from \"../dispatcher/payloads\";\nimport Modal, { type IHandle, type IModal } from \"../Modal\";\nimport ModalWidgetDialog from \"../components/views/dialogs/ModalWidgetDialog\";\nimport { WidgetMessagingStore } from \"./widgets/WidgetMessagingStore\";\n\ninterface IState {\n    modal?: IModal<any>;\n    openedFromId?: string;\n}\n\nexport class ModalWidgetStore extends AsyncStoreWithClient<IState> {\n    private static readonly internalInstance = (() => {\n        const instance = new ModalWidgetStore();\n        instance.start();\n        return instance;\n    })();\n    private modalInstance: IHandle<typeof ModalWidgetDialog> | null = null;\n    private openSourceWidgetId: string | null = null;\n    private openSourceWidgetRoomId: string | null = null;\n\n    private constructor() {\n        super(defaultDispatcher, {});\n    }\n\n    public static get instance(): ModalWidgetStore {\n        return ModalWidgetStore.internalInstance;\n    }\n\n    protected async onAction(payload: ActionPayload): Promise<any> {\n        // nothing\n    }\n\n    public canOpenModalWidget = (): boolean => {\n        return !this.modalInstance;\n    };\n\n    public openModalWidget = (\n        requestData: IModalWidgetOpenRequestData,\n        sourceWidget: Widget,\n        widgetRoomId?: string,\n    ): void => {\n        if (this.modalInstance) return;\n        this.openSourceWidgetId = sourceWidget.id;\n        this.openSourceWidgetRoomId = widgetRoomId ?? null;\n        this.modalInstance = Modal.createDialog(\n            ModalWidgetDialog,\n            {\n                widgetDefinition: { ...requestData },\n                widgetRoomId,\n                sourceWidgetId: sourceWidget.id,\n            },\n            undefined,\n            /* priority = */ false,\n            /* static = */ true,\n        );\n        this.modalInstance!.finished.then(([success, data]) => {\n            this.closeModalWidget(sourceWidget, widgetRoomId, success && data ? data : { \"m.exited\": true });\n\n            this.openSourceWidgetId = null;\n            this.openSourceWidgetRoomId = null;\n            this.modalInstance = null;\n        });\n    };\n\n    public closeModalWidget = (\n        sourceWidget: Widget,\n        widgetRoomId: string | undefined,\n        data: IModalWidgetReturnData,\n    ): void => {\n        if (!this.modalInstance) return;\n        if (this.openSourceWidgetId === sourceWidget.id && this.openSourceWidgetRoomId === widgetRoomId) {\n            this.openSourceWidgetId = null;\n            this.openSourceWidgetRoomId = null;\n            this.modalInstance.close();\n            this.modalInstance = null;\n\n            const sourceMessaging = WidgetMessagingStore.instance.getMessaging(sourceWidget, widgetRoomId);\n            if (!sourceMessaging?.widgetApi) {\n                logger.error(\"No source widget API for modal widget\");\n                return;\n            }\n            sourceMessaging.widgetApi.notifyModalWidgetClose(data);\n        }\n    };\n}\n\nwindow.mxModalWidgetStore = ModalWidgetStore.instance;\n","/*\n * Copyright 2024 New Vector Ltd.\n * Copyright 2020-2022 The Matrix.org Foundation C.I.C.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport {\n    type Room,\n    type MatrixEvent,\n    MatrixEventEvent,\n    type MatrixClient,\n    ClientEvent,\n    RoomStateEvent,\n    type ReceivedToDeviceMessage,\n    TypedEventEmitter,\n} from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\nimport {\n    ClientWidgetApi,\n    type IModalWidgetOpenRequest,\n    type IRoomEvent,\n    type IStickerActionRequest,\n    type IStickyActionRequest,\n    type ITemplateParams,\n    type IWidget,\n    type IWidgetApiErrorResponseData,\n    type IWidgetApiRequest,\n    type IWidgetApiRequestEmptyData,\n    type IWidgetData,\n    MatrixCapabilities,\n    runTemplate,\n    Widget,\n    WidgetApiFromWidgetAction,\n    WidgetKind,\n} from \"matrix-widget-api\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { _t } from \"../../languageHandler\";\nimport { getUserLanguage } from \"../../i18n/settings\";\nimport { ElementWidgetDriver } from \"./ElementWidgetDriver\";\nimport { WidgetMessagingStore } from \"./WidgetMessagingStore\";\nimport { MatrixClientPeg } from \"../../MatrixClientPeg\";\nimport { OwnProfileStore } from \"../OwnProfileStore\";\nimport WidgetUtils from \"../../utils/WidgetUtils\";\nimport { IntegrationManagers } from \"../../integrations/IntegrationManagers\";\nimport { WidgetType } from \"../../widgets/WidgetType\";\nimport ActiveWidgetStore from \"../ActiveWidgetStore\";\nimport defaultDispatcher from \"../../dispatcher/dispatcher\";\nimport { Action } from \"../../dispatcher/actions\";\nimport { ElementWidgetActions, type IHangupCallApiRequest, type IViewRoomApiRequest } from \"./ElementWidgetActions\";\nimport { ModalWidgetStore } from \"../ModalWidgetStore\";\nimport { isAppWidget } from \"../WidgetStore\";\nimport ThemeWatcher, { ThemeWatcherEvent } from \"../../settings/watchers/ThemeWatcher\";\nimport { getCustomTheme } from \"../../theme\";\nimport { ElementWidgetCapabilities } from \"./ElementWidgetCapabilities\";\nimport { ELEMENT_CLIENT_ID } from \"../../identifiers\";\nimport { WidgetVariableCustomisations } from \"../../customisations/WidgetVariables\";\nimport { arrayFastClone } from \"../../utils/arrays\";\nimport { type ViewRoomPayload } from \"../../dispatcher/payloads/ViewRoomPayload\";\nimport Modal from \"../../Modal\";\nimport ErrorDialog from \"../../components/views/dialogs/ErrorDialog\";\nimport { SDKContextClass } from \"../../contexts/SDKContextClass\";\nimport { UPDATE_EVENT } from \"../AsyncStore\";\n\n// TODO: Purge this code of its overgrown hacks and compatibility shims.\n\n// TODO: Don't use this. We should avoid overriding/mocking matrix-widget-api\n// behavior and instead strive to use widgets in more transparent ways.\nexport class ElementWidget extends Widget {\n    public constructor(private rawDefinition: IWidget) {\n        super(rawDefinition);\n    }\n\n    public get templateUrl(): string {\n        if (WidgetType.JITSI.matches(this.type)) {\n            return WidgetUtils.getLocalJitsiWrapperUrl({\n                forLocalRender: true,\n                auth: super.rawData?.auth as string, // this.rawData can call templateUrl, do this to prevent looping\n            });\n        }\n        return super.templateUrl;\n    }\n\n    public get popoutTemplateUrl(): string {\n        if (WidgetType.JITSI.matches(this.type)) {\n            return WidgetUtils.getLocalJitsiWrapperUrl({\n                forLocalRender: false, // The only important difference between this and templateUrl()\n                auth: super.rawData?.auth as string,\n            });\n        }\n        return this.templateUrl; // use this instead of super to ensure we get appropriate templating\n    }\n\n    public get rawData(): IWidgetData {\n        let conferenceId = super.rawData[\"conferenceId\"];\n        if (conferenceId === undefined) {\n            // we'll need to parse the conference ID out of the URL for v1 Jitsi widgets\n            const parsedUrl = new URL(super.templateUrl); // use super to get the raw widget URL\n            conferenceId = parsedUrl.searchParams.get(\"confId\");\n        }\n        let domain = super.rawData[\"domain\"];\n        if (domain === undefined) {\n            // v1 widgets default to meet.element.io regardless of user settings\n            domain = \"meet.element.io\";\n        }\n\n        let theme = new ThemeWatcher().getEffectiveTheme();\n        if (theme.startsWith(\"custom-\")) {\n            const customTheme = getCustomTheme(theme.slice(7));\n            // Jitsi only understands light/dark\n            theme = customTheme.is_dark ? \"dark\" : \"light\";\n        }\n\n        // only allow light/dark through, defaulting to dark as that was previously the only state\n        // accounts for legacy-light/legacy-dark themes too\n        if (theme.includes(\"light\")) {\n            theme = \"light\";\n        } else {\n            theme = \"dark\";\n        }\n\n        return {\n            ...super.rawData,\n            theme,\n            conferenceId,\n            domain,\n        };\n    }\n\n    public getCompleteUrl(params: ITemplateParams, asPopout = false): string {\n        return runTemplate(\n            asPopout ? this.popoutTemplateUrl : this.templateUrl,\n            {\n                ...this.rawDefinition,\n                data: this.rawData,\n            },\n            params,\n        );\n    }\n}\n\nexport enum WidgetMessagingEvent {\n    Start = \"start\",\n    Stop = \"stop\",\n}\n\ninterface WidgetMessagingEventMap {\n    [WidgetMessagingEvent.Start]: (widgetApi: ClientWidgetApi) => void;\n    [WidgetMessagingEvent.Stop]: (widgetApi: ClientWidgetApi) => void;\n}\n\ninterface WidgetMessagingOptions {\n    app: IWidget;\n    room?: Room; // without a room it is a user widget\n    userId: string;\n    creatorUserId: string;\n    waitForIframeLoad: boolean;\n    userWidget: boolean;\n    /**\n     * If defined this async method will be called when the widget requests to become sticky.\n     * It will only become sticky once the returned promise resolves.\n     * This is useful because: Widget B is sticky. Making widget A sticky will kill widget B immediately.\n     * This promise allows to do Widget B related cleanup before Widget A becomes sticky. (e.g. hangup a Voip call)\n     */\n    stickyPromise?: () => Promise<void>;\n}\n\n/**\n * A running instance of a widget, associated with an iframe and an active communication\n * channel. Instances must be tracked by WidgetMessagingStore, as only one WidgetMessaging\n * instance should exist for a given widget.\n *\n * This class is responsible for:\n * - Computing the templated widget URL\n * - Starting a {@link ClientWidgetApi} communication channel with the widget\n * - Eagerly pushing events from the Matrix client to the widget\n *\n * @see {@link ElementWidgetDriver} for the class used to *pull* data lazily from the\n *   Matrix client to the widget on the widget's behalf.\n * @see {@link WidgetMessagingStore} for the store that holds these instances.\n */\nexport class WidgetMessaging extends TypedEventEmitter<WidgetMessagingEvent, WidgetMessagingEventMap> {\n    private client: MatrixClient;\n    private iframe: HTMLIFrameElement | null = null;\n    private scalarToken?: string;\n    private roomId?: string;\n    // The room that we're currently allowing the widget to interact with. Only\n    // used for account widgets, which may follow the user to different rooms.\n    private viewedRoomId: string | null = null;\n    private kind: WidgetKind;\n    private readonly virtual: boolean;\n    private readonly themeWatcher = new ThemeWatcher();\n    private readUpToMap: { [roomId: string]: string } = {}; // room ID to event ID\n    // This promise will be called and needs to resolve before the widget will actually become sticky.\n    private stickyPromise?: () => Promise<void>;\n    // Holds events that should be fed to the widget once they finish decrypting\n    private readonly eventsToFeed = new WeakSet<MatrixEvent>();\n\n    public constructor(\n        private readonly widget: ElementWidget,\n        options: WidgetMessagingOptions,\n    ) {\n        super();\n        this.client = MatrixClientPeg.safeGet();\n        this.roomId = options.room?.roomId;\n        this.kind = options.userWidget ? WidgetKind.Account : WidgetKind.Room; // probably\n        this.virtual = isAppWidget(options.app) && options.app.eventId === undefined;\n        this.stickyPromise = options.stickyPromise;\n    }\n\n    private _widgetApi: ClientWidgetApi | null = null;\n    private set widgetApi(value: ClientWidgetApi | null) {\n        this._widgetApi = value;\n    }\n\n    /**\n     * The widget API interface to the widget, or null if disconnected.\n     */\n    public get widgetApi(): ClientWidgetApi | null {\n        return this._widgetApi;\n    }\n\n    /**\n     * The URL to use in the iframe\n     */\n    public get embedUrl(): string {\n        return this.runUrlTemplate({ asPopout: false });\n    }\n\n    /**\n     * The URL to use in the popout\n     */\n    public get popoutUrl(): string {\n        return this.runUrlTemplate({ asPopout: true });\n    }\n\n    private runUrlTemplate(opts = { asPopout: false }): string {\n        const fromCustomisation = WidgetVariableCustomisations?.provideVariables?.() ?? {};\n        const defaults: ITemplateParams = {\n            widgetRoomId: this.roomId,\n            currentUserId: this.client.getUserId()!,\n            userDisplayName: OwnProfileStore.instance.displayName ?? undefined,\n            userHttpAvatarUrl: OwnProfileStore.instance.getHttpAvatarUrl() ?? undefined,\n            clientId: ELEMENT_CLIENT_ID,\n            clientTheme: this.themeWatcher.getEffectiveTheme(),\n            clientLanguage: getUserLanguage(),\n            deviceId: this.client.getDeviceId() ?? undefined,\n            baseUrl: this.client.baseUrl,\n        };\n        const templated = this.widget.getCompleteUrl(Object.assign(defaults, fromCustomisation), opts?.asPopout);\n\n        const parsed = new URL(templated);\n\n        // Add in some legacy support sprinkles (for non-popout widgets)\n        // TODO: Replace these with proper widget params\n        // See https://github.com/matrix-org/matrix-doc/pull/1958/files#r405714833\n        if (!opts?.asPopout) {\n            parsed.searchParams.set(\"widgetId\", this.widget.id);\n            parsed.searchParams.set(\"parentUrl\", window.location.href.split(\"#\", 2)[0]);\n\n            // Give the widget a scalar token if we're supposed to (more legacy)\n            // TODO: Stop doing this\n            if (this.scalarToken) {\n                parsed.searchParams.set(\"scalar_token\", this.scalarToken);\n            }\n        }\n\n        // Replace the encoded dollar signs back to dollar signs. They have no special meaning\n        // in HTTP, but URL parsers encode them anyways.\n        return parsed.toString().replace(/%24/g, \"$\");\n    }\n\n    private onThemeChange = (theme: string): void => {\n        this.widgetApi?.updateTheme({ name: theme });\n    };\n\n    private onOpenModal = async (ev: CustomEvent<IModalWidgetOpenRequest>): Promise<void> => {\n        ev.preventDefault();\n        if (ModalWidgetStore.instance.canOpenModalWidget()) {\n            ModalWidgetStore.instance.openModalWidget(ev.detail.data, this.widget, this.roomId);\n            this.widgetApi?.transport.reply(ev.detail, {}); // ack\n        } else {\n            this.widgetApi?.transport.reply(ev.detail, {\n                error: {\n                    message: \"Unable to open modal at this time\",\n                },\n            });\n        }\n    };\n\n    // This listener is only active for account widgets, which may follow the\n    // user to different rooms\n    private onRoomViewStoreUpdate = (): void => {\n        const roomId = SDKContextClass.instance.roomViewStore.getRoomId() ?? null;\n        if (roomId !== this.viewedRoomId) {\n            this.widgetApi!.setViewedRoomId(roomId);\n            this.viewedRoomId = roomId;\n        }\n    };\n\n    /**\n     * This starts the messaging for the widget if it is not in the state `started` yet.\n     * @param iframe the iframe the widget should use\n     */\n    public start(iframe: HTMLIFrameElement): void {\n        if (this.widgetApi !== null) return;\n\n        this.iframe = iframe;\n        const driver = new ElementWidgetDriver(this.widget, this.kind, this.virtual, this.roomId);\n\n        this.widgetApi = new ClientWidgetApi(this.widget, iframe, driver);\n        this.widgetApi.once(\"ready\", () => {\n            this.themeWatcher.start();\n            this.themeWatcher.on(ThemeWatcherEvent.Change, this.onThemeChange);\n            // Theme may have changed while messaging was starting\n            this.onThemeChange(this.themeWatcher.getEffectiveTheme());\n        });\n        this.widgetApi.on(`action:${WidgetApiFromWidgetAction.OpenModalWidget}`, this.onOpenModal);\n\n        // When widgets are listening to events, we need to make sure they're only\n        // receiving events for the right room\n        if (this.roomId === undefined) {\n            // Account widgets listen to the currently active room\n            this.widgetApi.setViewedRoomId(SDKContextClass.instance.roomViewStore.getRoomId() ?? null);\n            SDKContextClass.instance.roomViewStore.on(UPDATE_EVENT, this.onRoomViewStoreUpdate);\n        } else {\n            // Room widgets get locked to the room they were added in\n            this.widgetApi.setViewedRoomId(this.roomId);\n        }\n\n        // Always attach a handler for ViewRoom, but permission check it internally\n        this.widgetApi.on(`action:${ElementWidgetActions.ViewRoom}`, (ev: CustomEvent<IViewRoomApiRequest>) => {\n            ev.preventDefault(); // stop the widget API from auto-rejecting this\n\n            // Check up front if this is even a valid request\n            const targetRoomId = (ev.detail.data || {}).room_id;\n            if (!targetRoomId) {\n                return this.widgetApi?.transport.reply(ev.detail, <IWidgetApiErrorResponseData>{\n                    error: { message: \"Room ID not supplied.\" },\n                });\n            }\n\n            // Check the widget's permission\n            if (!this.widgetApi?.hasCapability(ElementWidgetCapabilities.CanChangeViewedRoom)) {\n                return this.widgetApi?.transport.reply(ev.detail, <IWidgetApiErrorResponseData>{\n                    error: { message: \"This widget does not have permission for this action (denied).\" },\n                });\n            }\n\n            // at this point we can change rooms, so do that\n            defaultDispatcher.dispatch<ViewRoomPayload>({\n                action: Action.ViewRoom,\n                room_id: targetRoomId,\n                metricsTrigger: \"Widget\",\n            });\n\n            // acknowledge so the widget doesn't freak out\n            this.widgetApi.transport.reply(ev.detail, <IWidgetApiRequestEmptyData>{});\n        });\n\n        // Populate the map of \"read up to\" events for this widget with the current event in every room.\n        // This is a bit inefficient, but should be okay. We do this for all rooms in case the widget\n        // requests timeline capabilities in other rooms down the road. It's just easier to manage here.\n        for (const room of this.client.getRooms()) {\n            // Timelines are most recent last\n            const events = room.getLiveTimeline()?.getEvents() || [];\n            const roomEvent = events[events.length - 1];\n            if (!roomEvent) continue; // force later code to think the room is fresh\n            this.readUpToMap[room.roomId] = roomEvent.getId()!;\n        }\n\n        // Attach listeners for feeding events - the underlying widget classes handle permissions for us\n        this.client.on(ClientEvent.Event, this.onEvent);\n        this.client.on(MatrixEventEvent.Decrypted, this.onEventDecrypted);\n        this.client.on(RoomStateEvent.Events, this.onStateUpdate);\n        this.client.on(ClientEvent.ReceivedToDeviceMessage, this.onToDeviceMessage);\n\n        this.widgetApi.on(\n            `action:${WidgetApiFromWidgetAction.UpdateAlwaysOnScreen}`,\n            async (ev: CustomEvent<IStickyActionRequest>) => {\n                if (this.widgetApi?.hasCapability(MatrixCapabilities.AlwaysOnScreen)) {\n                    ev.preventDefault();\n                    if (ev.detail.data.value) {\n                        // If the widget wants to become sticky we wait for the stickyPromise to resolve\n                        if (this.stickyPromise) await this.stickyPromise();\n                    }\n                    // Stop being persistent can be done instantly\n                    ActiveWidgetStore.instance.setWidgetPersistence(\n                        this.widget.id,\n                        this.roomId ?? null,\n                        ev.detail.data.value,\n                    );\n                    // Send the ack after the widget actually has become sticky.\n                    this.widgetApi.transport.reply(ev.detail, <IWidgetApiRequestEmptyData>{});\n                }\n            },\n        );\n\n        // TODO: Replace this event listener with appropriate driver functionality once the API\n        // establishes a sane way to send events back and forth.\n        this.widgetApi.on(\n            `action:${WidgetApiFromWidgetAction.SendSticker}`,\n            (ev: CustomEvent<IStickerActionRequest>) => {\n                if (this.widgetApi?.hasCapability(MatrixCapabilities.StickerSending)) {\n                    // Acknowledge first\n                    ev.preventDefault();\n                    this.widgetApi.transport.reply(ev.detail, <IWidgetApiRequestEmptyData>{});\n\n                    // Send the sticker\n                    defaultDispatcher.dispatch({\n                        action: \"m.sticker\",\n                        data: ev.detail.data,\n                        widgetId: this.widget.id,\n                    });\n                }\n            },\n        );\n\n        if (WidgetType.STICKERPICKER.matches(this.widget.type)) {\n            this.widgetApi.on(\n                `action:${ElementWidgetActions.OpenIntegrationManager}`,\n                (ev: CustomEvent<IWidgetApiRequest>) => {\n                    // Acknowledge first\n                    ev.preventDefault();\n                    this.widgetApi?.transport.reply(ev.detail, <IWidgetApiRequestEmptyData>{});\n\n                    // First close the stickerpicker\n                    defaultDispatcher.dispatch({ action: \"stickerpicker_close\" });\n\n                    // Now open the integration manager\n                    // TODO: Spec this interaction.\n                    const data = ev.detail.data;\n                    const integType = data?.integType as string;\n                    const integId = <string>data?.integId;\n\n                    const roomId = SDKContextClass.instance.roomViewStore.getRoomId();\n                    const room = roomId ? this.client.getRoom(roomId) : undefined;\n                    if (!room) return;\n\n                    // noinspection JSIgnoredPromiseFromCall\n                    IntegrationManagers.sharedInstance()?.getPrimaryManager()?.open(room, `type_${integType}`, integId);\n                },\n            );\n        }\n\n        if (WidgetType.JITSI.matches(this.widget.type)) {\n            this.widgetApi.on(`action:${ElementWidgetActions.HangupCall}`, (ev: CustomEvent<IHangupCallApiRequest>) => {\n                ev.preventDefault();\n                if (ev.detail.data?.errorMessage) {\n                    Modal.createDialog(ErrorDialog, {\n                        title: _t(\"widget|error_hangup_title\"),\n                        description: _t(\"widget|error_hangup_description\", {\n                            message: ev.detail.data.errorMessage,\n                        }),\n                    });\n                }\n                this.widgetApi?.transport.reply(ev.detail, <IWidgetApiRequestEmptyData>{});\n            });\n        }\n\n        this.emit(WidgetMessagingEvent.Start, this.widgetApi);\n    }\n\n    public async prepare(): Promise<void> {\n        // Ensure the variables are ready for us to be rendered before continuing\n        await (WidgetVariableCustomisations?.isReady?.() ?? Promise.resolve());\n\n        if (this.scalarToken) return;\n        try {\n            if (WidgetUtils.isScalarUrl(this.widget.templateUrl)) {\n                const managers = IntegrationManagers.sharedInstance();\n                if (managers.hasManager()) {\n                    // TODO: Pick the right manager for the widget\n                    const defaultManager = managers.getPrimaryManager();\n                    if (defaultManager && WidgetUtils.isScalarUrl(defaultManager.apiUrl)) {\n                        const scalar = defaultManager.getScalarClient();\n                        this.scalarToken = await scalar.getScalarToken();\n                    }\n                }\n            }\n        } catch (e) {\n            // All errors are non-fatal\n            logger.error(\"Error preparing widget communications: \", e);\n        }\n    }\n\n    /**\n     * Stops the widget messaging for if it is started. Skips stopping if it is an active\n     * widget.\n     * @param opts\n     */\n    public stop(opts = { forceDestroy: false }): void {\n        if (this.widgetApi === null || this.iframe === null) return;\n        if (opts.forceDestroy) {\n            // HACK: This is a really dirty way to ensure that Jitsi cleans up\n            // its hold on the webcam. Without this, the widget holds a media\n            // stream open, even after death. See https://github.com/vector-im/element-web/issues/7351\n            // In practice we could just do `+= ''` to trick the browser into\n            // thinking the URL changed, however I can foresee this being\n            // optimized out by a browser. Instead, we'll just point the iframe\n            // at a page that is reasonably safe to use in the event the iframe\n            // doesn't wink away.\n            this.iframe!.src = \"about:blank\";\n        } else if (ActiveWidgetStore.instance.getWidgetPersistence(this.widget.id, this.roomId ?? null)) {\n            logger.log(\"Skipping destroy - persistent widget\");\n            return;\n        }\n\n        this.emit(WidgetMessagingEvent.Stop, this.widgetApi);\n        this.widgetApi?.stop();\n        // XXX is the removeAllListeners necessary here?\n        this.widgetApi?.removeAllListeners(); // Insurance against resource leaks\n        this.widgetApi = null;\n        this.iframe = null;\n        WidgetMessagingStore.instance.stopMessaging(this.widget, this.roomId);\n\n        SDKContextClass.instance.roomViewStore.off(UPDATE_EVENT, this.onRoomViewStoreUpdate);\n\n        this.client.off(ClientEvent.Event, this.onEvent);\n        this.client.off(MatrixEventEvent.Decrypted, this.onEventDecrypted);\n        this.client.off(RoomStateEvent.Events, this.onStateUpdate);\n        this.client.off(ClientEvent.ReceivedToDeviceMessage, this.onToDeviceMessage);\n    }\n\n    private onEvent = (ev: MatrixEvent): void => {\n        this.client.decryptEventIfNeeded(ev);\n        this.feedEvent(ev);\n    };\n\n    private onEventDecrypted = (ev: MatrixEvent): void => {\n        this.feedEvent(ev);\n    };\n\n    private onStateUpdate = (ev: MatrixEvent): void => {\n        if (this.widgetApi === null) return;\n        const raw = ev.getEffectiveEvent();\n        this.widgetApi.feedStateUpdate(raw as IRoomEvent).catch((e) => {\n            logger.error(\"Error sending state update to widget: \", e);\n        });\n    };\n\n    private onToDeviceMessage = async ({ message, encryptionInfo }: ReceivedToDeviceMessage): Promise<void> => {\n        await this.widgetApi?.feedToDevice(message, encryptionInfo != null);\n    };\n\n    /**\n     * Determines whether the event has a relation to an unknown parent.\n     */\n    private relatesToUnknown(ev: MatrixEvent): boolean {\n        // Replies to unknown events don't count\n        if (!ev.relationEventId || ev.replyEventId) return false;\n        const room = this.client.getRoom(ev.getRoomId());\n        return room === null || !room.findEventById(ev.relationEventId);\n    }\n\n    /**\n     * Determines whether the event comes from a room that we've been invited to\n     * (in which case we likely don't have the full timeline).\n     */\n    private isFromInvite(ev: MatrixEvent): boolean {\n        const room = this.client.getRoom(ev.getRoomId());\n        return room?.getMyMembership() === KnownMembership.Invite;\n    }\n\n    /**\n     * Advances the \"read up to\" marker for a room to a certain event. No-ops if\n     * the event is before the marker.\n     * @returns Whether the \"read up to\" marker was advanced.\n     */\n    private advanceReadUpToMarker(ev: MatrixEvent): boolean {\n        const evId = ev.getId();\n        if (evId === undefined) return false;\n        const roomId = ev.getRoomId();\n        if (roomId === undefined) return false;\n        const room = this.client.getRoom(roomId);\n        if (room === null) return false;\n\n        const upToEventId = this.readUpToMap[ev.getRoomId()!];\n        if (!upToEventId) {\n            // There's no marker yet; start it at this event\n            this.readUpToMap[roomId] = evId;\n            return true;\n        }\n\n        // Small optimization for exact match (skip the search)\n        if (upToEventId === evId) return false;\n\n        // Timelines are most recent last, so reverse the order and limit ourselves to 100 events\n        // to avoid overusing the CPU.\n        const timeline = room.getLiveTimeline();\n        const events = arrayFastClone(timeline.getEvents()).reverse().slice(0, 100);\n\n        for (const timelineEvent of events) {\n            if (timelineEvent.getId() === upToEventId) {\n                // The event must be somewhere before the \"read up to\" marker\n                return false;\n            } else if (timelineEvent.getId() === ev.getId()) {\n                // The event is after the marker; advance it\n                this.readUpToMap[roomId] = evId;\n                return true;\n            }\n        }\n\n        // We can't say for sure whether the widget has seen the event; let's\n        // just assume that it has\n        return false;\n    }\n\n    private feedEvent(ev: MatrixEvent): void {\n        if (this.widgetApi === null) return;\n        if (\n            // If we had decided earlier to feed this event to the widget, but\n            // it just wasn't ready, give it another try\n            this.eventsToFeed.delete(ev) ||\n            // Skip marker timeline check for events with relations to unknown parent because these\n            // events are not added to the timeline here and will be ignored otherwise:\n            // https://github.com/matrix-org/matrix-js-sdk/blob/d3dfcd924201d71b434af3d77343b5229b6ed75e/src/models/room.ts#L2207-L2213\n            this.relatesToUnknown(ev) ||\n            // Skip marker timeline check for rooms where membership is\n            // 'invite', otherwise the membership event from the invitation room\n            // will advance the marker and new state events will not be\n            // forwarded to the widget.\n            this.isFromInvite(ev) ||\n            // Check whether this event would be before or after our \"read up to\" marker. If it's\n            // before, or we can't decide, then we assume the widget will have already seen the event.\n            // If the event is after, or we don't have a marker for the room, then the marker will advance and we'll\n            // send it through.\n            // This approach of \"read up to\" prevents widgets receiving decryption spam from startup or\n            // receiving ancient events from backfill and such.\n            this.advanceReadUpToMarker(ev)\n        ) {\n            // If the event is still being decrypted, remember that we want to\n            // feed it to the widget (even if not strictly in the order given by\n            // the timeline) and get back to it later\n            if (ev.isBeingDecrypted() || ev.isDecryptionFailure()) {\n                this.eventsToFeed.add(ev);\n            } else {\n                const raw = ev.getEffectiveEvent();\n                this.widgetApi.feedEvent(raw as IRoomEvent).catch((e) => {\n                    logger.error(\"Error sending event to widget: \", e);\n                });\n            }\n        }\n    }\n}\n","/*\n * Copyright 2024 New Vector Ltd.\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type Widget, WidgetKind } from \"matrix-widget-api\";\n\nimport SettingsStore from \"../../settings/SettingsStore\";\nimport { SettingLevel } from \"../../settings/SettingLevel\";\nimport { type SDKContextClass } from \"../../contexts/SDKContextClass\";\n\nexport enum OIDCState {\n    Allowed, // user has set the remembered value as allowed\n    Denied, // user has set the remembered value as disallowed\n    Unknown, // user has not set a remembered value\n}\n\nexport class WidgetPermissionStore {\n    public constructor(private readonly context: SDKContextClass) {}\n\n    // TODO (all functions here): Merge widgetKind with the widget definition\n\n    private packSettingKey(widget: Widget, kind: WidgetKind, roomId?: string): string {\n        let location: string | null | undefined = roomId;\n        if (kind !== WidgetKind.Room) {\n            location = this.context.client?.getUserId();\n        }\n        if (kind === WidgetKind.Modal) {\n            location = \"*MODAL*-\" + location; // to guarantee differentiation from whatever spawned it\n        }\n        if (!location) {\n            throw new Error(\"Failed to determine a location to check the widget's OIDC state with\");\n        }\n\n        return encodeURIComponent(`${location}::${widget.templateUrl}`);\n    }\n\n    public getOIDCState(widget: Widget, kind: WidgetKind, roomId?: string): OIDCState {\n        const settingsKey = this.packSettingKey(widget, kind, roomId);\n        const settings = SettingsStore.getValue(\"widgetOpenIDPermissions\");\n        if (settings?.deny?.includes(settingsKey)) {\n            return OIDCState.Denied;\n        }\n        if (settings?.allow?.includes(settingsKey)) {\n            return OIDCState.Allowed;\n        }\n        return OIDCState.Unknown;\n    }\n\n    public setOIDCState(widget: Widget, kind: WidgetKind, roomId: string | undefined, newState: OIDCState): void {\n        const settingsKey = this.packSettingKey(widget, kind, roomId);\n\n        let currentValues = SettingsStore.getValue(\"widgetOpenIDPermissions\");\n        if (!currentValues) {\n            currentValues = {};\n        }\n        if (!currentValues.allow) currentValues.allow = [];\n        if (!currentValues.deny) currentValues.deny = [];\n\n        if (newState === OIDCState.Allowed) {\n            currentValues.allow.push(settingsKey);\n        } else if (newState === OIDCState.Denied) {\n            currentValues.deny.push(settingsKey);\n        } else {\n            currentValues.allow = currentValues.allow.filter((c) => c !== settingsKey);\n            currentValues.deny = currentValues.deny.filter((c) => c !== settingsKey);\n        }\n\n        SettingsStore.setValue(\"widgetOpenIDPermissions\", null, SettingLevel.DEVICE, currentValues);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { _t } from \"../languageHandler\";\nimport type Notifier from \"../Notifier\";\nimport GenericToast from \"../components/views/toasts/GenericToast\";\nimport ToastStore from \"../stores/ToastStore\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport { getLocalNotificationAccountDataEventType } from \"../utils/notifications\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { SettingLevel } from \"../settings/SettingLevel\";\n\nconst TOAST_KEY = \"desktopnotifications\";\n\nexport const showToast = (notifier: Notifier, fromMessageSend: boolean): void => {\n    const onAccept = async (): Promise<void> => {\n        await SettingsStore.setValue(\"notificationsEnabled\", null, SettingLevel.DEVICE, true);\n        const cli = MatrixClientPeg.safeGet();\n        const eventType = getLocalNotificationAccountDataEventType(cli.deviceId!);\n        cli.setAccountData(eventType, {\n            is_silenced: false,\n        });\n    };\n\n    const onReject = (): void => {\n        notifier.setPromptHidden(true);\n    };\n\n    ToastStore.sharedInstance().addOrReplaceToast({\n        key: TOAST_KEY,\n        title: fromMessageSend\n            ? _t(\"notifications|enable_prompt_toast_title_from_message_send\")\n            : _t(\"notifications|enable_prompt_toast_title\"),\n        props: {\n            description: _t(\"notifications|enable_prompt_toast_description\"),\n            primaryLabel: _t(\"action|enable\"),\n            onPrimaryClick: onAccept,\n            secondaryLabel: _t(\"action|dismiss\"),\n            onSecondaryClick: onReject,\n        },\n        component: GenericToast,\n        priority: 30,\n    });\n};\n\nexport const hideToast = (): void => {\n    ToastStore.sharedInstance().dismissToast(TOAST_KEY);\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MouseEvent } from \"react\";\n\nexport function chromeFileInputFix(event: MouseEvent<HTMLInputElement>): void {\n    // Workaround for Chromium Bug\n    // Chrome does not fire onChange events if the same file is selected twice\n    // Only required on Chromium-based browsers (Electron, Chrome, Edge, Opera, Vivaldi, etc)\n    event.currentTarget.value = \"\";\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2016-2018 , 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n// Pull in the encryption lib so that we can decrypt attachments.\nimport encrypt from \"matrix-encrypt-attachment\";\nimport { parseErrorResponse } from \"matrix-js-sdk/src/matrix\";\nimport { type EncryptedFile, type MediaEventInfo } from \"matrix-js-sdk/src/types\";\n\nimport { mediaFromContent } from \"../customisations/Media\";\nimport { getBlobSafeMimeType } from \"./blobs\";\n\nexport class DownloadError extends Error {\n    public constructor(e: Error) {\n        super(e.message);\n        this.name = \"DownloadError\";\n        this.stack = e.stack;\n    }\n}\n\nexport class DecryptError extends Error {\n    public constructor(e: Error) {\n        super(e.message);\n        this.name = \"DecryptError\";\n        this.stack = e.stack;\n    }\n}\n\n/**\n * Decrypt a file attached to a matrix event.\n * @param {EncryptedFile} file The encrypted file information taken from the matrix event.\n *   This passed to [link]{@link https://github.com/matrix-org/matrix-encrypt-attachment}\n *   as the encryption info object, so will also have the those keys in addition to\n *   the keys below.\n * @param {MediaEventInfo} info The info parameter taken from the matrix event.\n * @returns {Promise<Blob>} Resolves to a Blob of the file.\n */\nexport async function decryptFile(file?: EncryptedFile, info?: MediaEventInfo): Promise<Blob> {\n    // throws if file is falsy\n    const media = mediaFromContent({ file });\n\n    let responseData: ArrayBuffer;\n    try {\n        // Download the encrypted file as an array buffer.\n        const response = await media.downloadSource();\n        if (!response.ok) {\n            throw parseErrorResponse(response, await response.text());\n        }\n        responseData = await response.arrayBuffer();\n    } catch (e) {\n        throw new DownloadError(e as Error);\n    }\n\n    try {\n        // Decrypt the array buffer using the information taken from the event content.\n        const dataArray = await encrypt.decryptAttachment(responseData, file!);\n        // Turn the array into a Blob and give it the correct MIME-type.\n\n        // IMPORTANT: we must not allow scriptable mime-types into Blobs otherwise\n        // they introduce XSS attacks if the Blob URI is viewed directly in the\n        // browser (e.g. by copying the URI into a new tab or window.)\n        // See warning at top of file.\n        const mimetype = getBlobSafeMimeType(info?.mimetype?.split(\";\")[0].trim() ?? \"\");\n\n        return new Blob([dataArray], { type: mimetype });\n    } catch (e) {\n        throw new DecryptError(e as Error);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2018-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ReactNode } from \"react\";\nimport { MatrixError, ConnectionError } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { _t, _td, lookupString, type Tags, type TranslatedString } from \"../languageHandler\";\nimport SdkConfig from \"../SdkConfig\";\nimport { type ValidatedServerConfig } from \"./ValidatedServerConfig\";\nimport ExternalLink from \"../components/views/elements/ExternalLink\";\nimport Modal from \"../Modal.tsx\";\nimport ErrorDialog from \"../components/views/dialogs/ErrorDialog.tsx\";\n\nexport const resourceLimitStrings = {\n    \"monthly_active_user\": _td(\"error|mau\"),\n    \"hs_blocked\": _td(\"error|hs_blocked\"),\n    \"\": _td(\"error|resource_limits\"),\n};\n\nexport const adminContactStrings = {\n    \"\": _td(\"error|admin_contact\"),\n};\n\n/**\n * Produce a translated error message for a\n * M_RESOURCE_LIMIT_EXCEEDED error\n *\n * @param {string} limitType The limit_type from the error\n * @param {string} adminContact The admin_contact from the error\n * @param {Object} strings Translatable string for different\n *     limit_type. Must include at least the empty string key\n *     which is the default. Strings may include an 'a' tag\n *     for the admin contact link.\n * @param {Object} extraTranslations Extra translation substitution functions\n *     for any tags in the strings apart from 'a'\n * @returns {*} Translated string or react component\n */\nexport function messageForResourceLimitError(\n    limitType: string | undefined,\n    adminContact: string | undefined,\n    strings: Record<string, TranslationKey>,\n    extraTranslations?: Tags,\n): TranslatedString {\n    let errString = limitType ? strings[limitType] : undefined;\n    if (errString === undefined) errString = strings[\"\"];\n\n    const linkSub = (sub: string): ReactNode => {\n        if (adminContact) {\n            return (\n                <a href={adminContact} target=\"_blank\" rel=\"noreferrer noopener\">\n                    {sub}\n                </a>\n            );\n        } else {\n            return sub;\n        }\n    };\n\n    if (lookupString(errString).includes(\"<a>\")) {\n        return _t(errString, {}, Object.assign({ a: linkSub }, extraTranslations));\n    } else {\n        return _t(errString, {}, extraTranslations!);\n    }\n}\n\nexport function messageForSyncError(err: Error): ReactNode {\n    if (err instanceof MatrixError && err.errcode === \"M_RESOURCE_LIMIT_EXCEEDED\") {\n        const limitError = messageForResourceLimitError(\n            err.data.limit_type,\n            err.data.admin_contact,\n            resourceLimitStrings,\n        );\n        const adminContact = messageForResourceLimitError(\n            err.data.limit_type,\n            err.data.admin_contact,\n            adminContactStrings,\n        );\n        return (\n            <div>\n                <div>{limitError}</div>\n                <div>{adminContact}</div>\n            </div>\n        );\n    } else {\n        return <div>{_t(\"error|sync\")}</div>;\n    }\n}\n\nexport function messageForLoginError(\n    err: MatrixError,\n    serverConfig: Pick<ValidatedServerConfig, \"hsName\" | \"hsUrl\">,\n): ReactNode {\n    if (err.errcode === \"M_RESOURCE_LIMIT_EXCEEDED\") {\n        const errorTop = messageForResourceLimitError(\n            err.data.limit_type,\n            err.data.admin_contact,\n            resourceLimitStrings,\n        );\n        const errorDetail = messageForResourceLimitError(\n            err.data.limit_type,\n            err.data.admin_contact,\n            adminContactStrings,\n        );\n        return (\n            <div>\n                <div>{errorTop}</div>\n                <div className=\"mx_Login_smallError\">{errorDetail}</div>\n            </div>\n        );\n    } else if (err.httpStatus === 401 || err.httpStatus === 403) {\n        if (err.errcode === \"M_USER_DEACTIVATED\") {\n            return _t(\"auth|account_deactivated\");\n        } else if (SdkConfig.get(\"disable_custom_urls\")) {\n            return (\n                <div>\n                    <div>{_t(\"auth|incorrect_credentials\")}</div>\n                    <div className=\"mx_Login_smallError\">\n                        {_t(\"auth|incorrect_credentials_detail\", {\n                            hs: serverConfig.hsName,\n                        })}\n                    </div>\n                </div>\n            );\n        } else {\n            return _t(\"auth|incorrect_credentials\");\n        }\n    } else {\n        return messageForConnectionError(err, serverConfig);\n    }\n}\n\nexport function messageForConnectionError(\n    err: Error,\n    serverConfig: Pick<ValidatedServerConfig, \"hsName\" | \"hsUrl\">,\n): ReactNode {\n    let errorText = _t(\"error|connection\");\n\n    if (err instanceof ConnectionError) {\n        if (\n            window.location.protocol === \"https:\" &&\n            (serverConfig.hsUrl.startsWith(\"http:\") || !serverConfig.hsUrl.startsWith(\"http\"))\n        ) {\n            return (\n                <span>\n                    {_t(\n                        \"error|mixed_content\",\n                        {},\n                        {\n                            a: (sub) => {\n                                return (\n                                    <a\n                                        target=\"_blank\"\n                                        rel=\"noreferrer noopener\"\n                                        href=\"https://www.google.com/search?&q=enable%20unsafe%20scripts\"\n                                    >\n                                        {sub}\n                                    </a>\n                                );\n                            },\n                        },\n                    )}\n                </span>\n            );\n        }\n\n        return (\n            <span>\n                {_t(\n                    \"error|tls\",\n                    {},\n                    {\n                        a: (sub) => (\n                            <ExternalLink target=\"_blank\" rel=\"noreferrer noopener\" href={serverConfig.hsUrl}>\n                                {sub}\n                            </ExternalLink>\n                        ),\n                    },\n                )}\n            </span>\n        );\n    } else if (err instanceof MatrixError) {\n        if (err.errcode) {\n            errorText += `(${err.errcode})`;\n        } else if (err.httpStatus) {\n            errorText += ` (HTTP ${err.httpStatus})`;\n        }\n    }\n\n    return errorText;\n}\n\n/**\n * Utility for handling unexpected errors: pops up the error dialog.\n *\n * Example usage:\n * ```\n * try {\n *     /// complicated operation\n * } catch (e) {\n *     logErrorAndShowErrorDialog(\"Failed complicated operation\", e);\n * }\n * ```\n *\n * This isn't particularly intended to be pretty; rather it lets the user know that *something* has gone wrong so that\n * they can report a bug. The general idea is that it's better to let the user know of a failure, even if they\n * can't do anything about it, than it is to fail silently with the appearance of success.\n *\n * @param title - Title for the error dialog.\n * @param error - The thrown error. Becomes the content of the error dialog.\n */\nexport function logErrorAndShowErrorDialog(title: string, error: any): void {\n    logger.error(`${title}:`, error);\n    Modal.createDialog(ErrorDialog, { title, description: `${error}` });\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n    EventStatus,\n    MatrixEvent,\n    EventType,\n    EVENT_VISIBILITY_CHANGE_TYPE,\n    MsgType,\n    RelationType,\n    type MatrixClient,\n    THREAD_RELATION_TYPE,\n    M_POLL_END,\n    M_POLL_START,\n    M_LOCATION,\n    M_BEACON_INFO,\n} from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport shouldHideEvent from \"../shouldHideEvent\";\nimport { type GetRelationsForEvent } from \"../components/views/rooms/EventTile\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport { type TimelineRenderingType } from \"../contexts/RoomContext\";\nimport { launchPollEditor } from \"../components/views/messages/MPollBody\";\nimport { Action } from \"../dispatcher/actions\";\nimport { type ViewRoomPayload } from \"../dispatcher/payloads/ViewRoomPayload\";\nimport { ModuleApi } from \"../modules/Api\";\n\n/**\n * Returns whether an event should allow actions like reply, reactions, edit, etc.\n * which effectively checks whether it's a regular message that has been sent and that we\n * can display.\n *\n * @param {MatrixEvent} mxEvent The event to check\n * @returns {boolean} true if actionable\n */\nexport function isContentActionable(mxEvent: MatrixEvent): boolean {\n    const { status: eventStatus } = mxEvent;\n\n    // status is SENT before remote-echo, null after\n    const isSent = !eventStatus || eventStatus === EventStatus.SENT;\n\n    if (isSent && !mxEvent.isRedacted()) {\n        if (mxEvent.getType() === \"m.room.message\") {\n            const content = mxEvent.getContent();\n            if (content.msgtype && content.msgtype !== \"m.bad.encrypted\" && content.hasOwnProperty(\"body\")) {\n                return true;\n            }\n        } else if (\n            mxEvent.getType() === \"m.sticker\" ||\n            M_POLL_START.matches(mxEvent.getType()) ||\n            M_POLL_END.matches(mxEvent.getType()) ||\n            M_BEACON_INFO.matches(mxEvent.getType())\n        ) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\nexport function canEditContent(matrixClient: MatrixClient, mxEvent: MatrixEvent): boolean {\n    const isCancellable = mxEvent.getType() === EventType.RoomMessage || M_POLL_START.matches(mxEvent.getType());\n\n    if (\n        !isCancellable ||\n        // Editing local echos is not supported(results in send a message that references the local ID).\n        // We need to ensure the event is not local, and therefore has no send status.\n        mxEvent.status !== null ||\n        mxEvent.isRedacted() ||\n        mxEvent.isRelation(RelationType.Replace) ||\n        mxEvent.getSender() !== matrixClient.getUserId()\n    ) {\n        return false;\n    }\n\n    if (ModuleApi.instance.customComponents.getHintsForMessage(mxEvent)?.allowEditingEvent === false) {\n        return false;\n    }\n\n    const { msgtype, body } = mxEvent.getOriginalContent();\n    return (\n        M_POLL_START.matches(mxEvent.getType()) ||\n        ((msgtype === MsgType.Text || msgtype === MsgType.Emote) && !!body && typeof body === \"string\")\n    );\n}\n\nexport function canEditOwnEvent(matrixClient: MatrixClient, mxEvent: MatrixEvent): boolean {\n    // for now we only allow editing\n    // your own events. So this just call through\n    // In the future though, moderators will be able to\n    // edit other people's messages as well but we don't\n    // want findEditableEvent to return other people's events\n    // hence this method.\n    return canEditContent(matrixClient, mxEvent);\n}\n\nconst MAX_JUMP_DISTANCE = 100;\nexport function findEditableEvent({\n    matrixClient,\n    events,\n    isForward,\n    fromEventId,\n}: {\n    matrixClient: MatrixClient;\n    events: MatrixEvent[];\n    isForward: boolean;\n    fromEventId?: string;\n}): MatrixEvent | undefined {\n    if (!events.length) return;\n    const maxIdx = events.length - 1;\n    const inc = isForward ? 1 : -1;\n    const beginIdx = isForward ? 0 : maxIdx;\n    let endIdx = isForward ? maxIdx : 0;\n    if (!fromEventId) {\n        endIdx = Math.min(Math.max(0, beginIdx + inc * MAX_JUMP_DISTANCE), maxIdx);\n    }\n    let foundFromEventId = !fromEventId;\n    for (let i = beginIdx; i !== endIdx + inc; i += inc) {\n        const e = events[i];\n        // find start event first\n        if (!foundFromEventId && e.getId() === fromEventId) {\n            foundFromEventId = true;\n            // don't look further than MAX_JUMP_DISTANCE events from `fromEventId`\n            // to not iterate potentially 1000nds of events on key up/down\n            endIdx = Math.min(Math.max(0, i + inc * MAX_JUMP_DISTANCE), maxIdx);\n        } else if (foundFromEventId && !shouldHideEvent(e) && canEditOwnEvent(matrixClient, e)) {\n            // otherwise look for editable event\n            return e;\n        }\n    }\n}\n\n/**\n * How we should render a message depending on its moderation state.\n */\nexport enum MessageModerationState {\n    /**\n     * The message is visible to all.\n     */\n    VISIBLE_FOR_ALL = \"VISIBLE_FOR_ALL\",\n    /**\n     * The message is hidden pending moderation and we're not a user who should\n     * see it nevertheless.\n     */\n    HIDDEN_TO_CURRENT_USER = \"HIDDEN_TO_CURRENT_USER\",\n    /**\n     * The message is hidden pending moderation and we're either the author of\n     * the message or a moderator. In either case, we need to see the message\n     * with a marker.\n     */\n    SEE_THROUGH_FOR_CURRENT_USER = \"SEE_THROUGH_FOR_CURRENT_USER\",\n}\n\n// This is lazily initialized and cached since getMessageModerationState needs it,\n// and is called on timeline rendering hot-paths\nlet msc3531Enabled: boolean | null = null;\nconst getMsc3531Enabled = (): boolean => {\n    if (msc3531Enabled === null) {\n        msc3531Enabled = SettingsStore.getValue(\"feature_msc3531_hide_messages_pending_moderation\");\n    }\n    return msc3531Enabled!;\n};\n\n/**\n * Determine whether a message should be displayed as hidden pending moderation.\n *\n * If MSC3531 is deactivated in settings, all messages are considered visible\n * to all.\n */\nexport function getMessageModerationState(mxEvent: MatrixEvent, client: MatrixClient): MessageModerationState {\n    if (!getMsc3531Enabled()) {\n        return MessageModerationState.VISIBLE_FOR_ALL;\n    }\n    const visibility = mxEvent.messageVisibility();\n    if (visibility.visible) {\n        return MessageModerationState.VISIBLE_FOR_ALL;\n    }\n\n    // At this point, we know that the message is marked as hidden\n    // pending moderation. However, if we're the author or a moderator,\n    // we still need to display it.\n\n    if (mxEvent.sender?.userId === client.getUserId()) {\n        // We're the author, show the message.\n        return MessageModerationState.SEE_THROUGH_FOR_CURRENT_USER;\n    }\n\n    const room = client.getRoom(mxEvent.getRoomId());\n    if (\n        EVENT_VISIBILITY_CHANGE_TYPE.name &&\n        room?.currentState.maySendStateEvent(EVENT_VISIBILITY_CHANGE_TYPE.name, client.getUserId()!)\n    ) {\n        // We're a moderator (as indicated by prefixed event name), show the message.\n        return MessageModerationState.SEE_THROUGH_FOR_CURRENT_USER;\n    }\n    if (\n        EVENT_VISIBILITY_CHANGE_TYPE.altName &&\n        room?.currentState.maySendStateEvent(EVENT_VISIBILITY_CHANGE_TYPE.altName, client.getUserId()!)\n    ) {\n        // We're a moderator (as indicated by unprefixed event name), show the message.\n        return MessageModerationState.SEE_THROUGH_FOR_CURRENT_USER;\n    }\n    // For everybody else, hide the message.\n    return MessageModerationState.HIDDEN_TO_CURRENT_USER;\n}\n\nexport function isVoiceMessage(mxEvent: MatrixEvent): boolean {\n    const content = mxEvent.getContent();\n    // MSC2516 is a legacy identifier. See https://github.com/matrix-org/matrix-doc/pull/3245\n    return !!content[\"org.matrix.msc2516.voice\"] || !!content[\"org.matrix.msc3245.voice\"];\n}\n\nexport async function fetchInitialEvent(\n    client: MatrixClient,\n    roomId: string,\n    eventId: string,\n): Promise<MatrixEvent | null> {\n    let initialEvent: MatrixEvent | null;\n\n    try {\n        const eventData = await client.fetchRoomEvent(roomId, eventId);\n        initialEvent = new MatrixEvent(eventData);\n    } catch {\n        logger.warn(\"Could not find initial event: \" + eventId);\n        initialEvent = null;\n    }\n\n    if (client.supportsThreads() && initialEvent?.isRelation(THREAD_RELATION_TYPE.name) && !initialEvent.getThread()) {\n        const threadId = initialEvent.threadRootId!;\n        const room = client.getRoom(roomId);\n        const mapper = client.getEventMapper();\n        const rootEvent = room?.findEventById(threadId) ?? mapper(await client.fetchRoomEvent(roomId, threadId));\n        try {\n            room?.createThread(threadId, rootEvent, [initialEvent], true);\n        } catch {\n            logger.warn(\"Could not find root event: \" + threadId);\n        }\n    }\n\n    return initialEvent;\n}\n\nexport function editEvent(\n    matrixClient: MatrixClient,\n    mxEvent: MatrixEvent,\n    timelineRenderingType: TimelineRenderingType,\n    getRelationsForEvent?: GetRelationsForEvent,\n): void {\n    if (!canEditContent(matrixClient, mxEvent)) return;\n\n    if (M_POLL_START.matches(mxEvent.getType())) {\n        launchPollEditor(mxEvent, getRelationsForEvent);\n    } else {\n        defaultDispatcher.dispatch({\n            action: Action.EditEvent,\n            event: mxEvent,\n            timelineRenderingType: timelineRenderingType,\n        });\n    }\n}\n\nexport function canCancel(status?: EventStatus | null): boolean {\n    return status === EventStatus.QUEUED || status === EventStatus.NOT_SENT || status === EventStatus.ENCRYPTING;\n}\n\nexport const isLocationEvent = (event: MatrixEvent): boolean => {\n    const eventType = event.getType();\n    return (\n        M_LOCATION.matches(eventType) ||\n        (eventType === EventType.RoomMessage && M_LOCATION.matches(event.getContent().msgtype!))\n    );\n};\n\nexport function hasThreadSummary(event: MatrixEvent): boolean {\n    return event.isThreadRoot && !!event.getThread()?.length && !!event.getThread()!.replyToEvent;\n}\n\nexport const highlightEvent = (roomId: string, eventId: string): void => {\n    defaultDispatcher.dispatch<ViewRoomPayload>({\n        action: Action.ViewRoom,\n        event_id: eventId,\n        highlighted: true,\n        room_id: roomId,\n        metricsTrigger: undefined, // room doesn't change\n    });\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { BugReportEndpointURLLocal } from \"../IConfigOptions\";\nimport SdkConfig from \"../SdkConfig\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { UIFeature } from \"../settings/UIFeature\";\n\nexport function shouldShowFeedback(): boolean {\n    const url = SdkConfig.get().bug_report_endpoint_url;\n    return !!url && url !== BugReportEndpointURLLocal && SettingsStore.getValue(UIFeature.Feedback);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport type GetIframeFn = () => HTMLIFrameElement | null;\n\nexport const DEFAULT_STYLES = {\n    imgSrc: \"\",\n    imgStyle: null as string | null, // css props\n    style: \"\",\n    textContent: \"\",\n};\n\ntype DownloadOptions = {\n    blob: Blob;\n    name: string;\n    autoDownload?: boolean;\n    opts?: typeof DEFAULT_STYLES;\n};\n\n// set up the iframe as a singleton so we don't have to figure out destruction of it down the line.\nlet managedIframe: HTMLIFrameElement;\nlet onLoadPromise: Promise<void>;\nfunction getManagedIframe(): { iframe: HTMLIFrameElement; onLoadPromise: Promise<void> } {\n    if (managedIframe) return { iframe: managedIframe, onLoadPromise };\n\n    managedIframe = document.createElement(\"iframe\");\n\n    // Need to append the iframe in order for the browser to load it.\n    document.body.appendChild(managedIframe);\n\n    // Dev note: the reassignment warnings are entirely incorrect here.\n\n    managedIframe.style.display = \"none\";\n\n    // @ts-ignore\n    // noinspection JSConstantReassignment\n    managedIframe.sandbox = \"allow-scripts allow-downloads\";\n\n    onLoadPromise = new Promise((resolve) => {\n        managedIframe.onload = () => {\n            resolve();\n        };\n        managedIframe.src = \"usercontent/\"; // XXX: Should come from the skin\n    });\n\n    return { iframe: managedIframe, onLoadPromise };\n}\n\n// TODO: If we decide to keep the download link behaviour, we should bring the style management into here.\n\n/**\n * Helper to handle safe file downloads. This operates off an iframe for reasons described\n * by the blob helpers. By default, this will use a hidden iframe to manage the download\n * through a user content wrapper, but can be given an iframe reference if the caller needs\n * additional control over the styling/position of the iframe itself.\n */\nexport class FileDownloader {\n    private onLoadPromise?: Promise<void>;\n\n    /**\n     * Creates a new file downloader\n     * @param iframeFn Function to get a pre-configured iframe. Set to null to have the downloader\n     * use a generic, hidden, iframe.\n     */\n    public constructor(private iframeFn?: GetIframeFn) {}\n\n    private get iframe(): HTMLIFrameElement {\n        const iframe = this.iframeFn?.();\n        if (!iframe) {\n            const managed = getManagedIframe();\n            this.onLoadPromise = managed.onLoadPromise;\n            return managed.iframe;\n        }\n        this.onLoadPromise = undefined;\n        return iframe;\n    }\n\n    public async download({ blob, name, autoDownload = true, opts = DEFAULT_STYLES }: DownloadOptions): Promise<void> {\n        const iframe = this.iframe; // get the iframe first just in case we need to await onload\n        if (this.onLoadPromise) await this.onLoadPromise;\n        iframe.contentWindow?.postMessage(\n            {\n                ...opts,\n                blob: blob,\n                download: name,\n                auto: autoDownload,\n            },\n            \"*\",\n        );\n    }\n}\n","/**\n * filesize\n *\n * @copyright 2026 Jason Mulligan <jason.mulligan@avoidwork.com>\n * @license BSD-3-Clause\n * @version 11.0.19\n */\n// Error Messages\nconst INVALID_NUMBER = \"Invalid number\";\nconst INVALID_ROUND = \"Invalid rounding method\";\n\n// Standard Types\nconst IEC = \"iec\";\nconst JEDEC = \"jedec\";\nconst SI = \"si\";\n\n// Unit Types\nconst BIT = \"bit\";\nconst BITS = \"bits\";\nconst BYTE = \"byte\";\nconst BYTES = \"bytes\";\nconst SI_KBIT = \"kbit\";\nconst SI_KBYTE = \"kB\";\n\n// Output Format Types\nconst ARRAY = \"array\";\nconst FUNCTION = \"function\";\nconst OBJECT = \"object\";\nconst STRING = \"string\";\n\n// Processing Constants\nconst EXPONENT = \"exponent\";\nconst ROUND = \"round\";\n\n// Special Characters and Values\nconst E = \"e\";\nconst EMPTY = \"\";\nconst PERIOD = \".\";\nconst S = \"s\";\nconst SPACE = \" \";\nconst ZERO = \"0\";\n\n// Data Structures\nconst STRINGS = {\n\tsymbol: {\n\t\tiec: {\n\t\t\tbits: [\"bit\", \"Kibit\", \"Mibit\", \"Gibit\", \"Tibit\", \"Pibit\", \"Eibit\", \"Zibit\", \"Yibit\"],\n\t\t\tbytes: [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\", \"ZiB\", \"YiB\"],\n\t\t},\n\t\tjedec: {\n\t\t\tbits: [\"bit\", \"Kbit\", \"Mbit\", \"Gbit\", \"Tbit\", \"Pbit\", \"Ebit\", \"Zbit\", \"Ybit\"],\n\t\t\tbytes: [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"],\n\t\t},\n\t},\n\tfullform: {\n\t\tiec: [\"\", \"kibi\", \"mebi\", \"gibi\", \"tebi\", \"pebi\", \"exbi\", \"zebi\", \"yobi\"],\n\t\tjedec: [\"\", \"kilo\", \"mega\", \"giga\", \"tera\", \"peta\", \"exa\", \"zetta\", \"yotta\"],\n\t},\n};\n\n// Pre-computed lookup tables for performance optimization\nconst BINARY_POWERS = [\n\t1, // 2^0\n\t1024, // 2^10\n\t1048576, // 2^20\n\t1073741824, // 2^30\n\t1099511627776, // 2^40\n\t1125899906842624, // 2^50\n\t1152921504606846976, // 2^60\n\t1180591620717411303424, // 2^70\n\t1208925819614629174706176, // 2^80\n];\n\nconst DECIMAL_POWERS = [\n\t1, // 10^0\n\t1000, // 10^3\n\t1000000, // 10^6\n\t1000000000, // 10^9\n\t1000000000000, // 10^12\n\t1000000000000000, // 10^15\n\t1000000000000000000, // 10^18\n\t1000000000000000000000, // 10^21\n\t1000000000000000000000000, // 10^24\n];\n\n// Pre-computed log values for faster exponent calculation\nconst LOG_2_1024 = Math.log(1024);\nconst LOG_10_1000 = Math.log(1000);// Cached configuration lookup for better performance\nconst STANDARD_CONFIGS = {\n\t[SI]: { isDecimal: true, ceil: 1000, actualStandard: JEDEC },\n\t[IEC]: { isDecimal: false, ceil: 1024, actualStandard: IEC },\n\t[JEDEC]: { isDecimal: false, ceil: 1024, actualStandard: JEDEC },\n};\n\n/**\n * Optimized base configuration lookup\n * @param {string} standard - Standard type\n * @param {number} base - Base number\n * @returns {Object} Configuration object\n */\nfunction getBaseConfiguration(standard, base) {\n\t// Use cached lookup table for better performance\n\tif (STANDARD_CONFIGS[standard]) {\n\t\treturn STANDARD_CONFIGS[standard];\n\t}\n\n\t// Base override\n\tif (base === 2) {\n\t\treturn { isDecimal: false, ceil: 1024, actualStandard: IEC };\n\t}\n\n\t// Default\n\treturn { isDecimal: true, ceil: 1000, actualStandard: JEDEC };\n}\n\n/**\n * Optimized zero value handling\n * @param {number} precision - Precision value\n * @param {string} actualStandard - Standard to use\n * @param {boolean} bits - Whether to use bits\n * @param {Object} symbols - Custom symbols\n * @param {boolean} full - Whether to use full form\n * @param {Array} fullforms - Custom full forms\n * @param {string} output - Output format\n * @param {string} spacer - Spacer character\n * @param {string} [symbol] - Symbol to use (defaults based on bits/standard)\n * @returns {string|Array|Object|number} Formatted result\n */\nfunction handleZeroValue(\n\tprecision,\n\tactualStandard,\n\tbits,\n\tsymbols,\n\tfull,\n\tfullforms,\n\toutput,\n\tspacer,\n\tsymbol,\n) {\n\tlet value;\n\tif (precision > 0) {\n\t\tvalue = (0).toPrecision(precision);\n\t} else {\n\t\tvalue = 0;\n\t}\n\n\tif (output === EXPONENT) {\n\t\treturn 0;\n\t}\n\n\t// Set default symbol if not provided\n\tif (!symbol) {\n\t\tsymbol = bits\n\t\t\t? STRINGS.symbol[actualStandard].bits[0]\n\t\t\t: STRINGS.symbol[actualStandard].bytes[0];\n\t}\n\n\t// Apply symbol customization\n\tif (symbols[symbol]) {\n\t\tsymbol = symbols[symbol];\n\t}\n\n\t// Apply full form\n\tif (full) {\n\t\tif (fullforms[0]) {\n\t\t\tsymbol = fullforms[0];\n\t\t} else {\n\t\t\tsymbol = STRINGS.fullform[actualStandard][0];\n\t\t\tif (bits) {\n\t\t\t\tsymbol += BIT;\n\t\t\t} else {\n\t\t\t\tsymbol += BYTE;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return in requested format\n\tif (output === ARRAY) {\n\t\treturn [value, symbol];\n\t}\n\n\tif (output === OBJECT) {\n\t\treturn { value, symbol, exponent: 0, unit: symbol };\n\t}\n\n\treturn value + spacer + symbol;\n}\n\n/**\n * Optimized value calculation with bits handling\n * @param {number} num - Input number\n * @param {number} e - Exponent\n * @param {boolean} isDecimal - Whether to use decimal powers\n * @param {boolean} bits - Whether to calculate bits\n * @param {number} ceil - Ceiling value for auto-increment\n * @param {boolean} autoExponent - Whether exponent is auto (-1 or NaN)\n * @returns {Object} Object with result and e properties\n */\nfunction calculateOptimizedValue(num, e, isDecimal, bits, ceil, autoExponent = true) {\n\tlet d;\n\tif (isDecimal) {\n\t\td = DECIMAL_POWERS[e];\n\t} else {\n\t\td = BINARY_POWERS[e];\n\t}\n\tlet result = num / d;\n\n\tif (bits) {\n\t\tresult *= 8;\n\t\t// Handle auto-increment for bits (only when exponent is auto)\n\t\tif (autoExponent && result >= ceil && e < 8) {\n\t\t\tresult /= ceil;\n\t\t\te++;\n\t\t}\n\t}\n\n\treturn { result, e };\n}\n\n/**\n * Optimized precision handling with scientific notation correction\n * @param {number} value - Current value\n * @param {number} precision - Precision to apply\n * @param {number} e - Current exponent\n * @param {number} num - Original number\n * @param {boolean} isDecimal - Whether using decimal base\n * @param {boolean} bits - Whether calculating bits\n * @param {number} ceil - Ceiling value\n * @param {Function} roundingFunc - Rounding function\n * @param {number} round - Round value\n * @param {number} exponent - Forced exponent (-1 for auto)\n * @returns {Object} Object with value and e properties\n */\nfunction applyPrecisionHandling(\n\tvalue,\n\tprecision,\n\te,\n\tnum,\n\tisDecimal,\n\tbits,\n\tceil,\n\troundingFunc,\n\tround,\n\texponent,\n) {\n\tif (typeof value === \"string\") {\n\t\tvalue = parseFloat(value);\n\t}\n\n\tlet result = value.toPrecision(precision);\n\n\tconst autoExponent = exponent === -1 || isNaN(exponent);\n\n\t// Handle scientific notation by recalculating with incremented exponent\n\tif (result.includes(E) && e < 8 && autoExponent) {\n\t\te++;\n\t\tconst { result: valueResult } = calculateOptimizedValue(num, e, isDecimal, bits, ceil);\n\t\tlet p;\n\t\tif (round > 0) {\n\t\t\tp = Math.pow(10, round);\n\t\t} else {\n\t\t\tp = 1;\n\t\t}\n\t\tlet computed;\n\t\tif (p === 1) {\n\t\t\tcomputed = roundingFunc(valueResult);\n\t\t} else {\n\t\t\tcomputed = roundingFunc(valueResult * p) / p;\n\t\t}\n\t\tresult = computed.toPrecision(precision);\n\t}\n\n\treturn { value: result, e };\n}\n\n/**\n * Optimized number formatting with locale, separator, and padding\n * @param {number|string} value - Value to format\n * @param {string|boolean} locale - Locale setting\n * @param {Object} localeOptions - Locale options\n * @param {string} separator - Custom separator\n * @param {boolean} pad - Whether to pad\n * @param {number} round - Round value\n * @returns {string|number} Formatted value\n */\nfunction applyNumberFormatting(\n\tvalue,\n\tlocale,\n\tlocaleOptions,\n\tseparator,\n\tpad,\n\tround,\n\troundingFunc,\n) {\n\tlet result = value;\n\n\t// When padding alongside a locale, let the locale formatter emit the fixed\n\t// number of fraction digits. The manual string padding below cannot tell a\n\t// locale-inserted grouping separator from the decimal separator, so it\n\t// dropped digits (e.g. \"1,234,500\" became \"1,234\").\n\tconst localePad =\n\t\tpad && round > 0 ? { minimumFractionDigits: round, maximumFractionDigits: round } : undefined;\n\n\t// Apply locale formatting\n\tif (locale === true) {\n\t\tresult = result.toLocaleString(undefined, localePad);\n\t} else if (locale.length > 0) {\n\t\tresult = result.toLocaleString(locale, { ...localeOptions, ...localePad });\n\t} else if (separator.length > 0) {\n\t\t// Round before separator replacement to ensure excess decimal places\n\t\t// are truncated when pad is also set (fixes padding + separator bug).\n\t\tif (pad && round > 0) {\n\t\t\tconst p = Math.pow(10, round);\n\t\t\tresult = roundingFunc(result * p) / p;\n\t\t}\n\t\tresult = result.toString().replace(PERIOD, separator);\n\t}\n\n\t// Apply padding for the non-locale paths, where the string has a single\n\t// decimal separator and no grouping is inserted.\n\tif (pad && round > 0 && locale !== true && locale.length === 0) {\n\t\tconst resultStr = result.toString();\n\t\tconst x = separator || PERIOD;\n\t\tconst tmp = resultStr.split(x);\n\t\tconst s = tmp[1] || EMPTY;\n\n\t\tresult = `${tmp[0]}${x}${s.padEnd(round, ZERO)}`;\n\t}\n\n\treturn result;\n}\n\n/**\n * Calculates exponent from the input value using pre-computed log values and clamps to supported range\n * Also adjusts precision when exponent exceeds the lookup table bounds\n * @param {number} num - Input file size in bytes\n * @param {number} e - Current exponent value\n * @param {number} exponent - Original user-provided exponent option (-1 for auto)\n * @param {boolean} isDecimal - Whether to use decimal (SI) base\n * @param {number} precision - Current precision value (modified when e > 8)\n * @returns {Object} Object with computed e value and possibly adjusted precision\n */\nfunction calculateExponent(num, e, exponent, isDecimal, precision) {\n\tif (e === -1 || isNaN(e)) {\n\t\tif (isDecimal) {\n\t\t\te = Math.floor(Math.log(num) / LOG_10_1000);\n\t\t} else {\n\t\t\te = Math.floor(Math.log(num) / LOG_2_1024);\n\t\t}\n\t\tif (e < 0) {\n\t\t\te = 0;\n\t\t}\n\t}\n\n\tif (e > 8) {\n\t\tif (precision > 0) {\n\t\t\tprecision += 8 - e;\n\t\t}\n\t\treturn { e: 8, precision };\n\t}\n\n\treturn { e, precision };\n}\n\n/**\n * Applies rounding to the raw calculated value and handles auto-increment ceiling\n * @param {number} val - Raw value before rounding\n * @param {number} ceil - Ceiling threshold (1000 for SI, 1024 for IEC)\n * @param {number} e - Current exponent value\n * @param {number} round - Number of decimal places\n * @param {Function} roundingFunc - Rounding method (Math.round, Math.floor, Math.ceil)\n * @param {boolean} autoExponent - Whether exponent is auto-calculated (-1 or NaN)\n * @returns {Object} Object with rounded value and possibly incremented exponent\n */\nfunction applyRounding(val, ceil, e, round, roundingFunc, autoExponent) {\n\tlet p;\n\tif (e > 0 && round > 0) {\n\t\tp = Math.pow(10, round);\n\t} else {\n\t\tp = 1;\n\t}\n\tlet r;\n\tif (p === 1) {\n\t\tr = roundingFunc(val);\n\t} else {\n\t\tr = roundingFunc(val * p) / p;\n\t}\n\n\tif (r === ceil && e < 8 && autoExponent) {\n\t\tr = 1;\n\t\te++;\n\t}\n\n\treturn { value: r, e };\n}\n\n/**\n * Resolves the unit symbol for the given standard, bits mode, and exponent\n * Handles SI standard special case where exponent 1 always uses \"kB\" or \"kbit\"\n * @param {string} actualStandard - The resolved standard (iec, jedec)\n * @param {boolean} bits - Whether formatting bit values\n * @param {number} e - Current exponent index\n * @param {boolean} isDecimal - Whether using decimal (SI) base\n * @returns {string} The resolved unit symbol string\n */\nfunction resolveSymbol(actualStandard, bits, e, isDecimal) {\n\tconst symbolTable = STRINGS.symbol[actualStandard][bits ? BITS : BYTES];\n\tlet result;\n\tif (isDecimal && e === 1) {\n\t\tif (bits) {\n\t\t\tresult = SI_KBIT;\n\t\t} else {\n\t\t\tresult = SI_KBYTE;\n\t\t}\n\t} else {\n\t\tresult = symbolTable[e];\n\t}\n\treturn result;\n}\n\n/**\n * Decorates the result: applies negation, custom symbols, number formatting, and full form names\n * Mutates the result array in-place for both value (index 0) and symbol (index 1)\n * @param {Array} result - Result array with numeric value at [0] and string symbol at [1]\n * @param {boolean} neg - Whether the original input was negative\n * @param {Object} symbols - Custom symbol override map\n * @param {string|boolean} locale - Locale string for formatting\n * @param {Object} localeOptions - Additional locale formatting options\n * @param {string} separator - Custom decimal separator\n * @param {boolean} pad - Whether zero-pad decimals\n * @param {number} round - Target decimal count for padding\n * @param {boolean} full - Whether to use full unit names\n * @param {Array} fullforms - Custom full unit name overrides\n * @param {string} actualStandard - Unit standard for full form lookup\n * @param {number} e - Current exponent index\n * @param {boolean} bits - Whether formatting bit values\n * @returns {void} Mutates result array in place\n */\nfunction decorateResult(\n\tresult,\n\tneg,\n\tsymbols,\n\tlocale,\n\tlocaleOptions,\n\tseparator,\n\tpad,\n\tround,\n\tfull,\n\tfullforms,\n\tactualStandard,\n\te,\n\tbits,\n\troundingFunc,\n) {\n\tif (neg) {\n\t\tresult[0] = -result[0];\n\t}\n\n\tif (symbols[result[1]]) {\n\t\tresult[1] = symbols[result[1]];\n\t}\n\n\tresult[0] = applyNumberFormatting(\n\t\tresult[0],\n\t\tlocale,\n\t\tlocaleOptions,\n\t\tseparator,\n\t\tpad,\n\t\tround,\n\t\troundingFunc,\n\t);\n\n\tif (full) {\n\t\tlet unit;\n\t\tif (bits) {\n\t\t\tunit = BIT;\n\t\t} else {\n\t\t\tunit = BYTE;\n\t\t}\n\t\tlet val;\n\t\tif (typeof result[0] === \"string\") {\n\t\t\tval = parseFloat(result[0]);\n\t\t} else {\n\t\t\tval = result[0];\n\t\t}\n\t\t// Determine singular/plural suffix\n\t\tlet suffix;\n\t\tif (val === 1) {\n\t\t\tsuffix = EMPTY;\n\t\t} else {\n\t\t\tsuffix = S;\n\t\t}\n\t\t// Determine symbol — custom fullforms are the complete name, defaults get unit+suffix\n\t\tif (fullforms[e]) {\n\t\t\tresult[1] = fullforms[e];\n\t\t} else {\n\t\t\tresult[1] = STRINGS.fullform[actualStandard][e] + unit + suffix;\n\t\t}\n\t}\n}\n\n/**\n * Formats the computed result array into the requested output type\n * @param {Array} result - Result array with formatted value at [0] and symbol at [1]\n * @param {number} e - Current exponent\n * @param {string} u - Original resolved symbol (before custom override)\n * @param {string} output - Output type (ARRAY, OBJECT, STRING)\n * @param {string} spacer - String separator between value and unit\n * @returns {string|Array|Object|number} Formatted result in requested type\n */\nfunction formatOutput(result, e, u, output, spacer) {\n\tif (output === ARRAY) {\n\t\treturn result;\n\t}\n\n\tif (output === OBJECT) {\n\t\treturn {\n\t\t\tvalue: result[0],\n\t\t\tsymbol: result[1],\n\t\t\texponent: e,\n\t\t\tunit: u,\n\t\t};\n\t}\n\n\tlet formatted;\n\tif (spacer === SPACE) {\n\t\tformatted = `${result[0]} ${result[1]}`;\n\t} else {\n\t\tformatted = result.join(spacer);\n\t}\n\treturn formatted;\n}/**\n * Converts a file size in bytes to a human-readable string with appropriate units\n * @param {number|string|bigint} arg - The file size in bytes to convert\n * @param {Object} [options={}] - Configuration options for formatting\n * @param {boolean} [options.bits=false] - If true, calculates bits instead of bytes\n * @param {boolean} [options.pad=false] - If true, pads decimal places to match round parameter\n * @param {number} [options.base=-1] - Number base (2 for binary, 10 for decimal, -1 for auto)\n * @param {number} [options.round=2] - Number of decimal places to round to\n * @param {string|boolean} [options.locale=\"\"] - Locale for number formatting, true for system locale\n * @param {Object} [options.localeOptions={}] - Additional options for locale formatting\n * @param {string} [options.separator=\"\"] - Custom decimal separator\n * @param {string} [options.spacer=\" \"] - String to separate value and unit\n * @param {Object} [options.symbols={}] - Custom unit symbols\n * @param {string} [options.standard=\"\"] - Unit standard to use (SI, IEC, JEDEC)\n * @param {string} [options.output=\"string\"] - Output format: \"string\", \"array\", \"object\", or \"exponent\"\n * @param {boolean} [options.fullform=false] - If true, uses full unit names instead of abbreviations\n * @param {Array} [options.fullforms=[]] - Custom full unit names\n * @param {number} [options.exponent=-1] - Force specific exponent (-1 for auto)\n * @param {string} [options.roundingMethod=\"round\"] - Math rounding method to use\n * @param {number} [options.precision=0] - Number of significant digits (0 for auto)\n * @returns {string|Array|Object|number} Formatted file size based on output option\n * @throws {TypeError} When arg is not a valid number or roundingMethod is invalid\n * @example\n * filesize(1024) // \"1.02 kB\"\n * filesize(1024, {bits: true}) // \"8.19 kbit\"\n * filesize(1024, {output: \"object\"}) // {value: 1.02, symbol: \"kB\", exponent: 1, unit: \"kB\"}\n */\nfunction filesize(\n\targ,\n\t{\n\t\tbits = false,\n\t\tpad = false,\n\t\tbase = -1,\n\t\tround = 2,\n\t\tlocale = EMPTY,\n\t\tlocaleOptions = {},\n\t\tseparator = EMPTY,\n\t\tspacer = SPACE,\n\t\tsymbols = {},\n\t\tstandard = EMPTY,\n\t\toutput = STRING,\n\t\tfullform = false,\n\t\tfullforms = [],\n\t\texponent = -1,\n\t\troundingMethod = ROUND,\n\t\tprecision = 0,\n\t} = {},\n) {\n\tlet e = exponent,\n\t\tnum,\n\t\tresult = [],\n\t\tval = 0,\n\t\tu = EMPTY;\n\n\tif (typeof arg === \"bigint\") {\n\t\tnum = Number(arg);\n\t} else {\n\t\tnum = Number(arg);\n\n\t\tif (isNaN(num)) {\n\t\t\tthrow new TypeError(INVALID_NUMBER);\n\t\t}\n\n\t\tif (!isFinite(num)) {\n\t\t\tthrow new TypeError(INVALID_NUMBER);\n\t\t}\n\t}\n\n\tconst { isDecimal, ceil, actualStandard } = getBaseConfiguration(standard, base);\n\n\tconst full = fullform === true,\n\t\tneg = num < 0,\n\t\troundingFunc = Math[roundingMethod];\n\n\tif (typeof roundingFunc !== FUNCTION) {\n\t\tthrow new TypeError(INVALID_ROUND);\n\t}\n\n\tif (neg) {\n\t\tnum = -num;\n\t}\n\n\tif (num === 0) {\n\t\treturn handleZeroValue(\n\t\t\tprecision,\n\t\t\tactualStandard,\n\t\t\tbits,\n\t\t\tsymbols,\n\t\t\tfull,\n\t\t\tfullforms,\n\t\t\toutput,\n\t\t\tspacer,\n\t\t);\n\t}\n\n\t// Exponent calculation + clamp + precision adjustment\n\tconst { e: calculatedE, precision: precisionAdjusted } = calculateExponent(\n\t\tnum,\n\t\te,\n\t\texponent,\n\t\tisDecimal,\n\t\tprecision,\n\t);\n\te = calculatedE;\n\tconst autoExponent = exponent === -1 || isNaN(exponent);\n\n\tif (output === EXPONENT) {\n\t\treturn e;\n\t}\n\n\tconst { result: valueResult, e: valueExponent } = calculateOptimizedValue(\n\t\tnum,\n\t\te,\n\t\tisDecimal,\n\t\tbits,\n\t\tceil,\n\t\tautoExponent,\n\t);\n\tval = valueResult;\n\te = valueExponent;\n\n\t// Rounding + auto-increment ceiling\n\tconst rounded = applyRounding(val, ceil, e, round, roundingFunc, autoExponent);\n\tresult[0] = rounded.value;\n\te = rounded.e;\n\n\t// Precision handling\n\tif (precisionAdjusted > 0) {\n\t\tconst precisionResult = applyPrecisionHandling(\n\t\t\tresult[0],\n\t\t\tprecisionAdjusted,\n\t\t\te,\n\t\t\tnum,\n\t\t\tisDecimal,\n\t\t\tbits,\n\t\t\tceil,\n\t\t\troundingFunc,\n\t\t\tround,\n\t\t\texponent,\n\t\t);\n\t\tresult[0] = precisionResult.value;\n\t\te = precisionResult.e;\n\t}\n\n\tu = resolveSymbol(actualStandard, bits, e, isDecimal);\n\tresult[1] = u;\n\n\tdecorateResult(\n\t\tresult,\n\t\tneg,\n\t\tsymbols,\n\t\tlocale,\n\t\tlocaleOptions,\n\t\tseparator,\n\t\tpad,\n\t\tround,\n\t\tfull,\n\t\tfullforms,\n\t\tactualStandard,\n\t\te,\n\t\tbits,\n\t\troundingFunc,\n\t);\n\n\treturn formatOutput(result, e, u, output, spacer);\n}\n\n/**\n * Creates a partially applied version of filesize with preset options\n * @param {Object} [options={}] - Configuration options (same as filesize)\n * @param {boolean} [options.bits=false] - If true, calculates bits instead of bytes\n * @param {boolean} [options.pad=false] - If true, pads decimal places to match round parameter\n * @param {number} [options.base=-1] - Number base (2 for binary, 10 for decimal, -1 for auto)\n * @param {number} [options.round=2] - Number of decimal places to round to\n * @param {string|boolean} [options.locale=\"\"] - Locale for number formatting, true for system locale\n * @param {Object} [options.localeOptions={}] - Additional options for locale formatting\n * @param {string} [options.separator=\"\"] - Custom decimal separator\n * @param {string} [options.spacer=\" \"] - String to separate value and unit\n * @param {Object} [options.symbols={}] - Custom unit symbols\n * @param {string} [options.standard=\"\"] - Unit standard to use (SI, IEC, JEDEC)\n * @param {string} [options.output=\"string\"] - Output format: \"string\", \"array\", \"object\", or \"exponent\"\n * @param {boolean} [options.fullform=false] - If true, uses full unit names instead of abbreviations\n * @param {Array} [options.fullforms=[]] - Custom full unit names\n * @param {number} [options.exponent=-1] - Force specific exponent (-1 for auto)\n * @param {string} [options.roundingMethod=\"round\"] - Math rounding method to use\n * @param {number} [options.precision=0] - Number of significant digits (0 for auto)\n * @returns {Function} A function that takes a file size and returns formatted output\n * @example\n * const formatBytes = partial({round: 1, standard: \"iec\"});\n * formatBytes(1024) // \"1 KiB\"\n * formatBytes(2048) // \"2 KiB\"\n * formatBytes(1536) // \"1.5 KiB\"\n */\nfunction partial({\n\tbits = false,\n\tpad = false,\n\tbase = -1,\n\tround = 2,\n\tlocale = EMPTY,\n\tseparator = EMPTY,\n\tspacer = SPACE,\n\tstandard = EMPTY,\n\toutput = STRING,\n\tfullform = false,\n\texponent = -1,\n\troundingMethod = ROUND,\n\tprecision = 0,\n\tlocaleOptions = {},\n\tsymbols = {},\n\tfullforms = [],\n} = {}) {\n\t/**\n\t * Safely clone an object using structuredClone with JSON fallback.\n\t * structuredClone can throw for functions, circular refs, etc.\n\t */\n\tfunction safeClone(value) {\n\t\ttry {\n\t\t\treturn typeof structuredClone === \"function\"\n\t\t\t\t? structuredClone(value)\n\t\t\t\t: JSON.parse(JSON.stringify(value));\n\t\t} catch {\n\t\t\treturn JSON.parse(JSON.stringify(value));\n\t\t}\n\t}\n\n\tconst cloned = {\n\t\tlocaleOptions: safeClone(localeOptions),\n\t\tsymbols: safeClone(symbols),\n\t\tfullforms: safeClone(fullforms),\n\t};\n\n\treturn (arg) =>\n\t\tfilesize(arg, {\n\t\t\tbits,\n\t\t\tpad,\n\t\t\tbase,\n\t\t\tround,\n\t\t\tlocale,\n\t\t\tlocaleOptions: cloned.localeOptions,\n\t\t\tseparator,\n\t\t\tspacer,\n\t\t\tsymbols: cloned.symbols,\n\t\t\tstandard,\n\t\t\toutput,\n\t\t\tfullform,\n\t\t\tfullforms: cloned.fullforms,\n\t\t\texponent,\n\t\t\troundingMethod,\n\t\t\tprecision,\n\t\t});\n}export{filesize,partial};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>\nCopyright 2015-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { filesize, type FilesizeOptions, type FilesizeReturn } from \"filesize\";\nimport { type MediaEventContent } from \"matrix-js-sdk/src/types\";\n\nimport { _t } from \"../languageHandler\";\n\nexport function downloadLabelForFile(content: MediaEventContent, withSize = true): string {\n    let text = _t(\"action|download\");\n\n    if (content.info?.size && withSize) {\n        // If we know the size of the file then add it as human-readable string to the end of the link text\n        // so that the user knows how big a file they are downloading.\n        text += \" (\" + fileSize(content.info.size, { base: 2, standard: \"jedec\" }) + \")\";\n    }\n    return text;\n}\n\n/**\n * Extracts a human-readable label for the file attachment to use as\n * link text.\n *\n * @param {MediaEventContent} content The \"content\" key of the matrix event.\n * @param {string} fallbackText The fallback text\n * @param {boolean} withSize Whether to include size information. Default true.\n * @param {boolean} shortened Ensure the extension of the file name is visible. Default false.\n * @returns {string} the human-readable link text for the attachment.\n */\nexport function presentableTextForFile(\n    content: MediaEventContent,\n    fallbackText = _t(\"common|attachment\"),\n    withSize = true,\n    shortened = false,\n): string {\n    let text = fallbackText;\n    if (content.filename?.length) {\n        text = content.filename;\n    } else if (content.body?.length) {\n        // The content body should be the name of the file including a\n        // file extension.\n        text = content.body;\n    }\n\n    // We shorten to 15 characters somewhat arbitrarily, and assume most files\n    // will have a 3 character (plus full stop) extension. The goal is to knock\n    // the label down to 15-25 characters, not perfect accuracy.\n    if (shortened && text.length > 19) {\n        const parts = text.split(\".\");\n        let fileName = parts\n            .slice(0, parts.length - 1)\n            .join(\".\")\n            .substring(0, 15);\n        const extension = parts[parts.length - 1];\n\n        // Trim off any full stops from the file name to avoid a case where we\n        // add an ellipsis that looks really funky.\n        fileName = fileName.replace(/\\.*$/g, \"\");\n\n        text = `${fileName}...${extension}`;\n    }\n\n    if (content.info?.size && withSize) {\n        // If we know the size of the file then add it as human readable\n        // string to the end of the link text so that the user knows how\n        // big a file they are downloading.\n        // The content.info also contains a MIME-type but we don't display\n        // it since it is \"ugly\", users generally aren't aware what it\n        // means and the type of the attachment can usually be inferred\n        // from the file extension.\n        text += \" (\" + fileSize(content.info.size, { base: 2, standard: \"jedec\" }) + \")\";\n    }\n    return text;\n}\n\n/**\n * wrapper function to set default values for filesize function\n *\n * @param byteCount size of file\n * @param options options to customize the response type or size type conversion e.g. 12kB, 12KB\n * @returns {string | number | any[] | {\n *  value: any;\n *  symbol: any;\n *  exponent: number;\n *  unit: string;}} formatted file size with unit e.g. 12kB, 12KB\n */\nexport function fileSize<O extends FilesizeOptions>(byteCount: number, options?: O): FilesizeReturn<O> {\n    const defaultOption = { base: 2, standard: \"jedec\", ...options } as O;\n    return filesize<O>(byteCount, defaultOption);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 The Matrix.org Foundation C.I.C.\nCopyright 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type ReactElement, type ReactNode } from \"react\";\nimport { useIdColorHash } from \"@vector-im/compound-web\";\n\nimport { _t, getCurrentLanguage } from \"../languageHandler\";\nimport { getUserLanguage } from \"../i18n/settings\";\nimport { jsxJoin } from \"./ReactUtils\";\n\nexport { formatBytes } from \"@element-hq/web-shared-components\";\n\nlet cachedFormatter: Intl.NumberFormat | undefined;\nlet cachedCompactFormatter: Intl.NumberFormat | undefined;\n\n// It's quite costly to instanciate `Intl.NumberFormat`, hence why we do not do\n// it in every function call\nconst getCachedCompactFormatter = (): Intl.NumberFormat => {\n    if (!cachedCompactFormatter)\n        cachedCompactFormatter = new Intl.NumberFormat(getCurrentLanguage(), { notation: \"compact\" });\n    return cachedCompactFormatter;\n};\n\n/**\n * formats and rounds numbers to fit into ~3 characters, suitable for badge counts\n * e.g: 999, 10K, 99K, 1M, 10M, 99M, 1B, 10B, ...\n */\nexport function formatCount(count: number): string {\n    return getCachedCompactFormatter().format(count);\n}\n\n// It's quite costly to instanciate `Intl.NumberFormat`, hence why we do not do\n// it in every function call\nconst getCachedFormatter = (): Intl.NumberFormat => {\n    if (!cachedFormatter) cachedFormatter = new Intl.NumberFormat(getCurrentLanguage());\n    return cachedFormatter;\n};\n\n/**\n * Format a count showing the whole number but making it a bit more readable.\n * e.g: 1000 => 1,000\n */\nexport function formatCountLong(count: number): string {\n    return getCachedFormatter().format(count);\n}\n\nexport function getUserNameColorClass(userId: string): string {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    const number = useIdColorHash(userId);\n    return `mx_Username_color${number}`;\n}\n\n/**\n * Constructs a written English string representing `items`, with an optional\n * limit on the number of items included in the result. If specified and if the\n * length of `items` is greater than the limit, the string \"and n others\" will\n * be appended onto the result. If `items` is empty, returns the empty string.\n * If there is only one item, return it.\n * @param {string[]} items the items to construct a string from.\n * @param {number?} itemLimit the number by which to limit the list.\n * @returns {string} a string constructed by joining `items` with a comma\n * between each item, but with the last item appended as \" and [lastItem]\".\n */\nexport function formatList(items: string[], itemLimit?: number, includeCount?: boolean): string;\nexport function formatList(items: ReactElement[], itemLimit?: number, includeCount?: boolean): ReactElement;\nexport function formatList(items: ReactNode[], itemLimit?: number, includeCount?: boolean): ReactNode;\nexport function formatList(items: ReactNode[], itemLimit = items.length, includeCount = false): ReactNode {\n    let remaining = Math.max(items.length - itemLimit, 0);\n    if (items.length <= 1) {\n        return items[0] ?? \"\";\n    }\n\n    const formatter = new Intl.ListFormat(getUserLanguage(), { style: \"long\", type: \"conjunction\" });\n    if (remaining > 0) {\n        if (includeCount) {\n            itemLimit--;\n            remaining++;\n        }\n\n        items = items.slice(0, itemLimit);\n        let joinedItems: ReactNode;\n        if (items.every((e) => typeof e === \"string\")) {\n            joinedItems = items.join(\", \");\n        } else {\n            joinedItems = jsxJoin(items, \", \");\n        }\n\n        return _t(\"items_and_n_others\", { count: remaining }, { Items: () => joinedItems });\n    }\n\n    if (items.every((e) => typeof e === \"string\")) {\n        return formatter.format(items as string[]);\n    }\n\n    const parts = formatter.formatToParts(items.map((_, i) => `${i}`));\n    return jsxJoin(\n        parts.map((part) => {\n            if (part.type === \"literal\") return part.value;\n            return items[parseInt(part.value, 10)];\n        }),\n    );\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { SERVICE_TYPES, HTTPError, type MatrixClient, type Terms } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport SdkConfig from \"../SdkConfig\";\n\nexport function getDefaultIdentityServerUrl(): string | undefined {\n    return SdkConfig.get(\"validated_server_config\")?.isUrl;\n}\n\nexport function setToDefaultIdentityServer(matrixClient: MatrixClient): void {\n    const url = getDefaultIdentityServerUrl();\n    // Account data change will update localstorage, client, etc through dispatcher\n    matrixClient.setAccountData(\"m.identity_server\", {\n        base_url: url ?? null,\n    });\n}\n\nexport async function doesIdentityServerHaveTerms(matrixClient: MatrixClient, fullUrl: string): Promise<boolean> {\n    let terms: Partial<Terms> | null;\n    try {\n        terms = await matrixClient.getTerms(SERVICE_TYPES.IS, fullUrl);\n    } catch (e) {\n        logger.error(e);\n        if (e instanceof HTTPError && e.httpStatus === 404) {\n            terms = null;\n        } else {\n            throw e;\n        }\n    }\n\n    return !!terms?.[\"policies\"] && Object.keys(terms[\"policies\"]).length > 0;\n}\n\nexport function doesAccountDataHaveIdentityServer(matrixClient: MatrixClient): boolean {\n    const event = matrixClient.getAccountData(\"m.identity_server\");\n    return event?.getContent()[\"base_url\"];\n}\n","/*\n * Copyright 2024 New Vector Ltd.\n * Copyright 2022 The Matrix.org Foundation C.I.C.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { arrayHasDiff } from \"./arrays\";\n\nexport function mayBeAnimated(mimeType?: string): boolean {\n    return [\"image/gif\", \"image/webp\", \"image/png\", \"image/apng\", \"image/avif\"].includes(mimeType!);\n}\n\nfunction arrayBufferRead(arr: ArrayBuffer, start: number, len: number): Uint8Array {\n    return new Uint8Array(arr.slice(start, start + len));\n}\n\nfunction arrayBufferReadInt(arr: ArrayBuffer, start: number): number {\n    const dv = new DataView(arr, start, 4);\n    return dv.getUint32(0);\n}\n\nfunction arrayBufferReadStr(arr: ArrayBuffer, start: number, len: number): string {\n    return String.fromCharCode.apply(null, Array.from(arrayBufferRead(arr, start, len)));\n}\n\n/**\n * Check if a Blob contains an animated image.\n * @param blob The Blob to check.\n * @returns True if the image is animated, false if not, or undefined if it could not be determined.\n */\nexport async function blobIsAnimated(blob: Blob): Promise<boolean | undefined> {\n    try {\n        // Try parse the image using ImageDecoder as this is the most coherent way of asserting whether a piece of media\n        // is or is not animated. Limited availability at time of writing, notably Safari lacks support.\n        // https://developer.mozilla.org/en-US/docs/Web/API/ImageDecoder\n        const data = await blob.arrayBuffer();\n        const decoder = new ImageDecoder({ data, type: blob.type });\n        await decoder.tracks.ready;\n        if ([...decoder.tracks].some((track) => track.animated)) {\n            return true;\n        }\n    } catch (e) {\n        console.warn(\"ImageDecoder not supported or failed to decode image\", e);\n        // Not supported by this browser, fall through to manual checks\n    }\n\n    switch (blob.type) {\n        case \"image/webp\": {\n            // Only extended file format WEBP images support animation, so grab the expected data range and verify header.\n            // Based on https://developers.google.com/speed/webp/docs/riff_container#extended_file_format\n            const arr = await blob.slice(0, 21).arrayBuffer();\n            if (\n                arrayBufferReadStr(arr, 0, 4) === \"RIFF\" &&\n                arrayBufferReadStr(arr, 8, 4) === \"WEBP\" &&\n                arrayBufferReadStr(arr, 12, 4) === \"VP8X\"\n            ) {\n                const [flags] = arrayBufferRead(arr, 20, 1);\n                // Flags: R R I L E X _A_ R (reversed)\n                const animationFlagMask = 1 << 1;\n                return (flags & animationFlagMask) != 0;\n            }\n            return false;\n        }\n\n        case \"image/gif\": {\n            // Based on https://gist.github.com/zakirt/faa4a58cec5a7505b10e3686a226f285\n            // More info at http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp\n            const dv = new DataView(await blob.arrayBuffer(), 10);\n\n            const globalColorTable = dv.getUint8(0);\n            let globalColorTableSize = 0;\n            // check first bit, if 0, then we don't have a Global Color Table\n            if (globalColorTable & 0x80) {\n                // grab the last 3 bits, to calculate the global color table size -> RGB * 2^(N+1)\n                // N is the value in the last 3 bits.\n                globalColorTableSize = 3 * Math.pow(2, (globalColorTable & 0x7) + 1);\n            }\n\n            // move on to the Graphics Control Extension\n            const offset = 3 + globalColorTableSize;\n\n            const extensionIntroducer = dv.getUint8(offset);\n            const graphicsControlLabel = dv.getUint8(offset + 1);\n            let delayTime = 0;\n\n            // Graphics Control Extension section is where GIF animation data is stored\n            // First 2 bytes must be 0x21 and 0xF9\n            if (extensionIntroducer & 0x21 && graphicsControlLabel & 0xf9) {\n                // skip to the 2 bytes with the delay time\n                delayTime = dv.getUint16(offset + 4);\n            }\n\n            return !!delayTime;\n        }\n\n        case \"image/png\":\n        case \"image/apng\": {\n            // Based on https://stackoverflow.com/a/68618296\n            const arr = await blob.arrayBuffer();\n            if (\n                arrayHasDiff([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], Array.from(arrayBufferRead(arr, 0, 8)))\n            ) {\n                return false;\n            }\n\n            for (let i = 8; i < blob.size; ) {\n                const length = arrayBufferReadInt(arr, i);\n                i += 4;\n                const type = arrayBufferReadStr(arr, i, 4);\n                i += 4;\n\n                switch (type) {\n                    case \"acTL\":\n                        return true;\n                    case \"IDAT\":\n                        return false;\n                }\n                i += length + 4;\n            }\n            return false;\n        }\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { _t } from \"../languageHandler\";\n\nexport function getNameForEventRoom(matrixClient: MatrixClient, userId: string, roomId: string): string {\n    const room = matrixClient.getRoom(roomId);\n    const member = room && room.getMember(userId);\n    return member ? member.name : userId;\n}\n\nexport function userLabelForEventRoom(matrixClient: MatrixClient, userId: string, roomId: string): string {\n    const name = getNameForEventRoom(matrixClient, userId, roomId);\n    if (name !== userId) {\n        return _t(\"name_and_id\", { name, userId });\n    } else {\n        return userId;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n/**\n * A utility to ensure that a function is only called once triggered with\n * a mark applied. Multiple marks can be applied to the function, however\n * the function will only be called once upon trigger().\n *\n * The function starts unmarked.\n */\nexport class MarkedExecution {\n    private marked = false;\n\n    /**\n     * Creates a MarkedExecution for the provided function.\n     * @param {Function} fn The function to be called upon trigger if marked.\n     * @param {Function} onMarkCallback A function that is called when a new mark is made. Not\n     * called if a mark is already flagged.\n     */\n    public constructor(\n        private fn: () => void,\n        private onMarkCallback?: () => void,\n    ) {}\n\n    /**\n     * Resets the mark without calling the function.\n     */\n    public reset(): void {\n        this.marked = false;\n    }\n\n    /**\n     * Marks the function to be called upon trigger().\n     */\n    public mark(): void {\n        if (!this.marked) this.onMarkCallback?.();\n        this.marked = true;\n    }\n\n    /**\n     * If marked, the function will be called, otherwise this does nothing.\n     */\n    public trigger(): void {\n        if (!this.marked) return;\n        this.reset(); // reset first just in case the fn() causes a trigger()\n        this.fn();\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n/**\n * Utility class for lazily getting a variable.\n */\nexport class LazyValue<T> {\n    private val?: T;\n    private prom?: Promise<T>;\n    private done = false;\n\n    public constructor(private getFn: () => Promise<T>) {}\n\n    /**\n     * Whether or not a cached value is present.\n     */\n    public get present(): boolean {\n        // we use a tracking variable just in case the final value is falsy\n        return this.done;\n    }\n\n    /**\n     * Gets the value without invoking a get. May be undefined until the\n     * value is fetched properly.\n     */\n    public get cachedValue(): T | undefined {\n        return this.val;\n    }\n\n    /**\n     * Gets a promise which resolves to the value, eventually.\n     */\n    public get value(): Promise<T> {\n        if (this.prom) return this.prom;\n        this.prom = this.getFn();\n\n        return this.prom.then((v) => {\n            this.val = v;\n            this.done = true;\n            return v;\n        });\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, EventType, MsgType } from \"matrix-js-sdk/src/matrix\";\nimport { type FileContent, type ImageContent, type MediaEventContent } from \"matrix-js-sdk/src/types\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { LazyValue } from \"./LazyValue\";\nimport { type Media, mediaFromContent } from \"../customisations/Media\";\nimport { decryptFile } from \"./DecryptFile\";\nimport { type IDestroyable } from \"./IDestroyable\";\nimport { getBlobSafeMimeType } from \"./blobs.ts\";\n\n// TODO: We should consider caching the blobs. https://github.com/vector-im/element-web/issues/17192\n\nexport class MediaEventHelper implements IDestroyable {\n    // Either an HTTP or Object URL (when encrypted) to the media.\n    public readonly sourceUrl: LazyValue<string | null>;\n    public readonly thumbnailUrl: LazyValue<string | null>;\n\n    // Either the raw or decrypted (when encrypted) contents of the file.\n    public readonly sourceBlob: LazyValue<Blob>;\n    public readonly thumbnailBlob: LazyValue<Blob | null>;\n\n    public readonly media: Media;\n\n    public constructor(private event: MatrixEvent) {\n        this.sourceUrl = new LazyValue(this.prepareSourceUrl);\n        this.thumbnailUrl = new LazyValue(this.prepareThumbnailUrl);\n        this.sourceBlob = new LazyValue(this.fetchSource);\n        this.thumbnailBlob = new LazyValue(this.fetchThumbnail);\n\n        this.media = mediaFromContent(this.event.getContent());\n    }\n\n    public get fileName(): string {\n        return (\n            this.event.getContent<FileContent>().filename ||\n            this.event.getContent<MediaEventContent>().body ||\n            \"download\"\n        );\n    }\n\n    public destroy(): void {\n        if (this.media.isEncrypted) {\n            if (this.sourceUrl.cachedValue) URL.revokeObjectURL(this.sourceUrl.cachedValue);\n            if (this.thumbnailUrl.cachedValue) URL.revokeObjectURL(this.thumbnailUrl.cachedValue);\n        }\n    }\n\n    private prepareSourceUrl = async (): Promise<string | null> => {\n        if (this.media.isEncrypted) {\n            const blob = await this.sourceBlob.value;\n            return URL.createObjectURL(blob);\n        } else {\n            return this.media.srcHttp;\n        }\n    };\n\n    private prepareThumbnailUrl = async (): Promise<string | null> => {\n        if (this.media.isEncrypted) {\n            const blob = await this.thumbnailBlob.value;\n            if (blob === null) return null;\n            return URL.createObjectURL(blob);\n        } else {\n            return this.media.thumbnailHttp;\n        }\n    };\n\n    private fetchSource = (): Promise<Blob> => {\n        const content = this.event.getContent<MediaEventContent>();\n        if (this.media.isEncrypted) {\n            return decryptFile(content.file!, content.info);\n        }\n\n        return (\n            this.media\n                .downloadSource()\n                .then((r) => r.blob())\n                // Set the mime type from the event info on the blob\n                .then((blob) => blob.slice(0, blob.size, getBlobSafeMimeType(content.info?.mimetype ?? blob.type)))\n        );\n    };\n\n    private fetchThumbnail = (): Promise<Blob | null> => {\n        if (!this.media.hasThumbnail) return Promise.resolve(null);\n\n        const content = this.event.getContent<ImageContent>();\n        if (this.media.isEncrypted) {\n            if (content.info?.thumbnail_file) {\n                return decryptFile(content.info.thumbnail_file, content.info.thumbnail_info);\n            } else {\n                // \"Should never happen\"\n                logger.warn(\"Media claims to have thumbnail and is encrypted, but no thumbnail_file found\");\n                return Promise.resolve(null);\n            }\n        }\n\n        const thumbnailHttp = this.media.thumbnailHttp;\n        if (!thumbnailHttp) return Promise.resolve(null);\n\n        return (\n            fetch(thumbnailHttp)\n                .then((r) => r.blob())\n                // Set the mime type from the event info on the blob\n                .then((blob) =>\n                    blob.slice(0, blob.size, getBlobSafeMimeType(content.info?.thumbnail_info?.mimetype ?? blob.type)),\n                )\n        );\n    };\n\n    public static isEligible(event: MatrixEvent): boolean {\n        if (!event) return false;\n        if (event.isRedacted()) return false;\n        if (event.getType() === EventType.Sticker) return true;\n        if (event.getType() !== EventType.RoomMessage) return false;\n\n        const content = event.getContent();\n        const mediaMsgTypes: string[] = [MsgType.Video, MsgType.Audio, MsgType.Image, MsgType.File];\n        if (mediaMsgTypes.includes(content.msgtype!)) return true;\n        if (typeof content.url === \"string\") return true;\n\n        // Finally, it's probably not media\n        return false;\n    }\n\n    /**\n     * Determine if the media event in question supports being hidden in the timeline.\n     * @param event Any matrix event.\n     * @returns `true` if the media can be hidden, otherwise `false`.\n     */\n    public static canHide(event: MatrixEvent): boolean {\n        if (!event) return false;\n        if (event.isRedacted()) return false;\n        const content = event.getContent();\n        const hideTypes: string[] = [MsgType.Video, MsgType.Image];\n        if (hideTypes.includes(content.msgtype!)) return true;\n        return false;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\nCopyright 2019 New Vector Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, useCallback } from \"react\";\n\nimport { _t } from \"../../../languageHandler\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { SettingLevel } from \"../../../settings/SettingLevel\";\nimport BaseDialog from \"./BaseDialog\";\n\nexport interface UnknownProfile {\n    userId: string;\n    errorText: string;\n}\n\nexport type UnknownProfiles = UnknownProfile[];\n\nexport interface AskInviteAnywayDialogProps {\n    unknownProfileUsers: UnknownProfiles;\n    onInviteAnyways: () => void;\n    onGiveUp: () => void;\n    onFinished: (success: boolean) => void;\n    description?: string;\n    inviteNeverWarnLabel?: string;\n    inviteLabel?: string;\n}\n\nexport default function AskInviteAnywayDialog({\n    onFinished,\n    onGiveUp,\n    onInviteAnyways,\n    unknownProfileUsers,\n    description: descriptionProp,\n    inviteNeverWarnLabel,\n    inviteLabel,\n}: AskInviteAnywayDialogProps): JSX.Element {\n    const onInviteClicked = useCallback((): void => {\n        onInviteAnyways();\n        onFinished(true);\n    }, [onInviteAnyways, onFinished]);\n\n    const onInviteNeverWarnClicked = useCallback((): void => {\n        SettingsStore.setValue(\"promptBeforeInviteUnknownUsers\", null, SettingLevel.ACCOUNT, false);\n        onInviteAnyways();\n        onFinished(true);\n    }, [onInviteAnyways, onFinished]);\n\n    const onGiveUpClicked = useCallback((): void => {\n        onGiveUp();\n        onFinished(false);\n    }, [onGiveUp, onFinished]);\n\n    const errorList = unknownProfileUsers.map((address) => (\n        <li key={address.userId}>\n            {address.userId}: {address.errorText}\n        </li>\n    ));\n\n    const description = descriptionProp ?? _t(\"invite|unable_find_profiles_description_default\");\n\n    return (\n        <BaseDialog\n            className=\"mx_RetryInvitesDialog\"\n            onFinished={onGiveUpClicked}\n            title={_t(\"invite|unable_find_profiles_title\")}\n            contentId=\"mx_Dialog_content\"\n        >\n            <div id=\"mx_Dialog_content\">\n                <p>{description}</p>\n                <ul>{errorList}</ul>\n            </div>\n\n            <div className=\"mx_Dialog_buttons\">\n                <button onClick={onGiveUpClicked}>{_t(\"action|close\")}</button>\n                <button onClick={onInviteNeverWarnClicked}>\n                    {inviteNeverWarnLabel ?? _t(\"invite|unable_find_profiles_invite_never_warn_label_default\")}\n                </button>\n                <button onClick={onInviteClicked} autoFocus={true}>\n                    {inviteLabel ?? _t(\"invite|unable_find_profiles_invite_label_default\")}\n                </button>\n            </div>\n        </BaseDialog>\n    );\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport Modal from \"../../../Modal.tsx\";\nimport InviteProgressBody from \"./InviteProgressBody.tsx\";\n\n/** A Modal dialog that pops up while room invites are being sent. */\nconst InviteProgressDialog: React.FC = (_) => {\n    return <InviteProgressBody />;\n};\n\n/**\n * Open the invite progress dialog.\n *\n * Returns a callback which will close the dialog again.\n */\nexport function openInviteProgressDialog(): () => void {\n    const onBeforeClose = async (reason?: string): Promise<boolean> => {\n        // Inhibit closing via background click\n        return reason != \"backgroundClick\";\n    };\n\n    const { close } = Modal.createDialog(\n        InviteProgressDialog,\n        /* props */ {},\n        /* className */ undefined,\n        /* isPriorityModal */ false,\n        /* isStaticModal */ false,\n        { onBeforeClose },\n    );\n    return close;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2016-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { MatrixError, type MatrixClient, EventType, type EmptyObject, type InviteOpts } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { AddressType, getAddressType } from \"../UserAddress\";\nimport { _t } from \"../languageHandler\";\nimport Modal from \"../Modal\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport AskInviteAnywayDialog from \"../components/views/dialogs/AskInviteAnywayDialog\";\nimport ConfirmUserActionDialog from \"../components/views/dialogs/ConfirmUserActionDialog\";\nimport { openInviteProgressDialog } from \"../components/views/dialogs/InviteProgressDialog.tsx\";\n\nexport enum InviteState {\n    Invited = \"invited\",\n    Error = \"error\",\n}\n\ninterface IError {\n    errorText: string;\n    errcode: string;\n}\n\nexport const UNKNOWN_PROFILE_ERRORS = [\n    \"M_NOT_FOUND\",\n    \"M_USER_NOT_FOUND\",\n    \"M_PROFILE_UNDISCLOSED\",\n    \"M_PROFILE_NOT_FOUND\",\n];\n\nexport type CompletionStates = Record<string, InviteState>;\n\nconst USER_ALREADY_JOINED = \"IO.ELEMENT.ALREADY_JOINED\";\nconst USER_ALREADY_INVITED = \"IO.ELEMENT.ALREADY_INVITED\";\nconst USER_BANNED = \"IO.ELEMENT.BANNED\";\n\n/** Options interface for {@link MultiInviter} */\nexport interface MultiInviterOptions {\n    /** Optional callback, fired after each invite */\n    progressCallback?: () => void;\n\n    /**\n     * By default, we will pop up a \"Preparing invitations...\" dialog while the invites are being sent. Set this to\n     * `true` to inhibit it (in which case, you probably want to implement another bit of feedback UI).\n     */\n    inhibitProgressDialog?: boolean;\n}\n\n/**\n * Invites multiple addresses to a room, handling rate limiting from the server\n */\nexport default class MultiInviter {\n    private addresses: string[] = [];\n    private _fatal = false;\n    private completionStates: CompletionStates = {}; // State of each address (invited or error)\n    private errors: Record<string, IError> = {}; // { address: {errorText, errcode} }\n    private reason: string | undefined;\n\n    /**\n     * @param matrixClient the client of the logged in user\n     * @param {string} roomId The ID of the room to invite to\n     * @param options Options object\n     */\n    public constructor(\n        private readonly matrixClient: MatrixClient,\n        private roomId: string,\n        private readonly options: MultiInviterOptions = {},\n    ) {}\n\n    public get fatal(): boolean {\n        return this._fatal;\n    }\n\n    /**\n     * Invite users to this room. This may only be called once per\n     * instance of the class.\n     *\n     * Any failures are returned via the {@link CompletionStates} in the result.\n     *\n     * @param {array} addresses Array of addresses to invite\n     * @param {string} reason Reason for inviting (optional)\n     * @returns {Promise} Resolved when all invitations in the queue are complete.\n     */\n    public async invite(addresses: string[], reason?: string): Promise<CompletionStates> {\n        if (this.addresses.length > 0) {\n            throw new Error(\"Already inviting/invited\");\n        }\n        this.addresses.push(...addresses);\n        this.reason = reason;\n\n        let closeDialog: (() => void) | undefined;\n        if (!this.options.inhibitProgressDialog) {\n            closeDialog = openInviteProgressDialog();\n        }\n\n        try {\n            for (const addr of this.addresses) {\n                if (getAddressType(addr) === null) {\n                    this.completionStates[addr] = InviteState.Error;\n                    this.errors[addr] = {\n                        errcode: \"M_INVALID\",\n                        errorText: _t(\"invite|invalid_address\"),\n                    };\n                }\n            }\n\n            for (const addr of this.addresses) {\n                // don't try to invite it if it's an invalid address\n                // (it will already be marked as an error though,\n                // so no need to do so again)\n                if (getAddressType(addr) === null) {\n                    continue;\n                }\n\n                // don't re-invite (there's no way in the UI to do this, but\n                // for sanity's sake)\n                if (this.completionStates[addr] === InviteState.Invited) {\n                    continue;\n                }\n\n                await this.doInvite(addr, false);\n\n                if (this._fatal) {\n                    // `doInvite` suffered a fatal error. The error should have been recorded in `errors`; it's up\n                    // to the caller to report back to the user.\n                    return this.completionStates;\n                }\n            }\n\n            if (Object.keys(this.errors).length > 0) {\n                // There were problems inviting some people - see if we can invite them\n                // without caring if they exist or not.\n                const unknownProfileUsers = Object.keys(this.errors).filter((a) =>\n                    UNKNOWN_PROFILE_ERRORS.includes(this.errors[a].errcode),\n                );\n\n                if (unknownProfileUsers.length > 0) {\n                    await this.handleUnknownProfileUsers(unknownProfileUsers);\n                }\n            }\n        } finally {\n            // Remember to close the progress dialog, if we opened one.\n            closeDialog?.();\n        }\n\n        return this.completionStates;\n    }\n\n    public getCompletionState(addr: string): InviteState {\n        return this.completionStates[addr];\n    }\n\n    public getErrorText(addr: string): string | null {\n        return this.errors[addr]?.errorText ?? null;\n    }\n\n    private async inviteToRoom(roomId: string, addr: string, ignoreProfile = false): Promise<EmptyObject> {\n        const addrType = getAddressType(addr);\n\n        if (addrType === AddressType.Email) {\n            return this.matrixClient.inviteByEmail(roomId, addr);\n        } else if (addrType === AddressType.MatrixUserId) {\n            const room = this.matrixClient.getRoom(roomId);\n            if (!room) throw new Error(\"Room not found\");\n\n            const member = room.getMember(addr);\n            if (member?.membership === KnownMembership.Join) {\n                throw new MatrixError({\n                    errcode: USER_ALREADY_JOINED,\n                    error: \"Member already joined\",\n                });\n            } else if (member?.membership === KnownMembership.Invite) {\n                throw new MatrixError({\n                    errcode: USER_ALREADY_INVITED,\n                    error: \"Member already invited\",\n                });\n            } else if (member?.membership === KnownMembership.Ban) {\n                let proceed = false;\n                // Check if we can unban the invitee.\n                // See https://spec.matrix.org/v1.7/rooms/v10/#authorization-rules, particularly 4.5.3 and 4.5.4.\n                const ourMember = room.getMember(this.matrixClient.getSafeUserId());\n                if (\n                    !!ourMember &&\n                    member.powerLevel < ourMember.powerLevel &&\n                    room.currentState.hasSufficientPowerLevelFor(\"ban\", ourMember.powerLevel) &&\n                    room.currentState.hasSufficientPowerLevelFor(\"kick\", ourMember.powerLevel)\n                ) {\n                    const { finished } = Modal.createDialog(ConfirmUserActionDialog, {\n                        member,\n                        action: _t(\"action|unban\"),\n                        title: _t(\"invite|unban_first_title\"),\n                    });\n                    [proceed = false] = await finished;\n                    if (proceed) {\n                        await this.matrixClient.unban(roomId, member.userId);\n                    }\n                }\n\n                if (!proceed) {\n                    throw new MatrixError({\n                        errcode: USER_BANNED,\n                        error: \"Member is banned\",\n                    });\n                }\n            }\n\n            if (!ignoreProfile && SettingsStore.getValue(\"promptBeforeInviteUnknownUsers\", this.roomId)) {\n                try {\n                    await this.matrixClient.getProfileInfo(addr);\n                } catch (err) {\n                    // The error handling during the invitation process covers any API.\n                    // Some errors must to me mapped from profile API errors to more specific ones to avoid collisions.\n                    switch (err instanceof MatrixError ? err.errcode : err) {\n                        case \"M_FORBIDDEN\":\n                            throw new MatrixError({ errcode: \"M_PROFILE_UNDISCLOSED\" });\n                        case \"M_NOT_FOUND\":\n                            throw new MatrixError({ errcode: \"M_USER_NOT_FOUND\" });\n                        default:\n                            throw err;\n                    }\n                }\n            }\n\n            const opts: InviteOpts = {\n                shareEncryptedHistory: true,\n            };\n            if (this.reason !== undefined) opts.reason = this.reason;\n            return this.matrixClient.invite(roomId, addr, opts);\n        } else {\n            throw new Error(\"Unsupported address\");\n        }\n    }\n\n    /**\n     * Attempt to invite a user.\n     *\n     * Does not normally throw exceptions. If there was an error, this is reflected in {@link errors}.\n     * If the error was fatal and should prevent further invites from being done, {@link _fatal} is set.\n     */\n    private doInvite(address: string, ignoreProfile: boolean): Promise<void> {\n        return new Promise<void>((resolve, reject) => {\n            logger.log(`Inviting ${address}`);\n\n            const doInvite = this.inviteToRoom(this.roomId, address, ignoreProfile);\n            doInvite\n                .then(() => {\n                    this.completionStates[address] = InviteState.Invited;\n                    delete this.errors[address];\n\n                    resolve();\n                    this.options.progressCallback?.();\n                })\n                .catch((err) => {\n                    logger.error(err);\n\n                    const room = this.roomId ? this.matrixClient.getRoom(this.roomId) : null;\n                    const isSpace = room?.isSpaceRoom();\n                    const isFederated = room?.currentState.getStateEvents(EventType.RoomCreate, \"\")?.getContent()[\n                        \"m.federate\"\n                    ];\n\n                    let errorText: string | undefined;\n                    switch (err.errcode) {\n                        case \"M_FORBIDDEN\":\n                            if (isSpace) {\n                                errorText =\n                                    isFederated === false\n                                        ? _t(\"invite|error_unfederated_space\")\n                                        : _t(\"invite|error_permissions_space\");\n                            } else {\n                                errorText =\n                                    isFederated === false\n                                        ? _t(\"invite|error_unfederated_room\")\n                                        : _t(\"invite|error_permissions_room\");\n                            }\n                            // No point doing further invites.\n                            this._fatal = true;\n                            break;\n                        case USER_ALREADY_INVITED:\n                            if (isSpace) {\n                                errorText = _t(\"invite|error_already_invited_space\");\n                            } else {\n                                errorText = _t(\"invite|error_already_invited_room\");\n                            }\n                            break;\n                        case USER_ALREADY_JOINED:\n                            if (isSpace) {\n                                errorText = _t(\"invite|error_already_joined_space\");\n                            } else {\n                                errorText = _t(\"invite|error_already_joined_room\");\n                            }\n                            break;\n                        case \"M_LIMIT_EXCEEDED\":\n                            // we're being throttled so wait a bit & try again\n                            window.setTimeout(() => {\n                                this.doInvite(address, ignoreProfile).then(resolve, reject);\n                            }, 5000);\n                            return;\n                        case \"M_NOT_FOUND\":\n                        case \"M_USER_NOT_FOUND\":\n                            errorText = _t(\"invite|error_user_not_found\");\n                            break;\n                        case \"M_PROFILE_UNDISCLOSED\":\n                            errorText = _t(\"invite|error_profile_undisclosed\");\n                            break;\n                        case \"M_PROFILE_NOT_FOUND\":\n                            if (!ignoreProfile) {\n                                // Invite without the profile check\n                                logger.warn(`User ${address} does not have a profile - inviting anyways automatically`);\n                                this.doInvite(address, true).then(resolve, reject);\n                                return;\n                            }\n                            break;\n                        case \"M_BAD_STATE\":\n                        case USER_BANNED:\n                            errorText = _t(\"invite|error_bad_state\");\n                            break;\n                        case \"M_UNSUPPORTED_ROOM_VERSION\":\n                            if (isSpace) {\n                                errorText = _t(\"invite|error_version_unsupported_space\");\n                            } else {\n                                errorText = _t(\"invite|error_version_unsupported_room\");\n                            }\n                            break;\n                        case \"ORG.MATRIX.JSSDK_MISSING_PARAM\":\n                            if (getAddressType(address) === AddressType.Email) {\n                                errorText = _t(\"cannot_invite_without_identity_server\");\n                            }\n                    }\n\n                    if (!errorText) {\n                        errorText = _t(\"invite|error_unknown\");\n                    }\n\n                    this.completionStates[address] = InviteState.Error;\n                    this.errors[address] = { errorText, errcode: err.errcode };\n\n                    resolve();\n                });\n        });\n    }\n\n    /** Handle users which failed with an error code which indicated that their profile was unknown.\n     *\n     * Depending on the `promptBeforeInviteUnknownUsers` setting, we either prompt the user for how to proceed, or\n     * send the invites anyway.\n     */\n    private handleUnknownProfileUsers(unknownProfileUsers: string[]): Promise<void> {\n        return new Promise<void>((resolve) => {\n            const inviteUnknowns = (): void => {\n                const promises = unknownProfileUsers.map((u) => this.doInvite(u, true));\n                Promise.all(promises).then(() => resolve());\n            };\n\n            if (!SettingsStore.getValue(\"promptBeforeInviteUnknownUsers\", this.roomId)) {\n                inviteUnknowns();\n                return;\n            }\n\n            logger.log(\"Showing failed to invite dialog...\");\n            Modal.createDialog(AskInviteAnywayDialog, {\n                unknownProfileUsers: unknownProfileUsers.map((u) => ({\n                    userId: u,\n                    errorText: this.errors[u].errorText,\n                })),\n                onInviteAnyways: () => inviteUnknowns(),\n                onGiveUp: () => {\n                    // Fake all the completion states because we already warned the user\n                    for (const addr of unknownProfileUsers) {\n                        this.completionStates[addr] = InviteState.Invited;\n                    }\n                    resolve();\n                },\n            });\n        });\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type React from \"react\";\n\n// Wrap DOM event handlers with stopPropagation and preventDefault\nexport const preventDefaultWrapper =\n    <T extends React.BaseSyntheticEvent = React.BaseSyntheticEvent>(callback: () => void) =>\n    (e?: T) => {\n        e?.stopPropagation();\n        e?.preventDefault();\n        callback();\n    };\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2017 Travis Ralston\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n    type MatrixEvent,\n    EventType,\n    M_POLL_START,\n    type MatrixClient,\n    EventTimeline,\n    type Room,\n    type EmptyObject,\n} from \"matrix-js-sdk/src/matrix\";\n\nimport { isContentActionable } from \"./EventUtils\";\nimport { ReadPinsEventId } from \"../components/views/right_panel/types\";\n\nexport default class PinningUtils {\n    /**\n     * Event types that may be pinned.\n     */\n    public static readonly PINNABLE_EVENT_TYPES: (EventType | string)[] = [\n        EventType.RoomMessage,\n        M_POLL_START.name,\n        M_POLL_START.altName,\n    ];\n\n    /**\n     * Determines if the given event can be pinned.\n     * This is a simple check to see if the event is of a type that can be pinned.\n     * @param {MatrixEvent} event The event to check.\n     * @returns {boolean} True if the event may be pinned, false otherwise.\n     */\n    public static isPinnable(event: MatrixEvent): boolean {\n        if (event.isRedacted()) return false;\n        return PinningUtils.isUnpinnable(event);\n    }\n\n    /**\n     * Determines if the given event may be unpinned.\n     * @param {MatrixEvent} event The event to check.\n     * @returns {boolean} True if the event may be unpinned, false otherwise.\n     */\n    public static isUnpinnable(event: MatrixEvent): boolean {\n        if (!event) return false;\n        if (event.isRedacted()) return true;\n        return this.PINNABLE_EVENT_TYPES.includes(event.getType());\n    }\n\n    /**\n     * Determines if the given event is pinned.\n     * @param matrixClient\n     * @param mxEvent\n     */\n    public static isPinned(matrixClient: MatrixClient, mxEvent: MatrixEvent): boolean {\n        const room = matrixClient.getRoom(mxEvent.getRoomId());\n        if (!room) return false;\n\n        const pinnedEvent = room\n            .getLiveTimeline()\n            .getState(EventTimeline.FORWARDS)\n            ?.getStateEvents(EventType.RoomPinnedEvents, \"\");\n        if (!pinnedEvent) return false;\n        const content = pinnedEvent.getContent();\n        return content.pinned && Array.isArray(content.pinned) && content.pinned.includes(mxEvent.getId());\n    }\n\n    /**\n     * Determines if the given event may be pinned by the current user.\n     * This checks if the user has the necessary permissions to pin or unpin the event, and if the event is pinnable.\n     * @param matrixClient\n     * @param mxEvent\n     */\n    public static canPin(matrixClient: MatrixClient, mxEvent: MatrixEvent): boolean {\n        if (!isContentActionable(mxEvent)) return false;\n\n        const room = matrixClient.getRoom(mxEvent.getRoomId());\n        if (!room) return false;\n\n        // Should have a non-local event id\n        if (mxEvent.status !== null) return false;\n\n        return PinningUtils.userHasPinOrUnpinPermission(matrixClient, room) && PinningUtils.isPinnable(mxEvent);\n    }\n\n    /**\n     * Determines if the given event may be unpinned by the current user.\n     * This checks if the user has the necessary permissions to pin or unpin the event, and if the event is unpinnable.\n     * @param matrixClient\n     * @param mxEvent\n     */\n    public static canUnpin(matrixClient: MatrixClient, mxEvent: MatrixEvent): boolean {\n        const room = matrixClient.getRoom(mxEvent.getRoomId());\n        if (!room) return false;\n\n        // Should have a non-local event id\n        if (mxEvent.status !== null) return false;\n\n        return PinningUtils.userHasPinOrUnpinPermission(matrixClient, room) && PinningUtils.isUnpinnable(mxEvent);\n    }\n\n    /**\n     * Determines if the current user has permission to pin or unpin events in the given room.\n     * @param matrixClient\n     * @param room\n     */\n    public static userHasPinOrUnpinPermission(matrixClient: MatrixClient, room: Room): boolean {\n        return Boolean(\n            room\n                .getLiveTimeline()\n                .getState(EventTimeline.FORWARDS)\n                ?.mayClientSendStateEvent(EventType.RoomPinnedEvents, matrixClient),\n        );\n    }\n\n    /**\n     * Pin or unpin the given event.\n     * @param matrixClient\n     * @param mxEvent\n     */\n    public static async pinOrUnpinEvent(matrixClient: MatrixClient, mxEvent: MatrixEvent): Promise<void> {\n        const room = matrixClient.getRoom(mxEvent.getRoomId());\n        if (!room) return;\n\n        const eventId = mxEvent.getId();\n        if (!eventId) return;\n\n        // Should have a non-local event id\n        if (mxEvent.status !== null) return;\n\n        // Get the current pinned events of the room\n        const pinnedIds: Array<string> =\n            room\n                .getLiveTimeline()\n                .getState(EventTimeline.FORWARDS)\n                ?.getStateEvents(EventType.RoomPinnedEvents, \"\")\n                ?.getContent().pinned || [];\n\n        let roomAccountDataPromise: Promise<EmptyObject | void> = Promise.resolve();\n        // If the event is already pinned, unpin it\n        if (pinnedIds.includes(eventId)) {\n            pinnedIds.splice(pinnedIds.indexOf(eventId), 1);\n        } else {\n            // Otherwise, pin it\n            pinnedIds.push(eventId);\n            // We don't want to wait for the roomAccountDataPromise to resolve before sending the state event\n            roomAccountDataPromise = matrixClient.setRoomAccountData(room.roomId, ReadPinsEventId, {\n                event_ids: [...(room.getAccountData(ReadPinsEventId)?.getContent()?.event_ids || []), eventId],\n            });\n        }\n        await Promise.all([\n            matrixClient.sendStateEvent(room.roomId, EventType.RoomPinnedEvents, { pinned: pinnedIds }, \"\"),\n            roomAccountDataPromise,\n        ]);\n    }\n\n    /**\n     * Unpin all events in the given room.\n     * @param matrixClient\n     * @param roomId\n     */\n    public static async unpinAllEvents(matrixClient: MatrixClient, roomId: string): Promise<void> {\n        await matrixClient.sendStateEvent(roomId, EventType.RoomPinnedEvents, { pinned: [] }, \"\");\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n/**\n * The preferred room versions for various features within the app. The\n * room versions here are selected based on the client's support for the\n * possible room versions in combination with server support in the\n * ecosystem.\n *\n * Loosely follows https://spec.matrix.org/latest/rooms/#feature-matrix\n */\nexport class PreferredRoomVersions {\n    /**\n     * The room version to use when creating \"knock\" rooms.\n     */\n    public static readonly KnockRooms = \"7\";\n\n    /**\n     * The room version to use when creating \"restricted\" rooms.\n     */\n    public static readonly RestrictedRooms = \"9\";\n\n    private constructor() {\n        // readonly, static, class\n    }\n}\n\n/**\n * Determines if a room version supports the given feature using heuristics\n * for how Matrix works.\n * @param roomVer The room version to check support within.\n * @param featureVer The room version of the feature. Should be from PreferredRoomVersions.\n * @see PreferredRoomVersions\n */\nexport function doesRoomVersionSupport(roomVer: string, featureVer: string): boolean {\n    // Assumption: all unstable room versions don't support the feature. Calling code can check for unstable\n    // room versions explicitly if it wants to. The spec reserves [0-9] and `.` for its room versions.\n    if (!roomVer.match(/[\\d.]+/)) {\n        return false;\n    }\n\n    // Dev note: While the spec says room versions are not linear, we can make reasonable assumptions\n    // until the room versions prove themselves to be non-linear in the spec. We should see this coming\n    // from a mile away and can course-correct this function if needed.\n    return Number(roomVer) >= Number(featureVer);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type ReactNode } from \"react\";\n\n/**\n * Joins an array into one value with a joiner. E.g. join([\"hello\", \"world\"], \" \") -> <>hello world</>\n * @param array the array of element to join\n * @param joiner the string/JSX.Element to join with\n * @returns the joined array\n */\nexport function jsxJoin(array: ReactNode[], joiner?: string | JSX.Element): JSX.Element {\n    return (\n        <>\n            {array.map((element, index) => (\n                <React.Fragment key={index}>\n                    {element}\n                    {index === array.length - 1 ? null : joiner}\n                </React.Fragment>\n            ))}\n        </>\n    );\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n * Copyright 2024 New Vector Ltd.\n * Copyright 2023 The Matrix.org Foundation C.I.C.\n * Copyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type IContent, type IEventRelation, type MatrixEvent, THREAD_RELATION_TYPE } from \"matrix-js-sdk/src/matrix\";\nimport sanitizeHtml from \"sanitize-html\";\nimport { PERMITTED_URL_SCHEMES } from \"@element-hq/web-shared-components\";\n\nexport function getParentEventId(ev?: MatrixEvent): string | undefined {\n    if (!ev || ev.isRedacted()) return;\n    if (ev.replyEventId) {\n        return ev.replyEventId;\n    }\n}\n\n// Part of Replies fallback support\nexport function stripPlainReply(body: string): string {\n    // Removes lines beginning with `> ` until you reach one that doesn't.\n    const lines = body.split(\"\\n\");\n    while (lines.length && lines[0].startsWith(\"> \")) lines.shift();\n    // Reply fallback has a blank line after it, so remove it to prevent leading newline\n    if (lines[0] === \"\") lines.shift();\n    return lines.join(\"\\n\");\n}\n\n// Part of Replies fallback support - MUST NOT BE RENDERED DIRECTLY - UNSAFE HTML\nexport function stripHTMLReply(html: string): string {\n    // Sanitize the original HTML for inclusion in <mx-reply>.  We allow\n    // any HTML, since the original sender could use special tags that we\n    // don't recognize, but want to pass along to any recipients who do\n    // recognize them -- recipients should be sanitizing before displaying\n    // anyways.  However, we sanitize to 1) remove any mx-reply, so that we\n    // don't generate a nested mx-reply, and 2) make sure that the HTML is\n    // properly formatted (e.g. tags are closed where necessary)\n    return sanitizeHtml(html, {\n        allowedTags: false, // false means allow everything\n        allowedAttributes: false,\n        allowVulnerableTags: true, // silence xss warning, we won't be rendering directly this, so it is safe to do\n        // we somehow can't allow all schemes, so we allow all that we\n        // know of and mxc (for img tags)\n        allowedSchemes: [...PERMITTED_URL_SCHEMES, \"mxc\"],\n        exclusiveFilter: (frame) => frame.tag === \"mx-reply\",\n    });\n}\n\nexport function makeReplyMixIn(ev?: MatrixEvent): IEventRelation {\n    if (!ev) return {};\n\n    const mixin: IEventRelation = {\n        \"m.in_reply_to\": {\n            event_id: ev.getId(),\n        },\n    };\n\n    if (ev.threadRootId) {\n        mixin.is_falling_back = false;\n    }\n\n    return mixin;\n}\n\nexport function shouldDisplayReply(event: MatrixEvent): boolean {\n    if (event.isRedacted()) {\n        return false;\n    }\n\n    const inReplyTo = event.getWireContent()?.[\"m.relates_to\"]?.[\"m.in_reply_to\"];\n    if (!inReplyTo) {\n        return false;\n    }\n\n    const relation = event.getRelation();\n    if (relation?.rel_type === THREAD_RELATION_TYPE.name && relation?.is_falling_back) {\n        return false;\n    }\n\n    return !!inReplyTo.event_id;\n}\n\nexport function addReplyToMessageContent(content: IContent, replyToEvent: MatrixEvent): void {\n    content[\"m.relates_to\"] = {\n        ...content[\"m.relates_to\"],\n        ...makeReplyMixIn(replyToEvent),\n    };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { ClientEvent, EventType, type MatrixClient, type Room } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { showAnyInviteErrors } from \"../RoomInvite\";\nimport Modal, { type IHandle } from \"../Modal\";\nimport { _t } from \"../languageHandler\";\nimport ErrorDialog from \"../components/views/dialogs/ErrorDialog\";\nimport Spinner from \"../components/views/elements/Spinner\";\nimport MultiInviter, { type MultiInviterOptions } from \"./MultiInviter\";\nimport { SDKContextClass } from \"../contexts/SDKContextClass.ts\";\n\nexport interface RoomUpgradeProgress {\n    roomUpgraded: boolean;\n    roomSynced?: boolean;\n    inviteUsersProgress?: number;\n    inviteUsersTotal: number;\n    updateSpacesProgress?: number;\n    updateSpacesTotal: number;\n}\n\nexport async function awaitRoomDownSync(cli: MatrixClient, roomId: string): Promise<Room> {\n    const room = cli.getRoom(roomId);\n    if (room) return room; // already have the room\n\n    return new Promise<Room>((resolve) => {\n        // We have to wait for the js-sdk to give us the room back so\n        // we can more effectively abuse the MultiInviter behaviour\n        // which heavily relies on the Room object being available.\n        const checkForRoomFn = (room: Room): void => {\n            if (room.roomId !== roomId) return;\n            resolve(room);\n            cli.off(ClientEvent.Room, checkForRoomFn);\n        };\n        cli.on(ClientEvent.Room, checkForRoomFn);\n    });\n}\n\nexport async function upgradeRoom(\n    room: Room,\n    targetVersion: string,\n    inviteUsers = false,\n    handleError = true,\n    updateSpaces = true,\n    awaitRoom = false,\n    progressCallback?: (progress: RoomUpgradeProgress) => void,\n    inhibitInviteProgressDialog = false,\n    additionalCreators?: string[],\n): Promise<string> {\n    const cli = room.client;\n    let spinnerModal: IHandle<any> | undefined;\n    if (!progressCallback) {\n        spinnerModal = Modal.createDialog(Spinner, undefined, \"mx_Dialog_spinner\");\n    }\n\n    let toInvite: string[] = [];\n    if (inviteUsers) {\n        toInvite = [\n            ...room.getMembersWithMembership(KnownMembership.Join),\n            ...room.getMembersWithMembership(KnownMembership.Invite),\n        ]\n            .map((m) => m.userId)\n            .filter((m) => m !== cli.getUserId());\n    }\n\n    let parentsToRelink: Room[] = [];\n    if (updateSpaces) {\n        parentsToRelink = Array.from(SDKContextClass.instance.spaceStore.getKnownParents(room.roomId))\n            .map((roomId) => cli.getRoom(roomId))\n            .filter((parent) =>\n                parent?.currentState.maySendStateEvent(EventType.SpaceChild, cli.getUserId()!),\n            ) as Room[];\n    }\n\n    const progress: RoomUpgradeProgress = {\n        roomUpgraded: false,\n        roomSynced: awaitRoom || inviteUsers ? false : undefined,\n        inviteUsersProgress: inviteUsers ? 0 : undefined,\n        inviteUsersTotal: toInvite.length,\n        updateSpacesProgress: updateSpaces ? 0 : undefined,\n        updateSpacesTotal: parentsToRelink.length,\n    };\n    progressCallback?.(progress);\n\n    let newRoomId: string;\n    try {\n        ({ replacement_room: newRoomId } = await cli.upgradeRoom(room.roomId, targetVersion, additionalCreators));\n    } catch (e) {\n        if (!handleError) throw e;\n        logger.error(e);\n\n        Modal.createDialog(ErrorDialog, {\n            title: _t(\"room|upgrade_error_title\"),\n            description: _t(\"room|upgrade_error_description\"),\n        });\n        throw e;\n    }\n\n    progress.roomUpgraded = true;\n    progressCallback?.(progress);\n\n    if (awaitRoom || inviteUsers) {\n        await awaitRoomDownSync(room.client, newRoomId);\n        progress.roomSynced = true;\n        progressCallback?.(progress);\n    }\n\n    if (toInvite.length > 0) {\n        // Errors are handled internally to this function\n        await inviteUsersToRoom(cli, newRoomId, toInvite, {\n            progressCallback: () => {\n                progress.inviteUsersProgress!++;\n                progressCallback?.(progress);\n            },\n            inhibitProgressDialog: inhibitInviteProgressDialog,\n        });\n    }\n\n    if (parentsToRelink.length > 0) {\n        try {\n            for (const parent of parentsToRelink) {\n                const currentEv = parent.currentState.getStateEvents(EventType.SpaceChild, room.roomId);\n                await cli.sendStateEvent(\n                    parent.roomId,\n                    EventType.SpaceChild,\n                    {\n                        ...currentEv?.getContent(), // copy existing attributes like suggested\n                        via: [cli.getDomain()!],\n                    },\n                    newRoomId,\n                );\n                await cli.sendStateEvent(parent.roomId, EventType.SpaceChild, {}, room.roomId);\n\n                progress.updateSpacesProgress!++;\n                progressCallback?.(progress);\n            }\n        } catch (e) {\n            // These errors are not critical to the room upgrade itself\n            logger.warn(\"Failed to update parent spaces during room upgrade\", e);\n        }\n    }\n\n    spinnerModal?.close();\n    return newRoomId;\n}\n\nasync function inviteUsersToRoom(\n    client: MatrixClient,\n    roomId: string,\n    userIds: string[],\n    inviteOptions: MultiInviterOptions,\n): Promise<void> {\n    const inviter = new MultiInviter(client, roomId, inviteOptions);\n    const states = await inviter.invite(userIds);\n    const room = client.getRoom(roomId)!;\n    showAnyInviteErrors(states, room, inviter);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { ClientStoppedError, type MatrixClient, type Room } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport DMRoomMap from \"./DMRoomMap\";\nimport { asyncSome } from \"./arrays\";\n\nexport enum E2EStatus {\n    Warning = \"warning\",\n    Verified = \"verified\",\n    Normal = \"normal\",\n}\n\nexport async function shieldStatusForRoom(client: MatrixClient, room: Room): Promise<E2EStatus> {\n    const crypto = client.getCrypto();\n    if (!crypto) {\n        return E2EStatus.Warning;\n    }\n\n    try {\n        const members = (await room.getEncryptionTargetMembers()).map(({ userId }) => userId);\n        const inDMMap = !!DMRoomMap.shared().getUserIdForRoomId(room.roomId);\n\n        const verified: string[] = [];\n        const unverified: string[] = [];\n        for (const userId of members) {\n            if (userId === client.getUserId()) continue;\n            const userTrust = await crypto.getUserVerificationStatus(userId);\n\n            /* Alarm if any unverified users were verified before. */\n            if (userTrust.wasCrossSigningVerified() && !userTrust.isCrossSigningVerified()) {\n                return E2EStatus.Warning;\n            }\n            (userTrust.isCrossSigningVerified() ? verified : unverified).push(userId);\n        }\n\n        /* Check all verified user devices. */\n        /* Don't alarm if no other users are verified  */\n        const includeUser =\n            (verified.length > 0 && // Don't alarm for self in rooms where nobody else is verified\n                !inDMMap && // Don't alarm for self in DMs with other users\n                members.length !== 2) || // Don't alarm for self in 1:1 chats with other users\n            members.length === 1; // Do alarm for self if we're alone in a room\n        const targets = includeUser ? [...verified, client.getUserId()!] : verified;\n        const devicesByUser = await crypto.getUserDeviceInfo(targets);\n        for (const userId of targets) {\n            const devices = devicesByUser.get(userId);\n            if (!devices) {\n                // getUserDeviceInfo returned nothing about this user, which means we know nothing about their device list.\n                // That seems odd, so treat it as a warning.\n                logger.warn(`No device info for user ${userId}`);\n                return E2EStatus.Warning;\n            }\n\n            const anyDeviceNotVerified = await asyncSome(devices.keys(), async (deviceId) => {\n                const verificationStatus = await crypto.getDeviceVerificationStatus(userId, deviceId);\n                return !verificationStatus?.isVerified();\n            });\n            if (anyDeviceNotVerified) {\n                return E2EStatus.Warning;\n            }\n        }\n\n        return unverified.length === 0 ? E2EStatus.Verified : E2EStatus.Normal;\n    } catch (e) {\n        if (!(e instanceof ClientStoppedError)) {\n            throw e;\n        }\n\n        // The client has been stopped while we were figuring out what to do. Catch the exception to stop it being\n        // logged. It probably doesn't really matter what we return.\n        logger.warn(\"shieldStatusForRoom: client stopped\");\n        return E2EStatus.Normal;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { EnhancedMap } from \"./maps\";\n\n// Inspired by https://pkg.go.dev/golang.org/x/sync/singleflight\n\nconst keyMap = new EnhancedMap<object, EnhancedMap<string, unknown>>();\n\n/**\n * Access class to get a singleflight context. Singleflights execute a\n * function exactly once, unless instructed to forget about a result.\n *\n * Typically this is used to de-duplicate an action, such as a save button\n * being pressed, without having to track state internally for an operation\n * already being in progress. This doesn't expose a flag which can be used\n * to disable a button, however it would be capable of returning a Promise\n * from the first call.\n *\n * The result of the function call is cached indefinitely, just in case a\n * second call comes through late. There are various functions named \"forget\"\n * to have the cache be cleared of a result.\n *\n * Singleflights in our use case are tied to an instance of something, combined\n * with a string key to differentiate between multiple possible actions. This\n * means that a \"save\" key will be scoped to the instance which defined it and\n * not leak between other instances. This is done to avoid having to concatenate\n * variables to strings to essentially namespace the field, for most cases.\n */\nexport class Singleflight {\n    private constructor() {}\n\n    /**\n     * A void marker to help with returning a value in a singleflight context.\n     * If your code doesn't return anything, return this instead.\n     */\n    public static Void = Symbol(\"void\");\n\n    /**\n     * Acquire a singleflight context.\n     * @param {Object} instance An instance to associate the context with. Can be any object.\n     * @param {string} key A string key relevant to that instance to namespace under.\n     * @returns {SingleflightContext} Returns the context to execute the function.\n     */\n    public static for(instance?: object | null, key?: string | null): SingleflightContext {\n        if (!instance || !key) throw new Error(\"An instance and key must be supplied\");\n        return new SingleflightContext(instance, key);\n    }\n\n    /**\n     * Forgets all results for a given instance.\n     * @param {Object} instance The instance to forget about.\n     */\n    public static forgetAllFor(instance: object): void {\n        keyMap.delete(instance);\n    }\n\n    /**\n     * Forgets all cached results for all instances. Intended for use by tests.\n     */\n    public static forgetAll(): void {\n        for (const k of keyMap.keys()) {\n            keyMap.remove(k);\n        }\n    }\n}\n\nclass SingleflightContext {\n    public constructor(\n        private instance: object,\n        private key: string,\n    ) {}\n\n    /**\n     * Forget this particular instance and key combination, discarding the result.\n     */\n    public forget(): void {\n        const map = keyMap.get(this.instance);\n        if (!map) return;\n        map.remove(this.key);\n        if (!map.size) keyMap.remove(this.instance);\n    }\n\n    /**\n     * Execute a function. If a result is already known, that will be returned instead\n     * of executing the provided function. However, if no result is known then the function\n     * will be called, with its return value cached. The function must return a value\n     * other than `undefined` - take a look at Singleflight.Void if you don't have a return\n     * to make.\n     *\n     * Note that this technically allows the caller to provide a different function each time:\n     * this is largely considered a bad idea and should not be done. Singleflights work off the\n     * premise that something needs to happen once, so duplicate executions will be ignored.\n     *\n     * For ideal performance and behaviour, functions which return promises are preferred. If\n     * a function is not returning a promise, it should return as soon as possible to avoid a\n     * second call potentially racing it. The promise returned by this function will be that\n     * of the first execution of the function, even on duplicate calls.\n     * @param {Function} fn The function to execute.\n     * @returns The recorded value.\n     */\n    public do<T>(fn: () => T): T {\n        const map = keyMap.getOrCreate(this.instance, new EnhancedMap<string, unknown>());\n\n        // We have to manually getOrCreate() because we need to execute the fn\n        let val = <T>map.get(this.key);\n        if (val === undefined) {\n            val = fn();\n            map.set(this.key, val);\n        }\n\n        return val;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { groupBy, mapValues, maxBy, minBy, sumBy, takeRight } from \"lodash\";\nimport { type MatrixClient, type Room, type RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport { type Member } from \"./direct-messages\";\nimport DMRoomMap from \"./DMRoomMap\";\n\nexport const compareMembers =\n    (\n        activityScores: Record<string, IActivityScore | undefined>,\n        memberScores: Record<string, IMemberScore | undefined>,\n    ) =>\n    (a: Member | RoomMember, b: Member | RoomMember): number => {\n        const aActivityScore = activityScores[a.userId]?.score ?? 0;\n        const aMemberScore = memberScores[a.userId]?.score ?? 0;\n        const aScore = aActivityScore + aMemberScore;\n        const aNumRooms = memberScores[a.userId]?.numRooms ?? 0;\n\n        const bActivityScore = activityScores[b.userId]?.score ?? 0;\n        const bMemberScore = memberScores[b.userId]?.score ?? 0;\n        const bScore = bActivityScore + bMemberScore;\n        const bNumRooms = memberScores[b.userId]?.numRooms ?? 0;\n\n        if (aScore === bScore) {\n            if (aNumRooms === bNumRooms) {\n                // If there is no activity between members,\n                // keep the order received from the user directory search results\n                return 0;\n            }\n\n            return bNumRooms - aNumRooms;\n        }\n        return bScore - aScore;\n    };\n\nfunction joinedRooms(cli: MatrixClient): Room[] {\n    return (\n        cli\n            .getRooms()\n            .filter((r) => r.getMyMembership() === KnownMembership.Join)\n            // Skip low priority rooms and DMs\n            .filter((r) => !DMRoomMap.shared().getUserIdForRoomId(r.roomId))\n            .filter((r) => !Object.keys(r.tags).includes(\"m.lowpriority\"))\n    );\n}\n\ninterface IActivityScore {\n    lastSpoke: number;\n    score: number;\n}\n\n// Score people based on who have sent messages recently, as a way to improve the quality of suggestions.\n// We do this by checking every room to see who has sent a message in the last few hours, and giving them\n// a score which correlates to the freshness of their message. In theory, this results in suggestions\n// which are closer to \"continue this conversation\" rather than \"this person exists\".\nexport function buildActivityScores(cli: MatrixClient): { [userId: string]: IActivityScore } {\n    const now = new Date().getTime();\n    const earliestAgeConsidered = now - 60 * 60 * 1000; // 1 hour ago\n    const maxMessagesConsidered = 50; // so we don't iterate over a huge amount of traffic\n    const events = joinedRooms(cli)\n        .flatMap((room) => takeRight(room.getLiveTimeline().getEvents(), maxMessagesConsidered))\n        .filter((ev) => ev.getTs() > earliestAgeConsidered);\n    const senderEvents = groupBy(events, (ev) => ev.getSender());\n    // If the iteratee in mapValues returns undefined that key will be removed from the resultant object\n    return mapValues(senderEvents, (events) => {\n        if (!events.length) return;\n        const lastEvent = maxBy(events, (ev) => ev.getTs())!;\n        const distanceFromNow = Math.abs(now - lastEvent.getTs()); // abs to account for slight future messages\n        const inverseTime = now - earliestAgeConsidered - distanceFromNow;\n        return {\n            lastSpoke: lastEvent.getTs(),\n            // Scores from being in a room give a 'good' score of about 1.0-1.5, so for our\n            // score we'll try and award at least 1.0 for making the list, with 4.0 being\n            // an approximate maximum for being selected.\n            score: Math.max(1, inverseTime / (15 * 60 * 1000)), // 15min segments to keep scores sane\n        };\n    }) as { [key: string]: IActivityScore };\n}\n\ninterface IMemberScore {\n    member: RoomMember;\n    score: number;\n    numRooms: number;\n}\n\nexport function buildMemberScores(cli: MatrixClient): { [userId: string]: IMemberScore } {\n    const maxConsideredMembers = 200;\n    const consideredRooms = joinedRooms(cli).filter((room) => room.getJoinedMemberCount() < maxConsideredMembers);\n    const memberPeerEntries = consideredRooms.flatMap((room) =>\n        room.getJoinedMembers().map((member) => ({ member, roomSize: room.getJoinedMemberCount() })),\n    );\n    const userMeta = groupBy(memberPeerEntries, ({ member }) => member.userId);\n    // If the iteratee in mapValues returns undefined that key will be removed from the resultant object\n    return mapValues(userMeta, (roomMemberships) => {\n        if (!roomMemberships.length) return;\n        const maximumPeers = maxConsideredMembers * roomMemberships.length;\n        const totalPeers = sumBy(roomMemberships, (entry) => entry.roomSize);\n        return {\n            member: minBy(roomMemberships, (entry) => entry.roomSize)!.member,\n            numRooms: roomMemberships.length,\n            score: Math.max(0, Math.pow(1 - totalPeers / maximumPeers, 5)),\n        };\n    }) as { [userId: string]: IMemberScore };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2018-2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n/**\nA countdown timer, exposing a promise api.\nA timer starts in a non-started state,\nand needs to be started by calling `start()`` on it first.\n\nTimers can be `abort()`-ed which makes the promise reject prematurely.\n\nOnce a timer is finished or aborted, it can't be started again\n(because the promise should not be replaced). Instead, create\na new one through `clone()` or `cloneIfRun()`.\n*/\nexport default class Timer {\n    private timerHandle?: number;\n    private startTs?: number;\n    private deferred!: PromiseWithResolvers<void>;\n\n    public constructor(private timeout: number) {\n        this.setNotStarted();\n    }\n\n    private setNotStarted(): void {\n        this.timerHandle = undefined;\n        this.startTs = undefined;\n        this.deferred = Promise.withResolvers();\n        this.deferred.promise = this.deferred.promise.finally(() => {\n            this.timerHandle = undefined;\n        });\n    }\n\n    private onTimeout = (): void => {\n        const now = Date.now();\n        const elapsed = now - this.startTs!;\n        if (elapsed >= this.timeout) {\n            this.deferred.resolve();\n            this.setNotStarted();\n        } else {\n            const delta = this.timeout - elapsed;\n            this.timerHandle = window.setTimeout(this.onTimeout, delta);\n        }\n    };\n\n    public changeTimeout(timeout: number): void {\n        if (timeout === this.timeout) {\n            return;\n        }\n        const isSmallerTimeout = timeout < this.timeout;\n        this.timeout = timeout;\n        if (this.isRunning() && isSmallerTimeout) {\n            clearTimeout(this.timerHandle);\n            this.onTimeout();\n        }\n    }\n\n    /**\n     * if not started before, starts the timer.\n     * @returns {Timer} the same timer\n     */\n    public start(): Timer {\n        if (!this.isRunning()) {\n            this.startTs = Date.now();\n            this.timerHandle = window.setTimeout(this.onTimeout, this.timeout);\n        }\n        return this;\n    }\n\n    /**\n     * (re)start the timer. If it's running, reset the timeout. If not, start it.\n     * @returns {Timer} the same timer\n     */\n    public restart(): Timer {\n        if (this.isRunning()) {\n            // don't clearTimeout here as this method\n            // can be called in fast succession,\n            // instead just take note and compare\n            // when the already running timeout expires\n            this.startTs = Date.now();\n            return this;\n        } else {\n            return this.start();\n        }\n    }\n\n    /**\n     * if the timer is running, abort it,\n     * and reject the promise for this timer.\n     * @returns {Timer} the same timer\n     */\n    public abort(): Timer {\n        if (this.isRunning()) {\n            clearTimeout(this.timerHandle);\n            this.deferred.reject(new Error(\"Timer was aborted.\"));\n            this.setNotStarted();\n        }\n        return this;\n    }\n\n    /**\n     *promise that will resolve when the timer elapses,\n     *or is rejected when abort is called\n     *@returns {Promise}\n     */\n    public finished(): Promise<void> {\n        return this.deferred.promise;\n    }\n\n    public isRunning(): boolean {\n        return this.timerHandle !== undefined;\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { logger as rootLogger } from \"matrix-js-sdk/src/logger\";\nimport { type IPreviewUrlResponse, type MatrixClient, MatrixError } from \"matrix-js-sdk/src/matrix\";\nimport { decode } from \"html-entities\";\n\nimport type { UrlPreview } from \"@element-hq/web-shared-components\";\nimport { mediaFromMxc } from \"../customisations/Media\";\nimport { thumbHeight } from \"../ImageUtils\";\n\nconst logger = rootLogger.getChild(\"UrlPreviewFetcher\");\n\nexport const PREVIEW_WIDTH_PX = 478;\nexport const PREVIEW_HEIGHT_PX = 200;\nexport const MIN_PREVIEW_PX = 96;\nexport const MIN_IMAGE_SIZE_BYTES = 8192;\n\n/**\n * Handles fetching and parsing URL previews.\n * Maintains a cache of previously fetched previews; call `clearCache` when\n * media visibility changes so images are re-fetched with the correct visibility.\n */\nexport class UrlPreviewFetcher {\n    private readonly cache = new Map<string, UrlPreview>();\n\n    public constructor(\n        private readonly client: MatrixClient,\n        private readonly previewRequestTs: number,\n        private readonly showTooltips: boolean,\n    ) {}\n\n    public clearCache(): void {\n        this.cache.clear();\n    }\n\n    /**\n     * Parse a numeric value from OpenGraph. The OpenGraph spec defines all values as strings\n     * although Synapse may return these values as numbers. To be compatible, test strings\n     * and numbers.\n     * @param value The numeric value\n     * @returns A number if the value parsed correctly, or undefined otherwise.\n     */\n    private static getNumberFromOpenGraph(value: number | string | undefined): number | undefined {\n        if (typeof value === \"number\") {\n            return value;\n        } else if (typeof value === \"string\" && value) {\n            const i = Number.parseInt(value, 10);\n            if (!Number.isNaN(i)) return i;\n        }\n        return undefined;\n    }\n\n    /**\n     * Calculate the best possible title from an opengraph response.\n     * @param response The opengraph response\n     * @param link The link being used to preview.\n     * @returns The title value.\n     */\n    private static getBaseMetadataFromResponse(\n        response: IPreviewUrlResponse,\n        link: string,\n    ): Pick<UrlPreview, \"title\" | \"description\" | \"siteName\"> {\n        let title =\n            typeof response[\"og:title\"] === \"string\" && response[\"og:title\"].trim()\n                ? response[\"og:title\"].trim()\n                : undefined;\n        let description =\n            typeof response[\"og:description\"] === \"string\" && response[\"og:description\"].trim()\n                ? response[\"og:description\"].trim()\n                : undefined;\n        const siteName =\n            typeof response[\"og:site_name\"] === \"string\" && response[\"og:site_name\"].trim()\n                ? response[\"og:site_name\"].trim()\n                : new URL(link).hostname;\n\n        if (!title && description) {\n            title = description;\n            description = undefined;\n        } else if (!title && siteName) {\n            title = siteName;\n        } else if (!title) {\n            title = link;\n        }\n\n        if (description && description.toLowerCase() === siteName.toLowerCase()) {\n            description = undefined;\n        }\n\n        return { title, description: description && decode(description), siteName };\n    }\n\n    /**\n     * Calculate the best possible author from an opengraph response.\n     * @param response The opengraph response\n     * @returns The author value, or undefined if no valid author could be found.\n     */\n    private static getAuthorFromResponse(response: IPreviewUrlResponse): UrlPreview[\"author\"] {\n        let calculatedAuthor: string | undefined;\n        if (response[\"og:type\"] === \"article\") {\n            if (typeof response[\"article:author\"] === \"string\" && response[\"article:author\"]) {\n                calculatedAuthor = response[\"article:author\"];\n            }\n        }\n        if (typeof response[\"profile:username\"] === \"string\" && response[\"profile:username\"]) {\n            calculatedAuthor = response[\"profile:username\"];\n        }\n        if (calculatedAuthor && URL.canParse(calculatedAuthor)) {\n            return undefined;\n        }\n        return calculatedAuthor;\n    }\n\n    /**\n     * Calculate whether the provided image from the preview response is an full size preview or\n     * a site icon.\n     * @returns `true` if the image should be used as a preview, otherwise `false`\n     */\n    private static isImagePreview(width?: number, height?: number, bytes?: number): boolean {\n        if (width && width < MIN_PREVIEW_PX) return false;\n        if (height && height < MIN_PREVIEW_PX) return false;\n        if (bytes && bytes < MIN_IMAGE_SIZE_BYTES) return false;\n        return true;\n    }\n\n    /**\n     * Fetch a preview for a single URL, returning a cached result if available.\n     * @param link The URL to preview.\n     * @param loadMedia Whether to include the preview image. Pass false when media is hidden.\n     */\n    public async fetchPreview(link: string, loadMedia: boolean): Promise<UrlPreview | null> {\n        const cached = this.cache.get(link);\n        if (cached) return cached;\n\n        let response: IPreviewUrlResponse;\n        try {\n            response = await this.client.getUrlPreview(link, this.previewRequestTs);\n        } catch (error) {\n            if (error instanceof MatrixError && error.httpStatus === 404) {\n                logger.debug(\"Failed to get URL preview: \", error);\n            } else {\n                logger.error(\"Failed to get URL preview: \", error);\n            }\n            return null;\n        }\n\n        const { title, description, siteName } = UrlPreviewFetcher.getBaseMetadataFromResponse(response, link);\n        const author = UrlPreviewFetcher.getAuthorFromResponse(response);\n        const hasImage = response[\"og:image\"] && typeof response[\"og:image\"] === \"string\";\n\n        if (title === link && !hasImage) {\n            return null;\n        }\n\n        let image: UrlPreview[\"image\"];\n        let siteIcon: string | undefined;\n\n        if (typeof response[\"og:image\"] === \"string\" && loadMedia) {\n            const mxcImageFull = response[\"og:image\"];\n            const media = mediaFromMxc(response[\"og:image\"], this.client);\n            const declaredHeight = UrlPreviewFetcher.getNumberFromOpenGraph(response[\"og:image:height\"]);\n            const declaredWidth = UrlPreviewFetcher.getNumberFromOpenGraph(response[\"og:image:width\"]);\n            const imageSize = UrlPreviewFetcher.getNumberFromOpenGraph(response[\"matrix:image:size\"]);\n            const alt = typeof response[\"og:image:alt\"] === \"string\" ? response[\"og:image:alt\"] : undefined;\n            const imageType = typeof response[\"og:image:type\"] === \"string\" ? response[\"og:image:type\"] : undefined;\n\n            if (UrlPreviewFetcher.isImagePreview(declaredWidth, declaredHeight, imageSize)) {\n                const width = Math.min(declaredWidth ?? PREVIEW_WIDTH_PX, PREVIEW_WIDTH_PX);\n                const height =\n                    thumbHeight(width, declaredHeight, PREVIEW_WIDTH_PX, PREVIEW_WIDTH_PX) ?? PREVIEW_WIDTH_PX;\n                const thumb = media.getThumbnailOfSourceHttp(PREVIEW_WIDTH_PX, PREVIEW_HEIGHT_PX, \"scale\");\n                const playable = !!response[\"og:video\"] || !!response[\"og:video:type\"] || !!response[\"og:audio\"];\n                if (thumb) {\n                    image = {\n                        imageThumb: thumb,\n                        imageFull: media.srcHttp ?? thumb,\n                        mxcImageFull,\n                        imageType,\n                        width,\n                        height,\n                        fileSize: UrlPreviewFetcher.getNumberFromOpenGraph(response[\"matrix:image:size\"]),\n                        alt,\n                        playable,\n                    };\n                }\n            } else if (media.srcHttp) {\n                siteIcon = media.srcHttp;\n            }\n        }\n\n        const result = {\n            link,\n            title,\n            author,\n            description,\n            siteName,\n            siteIcon,\n            ogUrl: response[\"og:url\"],\n            showTooltipOnLink: !!(link !== title && this.showTooltips),\n            image,\n        } satisfies UrlPreview;\n        this.cache.set(link, result);\n        return result;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2015, 2016 , 2020 Copyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n/**\n * Returns the actual height that an image of dimensions (fullWidth, fullHeight)\n * will occupy if resized to fit inside a thumbnail bounding box of size\n * (thumbWidth, thumbHeight).\n *\n * If the aspect ratio of the source image is taller than the aspect ratio of\n * the thumbnail bounding box, then we return the thumbHeight parameter unchanged.\n * Otherwise we return the thumbHeight parameter scaled down appropriately to\n * reflect the actual height the scaled thumbnail occupies.\n *\n * This is very useful for calculating how much height a thumbnail will actually\n * consume in the timeline, when performing scroll offset calculations\n * (e.g. scroll locking)\n */\nexport function thumbHeight(fullWidth: number, fullHeight: number, thumbWidth: number, thumbHeight: number): number;\nexport function thumbHeight(\n    fullWidth: number | undefined,\n    fullHeight: number | undefined,\n    thumbWidth: number,\n    thumbHeight: number,\n): null;\nexport function thumbHeight(\n    fullWidth: number | undefined,\n    fullHeight: number | undefined,\n    thumbWidth: number,\n    thumbHeight: number,\n): number | null {\n    if (!fullWidth || !fullHeight) {\n        // Cannot calculate thumbnail height for image: missing w/h in metadata. We can't even\n        // log this because it's spammy\n        return null;\n    }\n    if (fullWidth < thumbWidth && fullHeight < thumbHeight) {\n        // no scaling needs to be applied\n        return fullHeight;\n    }\n    const widthMulti = thumbWidth / fullWidth;\n    const heightMulti = thumbHeight / fullHeight;\n    if (widthMulti < heightMulti) {\n        // width is the dominant dimension so scaling will be fixed on that\n        return Math.floor(widthMulti * fullHeight);\n    } else {\n        // height is the dominant dimension so scaling will be fixed on that\n        return Math.floor(heightMulti * fullHeight);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type IClientWellKnown, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { UnstableValue } from \"matrix-js-sdk/src/NamespacedValue\";\n\nconst CALL_BEHAVIOUR_WK_KEY = \"io.element.call_behaviour\";\nconst E2EE_WK_KEY = \"io.element.e2ee\";\nconst E2EE_WK_KEY_DEPRECATED = \"im.vector.riot.e2ee\";\nexport const TILE_SERVER_WK_KEY = new UnstableValue(\"m.tile_server\", \"org.matrix.msc3488.tile_server\");\nconst EMBEDDED_PAGES_WK_PROPERTY = \"io.element.embedded_pages\";\n\n/* eslint-disable camelcase */\nexport interface ICallBehaviourWellKnown {\n    widget_build_url?: string;\n    ignore_dm?: boolean;\n}\n\nexport interface IE2EEWellKnown {\n    default?: boolean;\n    /**\n     * Forces the encryption to disabled for all new rooms\n     * When true, overrides configured 'default' behaviour\n     * Hides the option to enable encryption on room creation\n     * Disables the option to enable encryption in room settings for all new and existing rooms\n     */\n    force_disable?: boolean;\n}\n\nexport interface ITileServerWellKnown {\n    map_style_url?: string;\n}\n\nexport interface IEmbeddedPagesWellKnown {\n    home_url?: string;\n}\n/* eslint-enable camelcase */\n\nexport function getCallBehaviourWellKnown(matrixClient: MatrixClient): ICallBehaviourWellKnown {\n    const clientWellKnown = matrixClient.getClientWellKnown();\n    return clientWellKnown?.[CALL_BEHAVIOUR_WK_KEY];\n}\n\nexport function getE2EEWellKnown(matrixClient: MatrixClient): IE2EEWellKnown | null {\n    const clientWellKnown = matrixClient.getClientWellKnown();\n    if (clientWellKnown?.[E2EE_WK_KEY]) {\n        return clientWellKnown[E2EE_WK_KEY];\n    }\n    if (clientWellKnown?.[E2EE_WK_KEY_DEPRECATED]) {\n        return clientWellKnown[E2EE_WK_KEY_DEPRECATED];\n    }\n    return null;\n}\n\nexport function getTileServerWellKnown(matrixClient: MatrixClient): ITileServerWellKnown | undefined {\n    return tileServerFromWellKnown(matrixClient.getClientWellKnown());\n}\n\nexport function tileServerFromWellKnown(clientWellKnown?: IClientWellKnown | undefined): ITileServerWellKnown {\n    return clientWellKnown?.[TILE_SERVER_WK_KEY.name] ?? clientWellKnown?.[TILE_SERVER_WK_KEY.altName];\n}\n\nexport function getEmbeddedPagesWellKnown(matrixClient: MatrixClient | undefined): IEmbeddedPagesWellKnown | undefined {\n    return embeddedPagesFromWellKnown(matrixClient?.getClientWellKnown());\n}\n\nexport function embeddedPagesFromWellKnown(clientWellKnown?: IClientWellKnown): IEmbeddedPagesWellKnown {\n    return clientWellKnown?.[EMBEDDED_PAGES_WK_PROPERTY];\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { type IDestroyable } from \"./IDestroyable\";\nimport { arrayFastClone } from \"./arrays\";\n\nexport type WhenFn<T extends string | number> = (w: Whenable<T>) => void;\n\n/**\n * Whenables are a cheap way to have Observable patterns mixed with typical\n * usage of Promises, without having to tear down listeners or calls. Whenables\n * are intended to be used when a condition will be met multiple times and\n * the consumer needs to know *when* that happens.\n */\nexport abstract class Whenable<T extends string | number> implements IDestroyable {\n    private listeners: { condition: T | null; fn: WhenFn<T> }[] = [];\n\n    /**\n     * Sets up a call to `fn` *when* the `condition` is met.\n     * @param condition The condition to match.\n     * @param fn The function to call.\n     * @returns This.\n     */\n    public when(condition: T, fn: WhenFn<T>): Whenable<T> {\n        this.listeners.push({ condition, fn });\n        return this;\n    }\n\n    /**\n     * Sets up a call to `fn` *when* any of the `conditions` are met.\n     * @param conditions The conditions to match.\n     * @param fn The function to call.\n     * @returns This.\n     */\n    public whenAnyOf(conditions: T[], fn: WhenFn<T>): Whenable<T> {\n        for (const condition of conditions) {\n            this.when(condition, fn);\n        }\n        return this;\n    }\n\n    /**\n     * Sets up a call to `fn` *when* any condition is met.\n     * @param fn The function to call.\n     * @returns This.\n     */\n    public whenAnything(fn: WhenFn<T>): Whenable<T> {\n        this.listeners.push({ condition: null, fn });\n        return this;\n    }\n\n    /**\n     * Notifies all the listeners of a given condition.\n     * @param condition The new condition that has been met.\n     */\n    protected notifyCondition(condition: T): void {\n        const listeners = arrayFastClone(this.listeners); // clone just in case the handler modifies us\n        for (const listener of listeners) {\n            if (listener.condition === null || listener.condition === condition) {\n                try {\n                    listener.fn(this);\n                } catch (e) {\n                    logger.error(`Error calling whenable listener for ${condition}:`, e);\n                }\n            }\n        }\n    }\n\n    public destroy(): void {\n        this.listeners = [];\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient, type MatrixEvent, getBeaconInfoIdentifier } from \"matrix-js-sdk/src/matrix\";\n\n/**\n * Beacons should only have shareable locations (open in external mapping tool, forward)\n * when they are live and have a location\n * If not live, returns null\n */\nexport const getShareableLocationEventForBeacon = (event: MatrixEvent, cli: MatrixClient): MatrixEvent | null => {\n    const room = cli.getRoom(event.getRoomId());\n    const beacon = room?.currentState.beacons?.get(getBeaconInfoIdentifier(event));\n    const latestLocationEvent = beacon?.latestLocationEvent;\n\n    if (beacon?.isLive && latestLocationEvent) {\n        return latestLocationEvent;\n    }\n    return null;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Beacon, type ContentHelpers } from \"matrix-js-sdk/src/matrix\";\n\n/**\n * Get ms until expiry\n * Returns 0 when expiry is already passed\n * @param startTimestamp\n * @param durationMs\n * @returns remainingMs\n */\nexport const msUntilExpiry = (startTimestamp: number, durationMs: number): number =>\n    Math.max(0, startTimestamp + durationMs - Date.now());\n\nexport const getBeaconMsUntilExpiry = (beaconInfo: ContentHelpers.BeaconInfoState): number =>\n    msUntilExpiry(beaconInfo.timestamp || 0, beaconInfo.timeout);\n\nexport const getBeaconExpiryTimestamp = (beacon: Beacon): number =>\n    (beacon.beaconInfo.timestamp || 0) + beacon.beaconInfo.timeout;\n\nexport const sortBeaconsByLatestExpiry = (left: Beacon, right: Beacon): number =>\n    getBeaconExpiryTimestamp(right) - getBeaconExpiryTimestamp(left);\n\n// aka sort by timestamp descending\nexport const sortBeaconsByLatestCreation = (left: Beacon, right: Beacon): number =>\n    (right.beaconInfo.timestamp || 0) - (left.beaconInfo.timestamp || 0);\n\n// a beacon's starting timestamp can be in the future\n// (either from small deviations in system clock times, or on purpose from another client)\n// a beacon is only live between its start timestamp and expiry\n// detect when a beacon is waiting to become live\nexport const isBeaconWaitingToStart = (beacon: Beacon): boolean =>\n    !beacon.isLive &&\n    !!beacon.beaconInfo.timestamp &&\n    beacon.beaconInfo.timestamp > Date.now() &&\n    getBeaconExpiryTimestamp(beacon) > Date.now();\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\n// map GeolocationPositionError codes\n// https://developer.mozilla.org/en-US/docs/Web/API/GeolocationPositionError\nexport enum GeolocationError {\n    // no navigator.geolocation\n    Unavailable = \"Unavailable\",\n    // The acquisition of the geolocation information failed because the page didn't have the permission to do it.\n    PermissionDenied = \"PermissionDenied\",\n    // The acquisition of the geolocation failed because at least one internal source of position returned an internal error.\n    PositionUnavailable = \"PositionUnavailable\",\n    // The time allowed to acquire the geolocation was reached before the information was obtained.\n    Timeout = \"Timeout\",\n    // other unexpected failure\n    Default = \"Default\",\n}\n\nconst GeolocationOptions = {\n    timeout: 10000,\n    maximumAge: 60000,\n};\n\nconst isGeolocationPositionError = (error: unknown): error is GeolocationPositionError =>\n    typeof error === \"object\" && !!(error as GeolocationPositionError)[\"PERMISSION_DENIED\"];\n/**\n * Maps GeolocationPositionError to our GeolocationError enum\n */\nexport const mapGeolocationError = (error: GeolocationPositionError | Error | unknown): GeolocationError => {\n    logger.error(\"Geolocation failed\", error);\n\n    if (isGeolocationPositionError(error)) {\n        switch (error?.code) {\n            case error.PERMISSION_DENIED:\n                return GeolocationError.PermissionDenied;\n            case error.POSITION_UNAVAILABLE:\n                return GeolocationError.PositionUnavailable;\n            case error.TIMEOUT:\n                return GeolocationError.Timeout;\n            default:\n                return GeolocationError.Default;\n        }\n    } else if (error instanceof Error && error.message === GeolocationError.Unavailable) {\n        return GeolocationError.Unavailable;\n    } else {\n        return GeolocationError.Default;\n    }\n};\n\nconst getGeolocation = (): Geolocation => {\n    if (!navigator.geolocation) {\n        throw new Error(GeolocationError.Unavailable);\n    }\n    return navigator.geolocation;\n};\n\nexport type GenericPosition = {\n    latitude: number;\n    longitude: number;\n    altitude?: number;\n    accuracy?: number;\n    timestamp: number;\n};\n\nexport type TimedGeoUri = {\n    geoUri: string;\n    timestamp: number;\n};\n\nexport const genericPositionFromGeolocation = (geoPosition: GeolocationPosition): GenericPosition => {\n    const { latitude, longitude, altitude, accuracy } = geoPosition.coords;\n\n    return {\n        // safari reports geolocation timestamps as Apple Cocoa Core Data timestamp\n        // or ms since 1/1/2001 instead of the regular epoch\n        // they also use local time, not utc\n        // to simplify, just use Date.now()\n        timestamp: Date.now(),\n        latitude,\n        longitude,\n        altitude: altitude ?? undefined,\n        accuracy,\n    };\n};\n\nexport const getGeoUri = (position: GenericPosition): string => {\n    const lat = position.latitude;\n    const lon = position.longitude;\n    const alt = Number.isFinite(position.altitude) ? `,${position.altitude}` : \"\";\n    const acc = Number.isFinite(position.accuracy) ? `;u=${position.accuracy}` : \"\";\n    return `geo:${lat},${lon}${alt}${acc}`;\n};\n\nexport const mapGeolocationPositionToTimedGeo = (position: GeolocationPosition): TimedGeoUri => {\n    const genericPosition = genericPositionFromGeolocation(position);\n    return { timestamp: genericPosition.timestamp, geoUri: getGeoUri(genericPosition) };\n};\n\n/**\n * Gets current position, returns a promise\n * @returns Promise<GeolocationPosition>\n */\nexport const getCurrentPosition = async (): Promise<GeolocationPosition> => {\n    try {\n        const position = await new Promise((resolve: PositionCallback, reject) => {\n            getGeolocation().getCurrentPosition(resolve, reject, GeolocationOptions);\n        });\n        return position;\n    } catch (error) {\n        throw new Error(mapGeolocationError(error));\n    }\n};\n\nexport type ClearWatchCallback = () => void;\nexport const watchPosition = (\n    onWatchPosition: PositionCallback,\n    onWatchPositionError: (error: GeolocationError) => void,\n): ClearWatchCallback => {\n    try {\n        const onError = (error: GeolocationPositionError): void => onWatchPositionError(mapGeolocationError(error));\n        const watchId = getGeolocation().watchPosition(onWatchPosition, onError, GeolocationOptions);\n        const clearWatch = (): void => {\n            getGeolocation().clearWatch(watchId);\n        };\n        return clearWatch;\n    } catch (error) {\n        throw new Error(mapGeolocationError(error));\n    }\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useContext, useEffect, useState } from \"react\";\nimport { type Beacon, BeaconEvent, type MatrixEvent, getBeaconInfoIdentifier } from \"matrix-js-sdk/src/matrix\";\n\nimport MatrixClientContext from \"../../contexts/MatrixClientContext\";\nimport { useEventEmitterState } from \"../../hooks/useEventEmitter\";\n\nexport const useBeacon = (beaconInfoEvent: MatrixEvent): Beacon | undefined => {\n    const matrixClient = useContext(MatrixClientContext);\n    const [beacon, setBeacon] = useState<Beacon>();\n\n    useEffect(() => {\n        const roomId = beaconInfoEvent.getRoomId();\n        const beaconIdentifier = getBeaconInfoIdentifier(beaconInfoEvent);\n\n        const room = matrixClient?.getRoom(roomId);\n        const beaconInstance = room?.currentState.beacons.get(beaconIdentifier);\n\n        // TODO could this be less stupid?\n\n        // Beacons are identified by their `state_key`,\n        // where `state_key` is always owner mxid for access control.\n        // Thus, only one beacon is allowed per-user per-room.\n        // See https://github.com/matrix-org/matrix-spec-proposals/pull/3672\n        // When a user creates a new beacon any previous\n        // beacon is replaced and should assume a 'stopped' state\n        // Here we check that this event is the latest beacon for this user\n        // If it is not the beacon instance is set to undefined.\n        // Retired beacons don't get a beacon instance.\n        if (beaconInstance?.beaconInfoId === beaconInfoEvent.getId()) {\n            setBeacon(beaconInstance);\n        } else {\n            setBeacon(undefined);\n        }\n    }, [beaconInfoEvent, matrixClient]);\n\n    // beacon update will fire when this beacon is superseded\n    // check the updated event id for equality to the matrix event\n    const beaconInstanceEventId = useEventEmitterState(beacon, BeaconEvent.Update, () => beacon?.beaconInfoId);\n\n    useEffect(() => {\n        if (beaconInstanceEventId && beaconInstanceEventId !== beaconInfoEvent.getId()) {\n            setBeacon(undefined);\n        }\n    }, [beaconInstanceEventId, beaconInfoEvent]);\n\n    useEffect(() => {\n        if (beacon) {\n            beacon.monitorLiveness();\n        }\n    }, [beacon]);\n\n    return beacon;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useEffect, useState } from \"react\";\nimport { type Beacon, type BeaconIdentifier } from \"matrix-js-sdk/src/matrix\";\n\nimport { useEventEmitterState } from \"../../hooks/useEventEmitter\";\nimport { OwnBeaconStore, OwnBeaconStoreEvent } from \"../../stores/OwnBeaconStore\";\nimport { sortBeaconsByLatestExpiry } from \"./duration\";\n\ntype LiveBeaconsState = {\n    beacon?: Beacon;\n    onStopSharing: () => void;\n    onResetLocationPublishError: () => void;\n    stoppingInProgress: boolean;\n    hasStopSharingError: boolean;\n    hasLocationPublishError: boolean;\n};\n\n/**\n * Monitor the current users own beacons\n * While current implementation only allows one live beacon per user per room\n * In future it will be possible to have multiple live beacons in one room\n * Select the latest expiry to display,\n * and kill all beacons on stop sharing\n */\nexport const useOwnLiveBeacons = (liveBeaconIds: BeaconIdentifier[]): LiveBeaconsState => {\n    const [stoppingInProgress, setStoppingInProgress] = useState(false);\n\n    const hasLocationPublishError = useEventEmitterState(\n        OwnBeaconStore.instance,\n        OwnBeaconStoreEvent.LocationPublishError,\n        () => liveBeaconIds.some(OwnBeaconStore.instance.beaconHasLocationPublishError),\n    );\n\n    const hasStopSharingError = useEventEmitterState(\n        OwnBeaconStore.instance,\n        OwnBeaconStoreEvent.BeaconUpdateError,\n        () => liveBeaconIds.some((id) => OwnBeaconStore.instance.beaconUpdateErrors.has(id)),\n    );\n\n    useEffect(() => {\n        if (hasStopSharingError) {\n            setStoppingInProgress(false);\n        }\n    }, [hasStopSharingError]);\n\n    // reset stopping in progress on change in live ids\n    useEffect(() => {\n        setStoppingInProgress(false);\n    }, [liveBeaconIds]);\n\n    // select the beacon with latest expiry to display expiry time\n    const beacon = liveBeaconIds\n        .map((beaconId) => OwnBeaconStore.instance.getBeaconById(beaconId)!)\n        .sort(sortBeaconsByLatestExpiry)\n        .shift();\n\n    const onStopSharing = async (): Promise<void> => {\n        setStoppingInProgress(true);\n        try {\n            await Promise.all(liveBeaconIds.map((beaconId) => OwnBeaconStore.instance.stopBeacon(beaconId)));\n        } catch {\n            setStoppingInProgress(false);\n        }\n    };\n\n    const onResetLocationPublishError = (): void => {\n        liveBeaconIds.forEach((beaconId) => {\n            OwnBeaconStore.instance.resetLocationPublishError(beaconId);\n        });\n    };\n\n    return {\n        onStopSharing,\n        onResetLocationPublishError,\n        beacon,\n        stoppingInProgress,\n        hasLocationPublishError,\n        hasStopSharingError,\n    };\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n// WARNING: We have to be very careful about what mime-types we allow into blobs,\n// as for performance reasons these are now rendered via URL.createObjectURL()\n// rather than by converting into data: URIs.\n//\n// This means that the content is rendered using the origin of the script which\n// called createObjectURL(), and so if the content contains any scripting then it\n// will pose a XSS vulnerability when the browser renders it.  This is particularly\n// bad if the user right-clicks the URI and pastes it into a new window or tab,\n// as the blob will then execute with access to Element's full JS environment(!)\n//\n// See https://github.com/matrix-org/matrix-react-sdk/pull/1820#issuecomment-385210647\n// for details.\n//\n// We mitigate this by only allowing mime-types into blobs which we know don't\n// contain any scripting, and instantiate all others as application/octet-stream\n// regardless of what mime-type the event claimed.  Even if the payload itself\n// is some malicious HTML, the fact we instantiate it with a media mimetype or\n// application/octet-stream means the browser doesn't try to render it as such.\n//\n// One interesting edge case is image/svg+xml, which empirically *is* rendered\n// correctly if the blob is set to the src attribute of an img tag (for thumbnails)\n// *even if the mimetype is application/octet-stream*.  However, empirically JS\n// in the SVG isn't executed in this scenario, so we seem to be okay.\n//\n// Tested on Chrome 65 and Firefox 60\n//\n// The list below is taken mainly from\n// https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats\n// N.B. Matrix doesn't currently specify which mimetypes are valid in given\n// events, so we pick the ones which HTML5 browsers should be able to display\n//\n// For the record, mime-types which must NEVER enter this list below include:\n//   text/html, text/xhtml, image/svg, image/svg+xml, image/pdf, and similar.\n\nconst ALLOWED_BLOB_MIMETYPES = [\n    \"image/jpeg\",\n    \"image/gif\",\n    \"image/png\",\n    \"image/apng\",\n    \"image/webp\",\n    \"image/avif\",\n\n    \"video/mp4\",\n    \"video/webm\",\n    \"video/ogg\",\n    \"video/quicktime\",\n\n    \"audio/mp4\",\n    \"audio/webm\",\n    \"audio/aac\",\n    \"audio/mpeg\",\n    \"audio/ogg\",\n    \"audio/wave\",\n    \"audio/wav\",\n    \"audio/x-wav\",\n    \"audio/x-pn-wav\",\n    \"audio/flac\",\n    \"audio/x-flac\",\n];\n\n/**\n * Checks whether the given mime type is in the allowed mimetype list\n * @param mimetype - the mimetype to check\n */\nexport function isMimeTypeAllowed(mimetype: string): boolean {\n    return ALLOWED_BLOB_MIMETYPES.includes(mimetype);\n}\n\n/**\n * Returns the input mimetype if it is allowed, `application/octet-stream` otherwise\n * @param mimetype - the mimetype to check\n */\nexport function getBlobSafeMimeType(mimetype: string): string {\n    if (!isMimeTypeAllowed(mimetype)) {\n        return \"application/octet-stream\";\n    }\n    return mimetype;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019 Michael Telatynski <7t3chguy@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { split } from \"lodash\";\n\nexport function textToHtmlRainbow(str: string): string {\n    const frequency = (2 * Math.PI) / str.length;\n\n    return split(str, \"\")\n        .map((c, i) => {\n            if (c === \" \") {\n                return c;\n            }\n            const [a, b] = generateAB(i * frequency, 1);\n            const [red, green, blue] = labToRGB(75, a, b);\n            return (\n                '<span data-mx-color=\"#' +\n                red.toString(16).padStart(2, \"0\") +\n                green.toString(16).padStart(2, \"0\") +\n                blue.toString(16).padStart(2, \"0\") +\n                '\">' +\n                c +\n                \"</span>\"\n            );\n        })\n        .join(\"\");\n}\n\nfunction generateAB(hue: number, chroma: number): [number, number] {\n    const a = chroma * 127 * Math.cos(hue);\n    const b = chroma * 127 * Math.sin(hue);\n\n    return [a, b];\n}\n\nfunction labToRGB(l: number, a: number, b: number): [number, number, number] {\n    // https://en.wikipedia.org/wiki/CIELAB_color_space#Reverse_transformation\n    // https://en.wikipedia.org/wiki/SRGB#The_forward_transformation_(CIE_XYZ_to_sRGB)\n\n    // Convert CIELAB to CIEXYZ (D65)\n    let y = (l + 16) / 116;\n    const x = adjustXYZ(y + a / 500) * 0.9505;\n    const z = adjustXYZ(y - b / 200) * 1.089;\n\n    y = adjustXYZ(y);\n\n    // Linear transformation from CIEXYZ to RGB\n    const red = 3.24096994 * x - 1.53738318 * y - 0.49861076 * z;\n    const green = -0.96924364 * x + 1.8759675 * y + 0.04155506 * z;\n    const blue = 0.05563008 * x - 0.20397696 * y + 1.05697151 * z;\n\n    return [adjustRGB(red), adjustRGB(green), adjustRGB(blue)];\n}\n\nfunction adjustXYZ(v: number): number {\n    if (v > 0.2069) {\n        return Math.pow(v, 3);\n    }\n    return 0.1284 * v - 0.01771;\n}\n\nfunction gammaCorrection(v: number): number {\n    // Non-linear transformation to sRGB\n    if (v <= 0.0031308) {\n        return 12.92 * v;\n    }\n    return 1.055 * Math.pow(v, 1 / 2.4) - 0.055;\n}\n\nfunction adjustRGB(v: number): number {\n    const corrected = gammaCorrection(v);\n\n    // Limits number between 0 and 1\n    const limited = Math.min(Math.max(corrected, 0), 1);\n\n    return Math.round(limited * 255);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type ClientEvent, type ClientEventHandlerMap, SyncState } from \"matrix-js-sdk/src/matrix\";\n\n/**\n * Creates a MatrixClient event listener function that can be used to get notified about reconnects.\n * @param callback The callback to be called on reconnect\n */\nexport const createReconnectedListener = (callback: () => void): ClientEventHandlerMap[ClientEvent.Sync] => {\n    return (syncState: SyncState, prevState: SyncState | null) => {\n        if (syncState !== SyncState.Error && prevState !== syncState) {\n            // Consider the client reconnected if there is no error with syncing.\n            // This means the state could be RECONNECTING, SYNCING, PREPARED or CATCHUP.\n            callback();\n        }\n    };\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Device, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\n/**\n * Get crypto information on a specific device.\n *\n * Only devices with Crypto support are returned. If the MatrixClient doesn't support cryptography, `undefined` is\n * returned.\n *\n * @param client  - Matrix Client.\n * @param userId  - ID of the user owning the device.\n * @param deviceId - ID of the device.\n * @param downloadUncached - If true, download the device list for users whose device list we are not\n *    currently tracking. Defaults to false.\n *\n * @returns Information on the device if it is known.\n */\nexport async function getDeviceCryptoInfo(\n    client: MatrixClient,\n    userId: string,\n    deviceId: string,\n    downloadUncached?: boolean,\n): Promise<Device | undefined> {\n    const crypto = client.getCrypto();\n    if (!crypto) {\n        // no crypto support, no device.\n        return undefined;\n    }\n\n    const deviceMap = await crypto.getUserDeviceInfo([userId], downloadUncached);\n    return deviceMap.get(userId)?.get(deviceId);\n}\n\n/**\n * Get the IDs of the given user's devices.\n *\n * Only devices with Crypto support are returned. If the MatrixClient doesn't support cryptography, an empty Set is\n * returned.\n *\n * @param client  - Matrix Client.\n * @param userId  - ID of the user to query.\n */\n\nexport async function getUserDeviceIds(client: MatrixClient, userId: string): Promise<Set<string>> {\n    const crypto = client.getCrypto();\n    if (!crypto) {\n        return new Set();\n    }\n\n    const deviceMap = await crypto.getUserDeviceInfo([userId]);\n    return new Set(deviceMap.get(userId)?.keys() ?? []);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2024 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\n/** The `algorithm` property used in `m.room.encrypted` state events for encrypted rooms.\n */\nexport const MEGOLM_ENCRYPTION_ALGORITHM = \"m.megolm.v1.aes-sha2\";\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { getE2EEWellKnown } from \"../WellKnownUtils\";\n\n/**\n * Check e2ee io.element.e2ee setting\n * Returns true when .well-known e2ee config force_disable is TRUE\n * When true all new rooms should be created with encryption disabled\n * Can be overriden by synapse option encryption_enabled_by_default_for_room_type ( :/ )\n * https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#encryption_enabled_by_default_for_room_type\n *\n * @param client\n * @returns whether well-known config forces encryption to DISABLED\n */\nexport function shouldForceDisableEncryption(client: MatrixClient): boolean {\n    const e2eeWellKnown = getE2EEWellKnown(client);\n\n    if (e2eeWellKnown) {\n        const shouldForceDisable = e2eeWellKnown[\"force_disable\"] === true;\n        return shouldForceDisable;\n    }\n    return false;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type IInvite3PID, type MatrixClient, type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { Action } from \"../../dispatcher/actions\";\nimport { type ViewRoomPayload } from \"../../dispatcher/payloads/ViewRoomPayload\";\nimport { determineCreateRoomEncryptionOption, type Member } from \"../direct-messages\";\nimport DMRoomMap from \"../DMRoomMap\";\nimport { isLocalRoom } from \"../localRoom/isLocalRoom\";\nimport { findDMForUser } from \"./findDMForUser\";\nimport dis from \"../../dispatcher/dispatcher\";\nimport { getAddressType } from \"../../UserAddress\";\nimport createRoom, { type IOpts } from \"../../createRoom\";\n\n/**\n * Start a DM.\n *\n * @returns {Promise<string | null} Resolves to the room id.\n */\nexport async function startDm(client: MatrixClient, targets: Member[], showSpinner = true): Promise<string | null> {\n    const targetIds = targets.map((t) => t.userId);\n\n    // Check if there is already a DM with these people and reuse it if possible.\n    let existingRoom: Room | undefined;\n    if (targetIds.length === 1) {\n        existingRoom = findDMForUser(client, targetIds[0]);\n    } else {\n        existingRoom = DMRoomMap.shared().getDMRoomForIdentifiers(targetIds) ?? undefined;\n    }\n    if (existingRoom && !isLocalRoom(existingRoom)) {\n        dis.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            room_id: existingRoom.roomId,\n            should_peek: false,\n            joining: false,\n            metricsTrigger: \"MessageUser\",\n        });\n        return Promise.resolve(existingRoom.roomId);\n    }\n\n    const createRoomOptions: IOpts = { inlineErrors: true };\n\n    if (await determineCreateRoomEncryptionOption(client, targets)) {\n        createRoomOptions.encryption = true;\n    }\n\n    // Check if it's a traditional DM and create the room if required.\n    // TODO: [Canonical DMs] Remove this check and instead just create the multi-person DM\n    const isSelf = targetIds.length === 1 && targetIds[0] === client.getUserId();\n    if (targetIds.length === 1 && !isSelf) {\n        createRoomOptions.dmUserId = targetIds[0];\n    }\n\n    if (targetIds.length > 1) {\n        createRoomOptions.createOpts = targetIds.reduce<{\n            invite_3pid: IInvite3PID[];\n            invite: string[];\n        }>(\n            (roomOptions, address) => {\n                const type = getAddressType(address);\n                if (type === \"email\") {\n                    const invite: IInvite3PID = {\n                        id_server: client.getIdentityServerUrl(true)!,\n                        medium: \"email\",\n                        address,\n                    };\n                    roomOptions.invite_3pid.push(invite);\n                } else if (type === \"mx-user-id\") {\n                    roomOptions.invite.push(address);\n                }\n                return roomOptions;\n            },\n            { invite: [], invite_3pid: [] },\n        );\n    }\n\n    createRoomOptions.spinner = showSpinner;\n    return createRoom(client, createRoomOptions);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { DirectoryMember, type Member, ThreepidMember } from \"./direct-messages\";\n\n/**\n * Tries to resolve the ThreepidMembers to DirectoryMembers.\n *\n * @param members - List of members to resolve\n * @returns {Promise<Member[]>} Same list with ThreepidMembers replaced by DirectoryMembers if succesfully resolved\n */\nexport const resolveThreePids = async (members: Member[], client: MatrixClient): Promise<Member[]> => {\n    const threePidMembers = members.filter((m) => m instanceof ThreepidMember) as ThreepidMember[];\n\n    // Nothing to do here\n    if (threePidMembers.length === 0) return members;\n\n    const lookedUpProfiles = await lookupThreePidProfiles(threePidMembers, client);\n\n    return members.map((member: Member) => {\n        if (!(member instanceof ThreepidMember)) return member;\n\n        const lookedUpProfile = lookedUpProfiles.find((r) => r.threePidId === member.userId);\n\n        // No profile found for this member; use the ThreepidMember.\n        if (!lookedUpProfile) return member;\n\n        return new DirectoryMember({\n            user_id: lookedUpProfile.mxid,\n            avatar_url: lookedUpProfile?.profile?.avatar_url,\n            display_name: lookedUpProfile?.profile?.displayname,\n        });\n    });\n};\n\n/**\n * Tries to look up the ThreepidMembers.\n *\n * @param threePids - List of 3rd-party members to look up\n * @returns  List of resolved 3rd-party IDs with their MXIDs\n */\nexport const lookupThreePids = async (\n    threePids: ThreepidMember[],\n    client: MatrixClient,\n): Promise<{ threePidId: string; mxid: string }[]> => {\n    // No identity server configured. Unable to resolve any 3rd party member.\n    if (!client.identityServer) return [];\n\n    // Nothing we can search, return null\n    if (threePids.length === 0) return [];\n\n    const token = await client.identityServer.getAccessToken();\n\n    if (!token) return [];\n\n    const lookedUp = await client.bulkLookupThreePids(\n        threePids.map((t) => [t.isEmail ? \"email\" : \"msisdn\", t.userId]),\n        token,\n    );\n\n    return lookedUp.threepids.map(([_threePidType, threePidId, mxid]: [string, string, string]) => ({\n        threePidId,\n        mxid,\n    }));\n};\n\n/**\n * Tries to look up the MXIDs and profiles of the ThreepidMembers.\n *\n * @param threePids - List of 3rd-prty members to look up\n * @returns List of resolved 3rd-party members with their MXIDs and profile (if found)\n */\nexport const lookupThreePidProfiles = async (\n    threePids: ThreepidMember[],\n    client: MatrixClient,\n): Promise<{ threePidId: string; mxid: string; profile: null | { avatar_url?: string; displayname?: string } }[]> => {\n    const lookedUpThreePids = await lookupThreePids(threePids, client);\n    const promises = lookedUpThreePids.map(async (t) => {\n        let profile: null | { avatar_url?: string; display_name?: string } = null;\n\n        try {\n            profile = await client.getProfileInfo(t.mxid);\n        } catch {\n            // ignore any lookup error\n        }\n\n        return {\n            threePidId: t.threePidId,\n            mxid: t.mxid,\n            profile,\n        };\n    });\n    return Promise.all(promises);\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { ClientEvent, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { canEncryptToAllUsers } from \"../createRoom\";\nimport { Action } from \"../dispatcher/actions\";\nimport { type ViewRoomPayload } from \"../dispatcher/payloads/ViewRoomPayload\";\nimport dis from \"../dispatcher/dispatcher\";\nimport { type LocalRoom, LocalRoomState } from \"../models/LocalRoom\";\nimport { waitForRoomReadyAndApplyAfterCreateCallbacks } from \"./local-room\";\nimport { findDMRoom } from \"./dm/findDMRoom\";\nimport { privateShouldBeEncrypted } from \"./rooms\";\nimport { createDmLocalRoom } from \"./dm/createDmLocalRoom\";\nimport { startDm } from \"./dm/startDm\";\nimport { resolveThreePids } from \"./threepids\";\n\nexport async function startDmOnFirstMessage(client: MatrixClient, targets: Member[]): Promise<string | null> {\n    let resolvedTargets = targets;\n\n    try {\n        resolvedTargets = await resolveThreePids(targets, client);\n    } catch (e) {\n        logger.warn(\"Error resolving 3rd-party members\", e);\n    }\n\n    const existingRoom = findDMRoom(client, resolvedTargets);\n\n    if (existingRoom) {\n        dis.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            room_id: existingRoom.roomId,\n            should_peek: false,\n            joining: false,\n            metricsTrigger: \"MessageUser\",\n        });\n        return existingRoom.roomId;\n    }\n\n    if (targets.length === 1 && targets[0] instanceof ThreepidMember && privateShouldBeEncrypted(client)) {\n        // Single 3rd-party invite and well-known promotes encryption:\n        // Directly create a room and invite the other.\n        return await startDm(client, targets);\n    }\n\n    const room = await createDmLocalRoom(client, resolvedTargets);\n    dis.dispatch({\n        action: Action.ViewRoom,\n        room_id: room.roomId,\n        joining: false,\n        targets: resolvedTargets,\n    });\n    return room.roomId;\n}\n\n/**\n * Starts a DM based on a local room.\n *\n * @async\n * @param {MatrixClient} client\n * @param {LocalRoom} localRoom\n * @returns {Promise<string | void>} Resolves to the created room id\n */\nexport async function createRoomFromLocalRoom(client: MatrixClient, localRoom: LocalRoom): Promise<string | void> {\n    if (!localRoom.isNew) {\n        // This action only makes sense for new local rooms.\n        return;\n    }\n\n    localRoom.state = LocalRoomState.CREATING;\n    client.emit(ClientEvent.Room, localRoom);\n\n    return startDm(client, localRoom.targets, false).then(\n        (roomId) => {\n            if (!roomId) throw new Error(`startDm for local room ${localRoom.roomId} didn't return a room Id`);\n\n            localRoom.actualRoomId = roomId;\n            return waitForRoomReadyAndApplyAfterCreateCallbacks(client, localRoom, roomId);\n        },\n        () => {\n            logger.warn(`Error creating DM for local room ${localRoom.roomId}`);\n            localRoom.state = LocalRoomState.ERROR;\n            client.emit(ClientEvent.Room, localRoom);\n        },\n    );\n}\n\n// This is the interface that is expected by various components in the Invite Dialog and RoomInvite.\n// It is a bit awkward because it also matches the RoomMember class from the js-sdk with some extra support\n// for 3PIDs/email addresses.\nexport abstract class Member {\n    /**\n     * The display name of this Member. For users this should be their profile's display\n     * name or user ID if none set. For 3PIDs this should be the 3PID address (email).\n     */\n    public abstract get name(): string;\n\n    /**\n     * The ID of this Member. For users this should be their user ID. For 3PIDs this should\n     * be the 3PID address (email).\n     */\n    public abstract get userId(): string;\n\n    /**\n     * Gets the MXC URL of this Member's avatar. For users this should be their profile's\n     * avatar MXC URL or null if none set. For 3PIDs this should always be undefined.\n     */\n    public abstract getMxcAvatarUrl(): string | undefined;\n}\n\nexport class DirectoryMember extends Member {\n    private readonly _userId: string;\n    private readonly displayName?: string;\n    private readonly avatarUrl?: string;\n\n    // eslint-disable-next-line camelcase\n    public constructor(userDirResult: { user_id: string; display_name?: string; avatar_url?: string }) {\n        super();\n        this._userId = userDirResult.user_id;\n        this.displayName = userDirResult.display_name;\n        this.avatarUrl = userDirResult.avatar_url;\n    }\n\n    // These next class members are for the Member interface\n    public get name(): string {\n        return this.displayName || this._userId;\n    }\n\n    public get userId(): string {\n        return this._userId;\n    }\n\n    public getMxcAvatarUrl(): string | undefined {\n        return this.avatarUrl;\n    }\n}\n\nexport class ThreepidMember extends Member {\n    private readonly id: string;\n\n    public constructor(id: string) {\n        super();\n        this.id = id;\n    }\n\n    // This is a getter that would be falsy on all other implementations. Until we have\n    // better type support in the react-sdk we can use this trick to determine the kind\n    // of 3PID we're dealing with, if any.\n    public get isEmail(): boolean {\n        return this.id.includes(\"@\");\n    }\n\n    // These next class members are for the Member interface\n    public get name(): string {\n        return this.id;\n    }\n\n    public get userId(): string {\n        return this.id;\n    }\n\n    public getMxcAvatarUrl(): string | undefined {\n        return undefined;\n    }\n}\n\nexport interface IDMUserTileProps {\n    member: Member;\n    onRemove?(member: Member): void;\n}\n\n/**\n * Detects whether a room should be encrypted.\n *\n * @async\n * @param {MatrixClient} client\n * @param {Member[]} targets The members to which run the check against\n * @returns {Promise<boolean>}\n */\nexport async function determineCreateRoomEncryptionOption(client: MatrixClient, targets: Member[]): Promise<boolean> {\n    if (privateShouldBeEncrypted(client)) {\n        // Enable encryption for a single 3rd party invite.\n        if (targets.length === 1 && targets[0] instanceof ThreepidMember) return true;\n\n        // Check whether all users have uploaded device keys before.\n        // If so, enable encryption in the new room.\n        const has3PidMembers = targets.some((t) => t instanceof ThreepidMember);\n        if (!has3PidMembers) {\n            const targetIds = targets.map((t) => t.userId);\n            const allHaveDeviceKeys = await canEncryptToAllUsers(client, targetIds);\n            if (allHaveDeviceKeys) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient, type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { type Member } from \"../direct-messages\";\nimport DMRoomMap from \"../DMRoomMap\";\nimport { findDMForUser } from \"./findDMForUser\";\n\n/**\n * Tries to find a DM room with some other users.\n *\n * @param {MatrixClient} client\n * @param {Member[]} targets The Members to try to find the room for\n * @returns {Room | null} Resolved so the room if found, else null\n */\nexport function findDMRoom(client: MatrixClient, targets: Member[]): Room | null {\n    const targetIds = targets.map((t) => t.userId);\n    let existingRoom: Room | null;\n    if (targetIds.length === 1) {\n        existingRoom = findDMForUser(client, targetIds[0]) ?? null;\n    } else {\n        existingRoom = DMRoomMap.shared().getDMRoomForIdentifiers(targetIds);\n    }\n    return existingRoom;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { EventType, KNOWN_SAFE_ROOM_VERSION, type MatrixClient, MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport { LOCAL_ROOM_ID_PREFIX, LocalRoom } from \"../../../src/models/LocalRoom\";\nimport { determineCreateRoomEncryptionOption, type Member } from \"../../../src/utils/direct-messages\";\nimport { MEGOLM_ENCRYPTION_ALGORITHM } from \"../crypto\";\n\n/**\n * Create a DM local room. This room will not be send to the server and only exists inside the client.\n * It sets up the local room with some artificial state events\n * so that can be used in most components instead of a „real“ room.\n *\n * @async\n * @param {MatrixClient} client\n * @param {Member[]} targets DM partners\n * @returns {Promise<LocalRoom>} Resolves to the new local room\n */\nexport async function createDmLocalRoom(client: MatrixClient, targets: Member[]): Promise<LocalRoom> {\n    const userId = client.getUserId()!;\n\n    const localRoom = new LocalRoom(LOCAL_ROOM_ID_PREFIX + client.makeTxnId(), client, userId);\n    const events: MatrixEvent[] = [];\n\n    events.push(\n        new MatrixEvent({\n            event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,\n            type: EventType.RoomCreate,\n            content: {\n                creator: userId,\n                room_version: KNOWN_SAFE_ROOM_VERSION,\n            },\n            state_key: \"\",\n            sender: userId,\n            room_id: localRoom.roomId,\n            origin_server_ts: Date.now(),\n        }),\n    );\n\n    if (await determineCreateRoomEncryptionOption(client, targets)) {\n        localRoom.encrypted = true;\n        events.push(\n            new MatrixEvent({\n                event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,\n                type: EventType.RoomEncryption,\n                content: {\n                    algorithm: MEGOLM_ENCRYPTION_ALGORITHM,\n                },\n                sender: userId,\n                state_key: \"\",\n                room_id: localRoom.roomId,\n                origin_server_ts: Date.now(),\n            }),\n        );\n    }\n\n    events.push(\n        new MatrixEvent({\n            event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,\n            type: EventType.RoomMember,\n            content: {\n                displayname: userId,\n                membership: KnownMembership.Join,\n            },\n            state_key: userId,\n            sender: userId,\n            room_id: localRoom.roomId,\n        }),\n    );\n\n    targets.forEach((target: Member) => {\n        events.push(\n            new MatrixEvent({\n                event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,\n                type: EventType.RoomMember,\n                content: {\n                    displayname: target.name,\n                    avatar_url: target.getMxcAvatarUrl() ?? undefined,\n                    membership: KnownMembership.Invite,\n                    isDirect: true,\n                },\n                state_key: target.userId,\n                sender: userId,\n                room_id: localRoom.roomId,\n            }),\n        );\n        events.push(\n            new MatrixEvent({\n                event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,\n                type: EventType.RoomMember,\n                content: {\n                    displayname: target.name,\n                    avatar_url: target.getMxcAvatarUrl() ?? undefined,\n                    membership: KnownMembership.Join,\n                },\n                state_key: target.userId,\n                sender: target.userId,\n                room_id: localRoom.roomId,\n            }),\n        );\n    });\n\n    localRoom.targets = targets;\n    localRoom.updateMyMembership(KnownMembership.Join);\n    localRoom.addLiveEvents(events, { addToState: true });\n    localRoom.currentState.setStateEvents(events);\n    localRoom.name = localRoom.getDefaultRoomName(client.getUserId()!);\n    client.store.storeRoom(localRoom);\n\n    return localRoom;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient, type Room } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport DMRoomMap from \"../DMRoomMap\";\nimport { isLocalRoom } from \"../localRoom/isLocalRoom\";\nimport { isJoinedOrNearlyJoined } from \"../membership\";\nimport { getFunctionalMembers } from \"../room/getFunctionalMembers\";\n\n/**\n * Iterates the rooms and tries to find a DM room with the user identified by UserId.\n * A DM room is assumed if one of the following matches:\n * - Has two members and contains a membership for the user identified by userId\n * - findRoomWithThirdpartyInvites is true and has one member and a third pending third party invite\n *\n * If multiple rooms match it will return the one with the most recent event.\n *\n * @param rooms - Rooms to iterate\n * @param userId - User Id of the other user\n * @param [findRoomWithThirdpartyInvites] - Whether to find a DM for a pending thirdparty invite\n * @returns DM room if found or undefined if not\n */\nfunction extractSuitableRoom(rooms: Room[], userId: string, findRoomWithThirdpartyInvites: boolean): Room | undefined {\n    const suitableRooms = rooms\n        .filter((r) => {\n            // Validate that we are joined and the other person is also joined. We'll also make sure\n            // that the room also looks like a DM (until we have canonical DMs to tell us). For now,\n            // a DM is a room of two people that contains those two people exactly. This does mean\n            // that bots, assistants, etc will ruin a room's DM-ness, though this is a problem for\n            // canonical DMs to solve.\n            if (r && r.getMyMembership() === KnownMembership.Join) {\n                if (isLocalRoom(r)) return false;\n\n                const functionalUsers = getFunctionalMembers(r);\n                const members = r.currentState.getMembers();\n                const joinedMembers = members.filter(\n                    (m) => !functionalUsers.includes(m.userId) && m.membership && isJoinedOrNearlyJoined(m.membership),\n                );\n                const otherMember = joinedMembers.find((m) => m.userId === userId);\n\n                if (otherMember && joinedMembers.length === 2) {\n                    return true;\n                }\n\n                const thirdPartyInvites = r.currentState.getStateEvents(\"m.room.third_party_invite\") || [];\n\n                // match room with pending third-party invite\n                return findRoomWithThirdpartyInvites && joinedMembers.length === 1 && thirdPartyInvites.length === 1;\n            }\n            return false;\n        })\n        .sort((r1, r2) => {\n            return r2.getLastActiveTimestamp() - r1.getLastActiveTimestamp();\n        });\n\n    if (suitableRooms.length) {\n        return suitableRooms[0];\n    }\n\n    return undefined;\n}\n\n/**\n * Tries to find a DM room with a specific user.\n *\n * @param {MatrixClient} client\n * @param {string} userId ID of the user to find the DM for\n * @returns {Room | undefined} Room if found\n */\nexport function findDMForUser(client: MatrixClient, userId: string): Room | undefined {\n    const roomIdsForUserId = DMRoomMap.shared().getDMRoomsForUserId(userId);\n    const roomsForUserId = roomIdsForUserId.map((id) => client.getRoom(id)).filter((r): r is Room => r !== null);\n    // Call with findRoomWithThirdpartyInvites = true to also include rooms with pending thirdparty invites.\n    // roomsForUserId can only contain rooms with the other user here,\n    // because they have been queried by getDMRoomsForUserId().\n    const suitableRoomForUserId = extractSuitableRoom(roomsForUserId, userId, true);\n\n    if (suitableRoomForUserId) {\n        return suitableRoomForUserId;\n    }\n\n    // Try to find in all rooms as a fallback\n    const allRoomIds = DMRoomMap.shared().getRoomIds();\n    const allRooms = Array.from(allRoomIds)\n        .map((id) => client.getRoom(id))\n        .filter((r): r is Room => r !== null);\n    return extractSuitableRoom(allRooms, userId, false);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Request, type Response } from \"./workers/blurhash.worker.ts\";\nimport { WorkerManager } from \"./WorkerManager\";\nimport blurhashWorkerFactory from \"./workers/blurhashWorkerFactory\";\n\nexport class BlurhashEncoder {\n    private static internalInstance = new BlurhashEncoder();\n\n    public static get instance(): BlurhashEncoder {\n        return BlurhashEncoder.internalInstance;\n    }\n\n    private readonly worker = new WorkerManager<Request, Response>(blurhashWorkerFactory());\n\n    public getBlurhash(imageData: ImageData): Promise<string> {\n        return this.worker.call({ imageData }).then((resp) => resp.blurhash);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport default function factory(options?: WorkerOptions | undefined): Worker {\n    return new Worker(\n        /* webpackChunkName: \"blurhash.worker\" */ new URL(\"./blurhash.worker.ts\", import.meta.url),\n        options,\n    );\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type ImageInfo } from \"matrix-js-sdk/src/types\";\n\nimport { BlurhashEncoder } from \"../BlurhashEncoder\";\n\ntype ThumbnailableElement = HTMLImageElement | HTMLVideoElement;\n\nexport const BLURHASH_FIELD = \"xyz.amorgan.blurhash\"; // MSC2448\n\ninterface IThumbnail {\n    info: ImageInfo;\n    thumbnail: Blob;\n}\n\nconst MAX_WIDTH = 800;\nconst MAX_HEIGHT = 600;\n\n/**\n * Create a thumbnail for a image DOM element.\n * The image will be smaller than MAX_WIDTH and MAX_HEIGHT.\n * The thumbnail will have the same aspect ratio as the original.\n * Draws the element into a canvas using CanvasRenderingContext2D.drawImage\n * Then calls Canvas.toBlob to get a blob object for the image data.\n *\n * Since it needs to calculate the dimensions of the source image and the\n * thumbnailed image it returns an info object filled out with information\n * about the original image and the thumbnail.\n *\n * @param {HTMLElement} element The element to thumbnail.\n * @param {number} inputWidth The width of the image in the input element.\n * @param {number} inputHeight the width of the image in the input element.\n * @param {string} mimeType The mimeType to save the blob as.\n * @param {boolean} calculateBlurhash Whether to calculate a blurhash of the given image too.\n * @returns {Promise} A promise that resolves with an object with an info key\n *  and a thumbnail key.\n */\nexport async function createThumbnail(\n    element: ThumbnailableElement,\n    inputWidth: number,\n    inputHeight: number,\n    mimeType: string,\n    calculateBlurhash = true,\n): Promise<IThumbnail> {\n    let targetWidth = inputWidth;\n    let targetHeight = inputHeight;\n    if (targetHeight > MAX_HEIGHT) {\n        targetWidth = Math.floor(targetWidth * (MAX_HEIGHT / targetHeight));\n        targetHeight = MAX_HEIGHT;\n    }\n    if (targetWidth > MAX_WIDTH) {\n        targetHeight = Math.floor(targetHeight * (MAX_WIDTH / targetWidth));\n        targetWidth = MAX_WIDTH;\n    }\n\n    let canvas: HTMLCanvasElement | OffscreenCanvas;\n    let context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n    try {\n        canvas = new window.OffscreenCanvas(targetWidth, targetHeight);\n        context = canvas.getContext(\"2d\") as OffscreenCanvasRenderingContext2D;\n    } catch {\n        // Fallback support for other browsers (Safari and Firefox for now)\n        canvas = document.createElement(\"canvas\");\n        canvas.width = targetWidth;\n        canvas.height = targetHeight;\n        context = canvas.getContext(\"2d\")!;\n    }\n\n    context.drawImage(element, 0, 0, targetWidth, targetHeight);\n\n    let thumbnailPromise: Promise<Blob>;\n    if (window.OffscreenCanvas && canvas instanceof OffscreenCanvas) {\n        thumbnailPromise = canvas.convertToBlob({ type: mimeType });\n    } else {\n        thumbnailPromise = new Promise<Blob>((resolve) =>\n            (canvas as HTMLCanvasElement).toBlob(resolve as BlobCallback, mimeType),\n        );\n    }\n\n    const imageData = context.getImageData(0, 0, targetWidth, targetHeight);\n    // thumbnailPromise and blurhash promise are being awaited concurrently\n    const blurhash = calculateBlurhash ? await BlurhashEncoder.instance.getBlurhash(imageData) : undefined;\n    const thumbnail = await thumbnailPromise;\n\n    return {\n        info: {\n            thumbnail_info: {\n                w: targetWidth,\n                h: targetHeight,\n                mimetype: thumbnail.type,\n                size: thumbnail.size,\n            },\n            w: inputWidth,\n            h: inputHeight,\n            [BLURHASH_FIELD]: blurhash,\n        },\n        thumbnail,\n    };\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useMemo, useState } from \"react\";\nimport { type Room, JoinRule } from \"matrix-js-sdk/src/matrix\";\nimport { InfoSolidIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport BaseDialog from \"../dialogs/BaseDialog\";\nimport SpaceChildrenPicker from \"../spaces/SpaceChildrenPicker\";\nimport { filterBoolean } from \"../../../utils/arrays\";\nimport { isOnlyAdmin } from \"../../../utils/membership\";\nimport { SDKContextClass } from \"../../../contexts/SDKContextClass.ts\";\n\ninterface IProps {\n    space: Room;\n    onFinished(this: void, leave: boolean, rooms?: Room[]): void;\n}\n\nconst LeaveSpaceDialog: React.FC<IProps> = ({ space, onFinished }) => {\n    const spaceChildren = useMemo(() => {\n        const roomSet = new Set(SDKContextClass.instance.spaceStore.getSpaceFilteredRoomIds(space.roomId));\n        SDKContextClass.instance.spaceStore.traverseSpace(\n            space.roomId,\n            (spaceId) => {\n                if (space.roomId === spaceId) return; // skip the root node\n                roomSet.add(spaceId);\n            },\n            false,\n        );\n        return filterBoolean(Array.from(roomSet).map((roomId) => space.client.getRoom(roomId)));\n    }, [space]);\n    const [roomsToLeave, setRoomsToLeave] = useState<Room[]>([]);\n    const selectedRooms = useMemo(() => new Set(roomsToLeave), [roomsToLeave]);\n\n    let rejoinWarning;\n    if (space.getJoinRule() !== JoinRule.Public) {\n        rejoinWarning = _t(\"space|leave_dialog_public_rejoin_warning\");\n    }\n\n    let onlyAdminWarning;\n    if (isOnlyAdmin(space)) {\n        onlyAdminWarning = _t(\"space|leave_dialog_only_admin_warning\");\n    } else {\n        const numChildrenOnlyAdminIn = roomsToLeave.filter(isOnlyAdmin).length;\n        if (numChildrenOnlyAdminIn > 0) {\n            onlyAdminWarning = _t(\"space|leave_dialog_only_admin_room_warning\");\n        }\n    }\n\n    return (\n        <BaseDialog\n            title={_t(\"space|leave_dialog_title\", { spaceName: space.name })}\n            className=\"mx_LeaveSpaceDialog\"\n            contentId=\"mx_LeaveSpaceDialog\"\n            onFinished={() => onFinished(false)}\n            fixedWidth={false}\n        >\n            <div className=\"mx_Dialog_content\" id=\"mx_LeaveSpaceDialog\">\n                <p>\n                    {_t(\n                        \"space|leave_dialog_description\",\n                        {},\n                        {\n                            spaceName: () => <strong>{space.name}</strong>,\n                        },\n                    )}\n                    &nbsp;\n                    {rejoinWarning}\n                    {rejoinWarning && <>&nbsp;</>}\n                    {spaceChildren.length > 0 && _t(\"space|leave_dialog_option_intro\")}\n                </p>\n\n                {spaceChildren.length > 0 && (\n                    <SpaceChildrenPicker\n                        space={space}\n                        spaceChildren={spaceChildren}\n                        selected={selectedRooms}\n                        onChange={setRoomsToLeave}\n                        noneLabel={_t(\"space|leave_dialog_option_none\")}\n                        allLabel={_t(\"space|leave_dialog_option_all\")}\n                        specificLabel={_t(\"space|leave_dialog_option_specific\")}\n                    />\n                )}\n\n                {onlyAdminWarning && (\n                    <div className=\"mx_LeaveSpaceDialog_section_warning\">\n                        <InfoSolidIcon />\n                        {onlyAdminWarning}\n                    </div>\n                )}\n            </div>\n            <DialogButtons\n                primaryButton={_t(\"space|leave_dialog_action\")}\n                primaryButtonClass=\"danger\"\n                onPrimaryButtonClick={() => onFinished(true, roomsToLeave)}\n                hasCancel={true}\n                onCancel={() => onFinished(false)}\n            />\n        </BaseDialog>\n    );\n};\n\nexport default LeaveSpaceDialog;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { sleep } from \"matrix-js-sdk/src/utils\";\nimport React, { type ReactNode } from \"react\";\nimport { EventStatus, MatrixEventEvent, type Room, type MatrixClient, MatrixError } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport Modal, { type IHandle } from \"../Modal\";\nimport Spinner from \"../components/views/elements/Spinner\";\nimport { _t } from \"../languageHandler\";\nimport ErrorDialog from \"../components/views/dialogs/ErrorDialog\";\nimport { isMetaSpace } from \"../stores/spaces\";\nimport dis from \"../dispatcher/dispatcher\";\nimport { type ViewRoomPayload } from \"../dispatcher/payloads/ViewRoomPayload\";\nimport { Action } from \"../dispatcher/actions\";\nimport { type ViewHomePagePayload } from \"../dispatcher/payloads/ViewHomePagePayload\";\nimport LeaveSpaceDialog from \"../components/views/dialogs/LeaveSpaceDialog\";\nimport { type AfterLeaveRoomPayload } from \"../dispatcher/payloads/AfterLeaveRoomPayload\";\nimport { bulkSpaceBehaviour } from \"./space\";\nimport { SDKContextClass } from \"../contexts/SDKContextClass\";\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { CallStore } from \"../stores/CallStore\";\n\nexport async function leaveRoomBehaviour(\n    matrixClient: MatrixClient,\n    roomId: string,\n    retry = true,\n    spinner = true,\n): Promise<void> {\n    let spinnerModal: IHandle<any> | undefined;\n    if (spinner) {\n        spinnerModal = Modal.createDialog(Spinner, undefined, \"mx_Dialog_spinner\");\n    }\n\n    let leavingAllVersions = true;\n    const history = matrixClient.getRoomUpgradeHistory(\n        roomId,\n        true,\n        SettingsStore.getValue(\"feature_dynamic_room_predecessors\"),\n    );\n    if (history && history.length > 0) {\n        const currentRoom = history[history.length - 1];\n        if (currentRoom.roomId !== roomId) {\n            // The user is trying to leave an older version of the room. Let them through\n            // without making them leave the current version of the room.\n            leavingAllVersions = false;\n        }\n    }\n\n    const room = matrixClient.getRoom(roomId);\n\n    // should not encounter this\n    if (!room) {\n        throw new Error(`Expected to find room for id ${roomId}`);\n    }\n\n    // attempt to hang up legacy based calls\n    try {\n        SDKContextClass.instance.legacyCallHandler.hangupOrReject(roomId);\n    } catch (e) {\n        logger.warn(\"Failed to hangup call before leaving room: \", e);\n    }\n\n    // hang up widget based calls\n    const activeCall = CallStore.instance.getActiveCall(roomId);\n    if (activeCall) {\n        try {\n            await activeCall.disconnect();\n        } catch (e) {\n            logger.warn(\"Failed to disconnect call before leaving room: \", e);\n        }\n    }\n\n    // await any queued messages being sent so that they do not fail\n    await Promise.all(\n        room\n            .getPendingEvents()\n            .filter((ev) => {\n                return [EventStatus.QUEUED, EventStatus.ENCRYPTING, EventStatus.SENDING].includes(ev.status!);\n            })\n            .map(\n                (ev) =>\n                    new Promise<void>((resolve, reject) => {\n                        const handler = (): void => {\n                            if (ev.status === EventStatus.NOT_SENT) {\n                                spinnerModal?.close();\n                                reject(ev.error);\n                            }\n\n                            if (!ev.status || ev.status === EventStatus.SENT) {\n                                ev.off(MatrixEventEvent.Status, handler);\n                                resolve();\n                            }\n                        };\n\n                        ev.on(MatrixEventEvent.Status, handler);\n                    }),\n            ),\n    );\n\n    let results: { [roomId: string]: Error | MatrixError | null } = {};\n    if (!leavingAllVersions) {\n        try {\n            await matrixClient.leave(roomId);\n        } catch (e) {\n            if (e instanceof MatrixError) {\n                const message = e.data.error || _t(\"room|leave_unexpected_error\");\n                results[roomId] = Object.assign(new Error(message), { errcode: e.data.errcode, data: e.data });\n            } else if (e instanceof Error) {\n                results[roomId] = e;\n            } else {\n                results[roomId] = new Error(\"Failed to leave room for unknown causes\");\n            }\n        }\n    } else {\n        results = await matrixClient.leaveRoomChain(roomId, retry);\n    }\n\n    if (retry) {\n        const limitExceededError = Object.values(results).find(\n            (e) => (e as MatrixError)?.errcode === \"M_LIMIT_EXCEEDED\",\n        ) as MatrixError;\n        if (limitExceededError) {\n            await sleep(limitExceededError.data.retry_after_ms ?? 100);\n            return leaveRoomBehaviour(matrixClient, roomId, false, false);\n        }\n    }\n\n    spinnerModal?.close();\n\n    const errors = Object.entries(results).filter((r) => !!r[1]);\n    if (errors.length > 0) {\n        const messages: ReactNode[] = [];\n        for (const roomErr of errors) {\n            const err = roomErr[1] as MatrixError; // [0] is the roomId\n            let message = _t(\"room|leave_unexpected_error\");\n            if (err?.errcode && err.message) {\n                if (err.errcode === \"M_CANNOT_LEAVE_SERVER_NOTICE_ROOM\") {\n                    Modal.createDialog(ErrorDialog, {\n                        title: _t(\"room|leave_server_notices_title\"),\n                        description: _t(\"room|leave_server_notices_description\"),\n                    });\n                    return;\n                }\n                message = results[roomId]!.message;\n            }\n            messages.push(message, React.createElement(\"BR\")); // createElement to avoid using a tsx file in utils\n        }\n        Modal.createDialog(ErrorDialog, {\n            title: _t(\"room|leave_error_title\"),\n            description: messages,\n        });\n        return;\n    }\n\n    if (SDKContextClass.instance.roomViewStore.getRoomId() === roomId) {\n        // We were viewing the room that was just left. In order to avoid\n        // accidentally viewing the next room in the list and clearing its\n        // notifications, switch to a neutral ground such as the home page or\n        // space landing page.\n        if (isMetaSpace(SDKContextClass.instance.spaceStore.activeSpace)) {\n            dis.dispatch<ViewHomePagePayload>({ action: Action.ViewHomePage });\n        } else if (SDKContextClass.instance.spaceStore.activeSpace === roomId) {\n            // View the parent space, if there is one\n            const parent = SDKContextClass.instance.spaceStore.getCanonicalParent(roomId);\n            if (parent !== null) {\n                dis.dispatch<ViewRoomPayload>({\n                    action: Action.ViewRoom,\n                    room_id: parent.roomId,\n                    metricsTrigger: undefined, // other\n                });\n            } else {\n                dis.dispatch<ViewHomePagePayload>({ action: Action.ViewHomePage });\n            }\n        } else {\n            dis.dispatch<ViewRoomPayload>({\n                action: Action.ViewRoom,\n                room_id: SDKContextClass.instance.spaceStore.activeSpace,\n                metricsTrigger: undefined, // other\n            });\n        }\n    }\n}\n\nexport const leaveSpace = (space: Room): void => {\n    const { finished } = Modal.createDialog(\n        LeaveSpaceDialog,\n        {\n            space,\n        },\n        \"mx_LeaveSpaceDialog_wrapper\",\n    );\n    finished.then(async ([leave, rooms]) => {\n        if (!leave) return;\n        await bulkSpaceBehaviour(space, rooms!, (room) => leaveRoomBehaviour(space.client, room.roomId));\n\n        dis.dispatch<AfterLeaveRoomPayload>({\n            action: Action.AfterLeaveRoom,\n            room_id: space.roomId,\n        });\n    });\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { EventType, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { type LocalRoom } from \"../../models/LocalRoom\";\n\n/**\n * Tests whether a room created based on a local room is ready.\n */\nexport function isRoomReady(client: MatrixClient, localRoom: LocalRoom): boolean {\n    // not ready if no actual room id exists\n    if (!localRoom.actualRoomId) return false;\n\n    const room = client.getRoom(localRoom.actualRoomId);\n    // not ready if the room does not exist\n    if (!room) return false;\n\n    // not ready if not all members joined/invited\n    if (room.getInvitedAndJoinedMemberCount() !== 1 + localRoom.targets?.length) return false;\n\n    const roomHistoryVisibilityEvents = room.currentState.getStateEvents(EventType.RoomHistoryVisibility);\n    // not ready if the room history has not been configured\n    if (roomHistoryVisibilityEvents.length === 0) return false;\n\n    const roomEncryptionEvents = room.currentState.getStateEvents(EventType.RoomEncryption);\n    // not ready if encryption has not been configured (applies only to encrypted rooms)\n    if (localRoom.encrypted === true && roomEncryptionEvents.length === 0) return false;\n\n    return true;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { ClientEvent, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport { type LocalRoom, LocalRoomState } from \"../models/LocalRoom\";\nimport { isLocalRoom } from \"./localRoom/isLocalRoom\";\nimport { isRoomReady } from \"./localRoom/isRoomReady\";\n\nconst isActualRoomIdDefined = (actualRoomId: string | undefined): actualRoomId is string => {\n    if (actualRoomId === undefined) {\n        // should not happen\n        throw new Error(\"Local room in CREATED state without actual room Id occurred\");\n    }\n\n    return true;\n};\n\n/**\n * Does a room action:\n * For non-local rooms it calls fn directly.\n * For local rooms it adds the callback function to the room's afterCreateCallbacks and\n * dispatches a \"local_room_event\".\n *\n * @async\n * @template T\n * @param {string} roomId Room ID of the target room\n * @param {(actualRoomId: string) => Promise<T>} fn Callback to be called directly or collected at the local room\n * @param {MatrixClient} [client]\n * @returns {Promise<T>} Promise that gets resolved after the callback has finished\n */\nexport async function doMaybeLocalRoomAction<T>(\n    roomId: string,\n    fn: (actualRoomId: string) => Promise<T>,\n    client: MatrixClient,\n): Promise<T> {\n    if (isLocalRoom(roomId)) {\n        const room = client.getRoom(roomId) as LocalRoom;\n\n        if (room.isCreated && isActualRoomIdDefined(room.actualRoomId)) {\n            return fn(room.actualRoomId);\n        }\n\n        return new Promise<T>((resolve, reject) => {\n            room.afterCreateCallbacks.push((newRoomId: string) => {\n                fn(newRoomId).then(resolve).catch(reject);\n            });\n            defaultDispatcher.dispatch({\n                action: \"local_room_event\",\n                roomId: room.roomId,\n            });\n        });\n    }\n\n    return fn(roomId);\n}\n\n/**\n * Waits until a room is ready and then applies the after-create local room callbacks.\n * Also implements a stopgap timeout after that a room is assumed to be ready.\n *\n * @see isRoomReady\n * @async\n * @param {MatrixClient} client\n * @param {LocalRoom} localRoom\n * @param actualRoomId Id of the actual room\n * @returns {Promise<string>} Resolved to the actual room id\n */\nexport async function waitForRoomReadyAndApplyAfterCreateCallbacks(\n    client: MatrixClient,\n    localRoom: LocalRoom,\n    actualRoomId: string,\n): Promise<string> {\n    if (isRoomReady(client, localRoom)) {\n        return applyAfterCreateCallbacks(localRoom, actualRoomId).then(() => {\n            localRoom.state = LocalRoomState.CREATED;\n            client.emit(ClientEvent.Room, localRoom);\n            return Promise.resolve(actualRoomId);\n        });\n    }\n\n    return new Promise((resolve, reject) => {\n        const finish = (): void => {\n            if (checkRoomStateIntervalHandle) clearInterval(checkRoomStateIntervalHandle);\n            if (stopgapTimeoutHandle) clearTimeout(stopgapTimeoutHandle);\n\n            applyAfterCreateCallbacks(localRoom, actualRoomId)\n                .then(() => {\n                    localRoom.state = LocalRoomState.CREATED;\n                    client.emit(ClientEvent.Room, localRoom);\n                    resolve(actualRoomId);\n                })\n                .catch((err) => {\n                    reject(err);\n                });\n        };\n\n        const stopgapFinish = (): void => {\n            logger.warn(`Assuming local room ${localRoom.roomId} is ready after hitting timeout`);\n            finish();\n        };\n\n        const checkRoomStateIntervalHandle = window.setInterval(() => {\n            if (isRoomReady(client, localRoom)) finish();\n        }, 500);\n        const stopgapTimeoutHandle = window.setTimeout(stopgapFinish, 5000);\n    });\n}\n\n/**\n * Applies the after-create callback of a local room.\n *\n * @async\n * @param {LocalRoom} localRoom\n * @param {string} roomId\n * @returns {Promise<void>} Resolved after all callbacks have been called\n */\nasync function applyAfterCreateCallbacks(localRoom: LocalRoom, roomId: string): Promise<void> {\n    for (const afterCreateCallback of localRoom.afterCreateCallbacks) {\n        afterCreateCallback(roomId);\n    }\n\n    localRoom.afterCreateCallbacks = [];\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { _t } from \"../../languageHandler\";\n\nexport enum LocationShareError {\n    MapStyleUrlNotConfigured = \"MapStyleUrlNotConfigured\",\n    MapStyleUrlNotReachable = \"MapStyleUrlNotReachable\",\n    WebGLNotEnabled = \"WebGLNotEnabled\",\n    Default = \"Default\",\n}\n\nexport const getLocationShareErrorMessage = (errorType?: LocationShareError): string => {\n    switch (errorType) {\n        case LocationShareError.MapStyleUrlNotConfigured:\n            return _t(\"location_sharing|MapStyleUrlNotConfigured\");\n        case LocationShareError.WebGLNotEnabled:\n            return _t(\"location_sharing|WebGLNotEnabled\");\n        case LocationShareError.MapStyleUrlNotReachable:\n        default:\n            return _t(\"location_sharing|MapStyleUrlNotReachable\");\n    }\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport SdkConfig from \"../../SdkConfig\";\nimport { getTileServerWellKnown } from \"../WellKnownUtils\";\nimport { LocationShareError } from \"./LocationShareErrors\";\n\n/**\n * Look up what map tile server style URL was provided in the homeserver's\n * .well-known location, or, failing that, in our local config, or, failing\n * that, defaults to the same tile server listed by matrix.org.\n */\nexport function findMapStyleUrl(matrixClient: MatrixClient): string {\n    const mapStyleUrl = getTileServerWellKnown(matrixClient)?.map_style_url ?? SdkConfig.get().map_style_url;\n\n    if (!mapStyleUrl) {\n        logger.error(\"'map_style_url' missing from homeserver .well-known area, and missing from from config.json.\");\n        throw new Error(LocationShareError.MapStyleUrlNotConfigured);\n    }\n\n    return mapStyleUrl;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type ILocationContent, LocationAssetType, M_ASSET } from \"matrix-js-sdk/src/matrix\";\n\nexport const isSelfLocation = (locationContent: ILocationContent): boolean => {\n    const asset = M_ASSET.findIn(locationContent) as { type: string };\n    const assetType = asset?.type ?? LocationAssetType.Self;\n    return assetType == LocationAssetType.Self;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, M_LOCATION, type MLocationEvent } from \"matrix-js-sdk/src/matrix\";\n\ntype LocationEvent = { geo_uri: string } & MLocationEvent;\n\n/**\n * Find the geo-URI contained within a location event.\n */\nexport const locationEventGeoUri = (mxEvent: MatrixEvent): string => {\n    // unfortunately we're stuck supporting legacy `content.geo_uri`\n    // events until the end of days, or until we figure out mutable\n    // events - so folks can read their old chat history correctly.\n    // https://github.com/matrix-org/matrix-doc/issues/3516\n    const content = mxEvent.getContent<LocationEvent>();\n    const loc = M_LOCATION.findIn(content);\n    return loc?.uri ?? content[\"geo_uri\"];\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nexport const parseGeoUri = (uri: string): GeolocationCoordinates | undefined => {\n    function parse(s: string): number | null {\n        const ret = parseFloat(s);\n        if (Number.isNaN(ret)) {\n            return null;\n        } else {\n            return ret;\n        }\n    }\n\n    const m = uri.match(/^\\s*geo:(.*?)\\s*$/);\n    if (!m) return;\n    const parts = m[1].split(\";\");\n    const coords = parts[0].split(\",\");\n    let uncertainty: number | null | undefined = undefined;\n    for (const param of parts.slice(1)) {\n        const m = param.match(/u=(.*)/);\n        if (m) uncertainty = parse(m[1]);\n    }\n    const latitude = parse(coords[0]);\n    const longitude = parse(coords[1]);\n\n    if (latitude === null || longitude === null) {\n        return;\n    }\n\n    const geoCoords = {\n        latitude: latitude!,\n        longitude: longitude!,\n        altitude: parse(coords[2]),\n        accuracy: uncertainty!,\n        altitudeAccuracy: null,\n        heading: null,\n        speed: null,\n    };\n\n    return {\n        toJSON: () => geoCoords,\n        ...geoCoords,\n    };\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, M_LOCATION } from \"matrix-js-sdk/src/matrix\";\n\nimport { parseGeoUri } from \"./parseGeoUri\";\n\nexport const makeMapSiteLink = (coords: GeolocationCoordinates): string => {\n    return (\n        \"https://www.openstreetmap.org/\" +\n        `?mlat=${coords.latitude}` +\n        `&mlon=${coords.longitude}` +\n        `#map=16/${coords.latitude}/${coords.longitude}`\n    );\n};\n\nexport const createMapSiteLinkFromEvent = (event: MatrixEvent): string | null => {\n    const content = event.getContent();\n    const mLocation = content[M_LOCATION.name];\n    if (mLocation !== undefined) {\n        const uri = mLocation[\"uri\"];\n        if (uri !== undefined) {\n            const geoCoords = parseGeoUri(uri);\n            return geoCoords ? makeMapSiteLink(geoCoords) : null;\n        }\n    } else {\n        const geoUri = content[\"geo_uri\"];\n        if (geoUri) {\n            const geoCoords = parseGeoUri(geoUri);\n            return geoCoords ? makeMapSiteLink(geoCoords) : null;\n        }\n    }\n    return null;\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { _t } from \"../../languageHandler\";\nimport SdkConfig from \"../../SdkConfig\";\n\n/**\n * Get a localised error message for GeolocationPositionError error codes\n * @param code - error code from GeolocationPositionError\n * @returns\n */\nexport const positionFailureMessage = (code: number): string | undefined => {\n    const brand = SdkConfig.get().brand;\n    switch (code) {\n        case 1:\n            return _t(\"location_sharing|failed_permission\", { brand });\n        case 2:\n            return _t(\"location_sharing|failed_generic\");\n        case 3:\n            return _t(\"location_sharing|failed_timeout\");\n        case 4:\n            return _t(\"location_sharing|failed_unknown\");\n    }\n};\n","/*\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { JoinRule, type MatrixClient, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\n\nimport { type MediaPreviewConfig, MediaPreviewValue } from \"../../@types/media_preview\";\nimport { SettingLevel } from \"../../settings/SettingLevel\";\nimport SettingsStore from \"../../settings/SettingsStore\";\n\n/**\n * Determine whether a room should be treated as private when applying media preview defaults.\n *\n * @param client - Matrix client used to resolve the room and its current join rule.\n * @param roomId - Room to inspect. If omitted or unknown, the room is treated as non-private.\n * @returns `true` when the room's join rule restricts membership, otherwise `false`.\n */\nfunction isRoomPrivate(client: MatrixClient, roomId?: string): boolean {\n    const room = roomId ? client.getRoom(roomId) : undefined;\n    const joinRule = room?.currentState.getJoinRule();\n\n    switch (joinRule) {\n        case JoinRule.Invite:\n        case JoinRule.Knock:\n        case JoinRule.Restricted:\n            return true;\n        default:\n            return false;\n    }\n}\n\n/**\n * Resolve whether media for a single event should be shown.\n *\n * Precedence is:\n * 1. An explicit per-event override stored in `showMediaEventIds`\n * 2. Always show media in events sent by the current user\n * 3. Fall back to the room-level `mediaPreviewConfig` policy\n *\n * @param mediaPreviewSetting - Effective room-level media preview configuration.\n * @param eventVisibility - Per-event visibility overrides keyed by event ID.\n * @param userId - Current user ID, used to always show media sent by the local user.\n * @param eventId - Event being evaluated. Used to look up any explicit override.\n * @param sender - Sender of the event being evaluated.\n * @param roomIsPrivate - Whether the event's room should use the private-room preview behavior.\n * @returns `true` when media should be displayed for the event, otherwise `false`.\n */\nexport function computeMediaVisibility(\n    mediaPreviewSetting: MediaPreviewConfig,\n    eventVisibility: Record<string, boolean>,\n    userId: string | undefined,\n    eventId: string | undefined,\n    sender: string | undefined,\n    roomIsPrivate: boolean,\n): boolean {\n    const explicitEventVisibility = eventId ? eventVisibility[eventId] : undefined;\n\n    if (explicitEventVisibility !== undefined) {\n        return explicitEventVisibility;\n    }\n\n    if (sender === userId) {\n        return true;\n    }\n\n    switch (mediaPreviewSetting.media_previews) {\n        case MediaPreviewValue.Off:\n            return false;\n        case MediaPreviewValue.On:\n            return true;\n        case MediaPreviewValue.Private:\n            return roomIsPrivate;\n        default:\n            console.warn(\"Invalid media visibility setting\", mediaPreviewSetting.media_previews);\n            return false;\n    }\n}\n\n/**\n * Compute the effective media visibility for a Matrix event using the current settings state.\n *\n * @param mxEvent - Event whose media visibility should be evaluated.\n * @param client - Matrix client used to resolve the current user and room metadata.\n * @returns `true` when media should be shown for the event, otherwise `false`.\n */\nexport function getMediaVisibility(mxEvent: MatrixEvent, client: MatrixClient): boolean {\n    const eventId = mxEvent.getId();\n    const roomId = mxEvent.getRoomId();\n    const mediaPreviewSetting = SettingsStore.getValue(\"mediaPreviewConfig\", roomId);\n    const eventVisibility = SettingsStore.getValue(\"showMediaEventIds\");\n\n    return computeMediaVisibility(\n        mediaPreviewSetting,\n        eventVisibility,\n        client.getUserId() ?? undefined,\n        eventId,\n        mxEvent.getSender(),\n        isRoomPrivate(client, roomId),\n    );\n}\n\n/**\n * Persist a per-event override for whether media should be displayed on this device.\n *\n * @param mxEvent - Event whose media visibility override should be updated.\n * @param visible - Whether media for the event should be shown.\n * @returns A promise that resolves once the device-scoped setting has been updated.\n */\nexport async function setMediaVisibility(mxEvent: MatrixEvent, visible: boolean): Promise<void> {\n    const eventId = mxEvent.getId();\n    if (!eventId) return;\n\n    const eventVisibility = SettingsStore.getValue(\"showMediaEventIds\");\n\n    await SettingsStore.setValue(\"showMediaEventIds\", null, SettingLevel.DEVICE, {\n        ...eventVisibility,\n        [eventId]: visible,\n    });\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020-2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n    type Room,\n    type RoomMember,\n    type RoomState,\n    RoomStateEvent,\n    type MatrixEvent,\n    type MatrixClient,\n} from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership, type Membership } from \"matrix-js-sdk/src/types\";\n\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport SettingsStore from \"../settings/SettingsStore\";\n\n/**\n * Approximation of a membership status for a given room.\n */\nexport enum EffectiveMembership {\n    /**\n     * The user is effectively joined to the room. For example, actually joined\n     * or knocking on the room (when that becomes possible).\n     */\n    Join = \"JOIN\",\n\n    /**\n     * The user is effectively invited to the room. Currently this is a direct map\n     * to the invite membership as no other membership states are effectively\n     * invites.\n     */\n    Invite = \"INVITE\",\n\n    /**\n     * The user is effectively no longer in the room. For example, kicked,\n     * banned, or voluntarily left.\n     */\n    Leave = \"LEAVE\",\n}\n\nexport function getEffectiveMembership(membership: Membership): EffectiveMembership {\n    if (membership === KnownMembership.Invite) {\n        return EffectiveMembership.Invite;\n    } else if (\n        membership === KnownMembership.Join ||\n        (SettingsStore.getValue(\"feature_ask_to_join\") && membership === KnownMembership.Knock)\n    ) {\n        return EffectiveMembership.Join;\n    } else {\n        // Probably a leave, kick, or ban\n        return EffectiveMembership.Leave;\n    }\n}\n\nexport function isKnockDenied(room: Room): boolean | undefined {\n    const memberId = MatrixClientPeg.get()?.getSafeUserId();\n    const member = memberId ? room.getMember(memberId) : null;\n    const previousMembership = member?.events.member?.getPrevContent().membership;\n\n    return member?.isKicked() && previousMembership === KnownMembership.Knock;\n}\n\nexport function getEffectiveMembershipTag(room: Room, membership?: string): EffectiveMembership {\n    return isKnockDenied(room)\n        ? EffectiveMembership.Join\n        : getEffectiveMembership(membership ?? room.getMyMembership());\n}\n\nexport function isJoinedOrNearlyJoined(membership: Membership): boolean {\n    const effective = getEffectiveMembership(membership);\n    return effective === EffectiveMembership.Join || effective === EffectiveMembership.Invite;\n}\n\n/**\n * Try to ensure the user is in the room (invited or joined) before continuing\n */\nexport async function waitForMember(\n    client: MatrixClient,\n    roomId: string,\n    userId: string,\n    opts = { timeout: 1500 },\n): Promise<boolean> {\n    const { timeout } = opts;\n    let handler: (event: MatrixEvent, state: RoomState, member: RoomMember) => void;\n\n    // check if the user is in the room before we start -- in which case, no need to wait.\n    if ((client.getRoom(roomId)?.getMember(userId) ?? null) !== null) {\n        return true;\n    }\n\n    return new Promise<boolean>((resolve) => {\n        // eslint-disable-next-line @typescript-eslint/naming-convention\n        handler = function (_, __, member: RoomMember) {\n            if (member.userId !== userId) return;\n            if (member.roomId !== roomId) return;\n            resolve(true);\n        };\n        client.on(RoomStateEvent.NewMember, handler);\n\n        /* We don't want to hang if this goes wrong, so we proceed and hope the other\n           user is already in the room */\n        window.setTimeout(resolve, timeout, false);\n    }).finally(() => {\n        client.removeListener(RoomStateEvent.NewMember, handler);\n    });\n}\n\n/**\n * Check if the user is the only joined admin in the room\n * This function will *not* cause lazy loading of room members, so if these should be included then\n * the caller needs to make sure members have been loaded.\n * @param room The room to check if the user is the only admin.\n * @returns True if the user is the only user with the highest power level, false otherwise\n */\nexport function isOnlyAdmin(room: Room): boolean {\n    const currentUserLevel = room.getMember(room.client.getSafeUserId())?.powerLevel;\n\n    const userLevelValues = room.getJoinedMembers().map((m) => m.powerLevel);\n\n    const maxUserLevel = Math.max(...userLevelValues.filter((x) => typeof x === \"number\"));\n    // If the user is the only user with highest power level\n    return (\n        maxUserLevel === currentUserLevel &&\n        userLevelValues.lastIndexOf(maxUserLevel) == userLevelValues.indexOf(maxUserLevel)\n    );\n}\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, type IContent, type IMentions, type IEventRelation } from \"matrix-js-sdk/src/matrix\";\nimport { type MessageComposerUrlPreviewSnapshot } from \"@element-hq/web-shared-components\";\n\nimport type EditorModel from \"../editor/model\";\nimport { Type } from \"../editor/parts\";\nimport { type RoomMessageEventContent } from \"../../@types/url-preview\";\nimport SettingsStore from \"../settings/SettingsStore\";\n\n/**\n * Build the mentions information based on the editor model (and any related events):\n *\n * 1. Search the model parts for room or user pills and fill in the mentions object.\n * 2. If this is a reply to another event, include any user mentions from that\n *    (but do not include a room mention).\n *\n * @param sender - The Matrix ID of the user sending the event.\n * @param content - The event content.\n * @param model - The editor model to search for mentions, null if there is no editor.\n * @param replyToEvent - The event being replied to or undefined if it is not a reply.\n * @param editedContent - The content of the parent event being edited.\n */\nexport function attachMentions(\n    sender: string,\n    content: IContent,\n    model: EditorModel | null,\n    replyToEvent: MatrixEvent | undefined,\n    editedContent: IContent | null = null,\n): void {\n    // We always attach the mentions even if the home server doesn't yet support\n    // intentional mentions. This is safe because m.mentions is an additive change\n    // that should simply be ignored by incapable home servers.\n\n    // The mentions property *always* gets included to disable legacy push rules.\n    const mentions: IMentions = (content[\"m.mentions\"] = {});\n\n    const userMentions = new Set<string>();\n    let roomMention = false;\n\n    // If there's a reply, initialize the mentioned users as the sender of that event.\n    if (replyToEvent) {\n        userMentions.add(replyToEvent.sender!.userId);\n    }\n\n    // If user provided content is available, check to see if any users are mentioned.\n    if (model) {\n        // Add any mentioned users in the current content.\n        for (const part of model.parts) {\n            if (part.type === Type.UserPill) {\n                userMentions.add(part.resourceId);\n            } else if (part.type === Type.AtRoomPill) {\n                roomMention = true;\n            }\n        }\n    }\n\n    // Ensure the *current* user isn't listed in the mentioned users.\n    userMentions.delete(sender);\n\n    // Finally, if this event is editing a previous event, only include users who\n    // were not previously mentioned and a room mention if the previous event was\n    // not a room mention.\n    if (editedContent) {\n        // First, the new event content gets the *full* set of users.\n        const newContent = content[\"m.new_content\"];\n        const newMentions: IMentions = (newContent[\"m.mentions\"] = {});\n\n        // Only include the users/room if there is any content.\n        if (userMentions.size) {\n            newMentions.user_ids = [...userMentions];\n        }\n        if (roomMention) {\n            newMentions.room = true;\n        }\n\n        // Fetch the mentions from the original event and remove any previously\n        // mentioned users.\n        const prevMentions = editedContent[\"m.mentions\"];\n        if (Array.isArray(prevMentions?.user_ids)) {\n            prevMentions!.user_ids.forEach((userId) => userMentions.delete(userId));\n        }\n\n        // If the original event mentioned the room, nothing to do here.\n        if (prevMentions?.room) {\n            roomMention = false;\n        }\n    }\n\n    // Only include the users/room if there is any content.\n    if (userMentions.size) {\n        mentions.user_ids = [...userMentions];\n    }\n    if (roomMention) {\n        mentions.room = true;\n    }\n}\n\n// Merges favouring the given relation\nexport function attachRelation(content: IContent, relation?: IEventRelation): void {\n    if (relation) {\n        content[\"m.relates_to\"] = {\n            ...content[\"m.relates_to\"],\n            ...relation,\n        };\n    }\n}\nexport function attachUrlPreviews(\n    urlPreviewSnapshot: MessageComposerUrlPreviewSnapshot,\n    content: RoomMessageEventContent,\n): void {\n    if (!SettingsStore.getValue(\"feature_msc4095_url_preview_bundle\")) return;\n\n    if (urlPreviewSnapshot.previews.length) {\n        content[\"com.beeper.linkpreviews\"] = urlPreviewSnapshot.previews.map((preview) => {\n            return {\n                \"matched_url\": preview.link,\n                \"og:url\": preview.ogUrl,\n                \"og:title\": preview.title,\n                \"og:description\": preview.description,\n                \"og:image\": preview.image?.mxcImageFull,\n                \"og:image:width\": preview.image?.width,\n                \"og:image:height\": preview.image?.height,\n                \"og:image:type\": preview.image?.imageType,\n                \"matrix:image:size\": preview.image?.fileSize,\n            };\n        });\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n    type MatrixClient,\n    LOCAL_NOTIFICATION_SETTINGS_PREFIX,\n    NotificationCountType,\n    type Room,\n    type LocalNotificationSettings,\n    ReceiptType,\n    type IMarkedUnreadEvent,\n    type EmptyObject,\n    EventType,\n} from \"matrix-js-sdk/src/matrix\";\nimport { type IndicatorIcon } from \"@vector-im/compound-web\";\n\nimport SettingsStore from \"../settings/SettingsStore\";\nimport { NotificationLevel } from \"../stores/notifications/NotificationLevel\";\nimport { doesRoomHaveUnreadMessages } from \"../Unread\";\nimport { type SettingKey } from \"../settings/Settings.tsx\";\n\n// MSC2867 is not yet spec at time of writing. We read from both stable\n// and unstable prefixes and accept the risk that the format may change,\n// since the stable prefix is not actually defined yet.\n\n/**\n * Unstable identifier for the marked_unread event, per MSC2867\n */\nexport const MARKED_UNREAD_TYPE_UNSTABLE = \"com.famedly.marked_unread\";\n/**\n * Stable identifier for the marked_unread event\n */\nexport const MARKED_UNREAD_TYPE_STABLE = EventType.MarkedUnread;\n\ndeclare module \"matrix-js-sdk/src/types\" {\n    interface RoomAccountDataEvents {\n        [MARKED_UNREAD_TYPE_UNSTABLE]: { [eventId: string]: boolean };\n    }\n}\n\nexport const deviceNotificationSettingsKeys: SettingKey[] = [\n    \"notificationsEnabled\",\n    \"notificationBodyEnabled\",\n    \"audioNotificationsEnabled\",\n];\n\nexport function getLocalNotificationAccountDataEventType(\n    deviceId: string | null,\n): `${typeof LOCAL_NOTIFICATION_SETTINGS_PREFIX.name}.${string}` {\n    return `${LOCAL_NOTIFICATION_SETTINGS_PREFIX.name}.${deviceId}`;\n}\n\nexport async function createLocalNotificationSettingsIfNeeded(cli: MatrixClient): Promise<void> {\n    if (cli.isGuest()) {\n        return;\n    }\n    const eventType = getLocalNotificationAccountDataEventType(cli.deviceId!);\n    const event = cli.getAccountData(eventType);\n    // New sessions will create an account data event to signify they support\n    // remote toggling of push notifications on this device. Default `is_silenced=true`\n    // For backwards compat purposes, older sessions will need to check settings value\n    // to determine what the state of `is_silenced`\n    if (!event) {\n        // If any of the above is true, we fall in the \"backwards compat\" case,\n        // and `is_silenced` will be set to `false`\n        const isSilenced = !deviceNotificationSettingsKeys.some((key) => SettingsStore.getValue(key));\n\n        await cli.setAccountData(eventType, {\n            is_silenced: isSilenced,\n        });\n    }\n}\n\nexport function localNotificationsAreSilenced(cli: MatrixClient): boolean {\n    const eventType = getLocalNotificationAccountDataEventType(cli.deviceId!);\n    const event = cli.getAccountData(eventType);\n    return event?.getContent<LocalNotificationSettings>()?.is_silenced ?? false;\n}\n\n/**\n * Mark a room as read\n * @param room\n * @param client\n * @returns a promise that resolves when the room has been marked as read\n */\nexport async function clearRoomNotification(room: Room, client: MatrixClient): Promise<EmptyObject | undefined> {\n    const lastEvent = room.getLastLiveEvent();\n\n    await setMarkedUnreadState(room, client, false);\n\n    try {\n        if (lastEvent) {\n            const receiptType = SettingsStore.getValue(\"sendReadReceipts\", room.roomId)\n                ? ReceiptType.Read\n                : ReceiptType.ReadPrivate;\n            return await client.sendReadReceipt(lastEvent, receiptType, true);\n        } else {\n            return {};\n        }\n    } finally {\n        // We've had a lot of stuck unread notifications that in e2ee rooms\n        // They occur on event decryption when clients try to replicate the logic\n        //\n        // This resets the notification on a room, even though no read receipt\n        // has been sent, particularly useful when the clients has incorrectly\n        // notified a user.\n        room.setUnreadNotificationCount(NotificationCountType.Highlight, 0);\n        room.setUnreadNotificationCount(NotificationCountType.Total, 0);\n        for (const thread of room.getThreads()) {\n            room.setThreadUnreadNotificationCount(thread.id, NotificationCountType.Highlight, 0);\n            room.setThreadUnreadNotificationCount(thread.id, NotificationCountType.Total, 0);\n        }\n    }\n}\n\n/**\n * Marks all rooms with an unread counter as read\n * @param client The matrix client\n * @returns a promise that resolves when all rooms have been marked as read\n */\nexport function clearAllNotifications(client: MatrixClient): Promise<Array<EmptyObject | undefined>> {\n    const receiptPromises = client\n        .getRooms()\n        .reduce((promises: Array<Promise<EmptyObject | undefined>>, room: Room) => {\n            if (doesRoomHaveUnreadMessages(room, true)) {\n                const promise = clearRoomNotification(room, client);\n                promises.push(promise);\n            }\n\n            return promises;\n        }, []);\n\n    return Promise.all(receiptPromises);\n}\n\n/**\n * Gives the marked_unread state of the given room\n * @param room The room to check\n * @returns - The marked_unread state of the room, or undefined if no explicit state is set.\n */\nexport function getMarkedUnreadState(room: Room): boolean | undefined {\n    const currentStateStable = room.getAccountData(MARKED_UNREAD_TYPE_STABLE)?.getContent<IMarkedUnreadEvent>()?.unread;\n    const currentStateUnstable = room\n        .getAccountData(MARKED_UNREAD_TYPE_UNSTABLE)\n        ?.getContent<IMarkedUnreadEvent>()?.unread;\n    return currentStateStable ?? currentStateUnstable;\n}\n\n/**\n * Sets the marked_unread state of the given room. This sets some room account data that indicates to\n * clients that the user considers this room to be 'unread', but without any actual notifications.\n *\n * @param room The room to set\n * @param client MatrixClient object to use\n * @param unread The new marked_unread state of the room\n */\nexport async function setMarkedUnreadState(room: Room, client: MatrixClient, unread: boolean): Promise<void> {\n    // if there's no event, treat this as false as we don't need to send the flag to clear it if the event isn't there\n    const currentState = getMarkedUnreadState(room);\n\n    if (Boolean(currentState) !== unread) {\n        await client.setRoomAccountData(room.roomId, EventType.MarkedUnread, { unread });\n    }\n}\n\n/**\n * A helper to transform a notification color to the what the Compound Icon Button\n * expects\n */\nexport function notificationLevelToIndicator(\n    level: NotificationLevel,\n): React.ComponentPropsWithRef<typeof IndicatorIcon>[\"indicator\"] {\n    if (level <= NotificationLevel.None) {\n        return undefined;\n    } else if (level <= NotificationLevel.Activity) {\n        return \"default\";\n    } else if (level <= NotificationLevel.Notification) {\n        return \"success\";\n    } else {\n        return \"critical\";\n    }\n}\n\n/**\n * Return the thread notification level for a room\n * @param room\n * @returns {NotificationLevel}\n */\nexport function getThreadNotificationLevel(room: Room): NotificationLevel {\n    const notificationCountType = room.threadsAggregateNotificationType;\n    switch (notificationCountType) {\n        case NotificationCountType.Highlight:\n            return NotificationLevel.Highlight;\n        case NotificationCountType.Total:\n            return NotificationLevel.Notification;\n        default:\n            return NotificationLevel.Activity;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport SdkConfig from \"../SdkConfig\";\n\nexport function isPresenceEnabled(matrixClient: MatrixClient): boolean {\n    const hsUrl = matrixClient.baseUrl;\n    const urls = SdkConfig.get(\"enable_presence_by_hs_url\");\n    if (!urls) return true;\n    if (urls[hsUrl] || urls[hsUrl] === undefined) return true;\n    return false;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixEvent, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\nimport { isSupportedReceiptType } from \"matrix-js-sdk/src/utils\";\n\n/**\n * Determines if a read receipt update event includes the client's own user.\n * @param event The event to check.\n * @param client The client to check against.\n * @returns True if the read receipt update includes the client, false otherwise.\n */\nexport function readReceiptChangeIsFor(event: MatrixEvent, client: MatrixClient): boolean {\n    const myUserId = client.getUserId()!;\n    for (const eventId of Object.keys(event.getContent())) {\n        for (const [receiptType, receipt] of Object.entries(event.getContent()[eventId])) {\n            if (!isSupportedReceiptType(receiptType)) continue;\n\n            if (Object.keys(receipt || {}).includes(myUserId)) return true;\n        }\n    }\n    return false;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room, UNSTABLE_ELEMENT_FUNCTIONAL_USERS } from \"matrix-js-sdk/src/matrix\";\n\nexport const getFunctionalMembers = (room: Room): string[] => {\n    const [functionalUsersStateEvent] = room.currentState.getStateEvents(UNSTABLE_ELEMENT_FUNCTIONAL_USERS.name);\n\n    if (Array.isArray(functionalUsersStateEvent?.getContent().service_members)) {\n        return functionalUsersStateEvent.getContent().service_members;\n    }\n\n    return [];\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type Room, type RoomMember } from \"matrix-js-sdk/src/matrix\";\n\nimport { getFunctionalMembers } from \"./getFunctionalMembers\";\n\n/**\n * Returns all room members that are non-functional (all actual room members).\n *\n * A functional user is a user that is not a real user, but a bot, assistant, etc.\n */\nexport const getJoinedNonFunctionalMembers = (room: Room): RoomMember[] => {\n    const functionalMembers = getFunctionalMembers(room);\n    return room.getJoinedMembers().filter((m) => !functionalMembers.includes(m.userId));\n};\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { JoinRule, type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { DefaultTagID, type TagID } from \"../../stores/room-list-v3/skip-list/tag\";\nimport { EffectiveMembership, getEffectiveMembershipTag } from \"../membership\";\nimport DMRoomMap from \"../DMRoomMap\";\n\n/**\n * Get the tags for a room.\n * @param room - the room to get the tags for\n * @returns an array of tags for the room. If the room has no tags, it will return an array with the DefaultTagID.Untagged tag.\n */\nexport function getTagsForRoom(room: Room): TagID[] {\n    const tags: TagID[] = [];\n\n    const membership = getEffectiveMembershipTag(room);\n\n    if (membership === EffectiveMembership.Invite) {\n        tags.push(DefaultTagID.Invite);\n    } else if (membership === EffectiveMembership.Leave) {\n        tags.push(DefaultTagID.Archived);\n    } else {\n        tags.push(...getTagsOfJoinedRoom(room));\n    }\n\n    if (!tags.length) tags.push(DefaultTagID.Untagged);\n\n    return tags;\n}\n\n/**\n * Get the tags for a room that the user has joined. It checks for user defined tags first, then checks if it's a DM, and finally checks if it's a conference room.\n * @param room - the room to get the tags for\n * @returns an array of tags for the room. If the room has no user defined tags, is not a DM, and is not a conference room, it will return an empty array.\n */\nexport function getTagsOfJoinedRoom(room: Room): TagID[] {\n    let tags = Object.keys(room.tags || {});\n\n    if (tags.length === 0) {\n        // Check to see if it's a DM if it isn't anything else\n        if (DMRoomMap.shared().getUserIdForRoomId(room.roomId)) {\n            tags = [DefaultTagID.DM];\n        }\n    }\n    if (room.isCallRoom() && (room.getJoinRule() === JoinRule.Public || room.getJoinRule() === JoinRule.Knock)) {\n        tags.push(DefaultTagID.Conference);\n    }\n\n    return tags;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type CallType } from \"matrix-js-sdk/src/webrtc/call\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport type LegacyCallHandler from \"../../LegacyCallHandler\";\nimport { getPlatformCallTypeProps, PlatformCallType } from \"../../hooks/room/useRoomCall\";\nimport defaultDispatcher from \"../../dispatcher/dispatcher\";\nimport { type ViewRoomPayload } from \"../../dispatcher/payloads/ViewRoomPayload\";\nimport { Action } from \"../../dispatcher/actions\";\nimport PosthogTrackers from \"../../PosthogTrackers\";\n\n/**\n * Helper to place a call in a room that works with all the legacy modes\n * @param room the room to place the call in\n * @param callType the type of call\n * @param platformCallType the platform to pass the call on\n * @param skipLobby Has the user indicated they would like to skip the lobby. Otherwise, defer to platform defaults.\n */\nexport const placeCall = async (\n    legacyCallHandler: LegacyCallHandler,\n    room: Room,\n    callType: CallType,\n    platformCallType: PlatformCallType,\n    skipLobby: boolean | undefined,\n    voiceOnly: boolean,\n): Promise<void> => {\n    const { analyticsName } = getPlatformCallTypeProps(platformCallType);\n    PosthogTrackers.trackInteraction(analyticsName);\n\n    if (platformCallType == PlatformCallType.LegacyCall || platformCallType == PlatformCallType.JitsiCall) {\n        await legacyCallHandler.placeCall(room.roomId, callType);\n    } else if (platformCallType == PlatformCallType.ElementCall) {\n        defaultDispatcher.dispatch<ViewRoomPayload>({\n            action: Action.ViewRoom,\n            room_id: room.roomId,\n            view_call: true,\n            voiceOnly,\n            skipLobby,\n            metricsTrigger: undefined,\n        });\n    }\n};\n","/*\nCopyright 2026 Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\nimport { getLastTimestamp } from \"../../stores/room-list-v3/skip-list/sorters/utils/getLastTimestamp\";\n\n/**\n * Sort an arbitrary list of rooms by recency (most recent activity first).\n *\n * Unlike the main room list sorting, this is a pure recency sort: muted and\n * low-priority rooms are NOT moved to the bottom. The provided array is not\n * mutated; a sorted copy is returned. The given list is sorted as-is and is\n * not filtered by the active space.\n * @param rooms The rooms to sort.\n * @param userId The mxId of the current user.\n */\nexport function sortRoomsByRecency(rooms: Room[], userId: string): Room[] {\n    const cache = new Map<string, number>();\n    const ts = (room: Room): number => {\n        let value = cache.get(room.roomId);\n        if (value === undefined) {\n            value = getLastTimestamp(room, userId);\n            cache.set(room.roomId, value);\n        }\n        return value;\n    };\n    return [...rooms].sort((a, b) => ts(b) - ts(a));\n}\n\n/**\n * Compare two rooms by recency, most recent activity first.\n *\n * Intended for sorting mixed result sets where rooms need to be ordered\n * relative to each other (e.g. spotlight search results).\n * @param roomA The first room.\n * @param roomB The second room.\n * @param userId The mxId of the current user.\n */\nexport function compareRoomsByRecency(roomA: Room, roomB: Room, userId: string): number {\n    return getLastTimestamp(roomB, userId) - getLastTimestamp(roomA, userId);\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { shouldForceDisableEncryption } from \"./crypto/shouldForceDisableEncryption\";\nimport { getE2EEWellKnown } from \"./WellKnownUtils\";\n\nexport function privateShouldBeEncrypted(client: MatrixClient): boolean {\n    if (shouldForceDisableEncryption(client)) {\n        return false;\n    }\n    const e2eeWellKnown = getE2EEWellKnown(client);\n    if (e2eeWellKnown) {\n        const defaultDisabled = e2eeWellKnown[\"default\"] === false;\n        return !defaultDisabled;\n    }\n    return true;\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, useRef, useState } from \"react\";\nimport { type Room, JoinRule } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { _t } from \"../../../languageHandler\";\nimport BaseDialog from \"./BaseDialog\";\nimport AccessibleButton, { type ButtonEvent } from \"../elements/AccessibleButton\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { BetaPill } from \"../beta/BetaCard\";\nimport type Field from \"../elements/Field\";\nimport type RoomAliasField from \"../elements/RoomAliasField\";\nimport { createSpace, SpaceCreateForm } from \"../spaces/SpaceCreateMenu\";\nimport { SubspaceSelector } from \"./AddExistingToSpaceDialog\";\nimport JoinRuleDropdown from \"../elements/JoinRuleDropdown\";\n\ninterface IProps {\n    space: Room;\n    onAddExistingSpaceClick(this: void): void;\n    onFinished(this: void, added?: boolean): void;\n}\n\nconst CreateSubspaceDialog: React.FC<IProps> = ({ space, onAddExistingSpaceClick, onFinished }) => {\n    const [parentSpace, setParentSpace] = useState(space);\n\n    const [busy, setBusy] = useState<boolean>(false);\n    const [name, setName] = useState(\"\");\n    const spaceNameField = useRef<Field>(null);\n    const [alias, setAlias] = useState(\"\");\n    const spaceAliasField = useRef<RoomAliasField>(null);\n    const [avatar, setAvatar] = useState<File | undefined>();\n    const [topic, setTopic] = useState<string>(\"\");\n\n    const spaceJoinRule = space.getJoinRule();\n    let defaultJoinRule = JoinRule.Restricted;\n    if (spaceJoinRule === JoinRule.Public) {\n        defaultJoinRule = JoinRule.Public;\n    }\n    const [joinRule, setJoinRule] = useState<JoinRule>(defaultJoinRule);\n\n    const onCreateSubspaceClick = async (e: ButtonEvent): Promise<void> => {\n        e.preventDefault();\n        if (busy) return;\n\n        setBusy(true);\n        // require & validate the space name field\n        if (spaceNameField.current && !(await spaceNameField.current.validate({ allowEmpty: false }))) {\n            spaceNameField.current.focus();\n            spaceNameField.current.validate({ allowEmpty: false, focused: true });\n            setBusy(false);\n            return;\n        }\n        // validate the space name alias field but do not require it\n        if (\n            spaceAliasField.current &&\n            joinRule === JoinRule.Public &&\n            !(await spaceAliasField.current.validate({ allowEmpty: true }))\n        ) {\n            spaceAliasField.current.focus();\n            spaceAliasField.current.validate({ allowEmpty: true, focused: true });\n            setBusy(false);\n            return;\n        }\n\n        try {\n            await createSpace(\n                space.client,\n                name,\n                joinRule === JoinRule.Public,\n                alias,\n                topic,\n                avatar,\n                {},\n                { parentSpace, joinRule },\n            );\n\n            onFinished(true);\n        } catch (e) {\n            logger.error(e);\n        }\n    };\n\n    let joinRuleMicrocopy: JSX.Element | undefined;\n    if (joinRule === JoinRule.Restricted) {\n        joinRuleMicrocopy = (\n            <p>\n                {_t(\n                    \"create_space|subspace_join_rule_restricted_description\",\n                    {},\n                    {\n                        SpaceName: () => <strong>{parentSpace.name}</strong>,\n                    },\n                )}\n            </p>\n        );\n    } else if (joinRule === JoinRule.Public) {\n        joinRuleMicrocopy = (\n            <p>\n                {_t(\n                    \"create_space|subspace_join_rule_public_description\",\n                    {},\n                    {\n                        SpaceName: () => <strong>{parentSpace.name}</strong>,\n                    },\n                )}\n            </p>\n        );\n    } else if (joinRule === JoinRule.Invite) {\n        joinRuleMicrocopy = <p>{_t(\"create_space|subspace_join_rule_invite_description\")}</p>;\n    }\n\n    return (\n        <BaseDialog\n            title={\n                <SubspaceSelector\n                    title={_t(\"create_space|subspace_dropdown_title\")}\n                    space={space}\n                    value={parentSpace}\n                    onChange={setParentSpace}\n                />\n            }\n            className=\"mx_CreateSubspaceDialog\"\n            contentId=\"mx_CreateSubspaceDialog\"\n            onFinished={onFinished}\n            fixedWidth={false}\n        >\n            <MatrixClientContext.Provider value={space.client}>\n                <div className=\"mx_CreateSubspaceDialog_content\">\n                    <div className=\"mx_CreateSubspaceDialog_betaNotice\">\n                        <BetaPill />\n                        {_t(\"create_space|subspace_beta_notice\")}\n                    </div>\n\n                    <SpaceCreateForm\n                        busy={busy}\n                        onSubmit={onCreateSubspaceClick}\n                        setAvatar={setAvatar}\n                        name={name}\n                        setName={setName}\n                        nameFieldRef={spaceNameField}\n                        topic={topic}\n                        setTopic={setTopic}\n                        alias={alias}\n                        setAlias={setAlias}\n                        showAliasField={joinRule === JoinRule.Public}\n                        aliasFieldRef={spaceAliasField}\n                    >\n                        <JoinRuleDropdown\n                            label={_t(\"create_space|subspace_join_rule_label\")}\n                            labelInvite={_t(\"create_space|subspace_join_rule_invite_only\")}\n                            labelPublic={_t(\"common|public_space\")}\n                            labelRestricted={_t(\"create_room|join_rule_restricted\")}\n                            width={478}\n                            value={joinRule}\n                            onChange={setJoinRule}\n                        />\n                        {joinRuleMicrocopy}\n                    </SpaceCreateForm>\n                </div>\n\n                <div className=\"mx_CreateSubspaceDialog_footer\">\n                    <div className=\"mx_CreateSubspaceDialog_footer_prompt\">\n                        <div>{_t(\"create_space|subspace_existing_space_prompt\")}</div>\n                        <AccessibleButton\n                            kind=\"link\"\n                            onClick={() => {\n                                onAddExistingSpaceClick();\n                                onFinished();\n                            }}\n                        >\n                            {_t(\"space|add_existing_subspace|space_dropdown_title\")}\n                        </AccessibleButton>\n                    </div>\n\n                    <AccessibleButton kind=\"primary_outline\" disabled={busy} onClick={() => onFinished(false)}>\n                        {_t(\"action|cancel\")}\n                    </AccessibleButton>\n                    <AccessibleButton kind=\"primary\" disabled={busy} onClick={onCreateSubspaceClick}>\n                        {busy ? _t(\"create_space|subspace_adding\") : _t(\"action|add\")}\n                    </AccessibleButton>\n                </div>\n            </MatrixClientContext.Provider>\n        </BaseDialog>\n    );\n};\n\nexport default CreateSubspaceDialog;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useState } from \"react\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { _t } from \"../../../languageHandler\";\nimport BaseDialog from \"./BaseDialog\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { AddExistingToSpace, defaultSpacesRenderer, SubspaceSelector } from \"./AddExistingToSpaceDialog\";\n\ninterface IProps {\n    space: Room;\n    onCreateSubspaceClick(this: void): void;\n    onFinished(this: void, added?: boolean): void;\n}\n\nconst AddExistingSubspaceDialog: React.FC<IProps> = ({ space, onCreateSubspaceClick, onFinished }) => {\n    const [selectedSpace, setSelectedSpace] = useState(space);\n\n    return (\n        <BaseDialog\n            title={\n                <SubspaceSelector\n                    title={_t(\"space|add_existing_subspace|space_dropdown_title\")}\n                    space={space}\n                    value={selectedSpace}\n                    onChange={setSelectedSpace}\n                />\n            }\n            className=\"mx_AddExistingToSpaceDialog\"\n            contentId=\"mx_AddExistingToSpace\"\n            onFinished={onFinished}\n            fixedWidth={false}\n        >\n            <MatrixClientContext.Provider value={space.client}>\n                <AddExistingToSpace\n                    space={space}\n                    onFinished={onFinished}\n                    footerPrompt={\n                        <>\n                            <div>{_t(\"space|add_existing_subspace|create_prompt\")}</div>\n                            <AccessibleButton onClick={onCreateSubspaceClick} kind=\"link\">\n                                {_t(\"space|add_existing_subspace|create_button\")}\n                            </AccessibleButton>\n                        </>\n                    }\n                    filterPlaceholder={_t(\"space|add_existing_subspace|filter_placeholder\")}\n                    spacesRenderer={defaultSpacesRenderer}\n                />\n            </MatrixClientContext.Provider>\n        </BaseDialog>\n    );\n};\n\nexport default AddExistingSubspaceDialog;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\nimport { type Room, type ICreateRoomStateEvent, type RoomType, EventType, JoinRule } from \"matrix-js-sdk/src/matrix\";\nimport { KnownMembership } from \"matrix-js-sdk/src/types\";\n\nimport { calculateRoomVia } from \"./permalinks/Permalinks\";\nimport Modal from \"../Modal\";\nimport CreateRoomDialog from \"../components/views/dialogs/CreateRoomDialog\";\nimport createRoom from \"../createRoom\";\nimport { _t } from \"../languageHandler\";\nimport SpacePublicShare from \"../components/views/spaces/SpacePublicShare\";\nimport InfoDialog from \"../components/views/dialogs/InfoDialog\";\nimport { showRoomInviteDialog } from \"../RoomInvite\";\nimport CreateSubspaceDialog from \"../components/views/dialogs/CreateSubspaceDialog\";\nimport AddExistingSubspaceDialog from \"../components/views/dialogs/AddExistingSubspaceDialog\";\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport { Action } from \"../dispatcher/actions\";\nimport Spinner from \"../components/views/elements/Spinner\";\nimport { shouldShowComponent } from \"../customisations/helpers/UIComponents\";\nimport { UIComponent } from \"../settings/UIFeature\";\nimport {\n    type OpenSpacePreferencesPayload,\n    type SpacePreferenceTab,\n} from \"../dispatcher/payloads/OpenSpacePreferencesPayload\";\nimport { type OpenSpaceSettingsPayload } from \"../dispatcher/payloads/OpenSpaceSettingsPayload\";\nimport { type OpenAddExistingToSpaceDialogPayload } from \"../dispatcher/payloads/OpenAddExistingToSpaceDialogPayload\";\nimport { SDKContextClass } from \"../contexts/SDKContextClass\";\n\nexport const shouldShowSpaceSettings = (space: Room): boolean => {\n    const userId = space.client.getUserId()!;\n    return (\n        space.getMyMembership() === KnownMembership.Join &&\n        (space.currentState.maySendStateEvent(EventType.RoomAvatar, userId) ||\n            space.currentState.maySendStateEvent(EventType.RoomName, userId) ||\n            space.currentState.maySendStateEvent(EventType.RoomTopic, userId) ||\n            space.currentState.maySendStateEvent(EventType.RoomJoinRules, userId))\n    );\n};\n\nexport const makeSpaceParentEvent = (room: Room, canonical = false): ICreateRoomStateEvent => ({\n    type: EventType.SpaceParent,\n    content: {\n        via: calculateRoomVia(room),\n        canonical: canonical,\n    },\n    state_key: room.roomId,\n});\n\nexport function showSpaceSettings(space: Room): void {\n    defaultDispatcher.dispatch<OpenSpaceSettingsPayload>({\n        action: Action.OpenSpaceSettings,\n        space,\n    });\n}\n\nexport const showAddExistingRooms = (space: Room): void => {\n    defaultDispatcher.dispatch<OpenAddExistingToSpaceDialogPayload>({\n        action: Action.OpenAddToExistingSpaceDialog,\n        space,\n    });\n};\n\nexport const showCreateNewRoom = async (space: Room, type?: RoomType): Promise<boolean> => {\n    const modal = Modal.createDialog(CreateRoomDialog, {\n        type,\n        defaultPublic: space.getJoinRule() === JoinRule.Public,\n        parentSpace: space,\n    });\n    const [shouldCreate, opts] = await modal.finished;\n    if (shouldCreate) {\n        await createRoom(space.client, opts!);\n    }\n    return !!shouldCreate;\n};\n\nexport const shouldShowSpaceInvite = (space: Room): boolean =>\n    ((space?.getMyMembership() === KnownMembership.Join && space.canInvite(space.client.getUserId()!)) ||\n        space.getJoinRule() === JoinRule.Public) &&\n    shouldShowComponent(UIComponent.InviteUsers);\n\nexport const showSpaceInvite = (space: Room, initialText = \"\"): void => {\n    if (space.getJoinRule() === \"public\") {\n        const modal = Modal.createDialog(InfoDialog, {\n            title: _t(\"invite|to_space\", { spaceName: space.name }),\n            description: (\n                <React.Fragment>\n                    <span>{_t(\"space|share_public\")}</span>\n                    <SpacePublicShare space={space} onFinished={() => modal.close()} />\n                </React.Fragment>\n            ),\n            fixedWidth: false,\n            button: false,\n            className: \"mx_SpacePanel_sharePublicSpace\",\n            hasCloseButton: true,\n        });\n    } else {\n        showRoomInviteDialog(space.roomId, initialText);\n    }\n};\n\nexport const showAddExistingSubspace = (space: Room): void => {\n    const { finished } = Modal.createDialog(\n        AddExistingSubspaceDialog,\n        {\n            space,\n            onCreateSubspaceClick: () => showCreateNewSubspace(space),\n        },\n        \"mx_AddExistingToSpaceDialog_wrapper\",\n    );\n    finished.then(([added]) => {\n        if (added && SDKContextClass.instance.roomViewStore.getRoomId() === space.roomId) {\n            defaultDispatcher.fire(Action.UpdateSpaceHierarchy);\n        }\n    });\n};\n\nexport const showCreateNewSubspace = (space: Room): void => {\n    const { finished } = Modal.createDialog(\n        CreateSubspaceDialog,\n        {\n            space,\n            onAddExistingSpaceClick: () => showAddExistingSubspace(space),\n        },\n        \"mx_CreateSubspaceDialog_wrapper\",\n    );\n    finished.then(([added]) => {\n        if (added && SDKContextClass.instance.roomViewStore.getRoomId() === space.roomId) {\n            defaultDispatcher.fire(Action.UpdateSpaceHierarchy);\n        }\n    });\n};\n\nexport const bulkSpaceBehaviour = async (\n    space: Room,\n    children: Room[],\n    fn: (room: Room) => Promise<unknown>,\n): Promise<void> => {\n    const modal = Modal.createDialog(Spinner, undefined, \"mx_Dialog_spinner\");\n    try {\n        for (const room of children) {\n            await fn(room);\n        }\n        await fn(space);\n    } finally {\n        modal.close();\n    }\n};\n\nexport const showSpacePreferences = (space: Room, initialTabId?: SpacePreferenceTab): void => {\n    defaultDispatcher.dispatch<OpenSpacePreferencesPayload>({\n        action: Action.OpenSpacePreferences,\n        space,\n        initialTabId,\n    });\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport type { Room } from \"matrix-js-sdk/src/matrix\";\n\n/**\n * Determines whether the given room is a video room.\n */\nexport const isVideoRoom = (room: Room): boolean => room.isElementVideoRoom() || room.isCallRoom();\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 , 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type User, type MatrixClient, type RoomMember } from \"matrix-js-sdk/src/matrix\";\nimport { type VerificationRequest } from \"matrix-js-sdk/src/crypto-api\";\n\nimport dis from \"./dispatcher/dispatcher\";\nimport { RightPanelPhases } from \"./stores/right-panel/RightPanelStorePhases\";\nimport type RightPanelStore from \"./stores/right-panel/RightPanelStore\";\nimport { type IRightPanelCardState } from \"./stores/right-panel/RightPanelStoreIPanelState\";\nimport { findDMForUser } from \"./utils/dm/findDMForUser\";\n\n/**\n * Verify another user.\n *\n * Note: cross-signing must be set up before calling this function.\n */\nexport function verifyUser(rightPanelStore: RightPanelStore, matrixClient: MatrixClient, user: User): void {\n    if (matrixClient.isGuest()) {\n        dis.dispatch({ action: \"require_registration\" });\n        return;\n    }\n    const existingRequest = pendingVerificationRequestForUser(matrixClient, user);\n    setRightPanel(rightPanelStore, { member: user, verificationRequest: existingRequest });\n}\n\nfunction setRightPanel(rightPanelStore: RightPanelStore, state: IRightPanelCardState): void {\n    if (rightPanelStore.roomPhaseHistory.some((card) => card.phase == RightPanelPhases.RoomSummary)) {\n        rightPanelStore.pushCard({ phase: RightPanelPhases.EncryptionPanel, state });\n    } else {\n        rightPanelStore.setCards([\n            { phase: RightPanelPhases.RoomSummary },\n            { phase: RightPanelPhases.MemberInfo, state: { member: state.member } },\n            { phase: RightPanelPhases.EncryptionPanel, state },\n        ]);\n    }\n}\n\nexport function pendingVerificationRequestForUser(\n    matrixClient: MatrixClient,\n    user: User | RoomMember,\n): VerificationRequest | undefined {\n    const dmRoom = findDMForUser(matrixClient, user.userId);\n    if (dmRoom) {\n        return matrixClient.getCrypto()!.findVerificationRequestDMInProgress(dmRoom.roomId, user.userId);\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport {\n    formatDateForInput,\n    BaseViewModel,\n    type DateSeparatorViewSnapshot as DateSeparatorViewSnapshotInterface,\n    type DateSeparatorViewModel as DateSeparatorViewModelInterface,\n} from \"@element-hq/web-shared-components\";\nimport React from \"react\";\nimport { Direction, ConnectionError, HTTPError, MatrixError } from \"matrix-js-sdk/src/matrix\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\n\nimport { formatFullDateNoDay, formatFullDateNoTime, getDaysArray } from \"../../../DateUtils\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport dispatcher from \"../../../dispatcher/dispatcher\";\nimport { Action } from \"../../../dispatcher/actions\";\nimport { type ViewRoomPayload } from \"../../../dispatcher/payloads/ViewRoomPayload\";\nimport { _t } from \"../../../languageHandler\";\nimport { getUserLanguage } from \"../../../i18n/settings\";\nimport Modal from \"../../../Modal\";\nimport SettingsStore from \"../../../settings/SettingsStore\";\nimport { UIFeature } from \"../../../settings/UIFeature\";\nimport ErrorDialog from \"../../../components/views/dialogs/ErrorDialog\";\nimport BugReportDialog from \"../../../components/views/dialogs/BugReportDialog\";\nimport AccessibleButton from \"../../../components/views/elements/AccessibleButton\";\nimport { type RoomViewStore } from \"../../../stores/RoomViewStore.tsx\";\n\nexport interface DateSeparatorViewModelProps {\n    /**\n     * Room ID used for jump-to-date navigation and room-switch guards.\n     */\n    roomId: string;\n    /**\n     * Timestamp used to compute the date separator label and initial picker value.\n     */\n    ts: number;\n    /**\n     * Export mode disables relative date labels and jump-to-date menu UI.\n     */\n    forExport?: boolean;\n    /**\n     * The room view store instance to use\n     */\n    roomViewStore: RoomViewStore;\n}\n\n/**\n * ViewModel for the date separator, providing the current state of the component.\n */\nexport class DateSeparatorViewModel\n    extends BaseViewModel<DateSeparatorViewSnapshotInterface, DateSeparatorViewModelProps>\n    implements DateSeparatorViewModelInterface\n{\n    /**\n     * Cached setting for UIFeature.TimelineEnableRelativeDates.\n     * Updated via SettingsStore watcher to keep labels in sync at runtime.\n     */\n    private relativeDatesEnabled: boolean;\n    /**\n     * Cached setting for feature_jump_to_date.\n     * Controls whether the jump-to-date menu is exposed in the snapshot.\n     */\n    private jumpToDateEnabled: boolean;\n\n    public constructor(props: DateSeparatorViewModelProps) {\n        const relativeDatesEnabled = SettingsStore.getValue(UIFeature.TimelineEnableRelativeDates);\n        const jumpToDateEnabled = SettingsStore.getValue(\"feature_jump_to_date\");\n\n        super(props, {\n            label: DateSeparatorViewModel.computeLabel(props, relativeDatesEnabled),\n        });\n\n        this.relativeDatesEnabled = relativeDatesEnabled;\n        this.jumpToDateEnabled = jumpToDateEnabled;\n        this.updateSnapshot();\n\n        // Keep label behaviour in sync with runtime setting updates.\n        const jumpToDateWatcherRef = SettingsStore.watchSetting(\n            \"feature_jump_to_date\",\n            null,\n            (_settingName, _roomId, _level, _newValAtLevel, newVal) => {\n                this.jumpToDateEnabled = !!newVal;\n                this.updateSnapshot();\n            },\n        );\n        this.disposables.track(() => SettingsStore.unwatchSetting(jumpToDateWatcherRef));\n\n        const relativeDatesWatcherRef = SettingsStore.watchSetting(\n            UIFeature.TimelineEnableRelativeDates,\n            null,\n            (_settingName, _roomId, _level, _newValAtLevel, newVal) => {\n                this.relativeDatesEnabled = !!newVal;\n                this.updateSnapshot();\n            },\n        );\n        this.disposables.track(() => SettingsStore.unwatchSetting(relativeDatesWatcherRef));\n    }\n\n    private computeSnapshot(): DateSeparatorViewSnapshotInterface {\n        const label = DateSeparatorViewModel.computeLabel(this.props, this.relativeDatesEnabled);\n        return {\n            label,\n            jumpToEnabled: this.jumpToDateEnabled && !this.props.forExport,\n            jumpFromDate: formatDateForInput(new Date(this.props.ts)),\n        };\n    }\n\n    private updateSnapshot(): void {\n        this.snapshot.set(this.computeSnapshot());\n    }\n\n    private static get relativeTimeFormat(): Intl.RelativeTimeFormat {\n        return new Intl.RelativeTimeFormat(getUserLanguage(), { style: \"long\", numeric: \"auto\" });\n    }\n\n    private static computeLabel(props: DateSeparatorViewModelProps, relativeDatesEnabled: boolean): string {\n        try {\n            const date = new Date(props.ts);\n\n            // During export, relative dates are ambiguous and should not be used.\n            if (props.forExport || !relativeDatesEnabled) return formatFullDateNoTime(date);\n\n            const today = new Date();\n            const yesterday = new Date();\n            const days = getDaysArray(\"long\");\n            yesterday.setDate(today.getDate() - 1);\n\n            if (date.toDateString() === today.toDateString()) {\n                return this.relativeTimeFormat.format(0, \"day\");\n            } else if (date.toDateString() === yesterday.toDateString()) {\n                return this.relativeTimeFormat.format(-1, \"day\");\n            } else if (today.getTime() - date.getTime() < 6 * 24 * 60 * 60 * 1000) {\n                return days[date.getDay()];\n            } else {\n                return formatFullDateNoTime(date);\n            }\n        } catch {\n            return _t(\"common|message_timestamp_invalid\");\n        }\n    }\n\n    public pickDate = async (inputTimestamp: number | string | Date): Promise<void> => {\n        const unixTimestamp = new Date(inputTimestamp).getTime();\n        const roomIdForJumpRequest = this.props.roomId;\n\n        try {\n            const cli = MatrixClientPeg.safeGet();\n            const { event_id: eventId, origin_server_ts: originServerTs } = await cli.timestampToEvent(\n                roomIdForJumpRequest,\n                unixTimestamp,\n                Direction.Forward,\n            );\n            logger.log(\n                `/timestamp_to_event: ` +\n                    `found ${eventId} (${originServerTs}) for timestamp=${unixTimestamp} (looking forward)`,\n            );\n\n            // Only try to navigate to the room if the user is still viewing the same\n            // room. We don't want to jump someone back to a room after a slow request\n            // if they've already navigated away to another room.\n            const currentRoomId = this.props.roomViewStore.getRoomId();\n            if (currentRoomId === roomIdForJumpRequest) {\n                dispatcher.dispatch<ViewRoomPayload>({\n                    action: Action.ViewRoom,\n                    event_id: eventId,\n                    highlighted: true,\n                    room_id: roomIdForJumpRequest,\n                    metricsTrigger: undefined, // room doesn't change\n                });\n            } else {\n                logger.debug(\n                    `No longer navigating to date in room (jump to date) because the user already switched ` +\n                        `to another room: currentRoomId=${currentRoomId}, roomIdForJumpRequest=${roomIdForJumpRequest}`,\n                );\n            }\n        } catch (err) {\n            logger.error(\n                `Error occured while trying to find event in ${roomIdForJumpRequest} ` +\n                    `at timestamp=${unixTimestamp}:`,\n                err,\n            );\n\n            // Only display an error if the user is still viewing the same room. We\n            // don't want to worry someone about an error in a room they no longer care\n            // about after a slow request if they've already navigated away to another\n            // room.\n            const currentRoomId = this.props.roomViewStore.getRoomId();\n            if (currentRoomId === roomIdForJumpRequest) {\n                let friendlyErrorMessage = \"An error occured while trying to find and jump to the given date.\";\n                let submitDebugLogsContent: React.ReactElement = <></>;\n\n                if (err instanceof ConnectionError) {\n                    friendlyErrorMessage = _t(\"room|error_jump_to_date_connection\");\n                } else if (err instanceof MatrixError) {\n                    if (err?.errcode === \"M_NOT_FOUND\") {\n                        friendlyErrorMessage = _t(\"room|error_jump_to_date_not_found\", {\n                            dateString: formatFullDateNoDay(new Date(unixTimestamp)),\n                        });\n                    } else {\n                        friendlyErrorMessage = _t(\"room|error_jump_to_date\", {\n                            statusCode: err?.httpStatus || _t(\"room|unknown_status_code_for_timeline_jump\"),\n                            errorCode: err?.errcode || _t(\"common|unavailable\"),\n                        });\n                    }\n                } else if (err instanceof HTTPError) {\n                    friendlyErrorMessage = err.message;\n                } else {\n                    // We only give the option to submit logs for actual errors, not network problems.\n                    submitDebugLogsContent = (\n                        <p>\n                            {_t(\n                                \"room|error_jump_to_date_send_logs_prompt\",\n                                {},\n                                {\n                                    debugLogsLink: (sub) => (\n                                        // This is by default a `<div>` which we\n                                        // can't nest within a `<p>` here so update\n                                        // this to a be a inline anchor element.\n                                        <AccessibleButton\n                                            element=\"a\"\n                                            kind=\"link\"\n                                            onClick={() => this.onBugReport(err instanceof Error ? err : undefined)}\n                                            data-testid=\"jump-to-date-error-submit-debug-logs-button\"\n                                        >\n                                            {sub}\n                                        </AccessibleButton>\n                                    ),\n                                },\n                            )}\n                        </p>\n                    );\n                }\n\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"room|error_jump_to_date_title\"),\n                    description: (\n                        <div data-testid=\"jump-to-date-error-content\">\n                            <p>{friendlyErrorMessage}</p>\n                            {submitDebugLogsContent}\n                            <details>\n                                <summary>{_t(\"room|error_jump_to_date_details\")}</summary>\n                                <p>{String(err)}</p>\n                            </details>\n                        </div>\n                    ),\n                });\n            }\n        }\n    };\n\n    public onBugReport = (err?: Error): void => {\n        Modal.createDialog(BugReportDialog, {\n            error: err,\n            initialText: \"Error occured while using jump to date #jump-to-date\",\n        });\n    };\n\n    public onLastWeekPicked = (): Promise<void> => {\n        const date = new Date();\n        date.setDate(date.getDate() - 7);\n        void this.pickDate(date);\n        return Promise.resolve();\n    };\n\n    public onLastMonthPicked = (): Promise<void> => {\n        const date = new Date();\n        // Month numbers are 0-11 and setMonth handles rollover.\n        date.setMonth(date.getMonth() - 1, 1);\n        void this.pickDate(date);\n        return Promise.resolve();\n    };\n\n    public onBeginningPicked = (): Promise<void> => {\n        void this.pickDate(new Date(0));\n        return Promise.resolve();\n    };\n\n    public onDatePicked = (dateString: string): Promise<void> => {\n        void this.pickDate(dateString);\n        return Promise.resolve();\n    };\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type JSX } from \"react\";\nimport { RoomStateEvent, type MatrixClient, type MatrixEvent } from \"matrix-js-sdk/src/matrix\";\nimport {\n    BaseViewModel,\n    EncryptionEventState,\n    type EncryptionEventViewSnapshot as EncryptionEventViewSnapshotInterface,\n    type EncryptionEventViewModel as EncryptionEventViewModelInterface,\n} from \"@element-hq/web-shared-components\";\n\nimport type { RoomEncryptionEventContent } from \"matrix-js-sdk/src/types\";\nimport DMRoomMap from \"../../../../utils/DMRoomMap\";\nimport { MEGOLM_ENCRYPTION_ALGORITHM } from \"../../../../utils/crypto\";\nimport { isLocalRoom } from \"../../../../utils/localRoom/isLocalRoom\";\nimport { isRoomEncrypted } from \"../../../../hooks/useIsEncrypted\";\nimport { objectHasDiff } from \"../../../../utils/objects\";\n\nexport interface EncryptionEventViewModelProps {\n    /** Caller-provided client. */\n    cli: MatrixClient;\n    /** Encryption state event to derive tile state from. */\n    mxEvent: MatrixEvent;\n    /** Optional timestamp element rendered in the tile footer slot. */\n    timestamp?: JSX.Element;\n}\n\nexport class EncryptionEventViewModel\n    extends BaseViewModel<EncryptionEventViewSnapshotInterface, EncryptionEventViewModelProps>\n    implements EncryptionEventViewModelInterface\n{\n    public constructor(props: EncryptionEventViewModelProps) {\n        super(\n            props,\n            EncryptionEventViewModel.calculateSnapshot(props, EncryptionEventViewModel.getInitialIsEncrypted(props)),\n        );\n        void this.refreshSnapshotFromEvent();\n\n        const roomId = this.props.mxEvent.getRoomId()!;\n        const room = this.props.cli.getRoom(roomId);\n        if (room) {\n            // Recompute when room state changes (including encryption state updates).\n            this.disposables.trackListener(room, RoomStateEvent.Update, () => void this.refreshSnapshotFromEvent());\n        }\n    }\n\n    private refreshSnapshotFromEvent = async (): Promise<void> => {\n        const roomId = this.props.mxEvent.getRoomId()!;\n        const room = this.props.cli.getRoom(roomId);\n        const crypto = this.props.cli.getCrypto();\n        const isEncrypted = Boolean(room && crypto && (await isRoomEncrypted(room, crypto)));\n        const nextSnapshot = EncryptionEventViewModel.calculateSnapshot(this.props, isEncrypted);\n\n        if (objectHasDiff(this.snapshot.current, nextSnapshot)) {\n            this.snapshot.set(nextSnapshot);\n        }\n    };\n\n    private static getInitialIsEncrypted(props: EncryptionEventViewModelProps): boolean {\n        const roomId = props.mxEvent.getRoomId()!;\n        const room = props.cli.getRoom(roomId);\n        if (!room) return false;\n\n        if (isLocalRoom(room)) {\n            const localRoom = room as { isEncryptionEnabled?: () => boolean };\n            return Boolean(localRoom.isEncryptionEnabled?.());\n        }\n\n        return room.hasEncryptionStateEvent();\n    }\n\n    private static calculateSnapshot(\n        props: EncryptionEventViewModelProps,\n        isEncrypted: boolean,\n    ): EncryptionEventViewSnapshotInterface {\n        const newSnapshot: EncryptionEventViewSnapshotInterface = {\n            state: EncryptionEventState.CHANGED,\n            encryptedStateEvents: undefined,\n            userName: undefined,\n            timestamp: props.timestamp,\n        };\n\n        const content = props.mxEvent.getContent<RoomEncryptionEventContent>();\n        if (isEncrypted && content.algorithm === MEGOLM_ENCRYPTION_ALGORITHM) {\n            const roomId = props.mxEvent.getRoomId()!;\n            const room = props.cli.getRoom(roomId);\n            const isRoomLocal = isLocalRoom(room);\n            const prevContent = props.mxEvent.getPrevContent() as RoomEncryptionEventContent;\n            const dmPartner = roomId ? DMRoomMap.shared().getUserIdForRoomId(roomId) : undefined;\n            const stateEncrypted = Boolean(\n                content[\"io.element.msc4362.encrypt_state_events\"] && props.cli.enableEncryptedStateEvents,\n            );\n\n            newSnapshot.state = EncryptionEventState.ENABLED;\n            newSnapshot.encryptedStateEvents = stateEncrypted;\n\n            if (prevContent.algorithm === MEGOLM_ENCRYPTION_ALGORITHM) {\n                newSnapshot.state = EncryptionEventState.CHANGED;\n            } else if (dmPartner) {\n                newSnapshot.state = EncryptionEventState.ENABLED_DM;\n                newSnapshot.userName = room?.getMember(dmPartner)?.rawDisplayName ?? dmPartner;\n            } else if (isRoomLocal) {\n                newSnapshot.state = EncryptionEventState.ENABLED_LOCAL;\n            }\n        } else if (isEncrypted) {\n            newSnapshot.state = EncryptionEventState.DISABLE_ATTEMPT;\n        } else {\n            newSnapshot.state = EncryptionEventState.UNSUPPORTED;\n        }\n\n        return newSnapshot;\n    }\n}\n","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport { type MouseEventHandler } from \"react\";\nimport {\n    BaseViewModel,\n    type MessageTimestampViewSnapshot as MessageTimestampViewSnapshotInterface,\n    type MessageTimestampViewModel as MessageTimestampViewModelInterface,\n} from \"@element-hq/web-shared-components\";\n\nimport { formatFullDate, formatTime, formatFullTime, formatRelativeTime } from \"../../../../../DateUtils\";\nimport { objectHasDiff } from \"../../../../../utils/objects\";\n\nexport interface MessageTimestampViewModelProps {\n    /**\n     * Message timestamp in milliseconds since the Unix epoch.\n     */\n    ts: number;\n    /**\n     * If specified will render both the sent-at and received-at timestamps in the tooltip\n     */\n    receivedTs?: number;\n    /**\n     * If set, use a 12-hour clock for formatted times.\n     */\n    showTwelveHour?: boolean;\n    /**\n     * If set, include the full date in the displayed timestamp.\n     */\n    showFullDate?: boolean;\n    /**\n     * If set, include seconds in the displayed timestamp.\n     */\n    showSeconds?: boolean;\n    /**\n     * If set, display a relative timestamp (e.g. \"5 minutes ago\").\n     */\n    showRelative?: boolean;\n    /**\n     * If set to true then no tooltip will be shown\n     */\n    inhibitTooltip?: boolean;\n    /**\n     * If specified, will be rendered as an anchor bearing the href, a `span` element will be used otherwise\n     */\n    href?: string;\n    /**\n     * Optional onClick handler to attach to the DOM element\n     */\n    onClick?: MouseEventHandler<HTMLElement>;\n    /**\n     * Optional onContextMenu handler to attach to the DOM element\n     */\n    onContextMenu?: MouseEventHandler<HTMLElement>;\n}\n\n/**\n * ViewModel for the message timestamp, providing the current state of the component.\n */\nexport class MessageTimestampViewModel\n    extends BaseViewModel<MessageTimestampViewSnapshotInterface, MessageTimestampViewModelProps>\n    implements MessageTimestampViewModelInterface\n{\n    public onClick?: MouseEventHandler<HTMLElement>;\n    public onContextMenu?: MouseEventHandler<HTMLElement>;\n\n    private static readonly computeSnapshot = (\n        props: MessageTimestampViewModelProps,\n    ): MessageTimestampViewSnapshotInterface => {\n        const date = new Date(props.ts);\n        const sentAt = formatFullDate(date, props.showTwelveHour);\n\n        let timestamp: string;\n        if (props.showRelative) {\n            timestamp = formatRelativeTime(date, props.showTwelveHour);\n        } else if (props.showFullDate) {\n            timestamp = formatFullDate(date, props.showTwelveHour, props.showSeconds);\n        } else if (props.showSeconds) {\n            timestamp = formatFullTime(date, props.showTwelveHour);\n        } else {\n            timestamp = formatTime(date, props.showTwelveHour);\n        }\n\n        let receivedAt: string | undefined;\n        if (props.receivedTs !== undefined) {\n            const receivedDate = new Date(props.receivedTs);\n            receivedAt = formatFullDate(receivedDate, props.showTwelveHour);\n        }\n\n        return {\n            ts: timestamp,\n            tsSentAt: sentAt,\n            tsReceivedAt: receivedAt,\n            inhibitTooltip: props.inhibitTooltip,\n            href: props.href,\n        };\n    };\n\n    private replaceProps(nextProps: MessageTimestampViewModelProps): void {\n        if (!objectHasDiff(this.props, nextProps)) return;\n\n        this.props = nextProps;\n        this.onClick = this.props.onClick;\n        this.onContextMenu = this.props.onContextMenu;\n        this.snapshot.set(MessageTimestampViewModel.computeSnapshot(this.props));\n    }\n\n    /**\n     * Create a timestamp view model with initial props and snapshot.\n     */\n    public constructor(props: MessageTimestampViewModelProps) {\n        super(props, MessageTimestampViewModel.computeSnapshot(props));\n        this.onClick = props.onClick;\n        this.onContextMenu = props.onContextMenu;\n    }\n\n    /**\n     * Replace all timestamp props in one update.\n     */\n    public setProps(props: MessageTimestampViewModelProps): void {\n        this.replaceProps(props);\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type IWidget } from \"matrix-widget-api\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type Room } from \"matrix-js-sdk/src/matrix\";\n\nimport { getCallBehaviourWellKnown } from \"../utils/WellKnownUtils\";\nimport WidgetUtils from \"../utils/WidgetUtils\";\nimport { type IStoredLayout, WidgetLayoutStore } from \"../stores/widgets/WidgetLayoutStore\";\nimport WidgetEchoStore from \"../stores/WidgetEchoStore\";\nimport WidgetStore, { type IApp } from \"../stores/WidgetStore\";\nimport SdkConfig from \"../SdkConfig\";\nimport { getJoinedNonFunctionalMembers } from \"../utils/room/getJoinedNonFunctionalMembers\";\n\n/* eslint-disable camelcase */\ninterface IManagedHybridWidgetData {\n    widget_id: string;\n    widget: IWidget;\n    layout: IStoredLayout;\n}\n/* eslint-enable camelcase */\n\nfunction getWidgetBuildUrl(room: Room): string | undefined {\n    const functionalMembers = getJoinedNonFunctionalMembers(room);\n    const isDm = functionalMembers.length === 2;\n    if (SdkConfig.get().widget_build_url) {\n        if (isDm && SdkConfig.get().widget_build_url_ignore_dm) {\n            return undefined;\n        }\n        return SdkConfig.get().widget_build_url;\n    }\n\n    const wellKnown = getCallBehaviourWellKnown(room.client);\n    if (isDm && wellKnown?.ignore_dm) {\n        return undefined;\n    }\n    /* eslint-disable-next-line camelcase */\n    return wellKnown?.widget_build_url;\n}\n\nexport function isManagedHybridWidgetEnabled(room: Room): boolean {\n    return !!getWidgetBuildUrl(room);\n}\n\nexport async function addManagedHybridWidget(room: Room): Promise<void> {\n    // Check for permission\n    if (!WidgetUtils.canUserModifyWidgets(room.client, room.roomId)) {\n        logger.error(`User not allowed to modify widgets in ${room.roomId}`);\n        return;\n    }\n\n    // Get widget data\n    /* eslint-disable-next-line camelcase */\n    const widgetBuildUrl = getWidgetBuildUrl(room);\n    if (!widgetBuildUrl) {\n        return;\n    }\n    let widgetData: IManagedHybridWidgetData;\n    try {\n        const response = await fetch(`${widgetBuildUrl}?roomId=${room.roomId}`);\n        widgetData = await response.json();\n    } catch (e) {\n        logger.error(`Managed hybrid widget builder failed for room ${room.roomId}`, e);\n        return;\n    }\n    if (!widgetData) {\n        return;\n    }\n    const { widget_id: widgetId, widget: widgetContent, layout } = widgetData;\n\n    // Ensure the widget is not already present in the room\n    let widgets = WidgetStore.instance.getApps(room.roomId);\n    const existing = widgets.some((w) => w.id === widgetId) || WidgetEchoStore.roomHasPendingWidgets(room.roomId, []);\n    if (existing) {\n        logger.error(`Managed hybrid widget already present in room ${room.roomId}`);\n        return;\n    }\n\n    // Add the widget\n    try {\n        await WidgetUtils.setRoomWidgetContent(room.client, room.roomId, widgetId, {\n            ...widgetContent,\n            \"io.element.managed_hybrid\": true,\n        });\n    } catch (e) {\n        logger.error(`Unable to add managed hybrid widget in room ${room.roomId}`, e);\n        return;\n    }\n\n    // Move the widget into position\n    if (!WidgetLayoutStore.instance.canCopyLayoutToRoom(room)) {\n        return;\n    }\n    widgets = WidgetStore.instance.getApps(room.roomId);\n    const installedWidget = widgets.find((w) => w.id === widgetId);\n    if (!installedWidget) {\n        return;\n    }\n    WidgetLayoutStore.instance.moveToContainer(room, installedWidget, layout.container);\n    WidgetLayoutStore.instance.setContainerHeight(room, layout.container, layout.height);\n    WidgetLayoutStore.instance.copyLayoutToRoom(room);\n}\n\nexport function isManagedHybridWidget(widget: IApp): boolean {\n    return !!widget[\"io.element.managed_hybrid\"];\n}\n","module.exports = \"img/social/email-1.4053cdb.png\";","module.exports = \"img/social/facebook.b008f77.png\";","module.exports = \"img/social/linkedin.5764540.png\";","module.exports = \"img/social/reddit.5424a6c.png\";","module.exports = \"img/social/twitter-2.711a2e5.png\";","\"use strict\";\n/*\nCopyright 2019-2024 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EMOJI = exports.DATA_BY_CATEGORY = exports.getEmojiFromUnicode = exports.EMOTICON_TO_EMOJI = void 0;\nconst compact_json_1 = __importDefault(require(\"emojibase-data/en/compact.json\"));\nconst iamcal_json_1 = __importDefault(require(\"emojibase-data/en/shortcodes/iamcal.json\"));\nconst emoji_json_1 = __importDefault(require(\"emojibase-data/versions/emoji.json\"));\nconst emojibase_1 = require(\"emojibase\");\nconst MAX_EMOJI_VERSION_WEB = 17.0;\n// The unicode is stored without the variant selector\nconst UNICODE_TO_EMOJI = new Map(); // not exported as gets for it are handled by getEmojiFromUnicode\nexports.EMOTICON_TO_EMOJI = new Map();\nconst getEmojiFromUnicode = (unicode) => UNICODE_TO_EMOJI.get(stripVariation(unicode));\nexports.getEmojiFromUnicode = getEmojiFromUnicode;\nconst isRegionalIndicator = (x) => {\n    // First verify that the string is a single character. We use Array.from\n    // to make sure we count by characters, not UTF-8 code units.\n    return (Array.from(x).length === 1 &&\n        // Next verify that the character is within the code point range for\n        // regional indicators.\n        // http://unicode.org/charts/PDF/Unicode-6.0/U60-1F100.pdf\n        x >= \"\\u{1f1e6}\" &&\n        x <= \"\\u{1f1ff}\");\n};\nconst EMOJIBASE_GROUP_ID_TO_CATEGORY = [\n    \"people\",\n    \"people\",\n    \"control\",\n    \"nature\",\n    \"foods\",\n    \"places\",\n    \"activity\",\n    \"objects\",\n    \"symbols\",\n    \"flags\",\n];\nexports.DATA_BY_CATEGORY = {\n    people: [],\n    nature: [],\n    foods: [],\n    places: [],\n    activity: [],\n    objects: [],\n    symbols: [],\n    flags: [],\n};\n// The MAX emoji version to be included in exported data.\n// This can be present as an env variable when it is being run for the mobile context.\n// We support setting a max emoji version so that we can upgrade emojibase for its library\n// features but not force a version on all platforms. Web for example needs to be upgraded\n// in unison with twemoji.\nconst MAX_EMOJI_VERSION = parseFloat(process.env.MAX_EMOJI_VERSION) || MAX_EMOJI_VERSION_WEB;\n// The compact version of emojibase does not have version stored on the emoji object\n// but there does existing a map of version to emoji.\n// Create a map of emoji to version so that we can lookup an emoji version and filter.\nconst EMOJI_TO_VERSION = new Map();\nfor (const [versionString, emojis] of Object.entries(emoji_json_1.default)) {\n    const version = parseFloat(versionString);\n    emojis.forEach((emoji) => EMOJI_TO_VERSION.set(emoji, version));\n}\n// Store various mappings from unicode/emoticon/shortcode to the Emoji objects\nexports.EMOJI = compact_json_1.default.filter((emojiData) => {\n    // filter emojis that are less than or equal to MAX_EMOJI_VERSION\n    const version = EMOJI_TO_VERSION.get(emojiData.hexcode);\n    return version !== undefined && version <= MAX_EMOJI_VERSION;\n}).map((emojiData) => {\n    // If there's ever a gap in shortcode coverage, we fudge it by\n    // filling it in with the emoji's CLDR annotation\n    const shortcodeData = iamcal_json_1.default[emojiData.hexcode] ?? [\n        emojiData.label.toLowerCase().replace(/\\W+/g, \"_\"),\n    ];\n    const emoji = {\n        ...emojiData,\n        // Homogenize shortcodes by ensuring that everything is an array\n        shortcodes: typeof shortcodeData === \"string\" ? [shortcodeData] : shortcodeData,\n    };\n    return emoji;\n});\nexports.EMOJI.forEach((emoji) => {\n    // We manually include regional indicators in the symbols group, since\n    // Emojibase intentionally leaves them uncategorized\n    const categoryId = EMOJIBASE_GROUP_ID_TO_CATEGORY[emoji.group] ??\n        (isRegionalIndicator(emoji.unicode) ? \"symbols\" : null);\n    if (exports.DATA_BY_CATEGORY.hasOwnProperty(categoryId)) {\n        exports.DATA_BY_CATEGORY[categoryId].push(emoji);\n    }\n    // Add mapping from unicode to Emoji object\n    // The 'unicode' field that we use in emojibase has either\n    // VS15 or VS16 appended to any characters that can take\n    // variation selectors. Which one it appends depends\n    // on whether emojibase considers their type to be 'text' or\n    // 'emoji'. We therefore strip any variation chars from strings\n    // both when building the map and when looking up.\n    UNICODE_TO_EMOJI.set(stripVariation(emoji.unicode), emoji);\n    if (emoji.emoticon) {\n        // Add mapping from emoticon to Emoji object\n        const emoticons = [emoji.emoticon]\n            //flatten, in case `emoji.emoticon` is an array\n            .flat()\n            .flatMap((x) => (0, emojibase_1.generateEmoticonPermutations)(x));\n        emoticons.forEach((x) => exports.EMOTICON_TO_EMOJI.set(x, emoji));\n    }\n});\n/**\n * Strips variation selectors from the end of given string\n * NB. Skin tone modifiers are not variation selectors:\n * this function does not touch them. (Should it?)\n *\n * @param {string} str string to strip\n * @returns {string} stripped string\n */\nfunction stripVariation(str) {\n    return str.replace(/[\\uFE00-\\uFE0F]$/, \"\");\n}\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.RoomViewLifecycle = void 0;\n\n/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nvar RoomViewLifecycle;\nexports.RoomViewLifecycle = RoomViewLifecycle;\n\n(function (RoomViewLifecycle) {\n  RoomViewLifecycle[\"PreviewRoomNotLoggedIn\"] = \"preview_not_logged_in\";\n  RoomViewLifecycle[\"JoinFromRoomPreview\"] = \"try_join_not_logged_in\";\n  RoomViewLifecycle[\"ViewRoom\"] = \"view_room\";\n})(RoomViewLifecycle || (exports.RoomViewLifecycle = RoomViewLifecycle = {}));","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WidgetLifecycle = void 0;\n\n/*\nCopyright 2023 Mikhail Aheichyk\nCopyright 2023 Nordeck IT + Consulting GmbH.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nvar WidgetLifecycle;\nexports.WidgetLifecycle = WidgetLifecycle;\n\n(function (WidgetLifecycle) {\n  WidgetLifecycle[\"CapabilitiesRequest\"] = \"capabilities_request\";\n  WidgetLifecycle[\"PreLoadRequest\"] = \"preload_request\";\n  WidgetLifecycle[\"IdentityRequest\"] = \"identity_request\";\n})(WidgetLifecycle || (exports.WidgetLifecycle = WidgetLifecycle = {}));\n/**\n * Listener for PreLoad and Identity requests\n */\n\n/**\n * Represents the widget\n */","const digitCharacters = [\n  \"0\",\n  \"1\",\n  \"2\",\n  \"3\",\n  \"4\",\n  \"5\",\n  \"6\",\n  \"7\",\n  \"8\",\n  \"9\",\n  \"A\",\n  \"B\",\n  \"C\",\n  \"D\",\n  \"E\",\n  \"F\",\n  \"G\",\n  \"H\",\n  \"I\",\n  \"J\",\n  \"K\",\n  \"L\",\n  \"M\",\n  \"N\",\n  \"O\",\n  \"P\",\n  \"Q\",\n  \"R\",\n  \"S\",\n  \"T\",\n  \"U\",\n  \"V\",\n  \"W\",\n  \"X\",\n  \"Y\",\n  \"Z\",\n  \"a\",\n  \"b\",\n  \"c\",\n  \"d\",\n  \"e\",\n  \"f\",\n  \"g\",\n  \"h\",\n  \"i\",\n  \"j\",\n  \"k\",\n  \"l\",\n  \"m\",\n  \"n\",\n  \"o\",\n  \"p\",\n  \"q\",\n  \"r\",\n  \"s\",\n  \"t\",\n  \"u\",\n  \"v\",\n  \"w\",\n  \"x\",\n  \"y\",\n  \"z\",\n  \"#\",\n  \"$\",\n  \"%\",\n  \"*\",\n  \"+\",\n  \",\",\n  \"-\",\n  \".\",\n  \":\",\n  \";\",\n  \"=\",\n  \"?\",\n  \"@\",\n  \"[\",\n  \"]\",\n  \"^\",\n  \"_\",\n  \"{\",\n  \"|\",\n  \"}\",\n  \"~\",\n];\n\nexport const decode83 = (str: String) => {\n  let value = 0;\n  for (let i = 0; i < str.length; i++) {\n    const c = str[i];\n    const digit = digitCharacters.indexOf(c);\n    value = value * 83 + digit;\n  }\n  return value;\n};\n\nexport const encode83 = (n: number, length: number): string => {\n  var result = \"\";\n  for (let i = 1; i <= length; i++) {\n    let digit = (Math.floor(n) / Math.pow(83, length - i)) % 83;\n    result += digitCharacters[Math.floor(digit)];\n  }\n  return result;\n};\n","export const sRGBToLinear = (value: number) => {\n  let v = value / 255;\n  if (v <= 0.04045) {\n    return v / 12.92;\n  } else {\n    return Math.pow((v + 0.055) / 1.055, 2.4);\n  }\n};\n\nexport const linearTosRGB = (value: number) => {\n  let v = Math.max(0, Math.min(1, value));\n  if (v <= 0.0031308) {\n    return Math.trunc(v * 12.92 * 255 + 0.5);\n  } else {\n    return Math.trunc((1.055 * Math.pow(v, 1 / 2.4) - 0.055) * 255 + 0.5);\n  }\n};\n\nexport const sign = (n: number) => (n < 0 ? -1 : 1);\n\nexport const signPow = (val: number, exp: number) =>\n  sign(val) * Math.pow(Math.abs(val), exp);\n","export class ValidationError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"ValidationError\";\n    this.message = message;\n  }\n}\n","import { decode83 } from \"./base83\";\nimport { sRGBToLinear, signPow, linearTosRGB } from \"./utils\";\nimport { ValidationError } from \"./error\";\n\n/**\n * Returns an error message if invalid or undefined if valid\n * @param blurhash\n */\nconst validateBlurhash = (blurhash: string) => {\n  if (!blurhash || blurhash.length < 6) {\n    throw new ValidationError(\n      \"The blurhash string must be at least 6 characters\"\n    );\n  }\n\n  const sizeFlag = decode83(blurhash[0]);\n  const numY = Math.floor(sizeFlag / 9) + 1;\n  const numX = (sizeFlag % 9) + 1;\n\n  if (blurhash.length !== 4 + 2 * numX * numY) {\n    throw new ValidationError(\n      `blurhash length mismatch: length is ${\n        blurhash.length\n      } but it should be ${4 + 2 * numX * numY}`\n    );\n  }\n};\n\nexport const isBlurhashValid = (\n  blurhash: string\n): { result: boolean; errorReason?: string } => {\n  try {\n    validateBlurhash(blurhash);\n  } catch (error) {\n    return { result: false, errorReason: error.message };\n  }\n\n  return { result: true };\n};\n\nconst decodeDC = (value: number) => {\n  const intR = value >> 16;\n  const intG = (value >> 8) & 255;\n  const intB = value & 255;\n  return [sRGBToLinear(intR), sRGBToLinear(intG), sRGBToLinear(intB)];\n};\n\nconst decodeAC = (value: number, maximumValue: number) => {\n  const quantR = Math.floor(value / (19 * 19));\n  const quantG = Math.floor(value / 19) % 19;\n  const quantB = value % 19;\n\n  const rgb = [\n    signPow((quantR - 9) / 9, 2.0) * maximumValue,\n    signPow((quantG - 9) / 9, 2.0) * maximumValue,\n    signPow((quantB - 9) / 9, 2.0) * maximumValue,\n  ];\n\n  return rgb;\n};\n\nconst decode = (\n  blurhash: string,\n  width: number,\n  height: number,\n  punch?: number\n) => {\n  validateBlurhash(blurhash);\n\n  punch = punch | 1;\n\n  const sizeFlag = decode83(blurhash[0]);\n  const numY = Math.floor(sizeFlag / 9) + 1;\n  const numX = (sizeFlag % 9) + 1;\n\n  const quantisedMaximumValue = decode83(blurhash[1]);\n  const maximumValue = (quantisedMaximumValue + 1) / 166;\n\n  const colors = new Array(numX * numY);\n\n  for (let i = 0; i < colors.length; i++) {\n    if (i === 0) {\n      const value = decode83(blurhash.substring(2, 6));\n      colors[i] = decodeDC(value);\n    } else {\n      const value = decode83(blurhash.substring(4 + i * 2, 6 + i * 2));\n      colors[i] = decodeAC(value, maximumValue * punch);\n    }\n  }\n\n  const bytesPerRow = width * 4;\n  const pixels = new Uint8ClampedArray(bytesPerRow * height);\n\n  for (let y = 0; y < height; y++) {\n    for (let x = 0; x < width; x++) {\n      let r = 0;\n      let g = 0;\n      let b = 0;\n\n      for (let j = 0; j < numY; j++) {\n        for (let i = 0; i < numX; i++) {\n          const basis =\n            Math.cos((Math.PI * x * i) / width) *\n            Math.cos((Math.PI * y * j) / height);\n          let color = colors[i + j * numX];\n          r += color[0] * basis;\n          g += color[1] * basis;\n          b += color[2] * basis;\n        }\n      }\n\n      let intR = linearTosRGB(r);\n      let intG = linearTosRGB(g);\n      let intB = linearTosRGB(b);\n\n      pixels[4 * x + 0 + y * bytesPerRow] = intR;\n      pixels[4 * x + 1 + y * bytesPerRow] = intG;\n      pixels[4 * x + 2 + y * bytesPerRow] = intB;\n      pixels[4 * x + 3 + y * bytesPerRow] = 255; // alpha\n    }\n  }\n  return pixels;\n};\n\nexport default decode;\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\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 * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author fraser@google.com (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nvar diff_match_patch = function() {\n\n  // Defaults.\n  // Redefine these in your program to override the defaults.\n\n  // Number of seconds to map a diff before giving up (0 for infinity).\n  this.Diff_Timeout = 1.0;\n  // Cost of an empty edit operation in terms of edit characters.\n  this.Diff_EditCost = 4;\n  // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n  this.Match_Threshold = 0.5;\n  // How far to search for a match (0 = exact location, 1000+ = broad match).\n  // A match this many characters away from the expected location will add\n  // 1.0 to the score (0.0 is a perfect match).\n  this.Match_Distance = 1000;\n  // When deleting a large block of text (over ~64 characters), how close do\n  // the contents have to be to match the expected contents. (0.0 = perfection,\n  // 1.0 = very loose).  Note that Match_Threshold controls how closely the\n  // end points of a delete need to match.\n  this.Patch_DeleteThreshold = 0.5;\n  // Chunk size for context length.\n  this.Patch_Margin = 4;\n\n  // The number of bits in an int.\n  this.Match_MaxBits = 32;\n};\n\n\n//  DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Class representing one diff tuple.\n * ~Attempts to look like a two-element array (which is what this used to be).~\n * Constructor returns an actual two-element array, to allow destructing @JackuB\n * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n * @param {string} text Text to be deleted, inserted, or retained.\n * @constructor\n */\ndiff_match_patch.Diff = function(op, text) {\n  return [op, text];\n};\n\n/**\n * Find the differences between two texts.  Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n *     then don't run a line-level diff first to identify the changed areas.\n *     Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number=} opt_deadline Optional time when the diff should be complete\n *     by.  Used internally for recursive calls.  Users should set DiffTimeout\n *     instead.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n    opt_deadline) {\n  // Set a deadline by which time the diff must be complete.\n  if (typeof opt_deadline == 'undefined') {\n    if (this.Diff_Timeout <= 0) {\n      opt_deadline = Number.MAX_VALUE;\n    } else {\n      opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n    }\n  }\n  var deadline = opt_deadline;\n\n  // Check for null inputs.\n  if (text1 == null || text2 == null) {\n    throw new Error('Null input. (diff_main)');\n  }\n\n  // Check for equality (speedup).\n  if (text1 == text2) {\n    if (text1) {\n      return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n    }\n    return [];\n  }\n\n  if (typeof opt_checklines == 'undefined') {\n    opt_checklines = true;\n  }\n  var checklines = opt_checklines;\n\n  // Trim off common prefix (speedup).\n  var commonlength = this.diff_commonPrefix(text1, text2);\n  var commonprefix = text1.substring(0, commonlength);\n  text1 = text1.substring(commonlength);\n  text2 = text2.substring(commonlength);\n\n  // Trim off common suffix (speedup).\n  commonlength = this.diff_commonSuffix(text1, text2);\n  var commonsuffix = text1.substring(text1.length - commonlength);\n  text1 = text1.substring(0, text1.length - commonlength);\n  text2 = text2.substring(0, text2.length - commonlength);\n\n  // Compute the diff on the middle block.\n  var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n  // Restore the prefix and suffix.\n  if (commonprefix) {\n    diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n  }\n  if (commonsuffix) {\n    diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n  }\n  this.diff_cleanupMerge(diffs);\n  return diffs;\n};\n\n\n/**\n * Find the differences between two texts.  Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag.  If false, then don't run a\n *     line-level diff first to identify the changed areas.\n *     If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n    deadline) {\n  var diffs;\n\n  if (!text1) {\n    // Just add some text (speedup).\n    return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n  }\n\n  if (!text2) {\n    // Just delete some text (speedup).\n    return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n  }\n\n  var longtext = text1.length > text2.length ? text1 : text2;\n  var shorttext = text1.length > text2.length ? text2 : text1;\n  var i = longtext.indexOf(shorttext);\n  if (i != -1) {\n    // Shorter text is inside the longer text (speedup).\n    diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)),\n             new diff_match_patch.Diff(DIFF_EQUAL, shorttext),\n             new diff_match_patch.Diff(DIFF_INSERT,\n                 longtext.substring(i + shorttext.length))];\n    // Swap insertions for deletions if diff is reversed.\n    if (text1.length > text2.length) {\n      diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n    }\n    return diffs;\n  }\n\n  if (shorttext.length == 1) {\n    // Single character string.\n    // After the previous speedup, the character can't be an equality.\n    return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n            new diff_match_patch.Diff(DIFF_INSERT, text2)];\n  }\n\n  // Check to see if the problem can be split in two.\n  var hm = this.diff_halfMatch_(text1, text2);\n  if (hm) {\n    // A half-match was found, sort out the return data.\n    var text1_a = hm[0];\n    var text1_b = hm[1];\n    var text2_a = hm[2];\n    var text2_b = hm[3];\n    var mid_common = hm[4];\n    // Send both pairs off for separate processing.\n    var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n    var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n    // Merge the results.\n    return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)],\n                          diffs_b);\n  }\n\n  if (checklines && text1.length > 100 && text2.length > 100) {\n    return this.diff_lineMode_(text1, text2, deadline);\n  }\n\n  return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n  // Scan the text on a line-by-line basis first.\n  var a = this.diff_linesToChars_(text1, text2);\n  text1 = a.chars1;\n  text2 = a.chars2;\n  var linearray = a.lineArray;\n\n  var diffs = this.diff_main(text1, text2, false, deadline);\n\n  // Convert the diff back to original text.\n  this.diff_charsToLines_(diffs, linearray);\n  // Eliminate freak matches (e.g. blank lines)\n  this.diff_cleanupSemantic(diffs);\n\n  // Rediff any replacement blocks, this time character-by-character.\n  // Add a dummy entry at the end.\n  diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n  var pointer = 0;\n  var count_delete = 0;\n  var count_insert = 0;\n  var text_delete = '';\n  var text_insert = '';\n  while (pointer < diffs.length) {\n    switch (diffs[pointer][0]) {\n      case DIFF_INSERT:\n        count_insert++;\n        text_insert += diffs[pointer][1];\n        break;\n      case DIFF_DELETE:\n        count_delete++;\n        text_delete += diffs[pointer][1];\n        break;\n      case DIFF_EQUAL:\n        // Upon reaching an equality, check for prior redundancies.\n        if (count_delete >= 1 && count_insert >= 1) {\n          // Delete the offending records and add the merged ones.\n          diffs.splice(pointer - count_delete - count_insert,\n                       count_delete + count_insert);\n          pointer = pointer - count_delete - count_insert;\n          var subDiff =\n              this.diff_main(text_delete, text_insert, false, deadline);\n          for (var j = subDiff.length - 1; j >= 0; j--) {\n            diffs.splice(pointer, 0, subDiff[j]);\n          }\n          pointer = pointer + subDiff.length;\n        }\n        count_insert = 0;\n        count_delete = 0;\n        text_delete = '';\n        text_insert = '';\n        break;\n    }\n    pointer++;\n  }\n  diffs.pop();  // Remove the dummy entry at the end.\n\n  return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n  // Cache the text lengths to prevent multiple calls.\n  var text1_length = text1.length;\n  var text2_length = text2.length;\n  var max_d = Math.ceil((text1_length + text2_length) / 2);\n  var v_offset = max_d;\n  var v_length = 2 * max_d;\n  var v1 = new Array(v_length);\n  var v2 = new Array(v_length);\n  // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n  // integers and undefined.\n  for (var x = 0; x < v_length; x++) {\n    v1[x] = -1;\n    v2[x] = -1;\n  }\n  v1[v_offset + 1] = 0;\n  v2[v_offset + 1] = 0;\n  var delta = text1_length - text2_length;\n  // If the total number of characters is odd, then the front path will collide\n  // with the reverse path.\n  var front = (delta % 2 != 0);\n  // Offsets for start and end of k loop.\n  // Prevents mapping of space beyond the grid.\n  var k1start = 0;\n  var k1end = 0;\n  var k2start = 0;\n  var k2end = 0;\n  for (var d = 0; d < max_d; d++) {\n    // Bail out if deadline is reached.\n    if ((new Date()).getTime() > deadline) {\n      break;\n    }\n\n    // Walk the front path one step.\n    for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n      var k1_offset = v_offset + k1;\n      var x1;\n      if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n        x1 = v1[k1_offset + 1];\n      } else {\n        x1 = v1[k1_offset - 1] + 1;\n      }\n      var y1 = x1 - k1;\n      while (x1 < text1_length && y1 < text2_length &&\n             text1.charAt(x1) == text2.charAt(y1)) {\n        x1++;\n        y1++;\n      }\n      v1[k1_offset] = x1;\n      if (x1 > text1_length) {\n        // Ran off the right of the graph.\n        k1end += 2;\n      } else if (y1 > text2_length) {\n        // Ran off the bottom of the graph.\n        k1start += 2;\n      } else if (front) {\n        var k2_offset = v_offset + delta - k1;\n        if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n          // Mirror x2 onto top-left coordinate system.\n          var x2 = text1_length - v2[k2_offset];\n          if (x1 >= x2) {\n            // Overlap detected.\n            return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n          }\n        }\n      }\n    }\n\n    // Walk the reverse path one step.\n    for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n      var k2_offset = v_offset + k2;\n      var x2;\n      if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n        x2 = v2[k2_offset + 1];\n      } else {\n        x2 = v2[k2_offset - 1] + 1;\n      }\n      var y2 = x2 - k2;\n      while (x2 < text1_length && y2 < text2_length &&\n             text1.charAt(text1_length - x2 - 1) ==\n             text2.charAt(text2_length - y2 - 1)) {\n        x2++;\n        y2++;\n      }\n      v2[k2_offset] = x2;\n      if (x2 > text1_length) {\n        // Ran off the left of the graph.\n        k2end += 2;\n      } else if (y2 > text2_length) {\n        // Ran off the top of the graph.\n        k2start += 2;\n      } else if (!front) {\n        var k1_offset = v_offset + delta - k2;\n        if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n          var x1 = v1[k1_offset];\n          var y1 = v_offset + x1 - k1_offset;\n          // Mirror x2 onto top-left coordinate system.\n          x2 = text1_length - x2;\n          if (x1 >= x2) {\n            // Overlap detected.\n            return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n          }\n        }\n      }\n    }\n  }\n  // Diff took too long and hit the deadline or\n  // number of diffs equals number of characters, no commonality at all.\n  return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n          new diff_match_patch.Diff(DIFF_INSERT, text2)];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n    deadline) {\n  var text1a = text1.substring(0, x);\n  var text2a = text2.substring(0, y);\n  var text1b = text1.substring(x);\n  var text2b = text2.substring(y);\n\n  // Compute both diffs serially.\n  var diffs = this.diff_main(text1a, text2a, false, deadline);\n  var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n  return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings.  Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n *     An object containing the encoded text1, the encoded text2 and\n *     the array of unique strings.\n *     The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n  var lineArray = [];  // e.g. lineArray[4] == 'Hello\\n'\n  var lineHash = {};   // e.g. lineHash['Hello\\n'] == 4\n\n  // '\\x00' is a valid character, but various debuggers don't like it.\n  // So we'll insert a junk entry to avoid generating a null character.\n  lineArray[0] = '';\n\n  /**\n   * Split a text into an array of strings.  Reduce the texts to a string of\n   * hashes where each Unicode character represents one line.\n   * Modifies linearray and linehash through being a closure.\n   * @param {string} text String to encode.\n   * @return {string} Encoded string.\n   * @private\n   */\n  function diff_linesToCharsMunge_(text) {\n    var chars = '';\n    // Walk the text, pulling out a substring for each line.\n    // text.split('\\n') would would temporarily double our memory footprint.\n    // Modifying text would create many large strings to garbage collect.\n    var lineStart = 0;\n    var lineEnd = -1;\n    // Keeping our own length variable is faster than looking it up.\n    var lineArrayLength = lineArray.length;\n    while (lineEnd < text.length - 1) {\n      lineEnd = text.indexOf('\\n', lineStart);\n      if (lineEnd == -1) {\n        lineEnd = text.length - 1;\n      }\n      var line = text.substring(lineStart, lineEnd + 1);\n\n      if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n          (lineHash[line] !== undefined)) {\n        chars += String.fromCharCode(lineHash[line]);\n      } else {\n        if (lineArrayLength == maxLines) {\n          // Bail out at 65535 because\n          // String.fromCharCode(65536) == String.fromCharCode(0)\n          line = text.substring(lineStart);\n          lineEnd = text.length;\n        }\n        chars += String.fromCharCode(lineArrayLength);\n        lineHash[line] = lineArrayLength;\n        lineArray[lineArrayLength++] = line;\n      }\n      lineStart = lineEnd + 1;\n    }\n    return chars;\n  }\n  // Allocate 2/3rds of the space for text1, the rest for text2.\n  var maxLines = 40000;\n  var chars1 = diff_linesToCharsMunge_(text1);\n  maxLines = 65535;\n  var chars2 = diff_linesToCharsMunge_(text2);\n  return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {!Array.<string>} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n  for (var i = 0; i < diffs.length; i++) {\n    var chars = diffs[i][1];\n    var text = [];\n    for (var j = 0; j < chars.length; j++) {\n      text[j] = lineArray[chars.charCodeAt(j)];\n    }\n    diffs[i][1] = text.join('');\n  }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n *     string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n  // Quick check for common null cases.\n  if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n    return 0;\n  }\n  // Binary search.\n  // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n  var pointermin = 0;\n  var pointermax = Math.min(text1.length, text2.length);\n  var pointermid = pointermax;\n  var pointerstart = 0;\n  while (pointermin < pointermid) {\n    if (text1.substring(pointerstart, pointermid) ==\n        text2.substring(pointerstart, pointermid)) {\n      pointermin = pointermid;\n      pointerstart = pointermin;\n    } else {\n      pointermax = pointermid;\n    }\n    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n  }\n  return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n  // Quick check for common null cases.\n  if (!text1 || !text2 ||\n      text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n    return 0;\n  }\n  // Binary search.\n  // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n  var pointermin = 0;\n  var pointermax = Math.min(text1.length, text2.length);\n  var pointermid = pointermax;\n  var pointerend = 0;\n  while (pointermin < pointermid) {\n    if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n        text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n      pointermin = pointermid;\n      pointerend = pointermin;\n    } else {\n      pointermax = pointermid;\n    }\n    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n  }\n  return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n *     string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n  // Cache the text lengths to prevent multiple calls.\n  var text1_length = text1.length;\n  var text2_length = text2.length;\n  // Eliminate the null case.\n  if (text1_length == 0 || text2_length == 0) {\n    return 0;\n  }\n  // Truncate the longer string.\n  if (text1_length > text2_length) {\n    text1 = text1.substring(text1_length - text2_length);\n  } else if (text1_length < text2_length) {\n    text2 = text2.substring(0, text1_length);\n  }\n  var text_length = Math.min(text1_length, text2_length);\n  // Quick check for the worst case.\n  if (text1 == text2) {\n    return text_length;\n  }\n\n  // Start by looking for a single character match\n  // and increase length until no match is found.\n  // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n  var best = 0;\n  var length = 1;\n  while (true) {\n    var pattern = text1.substring(text_length - length);\n    var found = text2.indexOf(pattern);\n    if (found == -1) {\n      return best;\n    }\n    length += found;\n    if (found == 0 || text1.substring(text_length - length) ==\n        text2.substring(0, length)) {\n      best = length;\n      length++;\n    }\n  }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n *     text1, the suffix of text1, the prefix of text2, the suffix of\n *     text2 and the common middle.  Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n  if (this.Diff_Timeout <= 0) {\n    // Don't risk returning a non-optimal diff if we have unlimited time.\n    return null;\n  }\n  var longtext = text1.length > text2.length ? text1 : text2;\n  var shorttext = text1.length > text2.length ? text2 : text1;\n  if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n    return null;  // Pointless.\n  }\n  var dmp = this;  // 'this' becomes 'window' in a closure.\n\n  /**\n   * Does a substring of shorttext exist within longtext such that the substring\n   * is at least half the length of longtext?\n   * Closure, but does not reference any external variables.\n   * @param {string} longtext Longer string.\n   * @param {string} shorttext Shorter string.\n   * @param {number} i Start index of quarter length substring within longtext.\n   * @return {Array.<string>} Five element Array, containing the prefix of\n   *     longtext, the suffix of longtext, the prefix of shorttext, the suffix\n   *     of shorttext and the common middle.  Or null if there was no match.\n   * @private\n   */\n  function diff_halfMatchI_(longtext, shorttext, i) {\n    // Start with a 1/4 length substring at position i as a seed.\n    var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n    var j = -1;\n    var best_common = '';\n    var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n    while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n      var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n                                               shorttext.substring(j));\n      var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n                                               shorttext.substring(0, j));\n      if (best_common.length < suffixLength + prefixLength) {\n        best_common = shorttext.substring(j - suffixLength, j) +\n            shorttext.substring(j, j + prefixLength);\n        best_longtext_a = longtext.substring(0, i - suffixLength);\n        best_longtext_b = longtext.substring(i + prefixLength);\n        best_shorttext_a = shorttext.substring(0, j - suffixLength);\n        best_shorttext_b = shorttext.substring(j + prefixLength);\n      }\n    }\n    if (best_common.length * 2 >= longtext.length) {\n      return [best_longtext_a, best_longtext_b,\n              best_shorttext_a, best_shorttext_b, best_common];\n    } else {\n      return null;\n    }\n  }\n\n  // First check if the second quarter is the seed for a half-match.\n  var hm1 = diff_halfMatchI_(longtext, shorttext,\n                             Math.ceil(longtext.length / 4));\n  // Check again based on the third quarter.\n  var hm2 = diff_halfMatchI_(longtext, shorttext,\n                             Math.ceil(longtext.length / 2));\n  var hm;\n  if (!hm1 && !hm2) {\n    return null;\n  } else if (!hm2) {\n    hm = hm1;\n  } else if (!hm1) {\n    hm = hm2;\n  } else {\n    // Both matched.  Select the longest.\n    hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n  }\n\n  // A half-match was found, sort out the return data.\n  var text1_a, text1_b, text2_a, text2_b;\n  if (text1.length > text2.length) {\n    text1_a = hm[0];\n    text1_b = hm[1];\n    text2_a = hm[2];\n    text2_b = hm[3];\n  } else {\n    text2_a = hm[0];\n    text2_b = hm[1];\n    text1_a = hm[2];\n    text1_b = hm[3];\n  }\n  var mid_common = hm[4];\n  return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n  var changes = false;\n  var equalities = [];  // Stack of indices where equalities are found.\n  var equalitiesLength = 0;  // Keeping our own length var is faster in JS.\n  /** @type {?string} */\n  var lastEquality = null;\n  // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n  var pointer = 0;  // Index of current position.\n  // Number of characters that changed prior to the equality.\n  var length_insertions1 = 0;\n  var length_deletions1 = 0;\n  // Number of characters that changed after the equality.\n  var length_insertions2 = 0;\n  var length_deletions2 = 0;\n  while (pointer < diffs.length) {\n    if (diffs[pointer][0] == DIFF_EQUAL) {  // Equality found.\n      equalities[equalitiesLength++] = pointer;\n      length_insertions1 = length_insertions2;\n      length_deletions1 = length_deletions2;\n      length_insertions2 = 0;\n      length_deletions2 = 0;\n      lastEquality = diffs[pointer][1];\n    } else {  // An insertion or deletion.\n      if (diffs[pointer][0] == DIFF_INSERT) {\n        length_insertions2 += diffs[pointer][1].length;\n      } else {\n        length_deletions2 += diffs[pointer][1].length;\n      }\n      // Eliminate an equality that is smaller or equal to the edits on both\n      // sides of it.\n      if (lastEquality && (lastEquality.length <=\n          Math.max(length_insertions1, length_deletions1)) &&\n          (lastEquality.length <= Math.max(length_insertions2,\n                                           length_deletions2))) {\n        // Duplicate record.\n        diffs.splice(equalities[equalitiesLength - 1], 0,\n                     new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n        // Change second copy to insert.\n        diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n        // Throw away the equality we just deleted.\n        equalitiesLength--;\n        // Throw away the previous equality (it needs to be reevaluated).\n        equalitiesLength--;\n        pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n        length_insertions1 = 0;  // Reset the counters.\n        length_deletions1 = 0;\n        length_insertions2 = 0;\n        length_deletions2 = 0;\n        lastEquality = null;\n        changes = true;\n      }\n    }\n    pointer++;\n  }\n\n  // Normalize the diff.\n  if (changes) {\n    this.diff_cleanupMerge(diffs);\n  }\n  this.diff_cleanupSemanticLossless(diffs);\n\n  // Find any overlaps between deletions and insertions.\n  // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n  //   -> <del>abc</del>xxx<ins>def</ins>\n  // e.g: <del>xxxabc</del><ins>defxxx</ins>\n  //   -> <ins>def</ins>xxx<del>abc</del>\n  // Only extract an overlap if it is as big as the edit ahead or behind it.\n  pointer = 1;\n  while (pointer < diffs.length) {\n    if (diffs[pointer - 1][0] == DIFF_DELETE &&\n        diffs[pointer][0] == DIFF_INSERT) {\n      var deletion = diffs[pointer - 1][1];\n      var insertion = diffs[pointer][1];\n      var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n      var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n      if (overlap_length1 >= overlap_length2) {\n        if (overlap_length1 >= deletion.length / 2 ||\n            overlap_length1 >= insertion.length / 2) {\n          // Overlap found.  Insert an equality and trim the surrounding edits.\n          diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n              insertion.substring(0, overlap_length1)));\n          diffs[pointer - 1][1] =\n              deletion.substring(0, deletion.length - overlap_length1);\n          diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n          pointer++;\n        }\n      } else {\n        if (overlap_length2 >= deletion.length / 2 ||\n            overlap_length2 >= insertion.length / 2) {\n          // Reverse overlap found.\n          // Insert an equality and swap and trim the surrounding edits.\n          diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n              deletion.substring(0, overlap_length2)));\n          diffs[pointer - 1][0] = DIFF_INSERT;\n          diffs[pointer - 1][1] =\n              insertion.substring(0, insertion.length - overlap_length2);\n          diffs[pointer + 1][0] = DIFF_DELETE;\n          diffs[pointer + 1][1] =\n              deletion.substring(overlap_length2);\n          pointer++;\n        }\n      }\n      pointer++;\n    }\n    pointer++;\n  }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n  /**\n   * Given two strings, compute a score representing whether the internal\n   * boundary falls on logical boundaries.\n   * Scores range from 6 (best) to 0 (worst).\n   * Closure, but does not reference any external variables.\n   * @param {string} one First string.\n   * @param {string} two Second string.\n   * @return {number} The score.\n   * @private\n   */\n  function diff_cleanupSemanticScore_(one, two) {\n    if (!one || !two) {\n      // Edges are the best.\n      return 6;\n    }\n\n    // Each port of this function behaves slightly differently due to\n    // subtle differences in each language's definition of things like\n    // 'whitespace'.  Since this function's purpose is largely cosmetic,\n    // the choice has been made to use each language's native features\n    // rather than force total conformity.\n    var char1 = one.charAt(one.length - 1);\n    var char2 = two.charAt(0);\n    var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n    var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n    var whitespace1 = nonAlphaNumeric1 &&\n        char1.match(diff_match_patch.whitespaceRegex_);\n    var whitespace2 = nonAlphaNumeric2 &&\n        char2.match(diff_match_patch.whitespaceRegex_);\n    var lineBreak1 = whitespace1 &&\n        char1.match(diff_match_patch.linebreakRegex_);\n    var lineBreak2 = whitespace2 &&\n        char2.match(diff_match_patch.linebreakRegex_);\n    var blankLine1 = lineBreak1 &&\n        one.match(diff_match_patch.blanklineEndRegex_);\n    var blankLine2 = lineBreak2 &&\n        two.match(diff_match_patch.blanklineStartRegex_);\n\n    if (blankLine1 || blankLine2) {\n      // Five points for blank lines.\n      return 5;\n    } else if (lineBreak1 || lineBreak2) {\n      // Four points for line breaks.\n      return 4;\n    } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n      // Three points for end of sentences.\n      return 3;\n    } else if (whitespace1 || whitespace2) {\n      // Two points for whitespace.\n      return 2;\n    } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n      // One point for non-alphanumeric.\n      return 1;\n    }\n    return 0;\n  }\n\n  var pointer = 1;\n  // Intentionally ignore the first and last element (don't need checking).\n  while (pointer < diffs.length - 1) {\n    if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n        diffs[pointer + 1][0] == DIFF_EQUAL) {\n      // This is a single edit surrounded by equalities.\n      var equality1 = diffs[pointer - 1][1];\n      var edit = diffs[pointer][1];\n      var equality2 = diffs[pointer + 1][1];\n\n      // First, shift the edit as far left as possible.\n      var commonOffset = this.diff_commonSuffix(equality1, edit);\n      if (commonOffset) {\n        var commonString = edit.substring(edit.length - commonOffset);\n        equality1 = equality1.substring(0, equality1.length - commonOffset);\n        edit = commonString + edit.substring(0, edit.length - commonOffset);\n        equality2 = commonString + equality2;\n      }\n\n      // Second, step character by character right, looking for the best fit.\n      var bestEquality1 = equality1;\n      var bestEdit = edit;\n      var bestEquality2 = equality2;\n      var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n          diff_cleanupSemanticScore_(edit, equality2);\n      while (edit.charAt(0) === equality2.charAt(0)) {\n        equality1 += edit.charAt(0);\n        edit = edit.substring(1) + equality2.charAt(0);\n        equality2 = equality2.substring(1);\n        var score = diff_cleanupSemanticScore_(equality1, edit) +\n            diff_cleanupSemanticScore_(edit, equality2);\n        // The >= encourages trailing rather than leading whitespace on edits.\n        if (score >= bestScore) {\n          bestScore = score;\n          bestEquality1 = equality1;\n          bestEdit = edit;\n          bestEquality2 = equality2;\n        }\n      }\n\n      if (diffs[pointer - 1][1] != bestEquality1) {\n        // We have an improvement, save it back to the diff.\n        if (bestEquality1) {\n          diffs[pointer - 1][1] = bestEquality1;\n        } else {\n          diffs.splice(pointer - 1, 1);\n          pointer--;\n        }\n        diffs[pointer][1] = bestEdit;\n        if (bestEquality2) {\n          diffs[pointer + 1][1] = bestEquality2;\n        } else {\n          diffs.splice(pointer + 1, 1);\n          pointer--;\n        }\n      }\n    }\n    pointer++;\n  }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n  var changes = false;\n  var equalities = [];  // Stack of indices where equalities are found.\n  var equalitiesLength = 0;  // Keeping our own length var is faster in JS.\n  /** @type {?string} */\n  var lastEquality = null;\n  // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n  var pointer = 0;  // Index of current position.\n  // Is there an insertion operation before the last equality.\n  var pre_ins = false;\n  // Is there a deletion operation before the last equality.\n  var pre_del = false;\n  // Is there an insertion operation after the last equality.\n  var post_ins = false;\n  // Is there a deletion operation after the last equality.\n  var post_del = false;\n  while (pointer < diffs.length) {\n    if (diffs[pointer][0] == DIFF_EQUAL) {  // Equality found.\n      if (diffs[pointer][1].length < this.Diff_EditCost &&\n          (post_ins || post_del)) {\n        // Candidate found.\n        equalities[equalitiesLength++] = pointer;\n        pre_ins = post_ins;\n        pre_del = post_del;\n        lastEquality = diffs[pointer][1];\n      } else {\n        // Not a candidate, and can never become one.\n        equalitiesLength = 0;\n        lastEquality = null;\n      }\n      post_ins = post_del = false;\n    } else {  // An insertion or deletion.\n      if (diffs[pointer][0] == DIFF_DELETE) {\n        post_del = true;\n      } else {\n        post_ins = true;\n      }\n      /*\n       * Five types to be split:\n       * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n       * <ins>A</ins>X<ins>C</ins><del>D</del>\n       * <ins>A</ins><del>B</del>X<ins>C</ins>\n       * <ins>A</del>X<ins>C</ins><del>D</del>\n       * <ins>A</ins><del>B</del>X<del>C</del>\n       */\n      if (lastEquality && ((pre_ins && pre_del && post_ins && post_del) ||\n                           ((lastEquality.length < this.Diff_EditCost / 2) &&\n                            (pre_ins + pre_del + post_ins + post_del) == 3))) {\n        // Duplicate record.\n        diffs.splice(equalities[equalitiesLength - 1], 0,\n                     new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n        // Change second copy to insert.\n        diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n        equalitiesLength--;  // Throw away the equality we just deleted;\n        lastEquality = null;\n        if (pre_ins && pre_del) {\n          // No changes made which could affect previous entry, keep going.\n          post_ins = post_del = true;\n          equalitiesLength = 0;\n        } else {\n          equalitiesLength--;  // Throw away the previous equality.\n          pointer = equalitiesLength > 0 ?\n              equalities[equalitiesLength - 1] : -1;\n          post_ins = post_del = false;\n        }\n        changes = true;\n      }\n    }\n    pointer++;\n  }\n\n  if (changes) {\n    this.diff_cleanupMerge(diffs);\n  }\n};\n\n\n/**\n * Reorder and merge like edit sections.  Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n  // Add a dummy entry at the end.\n  diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n  var pointer = 0;\n  var count_delete = 0;\n  var count_insert = 0;\n  var text_delete = '';\n  var text_insert = '';\n  var commonlength;\n  while (pointer < diffs.length) {\n    switch (diffs[pointer][0]) {\n      case DIFF_INSERT:\n        count_insert++;\n        text_insert += diffs[pointer][1];\n        pointer++;\n        break;\n      case DIFF_DELETE:\n        count_delete++;\n        text_delete += diffs[pointer][1];\n        pointer++;\n        break;\n      case DIFF_EQUAL:\n        // Upon reaching an equality, check for prior redundancies.\n        if (count_delete + count_insert > 1) {\n          if (count_delete !== 0 && count_insert !== 0) {\n            // Factor out any common prefixies.\n            commonlength = this.diff_commonPrefix(text_insert, text_delete);\n            if (commonlength !== 0) {\n              if ((pointer - count_delete - count_insert) > 0 &&\n                  diffs[pointer - count_delete - count_insert - 1][0] ==\n                  DIFF_EQUAL) {\n                diffs[pointer - count_delete - count_insert - 1][1] +=\n                    text_insert.substring(0, commonlength);\n              } else {\n                diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n                    text_insert.substring(0, commonlength)));\n                pointer++;\n              }\n              text_insert = text_insert.substring(commonlength);\n              text_delete = text_delete.substring(commonlength);\n            }\n            // Factor out any common suffixies.\n            commonlength = this.diff_commonSuffix(text_insert, text_delete);\n            if (commonlength !== 0) {\n              diffs[pointer][1] = text_insert.substring(text_insert.length -\n                  commonlength) + diffs[pointer][1];\n              text_insert = text_insert.substring(0, text_insert.length -\n                  commonlength);\n              text_delete = text_delete.substring(0, text_delete.length -\n                  commonlength);\n            }\n          }\n          // Delete the offending records and add the merged ones.\n          pointer -= count_delete + count_insert;\n          diffs.splice(pointer, count_delete + count_insert);\n          if (text_delete.length) {\n            diffs.splice(pointer, 0,\n                new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n            pointer++;\n          }\n          if (text_insert.length) {\n            diffs.splice(pointer, 0,\n                new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n            pointer++;\n          }\n          pointer++;\n        } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n          // Merge this equality with the previous one.\n          diffs[pointer - 1][1] += diffs[pointer][1];\n          diffs.splice(pointer, 1);\n        } else {\n          pointer++;\n        }\n        count_insert = 0;\n        count_delete = 0;\n        text_delete = '';\n        text_insert = '';\n        break;\n    }\n  }\n  if (diffs[diffs.length - 1][1] === '') {\n    diffs.pop();  // Remove the dummy entry at the end.\n  }\n\n  // Second pass: look for single edits surrounded on both sides by equalities\n  // which can be shifted sideways to eliminate an equality.\n  // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n  var changes = false;\n  pointer = 1;\n  // Intentionally ignore the first and last element (don't need checking).\n  while (pointer < diffs.length - 1) {\n    if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n        diffs[pointer + 1][0] == DIFF_EQUAL) {\n      // This is a single edit surrounded by equalities.\n      if (diffs[pointer][1].substring(diffs[pointer][1].length -\n          diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n        // Shift the edit over the previous equality.\n        diffs[pointer][1] = diffs[pointer - 1][1] +\n            diffs[pointer][1].substring(0, diffs[pointer][1].length -\n                                        diffs[pointer - 1][1].length);\n        diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n        diffs.splice(pointer - 1, 1);\n        changes = true;\n      } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n          diffs[pointer + 1][1]) {\n        // Shift the edit over the next equality.\n        diffs[pointer - 1][1] += diffs[pointer + 1][1];\n        diffs[pointer][1] =\n            diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n            diffs[pointer + 1][1];\n        diffs.splice(pointer + 1, 1);\n        changes = true;\n      }\n    }\n    pointer++;\n  }\n  // If shifts were made, the diff needs reordering and another shift sweep.\n  if (changes) {\n    this.diff_cleanupMerge(diffs);\n  }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n  var chars1 = 0;\n  var chars2 = 0;\n  var last_chars1 = 0;\n  var last_chars2 = 0;\n  var x;\n  for (x = 0; x < diffs.length; x++) {\n    if (diffs[x][0] !== DIFF_INSERT) {  // Equality or deletion.\n      chars1 += diffs[x][1].length;\n    }\n    if (diffs[x][0] !== DIFF_DELETE) {  // Equality or insertion.\n      chars2 += diffs[x][1].length;\n    }\n    if (chars1 > loc) {  // Overshot the location.\n      break;\n    }\n    last_chars1 = chars1;\n    last_chars2 = chars2;\n  }\n  // Was the location was deleted?\n  if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n    return last_chars2;\n  }\n  // Add the remaining character length.\n  return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n  var html = [];\n  var pattern_amp = /&/g;\n  var pattern_lt = /</g;\n  var pattern_gt = />/g;\n  var pattern_para = /\\n/g;\n  for (var x = 0; x < diffs.length; x++) {\n    var op = diffs[x][0];    // Operation (insert, delete, equal)\n    var data = diffs[x][1];  // Text of change.\n    var text = data.replace(pattern_amp, '&amp;').replace(pattern_lt, '&lt;')\n        .replace(pattern_gt, '&gt;').replace(pattern_para, '&para;<br>');\n    switch (op) {\n      case DIFF_INSERT:\n        html[x] = '<ins style=\"background:#e6ffe6;\">' + text + '</ins>';\n        break;\n      case DIFF_DELETE:\n        html[x] = '<del style=\"background:#ffe6e6;\">' + text + '</del>';\n        break;\n      case DIFF_EQUAL:\n        html[x] = '<span>' + text + '</span>';\n        break;\n    }\n  }\n  return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n  var text = [];\n  for (var x = 0; x < diffs.length; x++) {\n    if (diffs[x][0] !== DIFF_INSERT) {\n      text[x] = diffs[x][1];\n    }\n  }\n  return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n  var text = [];\n  for (var x = 0; x < diffs.length; x++) {\n    if (diffs[x][0] !== DIFF_DELETE) {\n      text[x] = diffs[x][1];\n    }\n  }\n  return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n  var levenshtein = 0;\n  var insertions = 0;\n  var deletions = 0;\n  for (var x = 0; x < diffs.length; x++) {\n    var op = diffs[x][0];\n    var data = diffs[x][1];\n    switch (op) {\n      case DIFF_INSERT:\n        insertions += data.length;\n        break;\n      case DIFF_DELETE:\n        deletions += data.length;\n        break;\n      case DIFF_EQUAL:\n        // A deletion and an insertion is one substitution.\n        levenshtein += Math.max(insertions, deletions);\n        insertions = 0;\n        deletions = 0;\n        break;\n    }\n  }\n  levenshtein += Math.max(insertions, deletions);\n  return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing  -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated.  Inserted text is escaped using %xx notation.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n  var text = [];\n  for (var x = 0; x < diffs.length; x++) {\n    switch (diffs[x][0]) {\n      case DIFF_INSERT:\n        text[x] = '+' + encodeURI(diffs[x][1]);\n        break;\n      case DIFF_DELETE:\n        text[x] = '-' + diffs[x][1].length;\n        break;\n      case DIFF_EQUAL:\n        text[x] = '=' + diffs[x][1].length;\n        break;\n    }\n  }\n  return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n  var diffs = [];\n  var diffsLength = 0;  // Keeping our own length var is faster in JS.\n  var pointer = 0;  // Cursor in text1\n  var tokens = delta.split(/\\t/g);\n  for (var x = 0; x < tokens.length; x++) {\n    // Each token begins with a one character parameter which specifies the\n    // operation of this token (delete, insert, equality).\n    var param = tokens[x].substring(1);\n    switch (tokens[x].charAt(0)) {\n      case '+':\n        try {\n          diffs[diffsLength++] =\n              new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n        } catch (ex) {\n          // Malformed URI sequence.\n          throw new Error('Illegal escape in diff_fromDelta: ' + param);\n        }\n        break;\n      case '-':\n        // Fall through.\n      case '=':\n        var n = parseInt(param, 10);\n        if (isNaN(n) || n < 0) {\n          throw new Error('Invalid number in diff_fromDelta: ' + param);\n        }\n        var text = text1.substring(pointer, pointer += n);\n        if (tokens[x].charAt(0) == '=') {\n          diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n        } else {\n          diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n        }\n        break;\n      default:\n        // Blank tokens are ok (from a trailing \\t).\n        // Anything else is an error.\n        if (tokens[x]) {\n          throw new Error('Invalid diff operation in diff_fromDelta: ' +\n                          tokens[x]);\n        }\n    }\n  }\n  if (pointer != text1.length) {\n    throw new Error('Delta length (' + pointer +\n        ') does not equal source text length (' + text1.length + ').');\n  }\n  return diffs;\n};\n\n\n//  MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n  // Check for null inputs.\n  if (text == null || pattern == null || loc == null) {\n    throw new Error('Null input. (match_main)');\n  }\n\n  loc = Math.max(0, Math.min(loc, text.length));\n  if (text == pattern) {\n    // Shortcut (potentially not guaranteed by the algorithm)\n    return 0;\n  } else if (!text.length) {\n    // Nothing to match.\n    return -1;\n  } else if (text.substring(loc, loc + pattern.length) == pattern) {\n    // Perfect match at the perfect spot!  (Includes case of null pattern)\n    return loc;\n  } else {\n    // Do a fuzzy compare.\n    return this.match_bitap_(text, pattern, loc);\n  }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n  if (pattern.length > this.Match_MaxBits) {\n    throw new Error('Pattern too long for this browser.');\n  }\n\n  // Initialise the alphabet.\n  var s = this.match_alphabet_(pattern);\n\n  var dmp = this;  // 'this' becomes 'window' in a closure.\n\n  /**\n   * Compute and return the score for a match with e errors and x location.\n   * Accesses loc and pattern through being a closure.\n   * @param {number} e Number of errors in match.\n   * @param {number} x Location of match.\n   * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n   * @private\n   */\n  function match_bitapScore_(e, x) {\n    var accuracy = e / pattern.length;\n    var proximity = Math.abs(loc - x);\n    if (!dmp.Match_Distance) {\n      // Dodge divide by zero error.\n      return proximity ? 1.0 : accuracy;\n    }\n    return accuracy + (proximity / dmp.Match_Distance);\n  }\n\n  // Highest score beyond which we give up.\n  var score_threshold = this.Match_Threshold;\n  // Is there a nearby exact match? (speedup)\n  var best_loc = text.indexOf(pattern, loc);\n  if (best_loc != -1) {\n    score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n    // What about in the other direction? (speedup)\n    best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n    if (best_loc != -1) {\n      score_threshold =\n          Math.min(match_bitapScore_(0, best_loc), score_threshold);\n    }\n  }\n\n  // Initialise the bit arrays.\n  var matchmask = 1 << (pattern.length - 1);\n  best_loc = -1;\n\n  var bin_min, bin_mid;\n  var bin_max = pattern.length + text.length;\n  var last_rd;\n  for (var d = 0; d < pattern.length; d++) {\n    // Scan for the best match; each iteration allows for one more error.\n    // Run a binary search to determine how far from 'loc' we can stray at this\n    // error level.\n    bin_min = 0;\n    bin_mid = bin_max;\n    while (bin_min < bin_mid) {\n      if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n        bin_min = bin_mid;\n      } else {\n        bin_max = bin_mid;\n      }\n      bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n    }\n    // Use the result from this iteration as the maximum for the next.\n    bin_max = bin_mid;\n    var start = Math.max(1, loc - bin_mid + 1);\n    var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n    var rd = Array(finish + 2);\n    rd[finish + 1] = (1 << d) - 1;\n    for (var j = finish; j >= start; j--) {\n      // The alphabet (s) is a sparse hash, so the following line generates\n      // warnings.\n      var charMatch = s[text.charAt(j - 1)];\n      if (d === 0) {  // First pass: exact match.\n        rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n      } else {  // Subsequent passes: fuzzy match.\n        rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n                (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n                last_rd[j + 1];\n      }\n      if (rd[j] & matchmask) {\n        var score = match_bitapScore_(d, j - 1);\n        // This match will almost certainly be better than any existing match.\n        // But check anyway.\n        if (score <= score_threshold) {\n          // Told you so.\n          score_threshold = score;\n          best_loc = j - 1;\n          if (best_loc > loc) {\n            // When passing loc, don't exceed our current distance from loc.\n            start = Math.max(1, 2 * loc - best_loc);\n          } else {\n            // Already passed loc, downhill from here on in.\n            break;\n          }\n        }\n      }\n    }\n    // No hope for a (better) match at greater error levels.\n    if (match_bitapScore_(d + 1, loc) > score_threshold) {\n      break;\n    }\n    last_rd = rd;\n  }\n  return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n  var s = {};\n  for (var i = 0; i < pattern.length; i++) {\n    s[pattern.charAt(i)] = 0;\n  }\n  for (var i = 0; i < pattern.length; i++) {\n    s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n  }\n  return s;\n};\n\n\n//  PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n  if (text.length == 0) {\n    return;\n  }\n  if (patch.start2 === null) {\n    throw Error('patch not initialized');\n  }\n  var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n  var padding = 0;\n\n  // Look for the first and last matches of pattern in text.  If two different\n  // matches are found, increase the pattern length.\n  while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n         pattern.length < this.Match_MaxBits - this.Patch_Margin -\n         this.Patch_Margin) {\n    padding += this.Patch_Margin;\n    pattern = text.substring(patch.start2 - padding,\n                             patch.start2 + patch.length1 + padding);\n  }\n  // Add one chunk for good luck.\n  padding += this.Patch_Margin;\n\n  // Add the prefix.\n  var prefix = text.substring(patch.start2 - padding, patch.start2);\n  if (prefix) {\n    patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n  }\n  // Add the suffix.\n  var suffix = text.substring(patch.start2 + patch.length1,\n                              patch.start2 + patch.length1 + padding);\n  if (suffix) {\n    patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n  }\n\n  // Roll back the start points.\n  patch.start1 -= prefix.length;\n  patch.start2 -= prefix.length;\n  // Extend the lengths.\n  patch.length1 += prefix.length + suffix.length;\n  patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.<!diff_match_patch.Diff>} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n  var text1, diffs;\n  if (typeof a == 'string' && typeof opt_b == 'string' &&\n      typeof opt_c == 'undefined') {\n    // Method 1: text1, text2\n    // Compute diffs from text1 and text2.\n    text1 = /** @type {string} */(a);\n    diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n    if (diffs.length > 2) {\n      this.diff_cleanupSemantic(diffs);\n      this.diff_cleanupEfficiency(diffs);\n    }\n  } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n      typeof opt_c == 'undefined') {\n    // Method 2: diffs\n    // Compute text1 from diffs.\n    diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(a);\n    text1 = this.diff_text1(diffs);\n  } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n      typeof opt_c == 'undefined') {\n    // Method 3: text1, diffs\n    text1 = /** @type {string} */(a);\n    diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_b);\n  } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n      opt_c && typeof opt_c == 'object') {\n    // Method 4: text1, text2, diffs\n    // text2 is not used.\n    text1 = /** @type {string} */(a);\n    diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_c);\n  } else {\n    throw new Error('Unknown call format to patch_make.');\n  }\n\n  if (diffs.length === 0) {\n    return [];  // Get rid of the null case.\n  }\n  var patches = [];\n  var patch = new diff_match_patch.patch_obj();\n  var patchDiffLength = 0;  // Keeping our own length var is faster in JS.\n  var char_count1 = 0;  // Number of characters into the text1 string.\n  var char_count2 = 0;  // Number of characters into the text2 string.\n  // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n  // text2 (postpatch_text).  We recreate the patches one by one to determine\n  // context info.\n  var prepatch_text = text1;\n  var postpatch_text = text1;\n  for (var x = 0; x < diffs.length; x++) {\n    var diff_type = diffs[x][0];\n    var diff_text = diffs[x][1];\n\n    if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n      // A new patch starts here.\n      patch.start1 = char_count1;\n      patch.start2 = char_count2;\n    }\n\n    switch (diff_type) {\n      case DIFF_INSERT:\n        patch.diffs[patchDiffLength++] = diffs[x];\n        patch.length2 += diff_text.length;\n        postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n                         postpatch_text.substring(char_count2);\n        break;\n      case DIFF_DELETE:\n        patch.length1 += diff_text.length;\n        patch.diffs[patchDiffLength++] = diffs[x];\n        postpatch_text = postpatch_text.substring(0, char_count2) +\n                         postpatch_text.substring(char_count2 +\n                             diff_text.length);\n        break;\n      case DIFF_EQUAL:\n        if (diff_text.length <= 2 * this.Patch_Margin &&\n            patchDiffLength && diffs.length != x + 1) {\n          // Small equality inside a patch.\n          patch.diffs[patchDiffLength++] = diffs[x];\n          patch.length1 += diff_text.length;\n          patch.length2 += diff_text.length;\n        } else if (diff_text.length >= 2 * this.Patch_Margin) {\n          // Time for a new patch.\n          if (patchDiffLength) {\n            this.patch_addContext_(patch, prepatch_text);\n            patches.push(patch);\n            patch = new diff_match_patch.patch_obj();\n            patchDiffLength = 0;\n            // Unlike Unidiff, our patch lists have a rolling context.\n            // https://github.com/google/diff-match-patch/wiki/Unidiff\n            // Update prepatch text & pos to reflect the application of the\n            // just completed patch.\n            prepatch_text = postpatch_text;\n            char_count1 = char_count2;\n          }\n        }\n        break;\n    }\n\n    // Update the current character count.\n    if (diff_type !== DIFF_INSERT) {\n      char_count1 += diff_text.length;\n    }\n    if (diff_type !== DIFF_DELETE) {\n      char_count2 += diff_text.length;\n    }\n  }\n  // Pick up the leftover patch if not empty.\n  if (patchDiffLength) {\n    this.patch_addContext_(patch, prepatch_text);\n    patches.push(patch);\n  }\n\n  return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n  // Making deep copies is hard in JavaScript.\n  var patchesCopy = [];\n  for (var x = 0; x < patches.length; x++) {\n    var patch = patches[x];\n    var patchCopy = new diff_match_patch.patch_obj();\n    patchCopy.diffs = [];\n    for (var y = 0; y < patch.diffs.length; y++) {\n      patchCopy.diffs[y] =\n          new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n    }\n    patchCopy.start1 = patch.start1;\n    patchCopy.start2 = patch.start2;\n    patchCopy.length1 = patch.length1;\n    patchCopy.length2 = patch.length2;\n    patchesCopy[x] = patchCopy;\n  }\n  return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text.  Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.<string|!Array.<boolean>>} Two element Array, containing the\n *      new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n  if (patches.length == 0) {\n    return [text, []];\n  }\n\n  // Deep copy the patches so that no changes are made to originals.\n  patches = this.patch_deepCopy(patches);\n\n  var nullPadding = this.patch_addPadding(patches);\n  text = nullPadding + text + nullPadding;\n\n  this.patch_splitMax(patches);\n  // delta keeps track of the offset between the expected and actual location\n  // of the previous patch.  If there are patches expected at positions 10 and\n  // 20, but the first patch was found at 12, delta is 2 and the second patch\n  // has an effective expected position of 22.\n  var delta = 0;\n  var results = [];\n  for (var x = 0; x < patches.length; x++) {\n    var expected_loc = patches[x].start2 + delta;\n    var text1 = this.diff_text1(patches[x].diffs);\n    var start_loc;\n    var end_loc = -1;\n    if (text1.length > this.Match_MaxBits) {\n      // patch_splitMax will only provide an oversized pattern in the case of\n      // a monster delete.\n      start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n                                  expected_loc);\n      if (start_loc != -1) {\n        end_loc = this.match_main(text,\n            text1.substring(text1.length - this.Match_MaxBits),\n            expected_loc + text1.length - this.Match_MaxBits);\n        if (end_loc == -1 || start_loc >= end_loc) {\n          // Can't find valid trailing context.  Drop this patch.\n          start_loc = -1;\n        }\n      }\n    } else {\n      start_loc = this.match_main(text, text1, expected_loc);\n    }\n    if (start_loc == -1) {\n      // No match found.  :(\n      results[x] = false;\n      // Subtract the delta for this failed patch from subsequent patches.\n      delta -= patches[x].length2 - patches[x].length1;\n    } else {\n      // Found a match.  :)\n      results[x] = true;\n      delta = start_loc - expected_loc;\n      var text2;\n      if (end_loc == -1) {\n        text2 = text.substring(start_loc, start_loc + text1.length);\n      } else {\n        text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n      }\n      if (text1 == text2) {\n        // Perfect match, just shove the replacement text in.\n        text = text.substring(0, start_loc) +\n               this.diff_text2(patches[x].diffs) +\n               text.substring(start_loc + text1.length);\n      } else {\n        // Imperfect match.  Run a diff to get a framework of equivalent\n        // indices.\n        var diffs = this.diff_main(text1, text2, false);\n        if (text1.length > this.Match_MaxBits &&\n            this.diff_levenshtein(diffs) / text1.length >\n            this.Patch_DeleteThreshold) {\n          // The end points match, but the content is unacceptably bad.\n          results[x] = false;\n        } else {\n          this.diff_cleanupSemanticLossless(diffs);\n          var index1 = 0;\n          var index2;\n          for (var y = 0; y < patches[x].diffs.length; y++) {\n            var mod = patches[x].diffs[y];\n            if (mod[0] !== DIFF_EQUAL) {\n              index2 = this.diff_xIndex(diffs, index1);\n            }\n            if (mod[0] === DIFF_INSERT) {  // Insertion\n              text = text.substring(0, start_loc + index2) + mod[1] +\n                     text.substring(start_loc + index2);\n            } else if (mod[0] === DIFF_DELETE) {  // Deletion\n              text = text.substring(0, start_loc + index2) +\n                     text.substring(start_loc + this.diff_xIndex(diffs,\n                         index1 + mod[1].length));\n            }\n            if (mod[0] !== DIFF_DELETE) {\n              index1 += mod[1].length;\n            }\n          }\n        }\n      }\n    }\n  }\n  // Strip the padding off.\n  text = text.substring(nullPadding.length, text.length - nullPadding.length);\n  return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n  var paddingLength = this.Patch_Margin;\n  var nullPadding = '';\n  for (var x = 1; x <= paddingLength; x++) {\n    nullPadding += String.fromCharCode(x);\n  }\n\n  // Bump all the patches forward.\n  for (var x = 0; x < patches.length; x++) {\n    patches[x].start1 += paddingLength;\n    patches[x].start2 += paddingLength;\n  }\n\n  // Add some padding on start of first diff.\n  var patch = patches[0];\n  var diffs = patch.diffs;\n  if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n    // Add nullPadding equality.\n    diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n    patch.start1 -= paddingLength;  // Should be 0.\n    patch.start2 -= paddingLength;  // Should be 0.\n    patch.length1 += paddingLength;\n    patch.length2 += paddingLength;\n  } else if (paddingLength > diffs[0][1].length) {\n    // Grow first equality.\n    var extraLength = paddingLength - diffs[0][1].length;\n    diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n    patch.start1 -= extraLength;\n    patch.start2 -= extraLength;\n    patch.length1 += extraLength;\n    patch.length2 += extraLength;\n  }\n\n  // Add some padding on end of last diff.\n  patch = patches[patches.length - 1];\n  diffs = patch.diffs;\n  if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n    // Add nullPadding equality.\n    diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n    patch.length1 += paddingLength;\n    patch.length2 += paddingLength;\n  } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n    // Grow last equality.\n    var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n    diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n    patch.length1 += extraLength;\n    patch.length2 += extraLength;\n  }\n\n  return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n  var patch_size = this.Match_MaxBits;\n  for (var x = 0; x < patches.length; x++) {\n    if (patches[x].length1 <= patch_size) {\n      continue;\n    }\n    var bigpatch = patches[x];\n    // Remove the big old patch.\n    patches.splice(x--, 1);\n    var start1 = bigpatch.start1;\n    var start2 = bigpatch.start2;\n    var precontext = '';\n    while (bigpatch.diffs.length !== 0) {\n      // Create one of several smaller patches.\n      var patch = new diff_match_patch.patch_obj();\n      var empty = true;\n      patch.start1 = start1 - precontext.length;\n      patch.start2 = start2 - precontext.length;\n      if (precontext !== '') {\n        patch.length1 = patch.length2 = precontext.length;\n        patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n      }\n      while (bigpatch.diffs.length !== 0 &&\n             patch.length1 < patch_size - this.Patch_Margin) {\n        var diff_type = bigpatch.diffs[0][0];\n        var diff_text = bigpatch.diffs[0][1];\n        if (diff_type === DIFF_INSERT) {\n          // Insertions are harmless.\n          patch.length2 += diff_text.length;\n          start2 += diff_text.length;\n          patch.diffs.push(bigpatch.diffs.shift());\n          empty = false;\n        } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n                   patch.diffs[0][0] == DIFF_EQUAL &&\n                   diff_text.length > 2 * patch_size) {\n          // This is a large deletion.  Let it pass in one chunk.\n          patch.length1 += diff_text.length;\n          start1 += diff_text.length;\n          empty = false;\n          patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n          bigpatch.diffs.shift();\n        } else {\n          // Deletion or equality.  Only take as much as we can stomach.\n          diff_text = diff_text.substring(0,\n              patch_size - patch.length1 - this.Patch_Margin);\n          patch.length1 += diff_text.length;\n          start1 += diff_text.length;\n          if (diff_type === DIFF_EQUAL) {\n            patch.length2 += diff_text.length;\n            start2 += diff_text.length;\n          } else {\n            empty = false;\n          }\n          patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n          if (diff_text == bigpatch.diffs[0][1]) {\n            bigpatch.diffs.shift();\n          } else {\n            bigpatch.diffs[0][1] =\n                bigpatch.diffs[0][1].substring(diff_text.length);\n          }\n        }\n      }\n      // Compute the head context for the next patch.\n      precontext = this.diff_text2(patch.diffs);\n      precontext =\n          precontext.substring(precontext.length - this.Patch_Margin);\n      // Append the end context for this patch.\n      var postcontext = this.diff_text1(bigpatch.diffs)\n                            .substring(0, this.Patch_Margin);\n      if (postcontext !== '') {\n        patch.length1 += postcontext.length;\n        patch.length2 += postcontext.length;\n        if (patch.diffs.length !== 0 &&\n            patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n          patch.diffs[patch.diffs.length - 1][1] += postcontext;\n        } else {\n          patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n        }\n      }\n      if (!empty) {\n        patches.splice(++x, 0, patch);\n      }\n    }\n  }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n  var text = [];\n  for (var x = 0; x < patches.length; x++) {\n    text[x] = patches[x];\n  }\n  return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n  var patches = [];\n  if (!textline) {\n    return patches;\n  }\n  var text = textline.split('\\n');\n  var textPointer = 0;\n  var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n  while (textPointer < text.length) {\n    var m = text[textPointer].match(patchHeader);\n    if (!m) {\n      throw new Error('Invalid patch string: ' + text[textPointer]);\n    }\n    var patch = new diff_match_patch.patch_obj();\n    patches.push(patch);\n    patch.start1 = parseInt(m[1], 10);\n    if (m[2] === '') {\n      patch.start1--;\n      patch.length1 = 1;\n    } else if (m[2] == '0') {\n      patch.length1 = 0;\n    } else {\n      patch.start1--;\n      patch.length1 = parseInt(m[2], 10);\n    }\n\n    patch.start2 = parseInt(m[3], 10);\n    if (m[4] === '') {\n      patch.start2--;\n      patch.length2 = 1;\n    } else if (m[4] == '0') {\n      patch.length2 = 0;\n    } else {\n      patch.start2--;\n      patch.length2 = parseInt(m[4], 10);\n    }\n    textPointer++;\n\n    while (textPointer < text.length) {\n      var sign = text[textPointer].charAt(0);\n      try {\n        var line = decodeURI(text[textPointer].substring(1));\n      } catch (ex) {\n        // Malformed URI sequence.\n        throw new Error('Illegal escape in patch_fromText: ' + line);\n      }\n      if (sign == '-') {\n        // Deletion.\n        patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n      } else if (sign == '+') {\n        // Insertion.\n        patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n      } else if (sign == ' ') {\n        // Minor equality.\n        patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n      } else if (sign == '@') {\n        // Start of next patch.\n        break;\n      } else if (sign === '') {\n        // Blank line?  Whatever.\n      } else {\n        // WTF?\n        throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n      }\n      textPointer++;\n    }\n  }\n  return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n  /** @type {!Array.<!diff_match_patch.Diff>} */\n  this.diffs = [];\n  /** @type {?number} */\n  this.start1 = null;\n  /** @type {?number} */\n  this.start2 = null;\n  /** @type {number} */\n  this.length1 = 0;\n  /** @type {number} */\n  this.length2 = 0;\n};\n\n\n/**\n * Emulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indices are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n  var coords1, coords2;\n  if (this.length1 === 0) {\n    coords1 = this.start1 + ',0';\n  } else if (this.length1 == 1) {\n    coords1 = this.start1 + 1;\n  } else {\n    coords1 = (this.start1 + 1) + ',' + this.length1;\n  }\n  if (this.length2 === 0) {\n    coords2 = this.start2 + ',0';\n  } else if (this.length2 == 1) {\n    coords2 = this.start2 + 1;\n  } else {\n    coords2 = (this.start2 + 1) + ',' + this.length2;\n  }\n  var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n  var op;\n  // Escape the body of the patch with %xx notation.\n  for (var x = 0; x < this.diffs.length; x++) {\n    switch (this.diffs[x][0]) {\n      case DIFF_INSERT:\n        op = '+';\n        break;\n      case DIFF_DELETE:\n        op = '-';\n        break;\n      case DIFF_EQUAL:\n        op = ' ';\n        break;\n    }\n    text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n  }\n  return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n *   Wyatt Baldwin <self@wyattbaldwin.com>\n *   All rights reserved\n *\n * Licensed under the MIT license.\n *\n *   http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n  single_source_shortest_paths: function(graph, s, d) {\n    // Predecessor map for each node that has been encountered.\n    // node ID => predecessor node ID\n    var predecessors = {};\n\n    // Costs of shortest paths from s to all nodes encountered.\n    // node ID => cost\n    var costs = {};\n    costs[s] = 0;\n\n    // Costs of shortest paths from s to all nodes encountered; differs from\n    // `costs` in that it provides easy access to the node that currently has\n    // the known shortest path from s.\n    // XXX: Do we actually need both `costs` and `open`?\n    var open = dijkstra.PriorityQueue.make();\n    open.push(s, 0);\n\n    var closest,\n        u, v,\n        cost_of_s_to_u,\n        adjacent_nodes,\n        cost_of_e,\n        cost_of_s_to_u_plus_cost_of_e,\n        cost_of_s_to_v,\n        first_visit;\n    while (!open.empty()) {\n      // In the nodes remaining in graph that have a known cost from s,\n      // find the node, u, that currently has the shortest path from s.\n      closest = open.pop();\n      u = closest.value;\n      cost_of_s_to_u = closest.cost;\n\n      // Get nodes adjacent to u...\n      adjacent_nodes = graph[u] || {};\n\n      // ...and explore the edges that connect u to those nodes, updating\n      // the cost of the shortest paths to any or all of those nodes as\n      // necessary. v is the node across the current edge from u.\n      for (v in adjacent_nodes) {\n        if (adjacent_nodes.hasOwnProperty(v)) {\n          // Get the cost of the edge running from u to v.\n          cost_of_e = adjacent_nodes[v];\n\n          // Cost of s to u plus the cost of u to v across e--this is *a*\n          // cost from s to v that may or may not be less than the current\n          // known cost to v.\n          cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n          // If we haven't visited v yet OR if the current known cost from s to\n          // v is greater than the new cost we just found (cost of s to u plus\n          // cost of u to v across e), update v's cost in the cost list and\n          // update v's predecessor in the predecessor list (it's now u).\n          cost_of_s_to_v = costs[v];\n          first_visit = (typeof costs[v] === 'undefined');\n          if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n            costs[v] = cost_of_s_to_u_plus_cost_of_e;\n            open.push(v, cost_of_s_to_u_plus_cost_of_e);\n            predecessors[v] = u;\n          }\n        }\n      }\n    }\n\n    if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n      var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n      throw new Error(msg);\n    }\n\n    return predecessors;\n  },\n\n  extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n    var nodes = [];\n    var u = d;\n    var predecessor;\n    while (u) {\n      nodes.push(u);\n      predecessor = predecessors[u];\n      u = predecessors[u];\n    }\n    nodes.reverse();\n    return nodes;\n  },\n\n  find_path: function(graph, s, d) {\n    var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n    return dijkstra.extract_shortest_path_from_predecessor_list(\n      predecessors, d);\n  },\n\n  /**\n   * A very naive priority queue implementation.\n   */\n  PriorityQueue: {\n    make: function (opts) {\n      var T = dijkstra.PriorityQueue,\n          t = {},\n          key;\n      opts = opts || {};\n      for (key in T) {\n        if (T.hasOwnProperty(key)) {\n          t[key] = T[key];\n        }\n      }\n      t.queue = [];\n      t.sorter = opts.sorter || T.default_sorter;\n      return t;\n    },\n\n    default_sorter: function (a, b) {\n      return a.cost - b.cost;\n    },\n\n    /**\n     * Add a new item to the queue and ensure the highest priority element\n     * is at the front of the queue.\n     */\n    push: function (value, cost) {\n      var item = {value: value, cost: cost};\n      this.queue.push(item);\n      this.queue.sort(this.sorter);\n    },\n\n    /**\n     * Return the highest priority element in the queue.\n     */\n    pop: function () {\n      return this.queue.shift();\n    },\n\n    empty: function () {\n      return this.queue.length === 0;\n    }\n  }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n  module.exports = dijkstra;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attributeNames = exports.elementNames = void 0;\nexports.elementNames = new Map([\n    \"altGlyph\",\n    \"altGlyphDef\",\n    \"altGlyphItem\",\n    \"animateColor\",\n    \"animateMotion\",\n    \"animateTransform\",\n    \"clipPath\",\n    \"feBlend\",\n    \"feColorMatrix\",\n    \"feComponentTransfer\",\n    \"feComposite\",\n    \"feConvolveMatrix\",\n    \"feDiffuseLighting\",\n    \"feDisplacementMap\",\n    \"feDistantLight\",\n    \"feDropShadow\",\n    \"feFlood\",\n    \"feFuncA\",\n    \"feFuncB\",\n    \"feFuncG\",\n    \"feFuncR\",\n    \"feGaussianBlur\",\n    \"feImage\",\n    \"feMerge\",\n    \"feMergeNode\",\n    \"feMorphology\",\n    \"feOffset\",\n    \"fePointLight\",\n    \"feSpecularLighting\",\n    \"feSpotLight\",\n    \"feTile\",\n    \"feTurbulence\",\n    \"foreignObject\",\n    \"glyphRef\",\n    \"linearGradient\",\n    \"radialGradient\",\n    \"textPath\",\n].map(function (val) { return [val.toLowerCase(), val]; }));\nexports.attributeNames = new Map([\n    \"definitionURL\",\n    \"attributeName\",\n    \"attributeType\",\n    \"baseFrequency\",\n    \"baseProfile\",\n    \"calcMode\",\n    \"clipPathUnits\",\n    \"diffuseConstant\",\n    \"edgeMode\",\n    \"filterUnits\",\n    \"glyphRef\",\n    \"gradientTransform\",\n    \"gradientUnits\",\n    \"kernelMatrix\",\n    \"kernelUnitLength\",\n    \"keyPoints\",\n    \"keySplines\",\n    \"keyTimes\",\n    \"lengthAdjust\",\n    \"limitingConeAngle\",\n    \"markerHeight\",\n    \"markerUnits\",\n    \"markerWidth\",\n    \"maskContentUnits\",\n    \"maskUnits\",\n    \"numOctaves\",\n    \"pathLength\",\n    \"patternContentUnits\",\n    \"patternTransform\",\n    \"patternUnits\",\n    \"pointsAtX\",\n    \"pointsAtY\",\n    \"pointsAtZ\",\n    \"preserveAlpha\",\n    \"preserveAspectRatio\",\n    \"primitiveUnits\",\n    \"refX\",\n    \"refY\",\n    \"repeatCount\",\n    \"repeatDur\",\n    \"requiredExtensions\",\n    \"requiredFeatures\",\n    \"specularConstant\",\n    \"specularExponent\",\n    \"spreadMethod\",\n    \"startOffset\",\n    \"stdDeviation\",\n    \"stitchTiles\",\n    \"surfaceScale\",\n    \"systemLanguage\",\n    \"tableValues\",\n    \"targetX\",\n    \"targetY\",\n    \"textLength\",\n    \"viewBox\",\n    \"viewTarget\",\n    \"xChannelSelector\",\n    \"yChannelSelector\",\n    \"zoomAndPan\",\n].map(function (val) { return [val.toLowerCase(), val]; }));\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    var desc = Object.getOwnPropertyDescriptor(m, k);\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n    }\n    Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.render = void 0;\n/*\n * Module dependencies\n */\nvar ElementType = __importStar(require(\"domelementtype\"));\nvar entities_1 = require(\"entities\");\n/**\n * Mixed-case SVG and MathML tags & attributes\n * recognized by the HTML parser.\n *\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nvar foreignNames_js_1 = require(\"./foreignNames.js\");\nvar unencodedElements = new Set([\n    \"style\",\n    \"script\",\n    \"xmp\",\n    \"iframe\",\n    \"noembed\",\n    \"noframes\",\n    \"plaintext\",\n    \"noscript\",\n]);\nfunction replaceQuotes(value) {\n    return value.replace(/\"/g, \"&quot;\");\n}\n/**\n * Format attributes\n */\nfunction formatAttributes(attributes, opts) {\n    var _a;\n    if (!attributes)\n        return;\n    var encode = ((_a = opts.encodeEntities) !== null && _a !== void 0 ? _a : opts.decodeEntities) === false\n        ? replaceQuotes\n        : opts.xmlMode || opts.encodeEntities !== \"utf8\"\n            ? entities_1.encodeXML\n            : entities_1.escapeAttribute;\n    return Object.keys(attributes)\n        .map(function (key) {\n        var _a, _b;\n        var value = (_a = attributes[key]) !== null && _a !== void 0 ? _a : \"\";\n        if (opts.xmlMode === \"foreign\") {\n            /* Fix up mixed-case attribute names */\n            key = (_b = foreignNames_js_1.attributeNames.get(key)) !== null && _b !== void 0 ? _b : key;\n        }\n        if (!opts.emptyAttrs && !opts.xmlMode && value === \"\") {\n            return key;\n        }\n        return \"\".concat(key, \"=\\\"\").concat(encode(value), \"\\\"\");\n    })\n        .join(\" \");\n}\n/**\n * Self-enclosing tags\n */\nvar singleTag = new Set([\n    \"area\",\n    \"base\",\n    \"basefont\",\n    \"br\",\n    \"col\",\n    \"command\",\n    \"embed\",\n    \"frame\",\n    \"hr\",\n    \"img\",\n    \"input\",\n    \"isindex\",\n    \"keygen\",\n    \"link\",\n    \"meta\",\n    \"param\",\n    \"source\",\n    \"track\",\n    \"wbr\",\n]);\n/**\n * Renders a DOM node or an array of DOM nodes to a string.\n *\n * Can be thought of as the equivalent of the `outerHTML` of the passed node(s).\n *\n * @param node Node to be rendered.\n * @param options Changes serialization behavior\n */\nfunction render(node, options) {\n    if (options === void 0) { options = {}; }\n    var nodes = \"length\" in node ? node : [node];\n    var output = \"\";\n    for (var i = 0; i < nodes.length; i++) {\n        output += renderNode(nodes[i], options);\n    }\n    return output;\n}\nexports.render = render;\nexports.default = render;\nfunction renderNode(node, options) {\n    switch (node.type) {\n        case ElementType.Root:\n            return render(node.children, options);\n        // @ts-expect-error We don't use `Doctype` yet\n        case ElementType.Doctype:\n        case ElementType.Directive:\n            return renderDirective(node);\n        case ElementType.Comment:\n            return renderComment(node);\n        case ElementType.CDATA:\n            return renderCdata(node);\n        case ElementType.Script:\n        case ElementType.Style:\n        case ElementType.Tag:\n            return renderTag(node, options);\n        case ElementType.Text:\n            return renderText(node, options);\n    }\n}\nvar foreignModeIntegrationPoints = new Set([\n    \"mi\",\n    \"mo\",\n    \"mn\",\n    \"ms\",\n    \"mtext\",\n    \"annotation-xml\",\n    \"foreignObject\",\n    \"desc\",\n    \"title\",\n]);\nvar foreignElements = new Set([\"svg\", \"math\"]);\nfunction renderTag(elem, opts) {\n    var _a;\n    // Handle SVG / MathML in HTML\n    if (opts.xmlMode === \"foreign\") {\n        /* Fix up mixed-case element names */\n        elem.name = (_a = foreignNames_js_1.elementNames.get(elem.name)) !== null && _a !== void 0 ? _a : elem.name;\n        /* Exit foreign mode at integration points */\n        if (elem.parent &&\n            foreignModeIntegrationPoints.has(elem.parent.name)) {\n            opts = __assign(__assign({}, opts), { xmlMode: false });\n        }\n    }\n    if (!opts.xmlMode && foreignElements.has(elem.name)) {\n        opts = __assign(__assign({}, opts), { xmlMode: \"foreign\" });\n    }\n    var tag = \"<\".concat(elem.name);\n    var attribs = formatAttributes(elem.attribs, opts);\n    if (attribs) {\n        tag += \" \".concat(attribs);\n    }\n    if (elem.children.length === 0 &&\n        (opts.xmlMode\n            ? // In XML mode or foreign mode, and user hasn't explicitly turned off self-closing tags\n                opts.selfClosingTags !== false\n            : // User explicitly asked for self-closing tags, even in HTML mode\n                opts.selfClosingTags && singleTag.has(elem.name))) {\n        if (!opts.xmlMode)\n            tag += \" \";\n        tag += \"/>\";\n    }\n    else {\n        tag += \">\";\n        if (elem.children.length > 0) {\n            tag += render(elem.children, opts);\n        }\n        if (opts.xmlMode || !singleTag.has(elem.name)) {\n            tag += \"</\".concat(elem.name, \">\");\n        }\n    }\n    return tag;\n}\nfunction renderDirective(elem) {\n    return \"<\".concat(elem.data, \">\");\n}\nfunction renderText(elem, opts) {\n    var _a;\n    var data = elem.data || \"\";\n    // If entities weren't decoded, no need to encode them back\n    if (((_a = opts.encodeEntities) !== null && _a !== void 0 ? _a : opts.decodeEntities) !== false &&\n        !(!opts.xmlMode &&\n            elem.parent &&\n            unencodedElements.has(elem.parent.name))) {\n        data =\n            opts.xmlMode || opts.encodeEntities !== \"utf8\"\n                ? (0, entities_1.encodeXML)(data)\n                : (0, entities_1.escapeText)(data);\n    }\n    return data;\n}\nfunction renderCdata(elem) {\n    return \"<![CDATA[\".concat(elem.children[0].data, \"]]>\");\n}\nfunction renderComment(elem) {\n    return \"<!--\".concat(elem.data, \"-->\");\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Doctype = exports.CDATA = exports.Tag = exports.Style = exports.Script = exports.Comment = exports.Directive = exports.Text = exports.Root = exports.isTag = exports.ElementType = void 0;\n/** Types of elements found in htmlparser2's DOM */\nvar ElementType;\n(function (ElementType) {\n    /** Type for the root element of a document */\n    ElementType[\"Root\"] = \"root\";\n    /** Type for Text */\n    ElementType[\"Text\"] = \"text\";\n    /** Type for <? ... ?> */\n    ElementType[\"Directive\"] = \"directive\";\n    /** Type for <!-- ... --> */\n    ElementType[\"Comment\"] = \"comment\";\n    /** Type for <script> tags */\n    ElementType[\"Script\"] = \"script\";\n    /** Type for <style> tags */\n    ElementType[\"Style\"] = \"style\";\n    /** Type for Any tag */\n    ElementType[\"Tag\"] = \"tag\";\n    /** Type for <![CDATA[ ... ]]> */\n    ElementType[\"CDATA\"] = \"cdata\";\n    /** Type for <!doctype ...> */\n    ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType = exports.ElementType || (exports.ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nfunction isTag(elem) {\n    return (elem.type === ElementType.Tag ||\n        elem.type === ElementType.Script ||\n        elem.type === ElementType.Style);\n}\nexports.isTag = isTag;\n// Exports for backwards compatibility\n/** Type for the root element of a document */\nexports.Root = ElementType.Root;\n/** Type for Text */\nexports.Text = ElementType.Text;\n/** Type for <? ... ?> */\nexports.Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\nexports.Comment = ElementType.Comment;\n/** Type for <script> tags */\nexports.Script = ElementType.Script;\n/** Type for <style> tags */\nexports.Style = ElementType.Style;\n/** Type for Any tag */\nexports.Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\nexports.CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\nexports.Doctype = ElementType.Doctype;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    var desc = Object.getOwnPropertyDescriptor(m, k);\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n    }\n    Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DomHandler = void 0;\nvar domelementtype_1 = require(\"domelementtype\");\nvar node_js_1 = require(\"./node.js\");\n__exportStar(require(\"./node.js\"), exports);\n// Default options\nvar defaultOpts = {\n    withStartIndices: false,\n    withEndIndices: false,\n    xmlMode: false,\n};\nvar DomHandler = /** @class */ (function () {\n    /**\n     * @param callback Called once parsing has completed.\n     * @param options Settings for the handler.\n     * @param elementCB Callback whenever a tag is closed.\n     */\n    function DomHandler(callback, options, elementCB) {\n        /** The elements of the DOM */\n        this.dom = [];\n        /** The root element for the DOM */\n        this.root = new node_js_1.Document(this.dom);\n        /** Indicated whether parsing has been completed. */\n        this.done = false;\n        /** Stack of open tags. */\n        this.tagStack = [this.root];\n        /** A data node that is still being written to. */\n        this.lastNode = null;\n        /** Reference to the parser instance. Used for location information. */\n        this.parser = null;\n        // Make it possible to skip arguments, for backwards-compatibility\n        if (typeof options === \"function\") {\n            elementCB = options;\n            options = defaultOpts;\n        }\n        if (typeof callback === \"object\") {\n            options = callback;\n            callback = undefined;\n        }\n        this.callback = callback !== null && callback !== void 0 ? callback : null;\n        this.options = options !== null && options !== void 0 ? options : defaultOpts;\n        this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;\n    }\n    DomHandler.prototype.onparserinit = function (parser) {\n        this.parser = parser;\n    };\n    // Resets the handler back to starting state\n    DomHandler.prototype.onreset = function () {\n        this.dom = [];\n        this.root = new node_js_1.Document(this.dom);\n        this.done = false;\n        this.tagStack = [this.root];\n        this.lastNode = null;\n        this.parser = null;\n    };\n    // Signals the handler that parsing is done\n    DomHandler.prototype.onend = function () {\n        if (this.done)\n            return;\n        this.done = true;\n        this.parser = null;\n        this.handleCallback(null);\n    };\n    DomHandler.prototype.onerror = function (error) {\n        this.handleCallback(error);\n    };\n    DomHandler.prototype.onclosetag = function () {\n        this.lastNode = null;\n        var elem = this.tagStack.pop();\n        if (this.options.withEndIndices) {\n            elem.endIndex = this.parser.endIndex;\n        }\n        if (this.elementCB)\n            this.elementCB(elem);\n    };\n    DomHandler.prototype.onopentag = function (name, attribs) {\n        var type = this.options.xmlMode ? domelementtype_1.ElementType.Tag : undefined;\n        var element = new node_js_1.Element(name, attribs, undefined, type);\n        this.addNode(element);\n        this.tagStack.push(element);\n    };\n    DomHandler.prototype.ontext = function (data) {\n        var lastNode = this.lastNode;\n        if (lastNode && lastNode.type === domelementtype_1.ElementType.Text) {\n            lastNode.data += data;\n            if (this.options.withEndIndices) {\n                lastNode.endIndex = this.parser.endIndex;\n            }\n        }\n        else {\n            var node = new node_js_1.Text(data);\n            this.addNode(node);\n            this.lastNode = node;\n        }\n    };\n    DomHandler.prototype.oncomment = function (data) {\n        if (this.lastNode && this.lastNode.type === domelementtype_1.ElementType.Comment) {\n            this.lastNode.data += data;\n            return;\n        }\n        var node = new node_js_1.Comment(data);\n        this.addNode(node);\n        this.lastNode = node;\n    };\n    DomHandler.prototype.oncommentend = function () {\n        this.lastNode = null;\n    };\n    DomHandler.prototype.oncdatastart = function () {\n        var text = new node_js_1.Text(\"\");\n        var node = new node_js_1.CDATA([text]);\n        this.addNode(node);\n        text.parent = node;\n        this.lastNode = text;\n    };\n    DomHandler.prototype.oncdataend = function () {\n        this.lastNode = null;\n    };\n    DomHandler.prototype.onprocessinginstruction = function (name, data) {\n        var node = new node_js_1.ProcessingInstruction(name, data);\n        this.addNode(node);\n    };\n    DomHandler.prototype.handleCallback = function (error) {\n        if (typeof this.callback === \"function\") {\n            this.callback(error, this.dom);\n        }\n        else if (error) {\n            throw error;\n        }\n    };\n    DomHandler.prototype.addNode = function (node) {\n        var parent = this.tagStack[this.tagStack.length - 1];\n        var previousSibling = parent.children[parent.children.length - 1];\n        if (this.options.withStartIndices) {\n            node.startIndex = this.parser.startIndex;\n        }\n        if (this.options.withEndIndices) {\n            node.endIndex = this.parser.endIndex;\n        }\n        parent.children.push(node);\n        if (previousSibling) {\n            node.prev = previousSibling;\n            previousSibling.next = node;\n        }\n        node.parent = parent;\n        this.lastNode = null;\n    };\n    return DomHandler;\n}());\nexports.DomHandler = DomHandler;\nexports.default = DomHandler;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.cloneNode = exports.hasChildren = exports.isDocument = exports.isDirective = exports.isComment = exports.isText = exports.isCDATA = exports.isTag = exports.Element = exports.Document = exports.CDATA = exports.NodeWithChildren = exports.ProcessingInstruction = exports.Comment = exports.Text = exports.DataNode = exports.Node = void 0;\nvar domelementtype_1 = require(\"domelementtype\");\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nvar Node = /** @class */ (function () {\n    function Node() {\n        /** Parent of the node */\n        this.parent = null;\n        /** Previous sibling */\n        this.prev = null;\n        /** Next sibling */\n        this.next = null;\n        /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n        this.startIndex = null;\n        /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n        this.endIndex = null;\n    }\n    Object.defineProperty(Node.prototype, \"parentNode\", {\n        // Read-write aliases for properties\n        /**\n         * Same as {@link parent}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.parent;\n        },\n        set: function (parent) {\n            this.parent = parent;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"previousSibling\", {\n        /**\n         * Same as {@link prev}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.prev;\n        },\n        set: function (prev) {\n            this.prev = prev;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"nextSibling\", {\n        /**\n         * Same as {@link next}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.next;\n        },\n        set: function (next) {\n            this.next = next;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    /**\n     * Clone this node, and optionally its children.\n     *\n     * @param recursive Clone child nodes as well.\n     * @returns A clone of the node.\n     */\n    Node.prototype.cloneNode = function (recursive) {\n        if (recursive === void 0) { recursive = false; }\n        return cloneNode(this, recursive);\n    };\n    return Node;\n}());\nexports.Node = Node;\n/**\n * A node that contains some data.\n */\nvar DataNode = /** @class */ (function (_super) {\n    __extends(DataNode, _super);\n    /**\n     * @param data The content of the data node\n     */\n    function DataNode(data) {\n        var _this = _super.call(this) || this;\n        _this.data = data;\n        return _this;\n    }\n    Object.defineProperty(DataNode.prototype, \"nodeValue\", {\n        /**\n         * Same as {@link data}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.data;\n        },\n        set: function (data) {\n            this.data = data;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return DataNode;\n}(Node));\nexports.DataNode = DataNode;\n/**\n * Text within the document.\n */\nvar Text = /** @class */ (function (_super) {\n    __extends(Text, _super);\n    function Text() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = domelementtype_1.ElementType.Text;\n        return _this;\n    }\n    Object.defineProperty(Text.prototype, \"nodeType\", {\n        get: function () {\n            return 3;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return Text;\n}(DataNode));\nexports.Text = Text;\n/**\n * Comments within the document.\n */\nvar Comment = /** @class */ (function (_super) {\n    __extends(Comment, _super);\n    function Comment() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = domelementtype_1.ElementType.Comment;\n        return _this;\n    }\n    Object.defineProperty(Comment.prototype, \"nodeType\", {\n        get: function () {\n            return 8;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return Comment;\n}(DataNode));\nexports.Comment = Comment;\n/**\n * Processing instructions, including doc types.\n */\nvar ProcessingInstruction = /** @class */ (function (_super) {\n    __extends(ProcessingInstruction, _super);\n    function ProcessingInstruction(name, data) {\n        var _this = _super.call(this, data) || this;\n        _this.name = name;\n        _this.type = domelementtype_1.ElementType.Directive;\n        return _this;\n    }\n    Object.defineProperty(ProcessingInstruction.prototype, \"nodeType\", {\n        get: function () {\n            return 1;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return ProcessingInstruction;\n}(DataNode));\nexports.ProcessingInstruction = ProcessingInstruction;\n/**\n * A `Node` that can have children.\n */\nvar NodeWithChildren = /** @class */ (function (_super) {\n    __extends(NodeWithChildren, _super);\n    /**\n     * @param children Children of the node. Only certain node types can have children.\n     */\n    function NodeWithChildren(children) {\n        var _this = _super.call(this) || this;\n        _this.children = children;\n        return _this;\n    }\n    Object.defineProperty(NodeWithChildren.prototype, \"firstChild\", {\n        // Aliases\n        /** First child of the node. */\n        get: function () {\n            var _a;\n            return (_a = this.children[0]) !== null && _a !== void 0 ? _a : null;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(NodeWithChildren.prototype, \"lastChild\", {\n        /** Last child of the node. */\n        get: function () {\n            return this.children.length > 0\n                ? this.children[this.children.length - 1]\n                : null;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(NodeWithChildren.prototype, \"childNodes\", {\n        /**\n         * Same as {@link children}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.children;\n        },\n        set: function (children) {\n            this.children = children;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return NodeWithChildren;\n}(Node));\nexports.NodeWithChildren = NodeWithChildren;\nvar CDATA = /** @class */ (function (_super) {\n    __extends(CDATA, _super);\n    function CDATA() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = domelementtype_1.ElementType.CDATA;\n        return _this;\n    }\n    Object.defineProperty(CDATA.prototype, \"nodeType\", {\n        get: function () {\n            return 4;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return CDATA;\n}(NodeWithChildren));\nexports.CDATA = CDATA;\n/**\n * The root node of the document.\n */\nvar Document = /** @class */ (function (_super) {\n    __extends(Document, _super);\n    function Document() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = domelementtype_1.ElementType.Root;\n        return _this;\n    }\n    Object.defineProperty(Document.prototype, \"nodeType\", {\n        get: function () {\n            return 9;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return Document;\n}(NodeWithChildren));\nexports.Document = Document;\n/**\n * An element within the DOM.\n */\nvar Element = /** @class */ (function (_super) {\n    __extends(Element, _super);\n    /**\n     * @param name Name of the tag, eg. `div`, `span`.\n     * @param attribs Object mapping attribute names to attribute values.\n     * @param children Children of the node.\n     */\n    function Element(name, attribs, children, type) {\n        if (children === void 0) { children = []; }\n        if (type === void 0) { type = name === \"script\"\n            ? domelementtype_1.ElementType.Script\n            : name === \"style\"\n                ? domelementtype_1.ElementType.Style\n                : domelementtype_1.ElementType.Tag; }\n        var _this = _super.call(this, children) || this;\n        _this.name = name;\n        _this.attribs = attribs;\n        _this.type = type;\n        return _this;\n    }\n    Object.defineProperty(Element.prototype, \"nodeType\", {\n        get: function () {\n            return 1;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Element.prototype, \"tagName\", {\n        // DOM Level 1 aliases\n        /**\n         * Same as {@link name}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.name;\n        },\n        set: function (name) {\n            this.name = name;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Element.prototype, \"attributes\", {\n        get: function () {\n            var _this = this;\n            return Object.keys(this.attribs).map(function (name) {\n                var _a, _b;\n                return ({\n                    name: name,\n                    value: _this.attribs[name],\n                    namespace: (_a = _this[\"x-attribsNamespace\"]) === null || _a === void 0 ? void 0 : _a[name],\n                    prefix: (_b = _this[\"x-attribsPrefix\"]) === null || _b === void 0 ? void 0 : _b[name],\n                });\n            });\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return Element;\n}(NodeWithChildren));\nexports.Element = Element;\n/**\n * @param node Node to check.\n * @returns `true` if the node is a `Element`, `false` otherwise.\n */\nfunction isTag(node) {\n    return (0, domelementtype_1.isTag)(node);\n}\nexports.isTag = isTag;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `CDATA`, `false` otherwise.\n */\nfunction isCDATA(node) {\n    return node.type === domelementtype_1.ElementType.CDATA;\n}\nexports.isCDATA = isCDATA;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `Text`, `false` otherwise.\n */\nfunction isText(node) {\n    return node.type === domelementtype_1.ElementType.Text;\n}\nexports.isText = isText;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `Comment`, `false` otherwise.\n */\nfunction isComment(node) {\n    return node.type === domelementtype_1.ElementType.Comment;\n}\nexports.isComment = isComment;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.\n */\nfunction isDirective(node) {\n    return node.type === domelementtype_1.ElementType.Directive;\n}\nexports.isDirective = isDirective;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.\n */\nfunction isDocument(node) {\n    return node.type === domelementtype_1.ElementType.Root;\n}\nexports.isDocument = isDocument;\n/**\n * @param node Node to check.\n * @returns `true` if the node has children, `false` otherwise.\n */\nfunction hasChildren(node) {\n    return Object.prototype.hasOwnProperty.call(node, \"children\");\n}\nexports.hasChildren = hasChildren;\n/**\n * Clone a node, and optionally its children.\n *\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nfunction cloneNode(node, recursive) {\n    if (recursive === void 0) { recursive = false; }\n    var result;\n    if (isText(node)) {\n        result = new Text(node.data);\n    }\n    else if (isComment(node)) {\n        result = new Comment(node.data);\n    }\n    else if (isTag(node)) {\n        var children = recursive ? cloneChildren(node.children) : [];\n        var clone_1 = new Element(node.name, __assign({}, node.attribs), children);\n        children.forEach(function (child) { return (child.parent = clone_1); });\n        if (node.namespace != null) {\n            clone_1.namespace = node.namespace;\n        }\n        if (node[\"x-attribsNamespace\"]) {\n            clone_1[\"x-attribsNamespace\"] = __assign({}, node[\"x-attribsNamespace\"]);\n        }\n        if (node[\"x-attribsPrefix\"]) {\n            clone_1[\"x-attribsPrefix\"] = __assign({}, node[\"x-attribsPrefix\"]);\n        }\n        result = clone_1;\n    }\n    else if (isCDATA(node)) {\n        var children = recursive ? cloneChildren(node.children) : [];\n        var clone_2 = new CDATA(children);\n        children.forEach(function (child) { return (child.parent = clone_2); });\n        result = clone_2;\n    }\n    else if (isDocument(node)) {\n        var children = recursive ? cloneChildren(node.children) : [];\n        var clone_3 = new Document(children);\n        children.forEach(function (child) { return (child.parent = clone_3); });\n        if (node[\"x-mode\"]) {\n            clone_3[\"x-mode\"] = node[\"x-mode\"];\n        }\n        result = clone_3;\n    }\n    else if (isDirective(node)) {\n        var instruction = new ProcessingInstruction(node.name, node.data);\n        if (node[\"x-name\"] != null) {\n            instruction[\"x-name\"] = node[\"x-name\"];\n            instruction[\"x-publicId\"] = node[\"x-publicId\"];\n            instruction[\"x-systemId\"] = node[\"x-systemId\"];\n        }\n        result = instruction;\n    }\n    else {\n        throw new Error(\"Not implemented yet: \".concat(node.type));\n    }\n    result.startIndex = node.startIndex;\n    result.endIndex = node.endIndex;\n    if (node.sourceCodeLocation != null) {\n        result.sourceCodeLocation = node.sourceCodeLocation;\n    }\n    return result;\n}\nexports.cloneNode = cloneNode;\nfunction cloneChildren(childs) {\n    var children = childs.map(function (child) { return cloneNode(child, true); });\n    for (var i = 1; i < children.length; i++) {\n        children[i].prev = children[i - 1];\n        children[i - 1].next = children[i];\n    }\n    return children;\n}\n",null,"module.exports = /[:=](?:\\'(?:\\-[\\(\\)DO\\[\\]o\\{\\}]|[\\(\\)DO\\[\\]o\\{\\}])|\\{>|\\-[#\\$&\\(-\\*\\/3<>-@B-EJLOPSXZ-\\]cjlopsxz-\\}]|[#\\$&\\(-\\*\\/3<>-@B-EJLOPSXZ-\\]cjlopsxz\\|\\}])|[Oo][:=](?:\\-[\\)\\]\\}]|[\\)\\]\\}])|>(?:[:=](?:\\-[\\(\\)\\/\\[-\\]\\{\\}]|[\\(\\)\\/\\[-\\]\\{\\}])|0(?:\\-[\\)\\]\\}]|[\\)\\]\\}]))|%(?:\\-[\\(\\[\\{]|[\\(\\[\\{])|\\\\[Mm]\\/|D(?:\\-[:=Xx]|[:=Xx])|8(?:\\-[#\\)D\\]\\}]|[#\\)D\\]\\}])|;(?:\\-[\\)P\\]p\\}]|[\\)P\\]p\\}])|x(?:\\-[\\(DP\\[op\\{]|[\\(DP\\[op\\{])|X(?:\\-[\\(DOP\\[\\{]|[\\(DOP\\[\\{])|<\\/?3|[:=]\\{/;\n","import type {\n\tGender,\n\tGroupKey,\n\tLocale,\n\tPermutationOptions,\n\tPresentation,\n\tQualifier,\n\tSkinTone,\n\tSkinToneKey,\n} from './types';\n\nexport const SEQUENCE_REMOVAL_PATTERN = /200D|FE0E|FE0F/g;\n\n// Use numbers instead of string values, as the filesize is greatly reduced.\n\nexport const TEXT: Presentation = 0;\nexport const EMOJI: Presentation = 1;\n\nexport const FEMALE: Gender = 0;\nexport const MALE: Gender = 1;\n\nexport const FULLY_QUALIFIED: Qualifier = 0;\nexport const MINIMALLY_QUALIFIED: Qualifier = 1;\nexport const UNQUALIFIED: Qualifier = 2;\n\nexport const LIGHT_SKIN: SkinTone = 1;\nexport const MEDIUM_LIGHT_SKIN: SkinTone = 2;\nexport const MEDIUM_SKIN: SkinTone = 3;\nexport const MEDIUM_DARK_SKIN: SkinTone = 4;\nexport const DARK_SKIN: SkinTone = 5;\n\nexport const GROUP_KEY_SMILEYS_EMOTION: GroupKey = 'smileys-emotion';\nexport const GROUP_KEY_PEOPLE_BODY: GroupKey = 'people-body';\nexport const GROUP_KEY_ANIMALS_NATURE: GroupKey = 'animals-nature';\nexport const GROUP_KEY_FOOD_DRINK: GroupKey = 'food-drink';\nexport const GROUP_KEY_TRAVEL_PLACES: GroupKey = 'travel-places';\nexport const GROUP_KEY_ACTIVITIES: GroupKey = 'activities';\nexport const GROUP_KEY_OBJECTS: GroupKey = 'objects';\nexport const GROUP_KEY_SYMBOLS: GroupKey = 'symbols';\nexport const GROUP_KEY_FLAGS: GroupKey = 'flags';\nexport const GROUP_KEY_COMPONENT: GroupKey = 'component';\n\nexport const SKIN_KEY_LIGHT: SkinToneKey = 'light';\nexport const SKIN_KEY_MEDIUM_LIGHT: SkinToneKey = 'medium-light';\nexport const SKIN_KEY_MEDIUM: SkinToneKey = 'medium';\nexport const SKIN_KEY_MEDIUM_DARK: SkinToneKey = 'medium-dark';\nexport const SKIN_KEY_DARK: SkinToneKey = 'dark';\n\n// Important release versions and locales in generating accurate data.\n\nexport const LATEST_EMOJI_VERSION = '17.0';\nexport const LATEST_UNICODE_VERSION = '17.0.0';\nexport const LATEST_CLDR_VERSION = '48';\n\nexport const FIRST_UNICODE_EMOJI_VERSION = '6.0.0';\nexport const EMOJI_VERSIONS = [\n\t'1.0',\n\t'2.0',\n\t'3.0',\n\t'4.0',\n\t'5.0',\n\t'11.0',\n\t'12.0',\n\t'12.1',\n\t'13.0',\n\t'13.1',\n\t'14.0',\n\t'15.0',\n\t'15.1',\n\t'16.0',\n\t'17.0',\n];\nexport const UNICODE_VERSIONS = [\n\t'6.0',\n\t'6.1',\n\t'6.2',\n\t'6.3',\n\t'7.0',\n\t'8.0',\n\t'9.0',\n\t'10.0',\n\t'11.0',\n\t'12.0',\n\t'12.1',\n\t'13.0',\n\t'14.0',\n\t'15.0',\n\t'15.1',\n\t'16.0',\n\t'17.0',\n];\n\nexport const SUPPORTED_LOCALES: Locale[] = [\n\t'bn', // Bangla\n\t'da', // Danish\n\t'de', // German\n\t'en', // English\n\t'en-gb', // English (Great Britain)\n\t'es', // Spanish\n\t'es-mx', // Spanish (Mexico)\n\t'et', // Estonian\n\t'fi', // Finnish\n\t'fr', // French\n\t'hi', // Hindi\n\t'hu', // Hungarian\n\t'it', // Italian\n\t'ja', // Japanese\n\t'ko', // Korean\n\t'lt', // Lithuanian\n\t'ms', // Malay\n\t'nb', // Norwegian\n\t'nl', // Dutch\n\t'pl', // Polish\n\t'pt', // Portuguese\n\t'ru', // Russian\n\t'sv', // Swedish\n\t'th', // Thai\n\t'uk', // Ukrainian\n\t'vi', // Vietnamese\n\t'zh', // Chinese\n\t'zh-hant', // Chinese (Traditional)\n];\n\n// Special options for emoticon permutations.\n\nexport const EMOTICON_OPTIONS: Record<string, PermutationOptions> = {\n\t// 🧙‍♂️ man mage\n\t':{>': { withNose: false },\n\t// 💔 broken heart\n\t'</3': { isFace: false },\n\t// ❤️ red heart\n\t'<3': { isFace: false },\n\t// 🤘 sign of the horns\n\t'\\\\m/': { isFace: false },\n\t'\\\\M/': { isFace: false },\n\t// 👹 ogre\n\t'0)': { withNose: false },\n};\n","import type { Emoticon, PermutationOptions } from './types';\n\n/**\n * This function will generate multiple permutations of a base emoticon character.\n * The following permutations will occur:\n *\n * - `)` mouth will be replaced with `]` and `}`. The same applies to sad/frowning mouths.\n * - `/` mouth will be replaced with `\\`.\n * - `:` eyes will be replaced with `=`.\n * - Supports a `-` nose, by injecting between the eyes and mouth.\n * - Supports both uppercase and lowercase variants.\n *\n * ```ts\n * import { generateEmoticonPermutations } from 'emojibase';\n *\n * generateEmoticonPermutations(':)'); // =-), =-}, :-], =-], :-}, :-), =}, =], =), :}, :], :)\n * ```\n *\n * > The base emoticon must follow a set of naming guidelines to work properly.\n *\n * Furthermore, this function accepts an options object as the 2nd argument, as a means to customize\n * the output.\n *\n * - `isFace` (bool) - Toggles face permutations (mouth and eye variants). Defaults to `true`.\n * - `withNose` (bool) - Toggles nose inclusion. Defaults to `true`.\n *\n * ```ts\n * generateEmoticonPermutations(':)', { withNose: false }); // =}, =], =), :}, :], :)\n * generateEmoticonPermutations('\\\\m/', { isFace: false }); // \\m/, \\M/\n * ```\n */\nexport function generateEmoticonPermutations(\n\temoticon: Emoticon,\n\toptions: PermutationOptions = {},\n): Emoticon[] {\n\tconst { isFace = true, withNose = true } = options;\n\tconst list = [emoticon];\n\n\t// Uppercase variant\n\tif (emoticon.toUpperCase() !== emoticon) {\n\t\tlist.push(...generateEmoticonPermutations(emoticon.toUpperCase(), options));\n\t}\n\n\tif (isFace) {\n\t\t// Backwards slash mouth variant\n\t\tif (emoticon.includes('/')) {\n\t\t\tlist.push(...generateEmoticonPermutations(emoticon.replace('/', '\\\\'), options));\n\t\t}\n\n\t\t// Bracket and curly brace mouth variants\n\t\tif (emoticon.includes(')')) {\n\t\t\tlist.push(\n\t\t\t\t...generateEmoticonPermutations(emoticon.replace(')', ']'), options),\n\t\t\t\t...generateEmoticonPermutations(emoticon.replace(')', '}'), options),\n\t\t\t);\n\t\t}\n\n\t\tif (emoticon.includes('(')) {\n\t\t\tlist.push(\n\t\t\t\t...generateEmoticonPermutations(emoticon.replace('(', '['), options),\n\t\t\t\t...generateEmoticonPermutations(emoticon.replace('(', '{'), options),\n\t\t\t);\n\t\t}\n\n\t\t// Eye variant\n\t\tif (emoticon.includes(':')) {\n\t\t\tlist.push(...generateEmoticonPermutations(emoticon.replace(':', '='), options));\n\t\t}\n\n\t\t// Nose variant for ALL\n\t\tif (withNose) {\n\t\t\tlist.forEach((emo) => {\n\t\t\t\tif (!emo.includes('-')) {\n\t\t\t\t\tlist.push(`${emo.slice(0, -1)}-${emo.slice(-1)}`);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Sort from longest to shortest\n\tlist.sort((a, b) => b.length - a.length);\n\n\treturn [...new Set(list)];\n}\n","import { SEQUENCE_REMOVAL_PATTERN } from './constants';\nimport type { Hexcode } from './types';\n\nconst STRIP_PATTERN = new RegExp(`(-| )?(${SEQUENCE_REMOVAL_PATTERN.source})`, 'g');\n\n/**\n * This function will strip zero width joiners (`200D`) and variation selectors\n * (`FE0E`, `FE0F`) from a hexadecimal codepoint.\n *\n * ```ts\n * import { stripHexcode } from 'emojibase';\n *\n * stripHexcode('1F468-200D-2695-FE0F'); // 1F468-2695\n * ```\n */\nexport function stripHexcode(hexcode: Hexcode): Hexcode {\n\treturn hexcode.replace(STRIP_PATTERN, '');\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeXML = exports.decodeHTMLStrict = exports.decodeHTML = exports.determineBranch = exports.JUMP_OFFSET_BASE = exports.BinTrieFlags = exports.xmlDecodeTree = exports.htmlDecodeTree = void 0;\nvar decode_data_html_1 = __importDefault(require(\"./generated/decode-data-html\"));\nexports.htmlDecodeTree = decode_data_html_1.default;\nvar decode_data_xml_1 = __importDefault(require(\"./generated/decode-data-xml\"));\nexports.xmlDecodeTree = decode_data_xml_1.default;\nvar decode_codepoint_1 = __importDefault(require(\"./decode_codepoint\"));\nvar BinTrieFlags;\n(function (BinTrieFlags) {\n    BinTrieFlags[BinTrieFlags[\"HAS_VALUE\"] = 32768] = \"HAS_VALUE\";\n    BinTrieFlags[BinTrieFlags[\"BRANCH_LENGTH\"] = 32512] = \"BRANCH_LENGTH\";\n    BinTrieFlags[BinTrieFlags[\"MULTI_BYTE\"] = 128] = \"MULTI_BYTE\";\n    BinTrieFlags[BinTrieFlags[\"JUMP_TABLE\"] = 127] = \"JUMP_TABLE\";\n})(BinTrieFlags = exports.BinTrieFlags || (exports.BinTrieFlags = {}));\nexports.JUMP_OFFSET_BASE = 48 /* ZERO */ - 1;\nfunction getDecoder(decodeTree) {\n    return function decodeHTMLBinary(str, strict) {\n        var ret = \"\";\n        var lastIdx = 0;\n        var strIdx = 0;\n        while ((strIdx = str.indexOf(\"&\", strIdx)) >= 0) {\n            ret += str.slice(lastIdx, strIdx);\n            lastIdx = strIdx;\n            // Skip the \"&\"\n            strIdx += 1;\n            // If we have a numeric entity, handle this separately.\n            if (str.charCodeAt(strIdx) === 35 /* NUM */) {\n                // Skip the leading \"&#\". For hex entities, also skip the leading \"x\".\n                var start = strIdx + 1;\n                var base = 10;\n                var cp = str.charCodeAt(start);\n                if ((cp | 32 /* To_LOWER_BIT */) === 120 /* LOWER_X */) {\n                    base = 16;\n                    strIdx += 1;\n                    start += 1;\n                }\n                while (((cp = str.charCodeAt(++strIdx)) >= 48 /* ZERO */ &&\n                    cp <= 57 /* NINE */) ||\n                    (base === 16 &&\n                        (cp | 32 /* To_LOWER_BIT */) >= 97 /* LOWER_A */ &&\n                        (cp | 32 /* To_LOWER_BIT */) <= 102 /* LOWER_F */))\n                    ;\n                if (start !== strIdx) {\n                    var entity = str.substring(start, strIdx);\n                    var parsed = parseInt(entity, base);\n                    if (str.charCodeAt(strIdx) === 59 /* SEMI */) {\n                        strIdx += 1;\n                    }\n                    else if (strict) {\n                        continue;\n                    }\n                    ret += decode_codepoint_1.default(parsed);\n                    lastIdx = strIdx;\n                }\n                continue;\n            }\n            var result = null;\n            var excess = 1;\n            var treeIdx = 0;\n            var current = decodeTree[treeIdx];\n            for (; strIdx < str.length; strIdx++, excess++) {\n                treeIdx = determineBranch(decodeTree, current, treeIdx + 1, str.charCodeAt(strIdx));\n                if (treeIdx < 0)\n                    break;\n                current = decodeTree[treeIdx];\n                // If the branch is a value, store it and continue\n                if (current & BinTrieFlags.HAS_VALUE) {\n                    // If we have a legacy entity while parsing strictly, just skip the number of bytes\n                    if (strict && str.charCodeAt(strIdx) !== 59 /* SEMI */) {\n                        // No need to consider multi-byte values, as the legacy entity is always a single byte\n                        treeIdx += 1;\n                    }\n                    else {\n                        // If this is a surrogate pair, combine the higher bits from the node with the next byte\n                        result =\n                            current & BinTrieFlags.MULTI_BYTE\n                                ? String.fromCharCode(decodeTree[++treeIdx], decodeTree[++treeIdx])\n                                : String.fromCharCode(decodeTree[++treeIdx]);\n                        excess = 0;\n                    }\n                }\n            }\n            if (result != null) {\n                ret += result;\n                lastIdx = strIdx - excess + 1;\n            }\n        }\n        return ret + str.slice(lastIdx);\n    };\n}\nfunction determineBranch(decodeTree, current, nodeIdx, char) {\n    if (current <= 128) {\n        return char === current ? nodeIdx : -1;\n    }\n    var branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 8;\n    if (branchCount === 0) {\n        return -1;\n    }\n    if (branchCount === 1) {\n        return char === decodeTree[nodeIdx] ? nodeIdx + 1 : -1;\n    }\n    var jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n    if (jumpOffset) {\n        var value = char - exports.JUMP_OFFSET_BASE - jumpOffset;\n        return value < 0 || value > branchCount\n            ? -1\n            : decodeTree[nodeIdx + value] - 1;\n    }\n    // Binary search for the character.\n    var lo = nodeIdx;\n    var hi = lo + branchCount - 1;\n    while (lo <= hi) {\n        var mid = (lo + hi) >>> 1;\n        var midVal = decodeTree[mid];\n        if (midVal < char) {\n            lo = mid + 1;\n        }\n        else if (midVal > char) {\n            hi = mid - 1;\n        }\n        else {\n            return decodeTree[mid + branchCount];\n        }\n    }\n    return -1;\n}\nexports.determineBranch = determineBranch;\nvar htmlDecoder = getDecoder(decode_data_html_1.default);\nvar xmlDecoder = getDecoder(decode_data_xml_1.default);\nfunction decodeHTML(str) {\n    return htmlDecoder(str, false);\n}\nexports.decodeHTML = decodeHTML;\nfunction decodeHTMLStrict(str) {\n    return htmlDecoder(str, true);\n}\nexports.decodeHTMLStrict = decodeHTMLStrict;\nfunction decodeXML(str) {\n    return xmlDecoder(str, true);\n}\nexports.decodeXML = decodeXML;\n","\"use strict\";\n// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decodeMap = new Map([\n    [0, 65533],\n    [128, 8364],\n    [130, 8218],\n    [131, 402],\n    [132, 8222],\n    [133, 8230],\n    [134, 8224],\n    [135, 8225],\n    [136, 710],\n    [137, 8240],\n    [138, 352],\n    [139, 8249],\n    [140, 338],\n    [142, 381],\n    [145, 8216],\n    [146, 8217],\n    [147, 8220],\n    [148, 8221],\n    [149, 8226],\n    [150, 8211],\n    [151, 8212],\n    [152, 732],\n    [153, 8482],\n    [154, 353],\n    [155, 8250],\n    [156, 339],\n    [158, 382],\n    [159, 376],\n]);\nvar fromCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, node/no-unsupported-features/es-builtins\nString.fromCodePoint ||\n    function (codePoint) {\n        var output = \"\";\n        if (codePoint > 0xffff) {\n            codePoint -= 0x10000;\n            output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n            codePoint = 0xdc00 | (codePoint & 0x3ff);\n        }\n        output += String.fromCharCode(codePoint);\n        return output;\n    };\nfunction decodeCodePoint(codePoint) {\n    var _a;\n    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n        return \"\\uFFFD\";\n    }\n    return fromCodePoint((_a = decodeMap.get(codePoint)) !== null && _a !== void 0 ? _a : codePoint);\n}\nexports.default = decodeCodePoint;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getTrie = exports.encodeHTMLTrieRe = exports.getCodePoint = void 0;\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nfunction isHighSurrugate(c) {\n    return (c & 64512 /* Mask */) === 55296 /* High */;\n}\n// For compatibility with node < 4, we wrap `codePointAt`\nexports.getCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nString.prototype.codePointAt != null\n    ? function (str, index) { return str.codePointAt(index); }\n    : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        function (c, index) {\n            return isHighSurrugate(c.charCodeAt(index))\n                ? (c.charCodeAt(index) - 55296 /* High */) * 0x400 +\n                    c.charCodeAt(index + 1) -\n                    0xdc00 +\n                    0x10000\n                : c.charCodeAt(index);\n        };\nvar htmlTrie = getTrie(entities_json_1.default);\nfunction encodeHTMLTrieRe(regExp, str) {\n    var _a;\n    var ret = \"\";\n    var lastIdx = 0;\n    var match;\n    while ((match = regExp.exec(str)) !== null) {\n        var i = match.index;\n        var char = str.charCodeAt(i);\n        var next = htmlTrie.get(char);\n        if (next) {\n            if (next.next != null && i + 1 < str.length) {\n                var value = (_a = next.next.get(str.charCodeAt(i + 1))) === null || _a === void 0 ? void 0 : _a.value;\n                if (value != null) {\n                    ret += str.substring(lastIdx, i) + value;\n                    regExp.lastIndex += 1;\n                    lastIdx = i + 2;\n                    continue;\n                }\n            }\n            ret += str.substring(lastIdx, i) + next.value;\n            lastIdx = i + 1;\n        }\n        else {\n            ret += str.substring(lastIdx, i) + \"&#x\" + exports.getCodePoint(str, i).toString(16) + \";\";\n            // Increase by 1 if we have a surrogate pair\n            lastIdx = regExp.lastIndex += Number(isHighSurrugate(char));\n        }\n    }\n    return ret + str.substr(lastIdx);\n}\nexports.encodeHTMLTrieRe = encodeHTMLTrieRe;\nfunction getTrie(map) {\n    var _a, _b, _c, _d;\n    var trie = new Map();\n    for (var _i = 0, _e = Object.keys(map); _i < _e.length; _i++) {\n        var value = _e[_i];\n        var key = map[value];\n        // Resolve the key\n        var lastMap = trie;\n        for (var i = 0; i < key.length - 1; i++) {\n            var char = key.charCodeAt(i);\n            var next = (_a = lastMap.get(char)) !== null && _a !== void 0 ? _a : {};\n            lastMap.set(char, next);\n            lastMap = (_b = next.next) !== null && _b !== void 0 ? _b : (next.next = new Map());\n        }\n        var val = (_c = lastMap.get(key.charCodeAt(key.length - 1))) !== null && _c !== void 0 ? _c : {};\n        (_d = val.value) !== null && _d !== void 0 ? _d : (val.value = \"&\" + value + \";\");\n        lastMap.set(key.charCodeAt(key.length - 1), val);\n    }\n    return trie;\n}\nexports.getTrie = getTrie;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = void 0;\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar encode_trie_1 = require(\"./encode-trie\");\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar htmlReplacer = getCharRegExp(entities_json_1.default, true);\nvar xmlReplacer = getCharRegExp(xml_json_1.default, true);\nvar xmlInvalidChars = getCharRegExp(xml_json_1.default, false);\nvar xmlCodeMap = new Map(Object.keys(xml_json_1.default).map(function (k) { return [\n    xml_json_1.default[k].charCodeAt(0),\n    \"&\" + k + \";\",\n]; }));\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using XML entities.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `&#xfc;`) will be used.\n */\nfunction encodeXML(str) {\n    var ret = \"\";\n    var lastIdx = 0;\n    var match;\n    while ((match = xmlReplacer.exec(str)) !== null) {\n        var i = match.index;\n        var char = str.charCodeAt(i);\n        var next = xmlCodeMap.get(char);\n        if (next) {\n            ret += str.substring(lastIdx, i) + next;\n            lastIdx = i + 1;\n        }\n        else {\n            ret += str.substring(lastIdx, i) + \"&#x\" + encode_trie_1.getCodePoint(str, i).toString(16) + \";\";\n            // Increase by 1 if we have a surrogate pair\n            lastIdx = xmlReplacer.lastIndex += Number((char & 65408) === 0xd800);\n        }\n    }\n    return ret + str.substr(lastIdx);\n}\nexports.encodeXML = encodeXML;\n/**\n * Encodes all entities and non-ASCII characters in the input.\n *\n * This includes characters that are valid ASCII characters in HTML documents.\n * For example `#` will be encoded as `&num;`. To get a more compact output,\n * consider using the `encodeNonAsciiHTML` function.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `&#xfc;`) will be used.\n */\nfunction encodeHTML(data) {\n    return encode_trie_1.encodeHTMLTrieRe(htmlReplacer, data);\n}\nexports.encodeHTML = encodeHTML;\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in HTML\n * documents using HTML entities.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `&#xfc;`) will be used.\n */\nfunction encodeNonAsciiHTML(data) {\n    return encode_trie_1.encodeHTMLTrieRe(xmlReplacer, data);\n}\nexports.encodeNonAsciiHTML = encodeNonAsciiHTML;\nfunction getCharRegExp(map, nonAscii) {\n    // Collect the start characters of all entities\n    var chars = Object.keys(map)\n        .map(function (k) { return \"\\\\\" + map[k].charAt(0); })\n        .filter(function (v) { return !nonAscii || v.charCodeAt(1) < 128; })\n        .sort(function (a, b) { return a.charCodeAt(1) - b.charCodeAt(1); })\n        // Remove duplicates\n        .filter(function (v, i, a) { return v !== a[i + 1]; });\n    // Add ranges to single characters.\n    for (var start = 0; start < chars.length - 1; start++) {\n        // Find the end of a run of characters\n        var end = start;\n        while (end < chars.length - 1 &&\n            chars[end].charCodeAt(1) + 1 === chars[end + 1].charCodeAt(1)) {\n            end += 1;\n        }\n        var count = 1 + end - start;\n        // We want to replace at least three characters\n        if (count < 3)\n            continue;\n        chars.splice(start, count, chars[start] + \"-\" + chars[end]);\n    }\n    return new RegExp(\"[\" + chars.join(\"\") + (nonAscii ? \"\\\\x80-\\\\uFFFF\" : \"\") + \"]\", \"g\");\n}\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using numeric hexadecimal reference (eg. `&#xfc;`).\n *\n * Have a look at `escapeUTF8` if you want a more concise output at the expense\n * of reduced transportability.\n *\n * @param data String to escape.\n */\nexports.escape = encodeXML;\n/**\n * Encodes all characters not valid in XML documents using XML entities.\n *\n * Note that the output will be character-set dependent.\n *\n * @param data String to escape.\n */\nfunction escapeUTF8(data) {\n    var match;\n    var lastIdx = 0;\n    var result = \"\";\n    while ((match = xmlInvalidChars.exec(data))) {\n        if (lastIdx !== match.index) {\n            result += data.substring(lastIdx, match.index);\n        }\n        // We know that this chararcter will be in `inverseXML`\n        result += xmlCodeMap.get(match[0].charCodeAt(0));\n        // Every match will be of length 1\n        lastIdx = match.index + 1;\n    }\n    return result + data.substring(lastIdx);\n}\nexports.escapeUTF8 = escapeUTF8;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Generated using scripts/write-decode-map.ts\n// prettier-ignore\nexports.default = new Uint16Array([14866, 60, 237, 340, 721, 1312, 1562, 1654, 1838, 1957, 2183, 2239, 2301, 2958, 3037, 3893, 4123, 4298, 4330, 4801, 5191, 5395, 5752, 5903, 5943, 5972, 6050, 0, 0, 0, 0, 0, 0, 6135, 6565, 7422, 8183, 8738, 9242, 9503, 9938, 10189, 10573, 10637, 10715, 11950, 12246, 13539, 13950, 14445, 14533, 15364, 16514, 16980, 17390, 17763, 17849, 18036, 18125, 4096, 69, 77, 97, 98, 99, 102, 103, 108, 109, 110, 111, 112, 114, 115, 116, 117, 92, 100, 106, 115, 122, 137, 142, 151, 157, 163, 167, 182, 196, 204, 220, 229, 108, 105, 103, 33024, 198, 59, 32768, 198, 80, 33024, 38, 59, 32768, 38, 99, 117, 116, 101, 33024, 193, 59, 32768, 193, 114, 101, 118, 101, 59, 32768, 258, 512, 105, 121, 127, 134, 114, 99, 33024, 194, 59, 32768, 194, 59, 32768, 1040, 114, 59, 32896, 55349, 56580, 114, 97, 118, 101, 33024, 192, 59, 32768, 192, 112, 104, 97, 59, 32768, 913, 97, 99, 114, 59, 32768, 256, 100, 59, 32768, 10835, 512, 103, 112, 172, 177, 111, 110, 59, 32768, 260, 102, 59, 32896, 55349, 56632, 112, 108, 121, 70, 117, 110, 99, 116, 105, 111, 110, 59, 32768, 8289, 105, 110, 103, 33024, 197, 59, 32768, 197, 512, 99, 115, 209, 214, 114, 59, 32896, 55349, 56476, 105, 103, 110, 59, 32768, 8788, 105, 108, 100, 101, 33024, 195, 59, 32768, 195, 109, 108, 33024, 196, 59, 32768, 196, 2048, 97, 99, 101, 102, 111, 114, 115, 117, 253, 278, 282, 310, 315, 321, 327, 332, 512, 99, 114, 258, 267, 107, 115, 108, 97, 115, 104, 59, 32768, 8726, 583, 271, 274, 59, 32768, 10983, 101, 100, 59, 32768, 8966, 121, 59, 32768, 1041, 768, 99, 114, 116, 289, 296, 306, 97, 117, 115, 101, 59, 32768, 8757, 110, 111, 117, 108, 108, 105, 115, 59, 32768, 8492, 97, 59, 32768, 914, 114, 59, 32896, 55349, 56581, 112, 102, 59, 32896, 55349, 56633, 101, 118, 101, 59, 32768, 728, 99, 114, 59, 32768, 8492, 109, 112, 101, 113, 59, 32768, 8782, 3584, 72, 79, 97, 99, 100, 101, 102, 104, 105, 108, 111, 114, 115, 117, 368, 373, 380, 426, 461, 466, 487, 491, 495, 533, 593, 695, 701, 707, 99, 121, 59, 32768, 1063, 80, 89, 33024, 169, 59, 32768, 169, 768, 99, 112, 121, 387, 393, 419, 117, 116, 101, 59, 32768, 262, 512, 59, 105, 398, 400, 32768, 8914, 116, 97, 108, 68, 105, 102, 102, 101, 114, 101, 110, 116, 105, 97, 108, 68, 59, 32768, 8517, 108, 101, 121, 115, 59, 32768, 8493, 1024, 97, 101, 105, 111, 435, 441, 449, 454, 114, 111, 110, 59, 32768, 268, 100, 105, 108, 33024, 199, 59, 32768, 199, 114, 99, 59, 32768, 264, 110, 105, 110, 116, 59, 32768, 8752, 111, 116, 59, 32768, 266, 512, 100, 110, 471, 478, 105, 108, 108, 97, 59, 32768, 184, 116, 101, 114, 68, 111, 116, 59, 32768, 183, 114, 59, 32768, 8493, 105, 59, 32768, 935, 114, 99, 108, 101, 1024, 68, 77, 80, 84, 508, 513, 520, 526, 111, 116, 59, 32768, 8857, 105, 110, 117, 115, 59, 32768, 8854, 108, 117, 115, 59, 32768, 8853, 105, 109, 101, 115, 59, 32768, 8855, 111, 512, 99, 115, 539, 562, 107, 119, 105, 115, 101, 67, 111, 110, 116, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 32768, 8754, 101, 67, 117, 114, 108, 121, 512, 68, 81, 573, 586, 111, 117, 98, 108, 101, 81, 117, 111, 116, 101, 59, 32768, 8221, 117, 111, 116, 101, 59, 32768, 8217, 1024, 108, 110, 112, 117, 602, 614, 648, 664, 111, 110, 512, 59, 101, 609, 611, 32768, 8759, 59, 32768, 10868, 768, 103, 105, 116, 621, 629, 634, 114, 117, 101, 110, 116, 59, 32768, 8801, 110, 116, 59, 32768, 8751, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 32768, 8750, 512, 102, 114, 653, 656, 59, 32768, 8450, 111, 100, 117, 99, 116, 59, 32768, 8720, 110, 116, 101, 114, 67, 108, 111, 99, 107, 119, 105, 115, 101, 67, 111, 110, 116, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 32768, 8755, 111, 115, 115, 59, 32768, 10799, 99, 114, 59, 32896, 55349, 56478, 112, 512, 59, 67, 713, 715, 32768, 8915, 97, 112, 59, 32768, 8781, 2816, 68, 74, 83, 90, 97, 99, 101, 102, 105, 111, 115, 743, 758, 763, 768, 773, 795, 809, 821, 826, 910, 1295, 512, 59, 111, 748, 750, 32768, 8517, 116, 114, 97, 104, 100, 59, 32768, 10513, 99, 121, 59, 32768, 1026, 99, 121, 59, 32768, 1029, 99, 121, 59, 32768, 1039, 768, 103, 114, 115, 780, 786, 790, 103, 101, 114, 59, 32768, 8225, 114, 59, 32768, 8609, 104, 118, 59, 32768, 10980, 512, 97, 121, 800, 806, 114, 111, 110, 59, 32768, 270, 59, 32768, 1044, 108, 512, 59, 116, 815, 817, 32768, 8711, 97, 59, 32768, 916, 114, 59, 32896, 55349, 56583, 512, 97, 102, 831, 897, 512, 99, 109, 836, 891, 114, 105, 116, 105, 99, 97, 108, 1024, 65, 68, 71, 84, 852, 859, 877, 884, 99, 117, 116, 101, 59, 32768, 180, 111, 581, 864, 867, 59, 32768, 729, 98, 108, 101, 65, 99, 117, 116, 101, 59, 32768, 733, 114, 97, 118, 101, 59, 32768, 96, 105, 108, 100, 101, 59, 32768, 732, 111, 110, 100, 59, 32768, 8900, 102, 101, 114, 101, 110, 116, 105, 97, 108, 68, 59, 32768, 8518, 2113, 920, 0, 0, 0, 925, 946, 0, 1139, 102, 59, 32896, 55349, 56635, 768, 59, 68, 69, 931, 933, 938, 32768, 168, 111, 116, 59, 32768, 8412, 113, 117, 97, 108, 59, 32768, 8784, 98, 108, 101, 1536, 67, 68, 76, 82, 85, 86, 961, 978, 996, 1080, 1101, 1125, 111, 110, 116, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 32768, 8751, 111, 1093, 985, 0, 0, 988, 59, 32768, 168, 110, 65, 114, 114, 111, 119, 59, 32768, 8659, 512, 101, 111, 1001, 1034, 102, 116, 768, 65, 82, 84, 1010, 1017, 1029, 114, 114, 111, 119, 59, 32768, 8656, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 8660, 101, 101, 59, 32768, 10980, 110, 103, 512, 76, 82, 1041, 1068, 101, 102, 116, 512, 65, 82, 1049, 1056, 114, 114, 111, 119, 59, 32768, 10232, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 10234, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 10233, 105, 103, 104, 116, 512, 65, 84, 1089, 1096, 114, 114, 111, 119, 59, 32768, 8658, 101, 101, 59, 32768, 8872, 112, 1042, 1108, 0, 0, 1115, 114, 114, 111, 119, 59, 32768, 8657, 111, 119, 110, 65, 114, 114, 111, 119, 59, 32768, 8661, 101, 114, 116, 105, 99, 97, 108, 66, 97, 114, 59, 32768, 8741, 110, 1536, 65, 66, 76, 82, 84, 97, 1152, 1179, 1186, 1236, 1272, 1288, 114, 114, 111, 119, 768, 59, 66, 85, 1163, 1165, 1170, 32768, 8595, 97, 114, 59, 32768, 10515, 112, 65, 114, 114, 111, 119, 59, 32768, 8693, 114, 101, 118, 101, 59, 32768, 785, 101, 102, 116, 1315, 1196, 0, 1209, 0, 1220, 105, 103, 104, 116, 86, 101, 99, 116, 111, 114, 59, 32768, 10576, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10590, 101, 99, 116, 111, 114, 512, 59, 66, 1229, 1231, 32768, 8637, 97, 114, 59, 32768, 10582, 105, 103, 104, 116, 805, 1245, 0, 1256, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10591, 101, 99, 116, 111, 114, 512, 59, 66, 1265, 1267, 32768, 8641, 97, 114, 59, 32768, 10583, 101, 101, 512, 59, 65, 1279, 1281, 32768, 8868, 114, 114, 111, 119, 59, 32768, 8615, 114, 114, 111, 119, 59, 32768, 8659, 512, 99, 116, 1300, 1305, 114, 59, 32896, 55349, 56479, 114, 111, 107, 59, 32768, 272, 4096, 78, 84, 97, 99, 100, 102, 103, 108, 109, 111, 112, 113, 115, 116, 117, 120, 1344, 1348, 1354, 1363, 1386, 1391, 1396, 1405, 1413, 1460, 1475, 1483, 1514, 1527, 1531, 1538, 71, 59, 32768, 330, 72, 33024, 208, 59, 32768, 208, 99, 117, 116, 101, 33024, 201, 59, 32768, 201, 768, 97, 105, 121, 1370, 1376, 1383, 114, 111, 110, 59, 32768, 282, 114, 99, 33024, 202, 59, 32768, 202, 59, 32768, 1069, 111, 116, 59, 32768, 278, 114, 59, 32896, 55349, 56584, 114, 97, 118, 101, 33024, 200, 59, 32768, 200, 101, 109, 101, 110, 116, 59, 32768, 8712, 512, 97, 112, 1418, 1423, 99, 114, 59, 32768, 274, 116, 121, 1060, 1431, 0, 0, 1444, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 32768, 9723, 101, 114, 121, 83, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 32768, 9643, 512, 103, 112, 1465, 1470, 111, 110, 59, 32768, 280, 102, 59, 32896, 55349, 56636, 115, 105, 108, 111, 110, 59, 32768, 917, 117, 512, 97, 105, 1489, 1504, 108, 512, 59, 84, 1495, 1497, 32768, 10869, 105, 108, 100, 101, 59, 32768, 8770, 108, 105, 98, 114, 105, 117, 109, 59, 32768, 8652, 512, 99, 105, 1519, 1523, 114, 59, 32768, 8496, 109, 59, 32768, 10867, 97, 59, 32768, 919, 109, 108, 33024, 203, 59, 32768, 203, 512, 105, 112, 1543, 1549, 115, 116, 115, 59, 32768, 8707, 111, 110, 101, 110, 116, 105, 97, 108, 69, 59, 32768, 8519, 1280, 99, 102, 105, 111, 115, 1572, 1576, 1581, 1620, 1648, 121, 59, 32768, 1060, 114, 59, 32896, 55349, 56585, 108, 108, 101, 100, 1060, 1591, 0, 0, 1604, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 32768, 9724, 101, 114, 121, 83, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 32768, 9642, 1601, 1628, 0, 1633, 0, 0, 1639, 102, 59, 32896, 55349, 56637, 65, 108, 108, 59, 32768, 8704, 114, 105, 101, 114, 116, 114, 102, 59, 32768, 8497, 99, 114, 59, 32768, 8497, 3072, 74, 84, 97, 98, 99, 100, 102, 103, 111, 114, 115, 116, 1678, 1683, 1688, 1701, 1708, 1729, 1734, 1739, 1742, 1748, 1828, 1834, 99, 121, 59, 32768, 1027, 33024, 62, 59, 32768, 62, 109, 109, 97, 512, 59, 100, 1696, 1698, 32768, 915, 59, 32768, 988, 114, 101, 118, 101, 59, 32768, 286, 768, 101, 105, 121, 1715, 1721, 1726, 100, 105, 108, 59, 32768, 290, 114, 99, 59, 32768, 284, 59, 32768, 1043, 111, 116, 59, 32768, 288, 114, 59, 32896, 55349, 56586, 59, 32768, 8921, 112, 102, 59, 32896, 55349, 56638, 101, 97, 116, 101, 114, 1536, 69, 70, 71, 76, 83, 84, 1766, 1783, 1794, 1803, 1809, 1821, 113, 117, 97, 108, 512, 59, 76, 1775, 1777, 32768, 8805, 101, 115, 115, 59, 32768, 8923, 117, 108, 108, 69, 113, 117, 97, 108, 59, 32768, 8807, 114, 101, 97, 116, 101, 114, 59, 32768, 10914, 101, 115, 115, 59, 32768, 8823, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 10878, 105, 108, 100, 101, 59, 32768, 8819, 99, 114, 59, 32896, 55349, 56482, 59, 32768, 8811, 2048, 65, 97, 99, 102, 105, 111, 115, 117, 1854, 1861, 1874, 1880, 1884, 1897, 1919, 1934, 82, 68, 99, 121, 59, 32768, 1066, 512, 99, 116, 1866, 1871, 101, 107, 59, 32768, 711, 59, 32768, 94, 105, 114, 99, 59, 32768, 292, 114, 59, 32768, 8460, 108, 98, 101, 114, 116, 83, 112, 97, 99, 101, 59, 32768, 8459, 833, 1902, 0, 1906, 102, 59, 32768, 8461, 105, 122, 111, 110, 116, 97, 108, 76, 105, 110, 101, 59, 32768, 9472, 512, 99, 116, 1924, 1928, 114, 59, 32768, 8459, 114, 111, 107, 59, 32768, 294, 109, 112, 533, 1940, 1950, 111, 119, 110, 72, 117, 109, 112, 59, 32768, 8782, 113, 117, 97, 108, 59, 32768, 8783, 3584, 69, 74, 79, 97, 99, 100, 102, 103, 109, 110, 111, 115, 116, 117, 1985, 1990, 1996, 2001, 2010, 2025, 2030, 2034, 2043, 2077, 2134, 2155, 2160, 2167, 99, 121, 59, 32768, 1045, 108, 105, 103, 59, 32768, 306, 99, 121, 59, 32768, 1025, 99, 117, 116, 101, 33024, 205, 59, 32768, 205, 512, 105, 121, 2015, 2022, 114, 99, 33024, 206, 59, 32768, 206, 59, 32768, 1048, 111, 116, 59, 32768, 304, 114, 59, 32768, 8465, 114, 97, 118, 101, 33024, 204, 59, 32768, 204, 768, 59, 97, 112, 2050, 2052, 2070, 32768, 8465, 512, 99, 103, 2057, 2061, 114, 59, 32768, 298, 105, 110, 97, 114, 121, 73, 59, 32768, 8520, 108, 105, 101, 115, 59, 32768, 8658, 837, 2082, 0, 2110, 512, 59, 101, 2086, 2088, 32768, 8748, 512, 103, 114, 2093, 2099, 114, 97, 108, 59, 32768, 8747, 115, 101, 99, 116, 105, 111, 110, 59, 32768, 8898, 105, 115, 105, 98, 108, 101, 512, 67, 84, 2120, 2127, 111, 109, 109, 97, 59, 32768, 8291, 105, 109, 101, 115, 59, 32768, 8290, 768, 103, 112, 116, 2141, 2146, 2151, 111, 110, 59, 32768, 302, 102, 59, 32896, 55349, 56640, 97, 59, 32768, 921, 99, 114, 59, 32768, 8464, 105, 108, 100, 101, 59, 32768, 296, 828, 2172, 0, 2177, 99, 121, 59, 32768, 1030, 108, 33024, 207, 59, 32768, 207, 1280, 99, 102, 111, 115, 117, 2193, 2206, 2211, 2217, 2232, 512, 105, 121, 2198, 2203, 114, 99, 59, 32768, 308, 59, 32768, 1049, 114, 59, 32896, 55349, 56589, 112, 102, 59, 32896, 55349, 56641, 820, 2222, 0, 2227, 114, 59, 32896, 55349, 56485, 114, 99, 121, 59, 32768, 1032, 107, 99, 121, 59, 32768, 1028, 1792, 72, 74, 97, 99, 102, 111, 115, 2253, 2258, 2263, 2269, 2283, 2288, 2294, 99, 121, 59, 32768, 1061, 99, 121, 59, 32768, 1036, 112, 112, 97, 59, 32768, 922, 512, 101, 121, 2274, 2280, 100, 105, 108, 59, 32768, 310, 59, 32768, 1050, 114, 59, 32896, 55349, 56590, 112, 102, 59, 32896, 55349, 56642, 99, 114, 59, 32896, 55349, 56486, 2816, 74, 84, 97, 99, 101, 102, 108, 109, 111, 115, 116, 2323, 2328, 2333, 2374, 2396, 2775, 2780, 2797, 2804, 2934, 2954, 99, 121, 59, 32768, 1033, 33024, 60, 59, 32768, 60, 1280, 99, 109, 110, 112, 114, 2344, 2350, 2356, 2360, 2370, 117, 116, 101, 59, 32768, 313, 98, 100, 97, 59, 32768, 923, 103, 59, 32768, 10218, 108, 97, 99, 101, 116, 114, 102, 59, 32768, 8466, 114, 59, 32768, 8606, 768, 97, 101, 121, 2381, 2387, 2393, 114, 111, 110, 59, 32768, 317, 100, 105, 108, 59, 32768, 315, 59, 32768, 1051, 512, 102, 115, 2401, 2702, 116, 2560, 65, 67, 68, 70, 82, 84, 85, 86, 97, 114, 2423, 2470, 2479, 2530, 2537, 2561, 2618, 2666, 2683, 2690, 512, 110, 114, 2428, 2441, 103, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 32768, 10216, 114, 111, 119, 768, 59, 66, 82, 2451, 2453, 2458, 32768, 8592, 97, 114, 59, 32768, 8676, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 8646, 101, 105, 108, 105, 110, 103, 59, 32768, 8968, 111, 838, 2485, 0, 2498, 98, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 32768, 10214, 110, 805, 2503, 0, 2514, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10593, 101, 99, 116, 111, 114, 512, 59, 66, 2523, 2525, 32768, 8643, 97, 114, 59, 32768, 10585, 108, 111, 111, 114, 59, 32768, 8970, 105, 103, 104, 116, 512, 65, 86, 2546, 2553, 114, 114, 111, 119, 59, 32768, 8596, 101, 99, 116, 111, 114, 59, 32768, 10574, 512, 101, 114, 2566, 2591, 101, 768, 59, 65, 86, 2574, 2576, 2583, 32768, 8867, 114, 114, 111, 119, 59, 32768, 8612, 101, 99, 116, 111, 114, 59, 32768, 10586, 105, 97, 110, 103, 108, 101, 768, 59, 66, 69, 2604, 2606, 2611, 32768, 8882, 97, 114, 59, 32768, 10703, 113, 117, 97, 108, 59, 32768, 8884, 112, 768, 68, 84, 86, 2626, 2638, 2649, 111, 119, 110, 86, 101, 99, 116, 111, 114, 59, 32768, 10577, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10592, 101, 99, 116, 111, 114, 512, 59, 66, 2659, 2661, 32768, 8639, 97, 114, 59, 32768, 10584, 101, 99, 116, 111, 114, 512, 59, 66, 2676, 2678, 32768, 8636, 97, 114, 59, 32768, 10578, 114, 114, 111, 119, 59, 32768, 8656, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8660, 115, 1536, 69, 70, 71, 76, 83, 84, 2716, 2730, 2741, 2750, 2756, 2768, 113, 117, 97, 108, 71, 114, 101, 97, 116, 101, 114, 59, 32768, 8922, 117, 108, 108, 69, 113, 117, 97, 108, 59, 32768, 8806, 114, 101, 97, 116, 101, 114, 59, 32768, 8822, 101, 115, 115, 59, 32768, 10913, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 10877, 105, 108, 100, 101, 59, 32768, 8818, 114, 59, 32896, 55349, 56591, 512, 59, 101, 2785, 2787, 32768, 8920, 102, 116, 97, 114, 114, 111, 119, 59, 32768, 8666, 105, 100, 111, 116, 59, 32768, 319, 768, 110, 112, 119, 2811, 2899, 2904, 103, 1024, 76, 82, 108, 114, 2821, 2848, 2860, 2887, 101, 102, 116, 512, 65, 82, 2829, 2836, 114, 114, 111, 119, 59, 32768, 10229, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 10231, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 10230, 101, 102, 116, 512, 97, 114, 2868, 2875, 114, 114, 111, 119, 59, 32768, 10232, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 10234, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 10233, 102, 59, 32896, 55349, 56643, 101, 114, 512, 76, 82, 2911, 2922, 101, 102, 116, 65, 114, 114, 111, 119, 59, 32768, 8601, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 8600, 768, 99, 104, 116, 2941, 2945, 2948, 114, 59, 32768, 8466, 59, 32768, 8624, 114, 111, 107, 59, 32768, 321, 59, 32768, 8810, 2048, 97, 99, 101, 102, 105, 111, 115, 117, 2974, 2978, 2982, 3007, 3012, 3022, 3028, 3033, 112, 59, 32768, 10501, 121, 59, 32768, 1052, 512, 100, 108, 2987, 2998, 105, 117, 109, 83, 112, 97, 99, 101, 59, 32768, 8287, 108, 105, 110, 116, 114, 102, 59, 32768, 8499, 114, 59, 32896, 55349, 56592, 110, 117, 115, 80, 108, 117, 115, 59, 32768, 8723, 112, 102, 59, 32896, 55349, 56644, 99, 114, 59, 32768, 8499, 59, 32768, 924, 2304, 74, 97, 99, 101, 102, 111, 115, 116, 117, 3055, 3060, 3067, 3089, 3201, 3206, 3874, 3880, 3889, 99, 121, 59, 32768, 1034, 99, 117, 116, 101, 59, 32768, 323, 768, 97, 101, 121, 3074, 3080, 3086, 114, 111, 110, 59, 32768, 327, 100, 105, 108, 59, 32768, 325, 59, 32768, 1053, 768, 103, 115, 119, 3096, 3160, 3194, 97, 116, 105, 118, 101, 768, 77, 84, 86, 3108, 3121, 3145, 101, 100, 105, 117, 109, 83, 112, 97, 99, 101, 59, 32768, 8203, 104, 105, 512, 99, 110, 3128, 3137, 107, 83, 112, 97, 99, 101, 59, 32768, 8203, 83, 112, 97, 99, 101, 59, 32768, 8203, 101, 114, 121, 84, 104, 105, 110, 83, 112, 97, 99, 101, 59, 32768, 8203, 116, 101, 100, 512, 71, 76, 3168, 3184, 114, 101, 97, 116, 101, 114, 71, 114, 101, 97, 116, 101, 114, 59, 32768, 8811, 101, 115, 115, 76, 101, 115, 115, 59, 32768, 8810, 76, 105, 110, 101, 59, 32768, 10, 114, 59, 32896, 55349, 56593, 1024, 66, 110, 112, 116, 3215, 3222, 3238, 3242, 114, 101, 97, 107, 59, 32768, 8288, 66, 114, 101, 97, 107, 105, 110, 103, 83, 112, 97, 99, 101, 59, 32768, 160, 102, 59, 32768, 8469, 3328, 59, 67, 68, 69, 71, 72, 76, 78, 80, 82, 83, 84, 86, 3269, 3271, 3293, 3312, 3352, 3430, 3455, 3551, 3589, 3625, 3678, 3821, 3861, 32768, 10988, 512, 111, 117, 3276, 3286, 110, 103, 114, 117, 101, 110, 116, 59, 32768, 8802, 112, 67, 97, 112, 59, 32768, 8813, 111, 117, 98, 108, 101, 86, 101, 114, 116, 105, 99, 97, 108, 66, 97, 114, 59, 32768, 8742, 768, 108, 113, 120, 3319, 3327, 3345, 101, 109, 101, 110, 116, 59, 32768, 8713, 117, 97, 108, 512, 59, 84, 3335, 3337, 32768, 8800, 105, 108, 100, 101, 59, 32896, 8770, 824, 105, 115, 116, 115, 59, 32768, 8708, 114, 101, 97, 116, 101, 114, 1792, 59, 69, 70, 71, 76, 83, 84, 3373, 3375, 3382, 3394, 3404, 3410, 3423, 32768, 8815, 113, 117, 97, 108, 59, 32768, 8817, 117, 108, 108, 69, 113, 117, 97, 108, 59, 32896, 8807, 824, 114, 101, 97, 116, 101, 114, 59, 32896, 8811, 824, 101, 115, 115, 59, 32768, 8825, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32896, 10878, 824, 105, 108, 100, 101, 59, 32768, 8821, 117, 109, 112, 533, 3437, 3448, 111, 119, 110, 72, 117, 109, 112, 59, 32896, 8782, 824, 113, 117, 97, 108, 59, 32896, 8783, 824, 101, 512, 102, 115, 3461, 3492, 116, 84, 114, 105, 97, 110, 103, 108, 101, 768, 59, 66, 69, 3477, 3479, 3485, 32768, 8938, 97, 114, 59, 32896, 10703, 824, 113, 117, 97, 108, 59, 32768, 8940, 115, 1536, 59, 69, 71, 76, 83, 84, 3506, 3508, 3515, 3524, 3531, 3544, 32768, 8814, 113, 117, 97, 108, 59, 32768, 8816, 114, 101, 97, 116, 101, 114, 59, 32768, 8824, 101, 115, 115, 59, 32896, 8810, 824, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32896, 10877, 824, 105, 108, 100, 101, 59, 32768, 8820, 101, 115, 116, 101, 100, 512, 71, 76, 3561, 3578, 114, 101, 97, 116, 101, 114, 71, 114, 101, 97, 116, 101, 114, 59, 32896, 10914, 824, 101, 115, 115, 76, 101, 115, 115, 59, 32896, 10913, 824, 114, 101, 99, 101, 100, 101, 115, 768, 59, 69, 83, 3603, 3605, 3613, 32768, 8832, 113, 117, 97, 108, 59, 32896, 10927, 824, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 8928, 512, 101, 105, 3630, 3645, 118, 101, 114, 115, 101, 69, 108, 101, 109, 101, 110, 116, 59, 32768, 8716, 103, 104, 116, 84, 114, 105, 97, 110, 103, 108, 101, 768, 59, 66, 69, 3663, 3665, 3671, 32768, 8939, 97, 114, 59, 32896, 10704, 824, 113, 117, 97, 108, 59, 32768, 8941, 512, 113, 117, 3683, 3732, 117, 97, 114, 101, 83, 117, 512, 98, 112, 3694, 3712, 115, 101, 116, 512, 59, 69, 3702, 3705, 32896, 8847, 824, 113, 117, 97, 108, 59, 32768, 8930, 101, 114, 115, 101, 116, 512, 59, 69, 3722, 3725, 32896, 8848, 824, 113, 117, 97, 108, 59, 32768, 8931, 768, 98, 99, 112, 3739, 3757, 3801, 115, 101, 116, 512, 59, 69, 3747, 3750, 32896, 8834, 8402, 113, 117, 97, 108, 59, 32768, 8840, 99, 101, 101, 100, 115, 1024, 59, 69, 83, 84, 3771, 3773, 3781, 3793, 32768, 8833, 113, 117, 97, 108, 59, 32896, 10928, 824, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 8929, 105, 108, 100, 101, 59, 32896, 8831, 824, 101, 114, 115, 101, 116, 512, 59, 69, 3811, 3814, 32896, 8835, 8402, 113, 117, 97, 108, 59, 32768, 8841, 105, 108, 100, 101, 1024, 59, 69, 70, 84, 3834, 3836, 3843, 3854, 32768, 8769, 113, 117, 97, 108, 59, 32768, 8772, 117, 108, 108, 69, 113, 117, 97, 108, 59, 32768, 8775, 105, 108, 100, 101, 59, 32768, 8777, 101, 114, 116, 105, 99, 97, 108, 66, 97, 114, 59, 32768, 8740, 99, 114, 59, 32896, 55349, 56489, 105, 108, 100, 101, 33024, 209, 59, 32768, 209, 59, 32768, 925, 3584, 69, 97, 99, 100, 102, 103, 109, 111, 112, 114, 115, 116, 117, 118, 3921, 3927, 3936, 3951, 3958, 3963, 3972, 3996, 4002, 4034, 4037, 4055, 4071, 4078, 108, 105, 103, 59, 32768, 338, 99, 117, 116, 101, 33024, 211, 59, 32768, 211, 512, 105, 121, 3941, 3948, 114, 99, 33024, 212, 59, 32768, 212, 59, 32768, 1054, 98, 108, 97, 99, 59, 32768, 336, 114, 59, 32896, 55349, 56594, 114, 97, 118, 101, 33024, 210, 59, 32768, 210, 768, 97, 101, 105, 3979, 3984, 3989, 99, 114, 59, 32768, 332, 103, 97, 59, 32768, 937, 99, 114, 111, 110, 59, 32768, 927, 112, 102, 59, 32896, 55349, 56646, 101, 110, 67, 117, 114, 108, 121, 512, 68, 81, 4014, 4027, 111, 117, 98, 108, 101, 81, 117, 111, 116, 101, 59, 32768, 8220, 117, 111, 116, 101, 59, 32768, 8216, 59, 32768, 10836, 512, 99, 108, 4042, 4047, 114, 59, 32896, 55349, 56490, 97, 115, 104, 33024, 216, 59, 32768, 216, 105, 573, 4060, 4067, 100, 101, 33024, 213, 59, 32768, 213, 101, 115, 59, 32768, 10807, 109, 108, 33024, 214, 59, 32768, 214, 101, 114, 512, 66, 80, 4085, 4109, 512, 97, 114, 4090, 4094, 114, 59, 32768, 8254, 97, 99, 512, 101, 107, 4101, 4104, 59, 32768, 9182, 101, 116, 59, 32768, 9140, 97, 114, 101, 110, 116, 104, 101, 115, 105, 115, 59, 32768, 9180, 2304, 97, 99, 102, 104, 105, 108, 111, 114, 115, 4141, 4150, 4154, 4159, 4163, 4166, 4176, 4198, 4284, 114, 116, 105, 97, 108, 68, 59, 32768, 8706, 121, 59, 32768, 1055, 114, 59, 32896, 55349, 56595, 105, 59, 32768, 934, 59, 32768, 928, 117, 115, 77, 105, 110, 117, 115, 59, 32768, 177, 512, 105, 112, 4181, 4194, 110, 99, 97, 114, 101, 112, 108, 97, 110, 101, 59, 32768, 8460, 102, 59, 32768, 8473, 1024, 59, 101, 105, 111, 4207, 4209, 4251, 4256, 32768, 10939, 99, 101, 100, 101, 115, 1024, 59, 69, 83, 84, 4223, 4225, 4232, 4244, 32768, 8826, 113, 117, 97, 108, 59, 32768, 10927, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 8828, 105, 108, 100, 101, 59, 32768, 8830, 109, 101, 59, 32768, 8243, 512, 100, 112, 4261, 4267, 117, 99, 116, 59, 32768, 8719, 111, 114, 116, 105, 111, 110, 512, 59, 97, 4278, 4280, 32768, 8759, 108, 59, 32768, 8733, 512, 99, 105, 4289, 4294, 114, 59, 32896, 55349, 56491, 59, 32768, 936, 1024, 85, 102, 111, 115, 4306, 4313, 4318, 4323, 79, 84, 33024, 34, 59, 32768, 34, 114, 59, 32896, 55349, 56596, 112, 102, 59, 32768, 8474, 99, 114, 59, 32896, 55349, 56492, 3072, 66, 69, 97, 99, 101, 102, 104, 105, 111, 114, 115, 117, 4354, 4360, 4366, 4395, 4417, 4473, 4477, 4481, 4743, 4764, 4776, 4788, 97, 114, 114, 59, 32768, 10512, 71, 33024, 174, 59, 32768, 174, 768, 99, 110, 114, 4373, 4379, 4383, 117, 116, 101, 59, 32768, 340, 103, 59, 32768, 10219, 114, 512, 59, 116, 4389, 4391, 32768, 8608, 108, 59, 32768, 10518, 768, 97, 101, 121, 4402, 4408, 4414, 114, 111, 110, 59, 32768, 344, 100, 105, 108, 59, 32768, 342, 59, 32768, 1056, 512, 59, 118, 4422, 4424, 32768, 8476, 101, 114, 115, 101, 512, 69, 85, 4433, 4458, 512, 108, 113, 4438, 4446, 101, 109, 101, 110, 116, 59, 32768, 8715, 117, 105, 108, 105, 98, 114, 105, 117, 109, 59, 32768, 8651, 112, 69, 113, 117, 105, 108, 105, 98, 114, 105, 117, 109, 59, 32768, 10607, 114, 59, 32768, 8476, 111, 59, 32768, 929, 103, 104, 116, 2048, 65, 67, 68, 70, 84, 85, 86, 97, 4501, 4547, 4556, 4607, 4614, 4671, 4719, 4736, 512, 110, 114, 4506, 4519, 103, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 32768, 10217, 114, 111, 119, 768, 59, 66, 76, 4529, 4531, 4536, 32768, 8594, 97, 114, 59, 32768, 8677, 101, 102, 116, 65, 114, 114, 111, 119, 59, 32768, 8644, 101, 105, 108, 105, 110, 103, 59, 32768, 8969, 111, 838, 4562, 0, 4575, 98, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 32768, 10215, 110, 805, 4580, 0, 4591, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10589, 101, 99, 116, 111, 114, 512, 59, 66, 4600, 4602, 32768, 8642, 97, 114, 59, 32768, 10581, 108, 111, 111, 114, 59, 32768, 8971, 512, 101, 114, 4619, 4644, 101, 768, 59, 65, 86, 4627, 4629, 4636, 32768, 8866, 114, 114, 111, 119, 59, 32768, 8614, 101, 99, 116, 111, 114, 59, 32768, 10587, 105, 97, 110, 103, 108, 101, 768, 59, 66, 69, 4657, 4659, 4664, 32768, 8883, 97, 114, 59, 32768, 10704, 113, 117, 97, 108, 59, 32768, 8885, 112, 768, 68, 84, 86, 4679, 4691, 4702, 111, 119, 110, 86, 101, 99, 116, 111, 114, 59, 32768, 10575, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10588, 101, 99, 116, 111, 114, 512, 59, 66, 4712, 4714, 32768, 8638, 97, 114, 59, 32768, 10580, 101, 99, 116, 111, 114, 512, 59, 66, 4729, 4731, 32768, 8640, 97, 114, 59, 32768, 10579, 114, 114, 111, 119, 59, 32768, 8658, 512, 112, 117, 4748, 4752, 102, 59, 32768, 8477, 110, 100, 73, 109, 112, 108, 105, 101, 115, 59, 32768, 10608, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8667, 512, 99, 104, 4781, 4785, 114, 59, 32768, 8475, 59, 32768, 8625, 108, 101, 68, 101, 108, 97, 121, 101, 100, 59, 32768, 10740, 3328, 72, 79, 97, 99, 102, 104, 105, 109, 111, 113, 115, 116, 117, 4827, 4842, 4849, 4856, 4889, 4894, 4949, 4955, 4967, 4973, 5059, 5065, 5070, 512, 67, 99, 4832, 4838, 72, 99, 121, 59, 32768, 1065, 121, 59, 32768, 1064, 70, 84, 99, 121, 59, 32768, 1068, 99, 117, 116, 101, 59, 32768, 346, 1280, 59, 97, 101, 105, 121, 4867, 4869, 4875, 4881, 4886, 32768, 10940, 114, 111, 110, 59, 32768, 352, 100, 105, 108, 59, 32768, 350, 114, 99, 59, 32768, 348, 59, 32768, 1057, 114, 59, 32896, 55349, 56598, 111, 114, 116, 1024, 68, 76, 82, 85, 4906, 4917, 4928, 4940, 111, 119, 110, 65, 114, 114, 111, 119, 59, 32768, 8595, 101, 102, 116, 65, 114, 114, 111, 119, 59, 32768, 8592, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 8594, 112, 65, 114, 114, 111, 119, 59, 32768, 8593, 103, 109, 97, 59, 32768, 931, 97, 108, 108, 67, 105, 114, 99, 108, 101, 59, 32768, 8728, 112, 102, 59, 32896, 55349, 56650, 1091, 4979, 0, 0, 4983, 116, 59, 32768, 8730, 97, 114, 101, 1024, 59, 73, 83, 85, 4994, 4996, 5010, 5052, 32768, 9633, 110, 116, 101, 114, 115, 101, 99, 116, 105, 111, 110, 59, 32768, 8851, 117, 512, 98, 112, 5016, 5033, 115, 101, 116, 512, 59, 69, 5024, 5026, 32768, 8847, 113, 117, 97, 108, 59, 32768, 8849, 101, 114, 115, 101, 116, 512, 59, 69, 5043, 5045, 32768, 8848, 113, 117, 97, 108, 59, 32768, 8850, 110, 105, 111, 110, 59, 32768, 8852, 99, 114, 59, 32896, 55349, 56494, 97, 114, 59, 32768, 8902, 1024, 98, 99, 109, 112, 5079, 5102, 5155, 5158, 512, 59, 115, 5084, 5086, 32768, 8912, 101, 116, 512, 59, 69, 5093, 5095, 32768, 8912, 113, 117, 97, 108, 59, 32768, 8838, 512, 99, 104, 5107, 5148, 101, 101, 100, 115, 1024, 59, 69, 83, 84, 5120, 5122, 5129, 5141, 32768, 8827, 113, 117, 97, 108, 59, 32768, 10928, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 8829, 105, 108, 100, 101, 59, 32768, 8831, 84, 104, 97, 116, 59, 32768, 8715, 59, 32768, 8721, 768, 59, 101, 115, 5165, 5167, 5185, 32768, 8913, 114, 115, 101, 116, 512, 59, 69, 5176, 5178, 32768, 8835, 113, 117, 97, 108, 59, 32768, 8839, 101, 116, 59, 32768, 8913, 2816, 72, 82, 83, 97, 99, 102, 104, 105, 111, 114, 115, 5213, 5221, 5227, 5241, 5252, 5274, 5279, 5323, 5362, 5368, 5378, 79, 82, 78, 33024, 222, 59, 32768, 222, 65, 68, 69, 59, 32768, 8482, 512, 72, 99, 5232, 5237, 99, 121, 59, 32768, 1035, 121, 59, 32768, 1062, 512, 98, 117, 5246, 5249, 59, 32768, 9, 59, 32768, 932, 768, 97, 101, 121, 5259, 5265, 5271, 114, 111, 110, 59, 32768, 356, 100, 105, 108, 59, 32768, 354, 59, 32768, 1058, 114, 59, 32896, 55349, 56599, 512, 101, 105, 5284, 5300, 835, 5289, 0, 5297, 101, 102, 111, 114, 101, 59, 32768, 8756, 97, 59, 32768, 920, 512, 99, 110, 5305, 5315, 107, 83, 112, 97, 99, 101, 59, 32896, 8287, 8202, 83, 112, 97, 99, 101, 59, 32768, 8201, 108, 100, 101, 1024, 59, 69, 70, 84, 5335, 5337, 5344, 5355, 32768, 8764, 113, 117, 97, 108, 59, 32768, 8771, 117, 108, 108, 69, 113, 117, 97, 108, 59, 32768, 8773, 105, 108, 100, 101, 59, 32768, 8776, 112, 102, 59, 32896, 55349, 56651, 105, 112, 108, 101, 68, 111, 116, 59, 32768, 8411, 512, 99, 116, 5383, 5388, 114, 59, 32896, 55349, 56495, 114, 111, 107, 59, 32768, 358, 5426, 5417, 5444, 5458, 5473, 0, 5480, 5485, 0, 0, 0, 0, 0, 5494, 5500, 5564, 5579, 0, 5726, 5732, 5738, 5745, 512, 99, 114, 5421, 5429, 117, 116, 101, 33024, 218, 59, 32768, 218, 114, 512, 59, 111, 5435, 5437, 32768, 8607, 99, 105, 114, 59, 32768, 10569, 114, 820, 5449, 0, 5453, 121, 59, 32768, 1038, 118, 101, 59, 32768, 364, 512, 105, 121, 5462, 5469, 114, 99, 33024, 219, 59, 32768, 219, 59, 32768, 1059, 98, 108, 97, 99, 59, 32768, 368, 114, 59, 32896, 55349, 56600, 114, 97, 118, 101, 33024, 217, 59, 32768, 217, 97, 99, 114, 59, 32768, 362, 512, 100, 105, 5504, 5548, 101, 114, 512, 66, 80, 5511, 5535, 512, 97, 114, 5516, 5520, 114, 59, 32768, 95, 97, 99, 512, 101, 107, 5527, 5530, 59, 32768, 9183, 101, 116, 59, 32768, 9141, 97, 114, 101, 110, 116, 104, 101, 115, 105, 115, 59, 32768, 9181, 111, 110, 512, 59, 80, 5555, 5557, 32768, 8899, 108, 117, 115, 59, 32768, 8846, 512, 103, 112, 5568, 5573, 111, 110, 59, 32768, 370, 102, 59, 32896, 55349, 56652, 2048, 65, 68, 69, 84, 97, 100, 112, 115, 5595, 5624, 5635, 5648, 5664, 5671, 5682, 5712, 114, 114, 111, 119, 768, 59, 66, 68, 5606, 5608, 5613, 32768, 8593, 97, 114, 59, 32768, 10514, 111, 119, 110, 65, 114, 114, 111, 119, 59, 32768, 8645, 111, 119, 110, 65, 114, 114, 111, 119, 59, 32768, 8597, 113, 117, 105, 108, 105, 98, 114, 105, 117, 109, 59, 32768, 10606, 101, 101, 512, 59, 65, 5655, 5657, 32768, 8869, 114, 114, 111, 119, 59, 32768, 8613, 114, 114, 111, 119, 59, 32768, 8657, 111, 119, 110, 97, 114, 114, 111, 119, 59, 32768, 8661, 101, 114, 512, 76, 82, 5689, 5700, 101, 102, 116, 65, 114, 114, 111, 119, 59, 32768, 8598, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 8599, 105, 512, 59, 108, 5718, 5720, 32768, 978, 111, 110, 59, 32768, 933, 105, 110, 103, 59, 32768, 366, 99, 114, 59, 32896, 55349, 56496, 105, 108, 100, 101, 59, 32768, 360, 109, 108, 33024, 220, 59, 32768, 220, 2304, 68, 98, 99, 100, 101, 102, 111, 115, 118, 5770, 5776, 5781, 5785, 5798, 5878, 5883, 5889, 5895, 97, 115, 104, 59, 32768, 8875, 97, 114, 59, 32768, 10987, 121, 59, 32768, 1042, 97, 115, 104, 512, 59, 108, 5793, 5795, 32768, 8873, 59, 32768, 10982, 512, 101, 114, 5803, 5806, 59, 32768, 8897, 768, 98, 116, 121, 5813, 5818, 5866, 97, 114, 59, 32768, 8214, 512, 59, 105, 5823, 5825, 32768, 8214, 99, 97, 108, 1024, 66, 76, 83, 84, 5837, 5842, 5848, 5859, 97, 114, 59, 32768, 8739, 105, 110, 101, 59, 32768, 124, 101, 112, 97, 114, 97, 116, 111, 114, 59, 32768, 10072, 105, 108, 100, 101, 59, 32768, 8768, 84, 104, 105, 110, 83, 112, 97, 99, 101, 59, 32768, 8202, 114, 59, 32896, 55349, 56601, 112, 102, 59, 32896, 55349, 56653, 99, 114, 59, 32896, 55349, 56497, 100, 97, 115, 104, 59, 32768, 8874, 1280, 99, 101, 102, 111, 115, 5913, 5919, 5925, 5930, 5936, 105, 114, 99, 59, 32768, 372, 100, 103, 101, 59, 32768, 8896, 114, 59, 32896, 55349, 56602, 112, 102, 59, 32896, 55349, 56654, 99, 114, 59, 32896, 55349, 56498, 1024, 102, 105, 111, 115, 5951, 5956, 5959, 5965, 114, 59, 32896, 55349, 56603, 59, 32768, 926, 112, 102, 59, 32896, 55349, 56655, 99, 114, 59, 32896, 55349, 56499, 2304, 65, 73, 85, 97, 99, 102, 111, 115, 117, 5990, 5995, 6000, 6005, 6014, 6027, 6032, 6038, 6044, 99, 121, 59, 32768, 1071, 99, 121, 59, 32768, 1031, 99, 121, 59, 32768, 1070, 99, 117, 116, 101, 33024, 221, 59, 32768, 221, 512, 105, 121, 6019, 6024, 114, 99, 59, 32768, 374, 59, 32768, 1067, 114, 59, 32896, 55349, 56604, 112, 102, 59, 32896, 55349, 56656, 99, 114, 59, 32896, 55349, 56500, 109, 108, 59, 32768, 376, 2048, 72, 97, 99, 100, 101, 102, 111, 115, 6066, 6071, 6078, 6092, 6097, 6119, 6123, 6128, 99, 121, 59, 32768, 1046, 99, 117, 116, 101, 59, 32768, 377, 512, 97, 121, 6083, 6089, 114, 111, 110, 59, 32768, 381, 59, 32768, 1047, 111, 116, 59, 32768, 379, 835, 6102, 0, 6116, 111, 87, 105, 100, 116, 104, 83, 112, 97, 99, 101, 59, 32768, 8203, 97, 59, 32768, 918, 114, 59, 32768, 8488, 112, 102, 59, 32768, 8484, 99, 114, 59, 32896, 55349, 56501, 5938, 6159, 6168, 6175, 0, 6214, 6222, 6233, 0, 0, 0, 0, 6242, 6267, 6290, 6429, 6444, 0, 6495, 6503, 6531, 6540, 0, 6547, 99, 117, 116, 101, 33024, 225, 59, 32768, 225, 114, 101, 118, 101, 59, 32768, 259, 1536, 59, 69, 100, 105, 117, 121, 6187, 6189, 6193, 6196, 6203, 6210, 32768, 8766, 59, 32896, 8766, 819, 59, 32768, 8767, 114, 99, 33024, 226, 59, 32768, 226, 116, 101, 33024, 180, 59, 32768, 180, 59, 32768, 1072, 108, 105, 103, 33024, 230, 59, 32768, 230, 512, 59, 114, 6226, 6228, 32768, 8289, 59, 32896, 55349, 56606, 114, 97, 118, 101, 33024, 224, 59, 32768, 224, 512, 101, 112, 6246, 6261, 512, 102, 112, 6251, 6257, 115, 121, 109, 59, 32768, 8501, 104, 59, 32768, 8501, 104, 97, 59, 32768, 945, 512, 97, 112, 6271, 6284, 512, 99, 108, 6276, 6280, 114, 59, 32768, 257, 103, 59, 32768, 10815, 33024, 38, 59, 32768, 38, 1077, 6295, 0, 0, 6326, 1280, 59, 97, 100, 115, 118, 6305, 6307, 6312, 6315, 6322, 32768, 8743, 110, 100, 59, 32768, 10837, 59, 32768, 10844, 108, 111, 112, 101, 59, 32768, 10840, 59, 32768, 10842, 1792, 59, 101, 108, 109, 114, 115, 122, 6340, 6342, 6345, 6349, 6391, 6410, 6422, 32768, 8736, 59, 32768, 10660, 101, 59, 32768, 8736, 115, 100, 512, 59, 97, 6356, 6358, 32768, 8737, 2098, 6368, 6371, 6374, 6377, 6380, 6383, 6386, 6389, 59, 32768, 10664, 59, 32768, 10665, 59, 32768, 10666, 59, 32768, 10667, 59, 32768, 10668, 59, 32768, 10669, 59, 32768, 10670, 59, 32768, 10671, 116, 512, 59, 118, 6397, 6399, 32768, 8735, 98, 512, 59, 100, 6405, 6407, 32768, 8894, 59, 32768, 10653, 512, 112, 116, 6415, 6419, 104, 59, 32768, 8738, 59, 32768, 197, 97, 114, 114, 59, 32768, 9084, 512, 103, 112, 6433, 6438, 111, 110, 59, 32768, 261, 102, 59, 32896, 55349, 56658, 1792, 59, 69, 97, 101, 105, 111, 112, 6458, 6460, 6463, 6469, 6472, 6476, 6480, 32768, 8776, 59, 32768, 10864, 99, 105, 114, 59, 32768, 10863, 59, 32768, 8778, 100, 59, 32768, 8779, 115, 59, 32768, 39, 114, 111, 120, 512, 59, 101, 6488, 6490, 32768, 8776, 113, 59, 32768, 8778, 105, 110, 103, 33024, 229, 59, 32768, 229, 768, 99, 116, 121, 6509, 6514, 6517, 114, 59, 32896, 55349, 56502, 59, 32768, 42, 109, 112, 512, 59, 101, 6524, 6526, 32768, 8776, 113, 59, 32768, 8781, 105, 108, 100, 101, 33024, 227, 59, 32768, 227, 109, 108, 33024, 228, 59, 32768, 228, 512, 99, 105, 6551, 6559, 111, 110, 105, 110, 116, 59, 32768, 8755, 110, 116, 59, 32768, 10769, 4096, 78, 97, 98, 99, 100, 101, 102, 105, 107, 108, 110, 111, 112, 114, 115, 117, 6597, 6602, 6673, 6688, 6701, 6707, 6768, 6773, 6891, 6898, 6999, 7023, 7309, 7316, 7334, 7383, 111, 116, 59, 32768, 10989, 512, 99, 114, 6607, 6652, 107, 1024, 99, 101, 112, 115, 6617, 6623, 6632, 6639, 111, 110, 103, 59, 32768, 8780, 112, 115, 105, 108, 111, 110, 59, 32768, 1014, 114, 105, 109, 101, 59, 32768, 8245, 105, 109, 512, 59, 101, 6646, 6648, 32768, 8765, 113, 59, 32768, 8909, 583, 6656, 6661, 101, 101, 59, 32768, 8893, 101, 100, 512, 59, 103, 6667, 6669, 32768, 8965, 101, 59, 32768, 8965, 114, 107, 512, 59, 116, 6680, 6682, 32768, 9141, 98, 114, 107, 59, 32768, 9142, 512, 111, 121, 6693, 6698, 110, 103, 59, 32768, 8780, 59, 32768, 1073, 113, 117, 111, 59, 32768, 8222, 1280, 99, 109, 112, 114, 116, 6718, 6731, 6738, 6743, 6749, 97, 117, 115, 512, 59, 101, 6726, 6728, 32768, 8757, 59, 32768, 8757, 112, 116, 121, 118, 59, 32768, 10672, 115, 105, 59, 32768, 1014, 110, 111, 117, 59, 32768, 8492, 768, 97, 104, 119, 6756, 6759, 6762, 59, 32768, 946, 59, 32768, 8502, 101, 101, 110, 59, 32768, 8812, 114, 59, 32896, 55349, 56607, 103, 1792, 99, 111, 115, 116, 117, 118, 119, 6789, 6809, 6834, 6850, 6872, 6879, 6884, 768, 97, 105, 117, 6796, 6800, 6805, 112, 59, 32768, 8898, 114, 99, 59, 32768, 9711, 112, 59, 32768, 8899, 768, 100, 112, 116, 6816, 6821, 6827, 111, 116, 59, 32768, 10752, 108, 117, 115, 59, 32768, 10753, 105, 109, 101, 115, 59, 32768, 10754, 1090, 6840, 0, 0, 6846, 99, 117, 112, 59, 32768, 10758, 97, 114, 59, 32768, 9733, 114, 105, 97, 110, 103, 108, 101, 512, 100, 117, 6862, 6868, 111, 119, 110, 59, 32768, 9661, 112, 59, 32768, 9651, 112, 108, 117, 115, 59, 32768, 10756, 101, 101, 59, 32768, 8897, 101, 100, 103, 101, 59, 32768, 8896, 97, 114, 111, 119, 59, 32768, 10509, 768, 97, 107, 111, 6905, 6976, 6994, 512, 99, 110, 6910, 6972, 107, 768, 108, 115, 116, 6918, 6927, 6935, 111, 122, 101, 110, 103, 101, 59, 32768, 10731, 113, 117, 97, 114, 101, 59, 32768, 9642, 114, 105, 97, 110, 103, 108, 101, 1024, 59, 100, 108, 114, 6951, 6953, 6959, 6965, 32768, 9652, 111, 119, 110, 59, 32768, 9662, 101, 102, 116, 59, 32768, 9666, 105, 103, 104, 116, 59, 32768, 9656, 107, 59, 32768, 9251, 770, 6981, 0, 6991, 771, 6985, 0, 6988, 59, 32768, 9618, 59, 32768, 9617, 52, 59, 32768, 9619, 99, 107, 59, 32768, 9608, 512, 101, 111, 7004, 7019, 512, 59, 113, 7009, 7012, 32896, 61, 8421, 117, 105, 118, 59, 32896, 8801, 8421, 116, 59, 32768, 8976, 1024, 112, 116, 119, 120, 7032, 7037, 7049, 7055, 102, 59, 32896, 55349, 56659, 512, 59, 116, 7042, 7044, 32768, 8869, 111, 109, 59, 32768, 8869, 116, 105, 101, 59, 32768, 8904, 3072, 68, 72, 85, 86, 98, 100, 104, 109, 112, 116, 117, 118, 7080, 7101, 7126, 7147, 7182, 7187, 7208, 7233, 7240, 7246, 7253, 7274, 1024, 76, 82, 108, 114, 7089, 7092, 7095, 7098, 59, 32768, 9559, 59, 32768, 9556, 59, 32768, 9558, 59, 32768, 9555, 1280, 59, 68, 85, 100, 117, 7112, 7114, 7117, 7120, 7123, 32768, 9552, 59, 32768, 9574, 59, 32768, 9577, 59, 32768, 9572, 59, 32768, 9575, 1024, 76, 82, 108, 114, 7135, 7138, 7141, 7144, 59, 32768, 9565, 59, 32768, 9562, 59, 32768, 9564, 59, 32768, 9561, 1792, 59, 72, 76, 82, 104, 108, 114, 7162, 7164, 7167, 7170, 7173, 7176, 7179, 32768, 9553, 59, 32768, 9580, 59, 32768, 9571, 59, 32768, 9568, 59, 32768, 9579, 59, 32768, 9570, 59, 32768, 9567, 111, 120, 59, 32768, 10697, 1024, 76, 82, 108, 114, 7196, 7199, 7202, 7205, 59, 32768, 9557, 59, 32768, 9554, 59, 32768, 9488, 59, 32768, 9484, 1280, 59, 68, 85, 100, 117, 7219, 7221, 7224, 7227, 7230, 32768, 9472, 59, 32768, 9573, 59, 32768, 9576, 59, 32768, 9516, 59, 32768, 9524, 105, 110, 117, 115, 59, 32768, 8863, 108, 117, 115, 59, 32768, 8862, 105, 109, 101, 115, 59, 32768, 8864, 1024, 76, 82, 108, 114, 7262, 7265, 7268, 7271, 59, 32768, 9563, 59, 32768, 9560, 59, 32768, 9496, 59, 32768, 9492, 1792, 59, 72, 76, 82, 104, 108, 114, 7289, 7291, 7294, 7297, 7300, 7303, 7306, 32768, 9474, 59, 32768, 9578, 59, 32768, 9569, 59, 32768, 9566, 59, 32768, 9532, 59, 32768, 9508, 59, 32768, 9500, 114, 105, 109, 101, 59, 32768, 8245, 512, 101, 118, 7321, 7326, 118, 101, 59, 32768, 728, 98, 97, 114, 33024, 166, 59, 32768, 166, 1024, 99, 101, 105, 111, 7343, 7348, 7353, 7364, 114, 59, 32896, 55349, 56503, 109, 105, 59, 32768, 8271, 109, 512, 59, 101, 7359, 7361, 32768, 8765, 59, 32768, 8909, 108, 768, 59, 98, 104, 7372, 7374, 7377, 32768, 92, 59, 32768, 10693, 115, 117, 98, 59, 32768, 10184, 573, 7387, 7399, 108, 512, 59, 101, 7392, 7394, 32768, 8226, 116, 59, 32768, 8226, 112, 768, 59, 69, 101, 7406, 7408, 7411, 32768, 8782, 59, 32768, 10926, 512, 59, 113, 7416, 7418, 32768, 8783, 59, 32768, 8783, 6450, 7448, 0, 7523, 7571, 7576, 7613, 0, 7618, 7647, 0, 0, 7764, 0, 0, 7779, 0, 0, 7899, 7914, 7949, 7955, 0, 8158, 0, 8176, 768, 99, 112, 114, 7454, 7460, 7509, 117, 116, 101, 59, 32768, 263, 1536, 59, 97, 98, 99, 100, 115, 7473, 7475, 7480, 7487, 7500, 7505, 32768, 8745, 110, 100, 59, 32768, 10820, 114, 99, 117, 112, 59, 32768, 10825, 512, 97, 117, 7492, 7496, 112, 59, 32768, 10827, 112, 59, 32768, 10823, 111, 116, 59, 32768, 10816, 59, 32896, 8745, 65024, 512, 101, 111, 7514, 7518, 116, 59, 32768, 8257, 110, 59, 32768, 711, 1024, 97, 101, 105, 117, 7531, 7544, 7552, 7557, 833, 7536, 0, 7540, 115, 59, 32768, 10829, 111, 110, 59, 32768, 269, 100, 105, 108, 33024, 231, 59, 32768, 231, 114, 99, 59, 32768, 265, 112, 115, 512, 59, 115, 7564, 7566, 32768, 10828, 109, 59, 32768, 10832, 111, 116, 59, 32768, 267, 768, 100, 109, 110, 7582, 7589, 7596, 105, 108, 33024, 184, 59, 32768, 184, 112, 116, 121, 118, 59, 32768, 10674, 116, 33280, 162, 59, 101, 7603, 7605, 32768, 162, 114, 100, 111, 116, 59, 32768, 183, 114, 59, 32896, 55349, 56608, 768, 99, 101, 105, 7624, 7628, 7643, 121, 59, 32768, 1095, 99, 107, 512, 59, 109, 7635, 7637, 32768, 10003, 97, 114, 107, 59, 32768, 10003, 59, 32768, 967, 114, 1792, 59, 69, 99, 101, 102, 109, 115, 7662, 7664, 7667, 7742, 7745, 7752, 7757, 32768, 9675, 59, 32768, 10691, 768, 59, 101, 108, 7674, 7676, 7680, 32768, 710, 113, 59, 32768, 8791, 101, 1074, 7687, 0, 0, 7709, 114, 114, 111, 119, 512, 108, 114, 7695, 7701, 101, 102, 116, 59, 32768, 8634, 105, 103, 104, 116, 59, 32768, 8635, 1280, 82, 83, 97, 99, 100, 7719, 7722, 7725, 7730, 7736, 59, 32768, 174, 59, 32768, 9416, 115, 116, 59, 32768, 8859, 105, 114, 99, 59, 32768, 8858, 97, 115, 104, 59, 32768, 8861, 59, 32768, 8791, 110, 105, 110, 116, 59, 32768, 10768, 105, 100, 59, 32768, 10991, 99, 105, 114, 59, 32768, 10690, 117, 98, 115, 512, 59, 117, 7771, 7773, 32768, 9827, 105, 116, 59, 32768, 9827, 1341, 7785, 7804, 7850, 0, 7871, 111, 110, 512, 59, 101, 7791, 7793, 32768, 58, 512, 59, 113, 7798, 7800, 32768, 8788, 59, 32768, 8788, 1086, 7809, 0, 0, 7820, 97, 512, 59, 116, 7814, 7816, 32768, 44, 59, 32768, 64, 768, 59, 102, 108, 7826, 7828, 7832, 32768, 8705, 110, 59, 32768, 8728, 101, 512, 109, 120, 7838, 7844, 101, 110, 116, 59, 32768, 8705, 101, 115, 59, 32768, 8450, 824, 7854, 0, 7866, 512, 59, 100, 7858, 7860, 32768, 8773, 111, 116, 59, 32768, 10861, 110, 116, 59, 32768, 8750, 768, 102, 114, 121, 7877, 7881, 7886, 59, 32896, 55349, 56660, 111, 100, 59, 32768, 8720, 33280, 169, 59, 115, 7892, 7894, 32768, 169, 114, 59, 32768, 8471, 512, 97, 111, 7903, 7908, 114, 114, 59, 32768, 8629, 115, 115, 59, 32768, 10007, 512, 99, 117, 7918, 7923, 114, 59, 32896, 55349, 56504, 512, 98, 112, 7928, 7938, 512, 59, 101, 7933, 7935, 32768, 10959, 59, 32768, 10961, 512, 59, 101, 7943, 7945, 32768, 10960, 59, 32768, 10962, 100, 111, 116, 59, 32768, 8943, 1792, 100, 101, 108, 112, 114, 118, 119, 7969, 7983, 7996, 8009, 8057, 8147, 8152, 97, 114, 114, 512, 108, 114, 7977, 7980, 59, 32768, 10552, 59, 32768, 10549, 1089, 7989, 0, 0, 7993, 114, 59, 32768, 8926, 99, 59, 32768, 8927, 97, 114, 114, 512, 59, 112, 8004, 8006, 32768, 8630, 59, 32768, 10557, 1536, 59, 98, 99, 100, 111, 115, 8022, 8024, 8031, 8044, 8049, 8053, 32768, 8746, 114, 99, 97, 112, 59, 32768, 10824, 512, 97, 117, 8036, 8040, 112, 59, 32768, 10822, 112, 59, 32768, 10826, 111, 116, 59, 32768, 8845, 114, 59, 32768, 10821, 59, 32896, 8746, 65024, 1024, 97, 108, 114, 118, 8066, 8078, 8116, 8123, 114, 114, 512, 59, 109, 8073, 8075, 32768, 8631, 59, 32768, 10556, 121, 768, 101, 118, 119, 8086, 8104, 8109, 113, 1089, 8093, 0, 0, 8099, 114, 101, 99, 59, 32768, 8926, 117, 99, 99, 59, 32768, 8927, 101, 101, 59, 32768, 8910, 101, 100, 103, 101, 59, 32768, 8911, 101, 110, 33024, 164, 59, 32768, 164, 101, 97, 114, 114, 111, 119, 512, 108, 114, 8134, 8140, 101, 102, 116, 59, 32768, 8630, 105, 103, 104, 116, 59, 32768, 8631, 101, 101, 59, 32768, 8910, 101, 100, 59, 32768, 8911, 512, 99, 105, 8162, 8170, 111, 110, 105, 110, 116, 59, 32768, 8754, 110, 116, 59, 32768, 8753, 108, 99, 116, 121, 59, 32768, 9005, 4864, 65, 72, 97, 98, 99, 100, 101, 102, 104, 105, 106, 108, 111, 114, 115, 116, 117, 119, 122, 8221, 8226, 8231, 8267, 8282, 8296, 8327, 8351, 8366, 8379, 8466, 8471, 8487, 8621, 8647, 8676, 8697, 8712, 8720, 114, 114, 59, 32768, 8659, 97, 114, 59, 32768, 10597, 1024, 103, 108, 114, 115, 8240, 8246, 8252, 8256, 103, 101, 114, 59, 32768, 8224, 101, 116, 104, 59, 32768, 8504, 114, 59, 32768, 8595, 104, 512, 59, 118, 8262, 8264, 32768, 8208, 59, 32768, 8867, 572, 8271, 8278, 97, 114, 111, 119, 59, 32768, 10511, 97, 99, 59, 32768, 733, 512, 97, 121, 8287, 8293, 114, 111, 110, 59, 32768, 271, 59, 32768, 1076, 768, 59, 97, 111, 8303, 8305, 8320, 32768, 8518, 512, 103, 114, 8310, 8316, 103, 101, 114, 59, 32768, 8225, 114, 59, 32768, 8650, 116, 115, 101, 113, 59, 32768, 10871, 768, 103, 108, 109, 8334, 8339, 8344, 33024, 176, 59, 32768, 176, 116, 97, 59, 32768, 948, 112, 116, 121, 118, 59, 32768, 10673, 512, 105, 114, 8356, 8362, 115, 104, 116, 59, 32768, 10623, 59, 32896, 55349, 56609, 97, 114, 512, 108, 114, 8373, 8376, 59, 32768, 8643, 59, 32768, 8642, 1280, 97, 101, 103, 115, 118, 8390, 8418, 8421, 8428, 8433, 109, 768, 59, 111, 115, 8398, 8400, 8415, 32768, 8900, 110, 100, 512, 59, 115, 8407, 8409, 32768, 8900, 117, 105, 116, 59, 32768, 9830, 59, 32768, 9830, 59, 32768, 168, 97, 109, 109, 97, 59, 32768, 989, 105, 110, 59, 32768, 8946, 768, 59, 105, 111, 8440, 8442, 8461, 32768, 247, 100, 101, 33280, 247, 59, 111, 8450, 8452, 32768, 247, 110, 116, 105, 109, 101, 115, 59, 32768, 8903, 110, 120, 59, 32768, 8903, 99, 121, 59, 32768, 1106, 99, 1088, 8478, 0, 0, 8483, 114, 110, 59, 32768, 8990, 111, 112, 59, 32768, 8973, 1280, 108, 112, 116, 117, 119, 8498, 8504, 8509, 8556, 8570, 108, 97, 114, 59, 32768, 36, 102, 59, 32896, 55349, 56661, 1280, 59, 101, 109, 112, 115, 8520, 8522, 8535, 8542, 8548, 32768, 729, 113, 512, 59, 100, 8528, 8530, 32768, 8784, 111, 116, 59, 32768, 8785, 105, 110, 117, 115, 59, 32768, 8760, 108, 117, 115, 59, 32768, 8724, 113, 117, 97, 114, 101, 59, 32768, 8865, 98, 108, 101, 98, 97, 114, 119, 101, 100, 103, 101, 59, 32768, 8966, 110, 768, 97, 100, 104, 8578, 8585, 8597, 114, 114, 111, 119, 59, 32768, 8595, 111, 119, 110, 97, 114, 114, 111, 119, 115, 59, 32768, 8650, 97, 114, 112, 111, 111, 110, 512, 108, 114, 8608, 8614, 101, 102, 116, 59, 32768, 8643, 105, 103, 104, 116, 59, 32768, 8642, 563, 8625, 8633, 107, 97, 114, 111, 119, 59, 32768, 10512, 1088, 8638, 0, 0, 8643, 114, 110, 59, 32768, 8991, 111, 112, 59, 32768, 8972, 768, 99, 111, 116, 8654, 8666, 8670, 512, 114, 121, 8659, 8663, 59, 32896, 55349, 56505, 59, 32768, 1109, 108, 59, 32768, 10742, 114, 111, 107, 59, 32768, 273, 512, 100, 114, 8681, 8686, 111, 116, 59, 32768, 8945, 105, 512, 59, 102, 8692, 8694, 32768, 9663, 59, 32768, 9662, 512, 97, 104, 8702, 8707, 114, 114, 59, 32768, 8693, 97, 114, 59, 32768, 10607, 97, 110, 103, 108, 101, 59, 32768, 10662, 512, 99, 105, 8725, 8729, 121, 59, 32768, 1119, 103, 114, 97, 114, 114, 59, 32768, 10239, 4608, 68, 97, 99, 100, 101, 102, 103, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 120, 8774, 8788, 8807, 8844, 8849, 8852, 8866, 8895, 8929, 8977, 8989, 9004, 9046, 9136, 9151, 9171, 9184, 9199, 512, 68, 111, 8779, 8784, 111, 116, 59, 32768, 10871, 116, 59, 32768, 8785, 512, 99, 115, 8793, 8801, 117, 116, 101, 33024, 233, 59, 32768, 233, 116, 101, 114, 59, 32768, 10862, 1024, 97, 105, 111, 121, 8816, 8822, 8835, 8841, 114, 111, 110, 59, 32768, 283, 114, 512, 59, 99, 8828, 8830, 32768, 8790, 33024, 234, 59, 32768, 234, 108, 111, 110, 59, 32768, 8789, 59, 32768, 1101, 111, 116, 59, 32768, 279, 59, 32768, 8519, 512, 68, 114, 8857, 8862, 111, 116, 59, 32768, 8786, 59, 32896, 55349, 56610, 768, 59, 114, 115, 8873, 8875, 8883, 32768, 10906, 97, 118, 101, 33024, 232, 59, 32768, 232, 512, 59, 100, 8888, 8890, 32768, 10902, 111, 116, 59, 32768, 10904, 1024, 59, 105, 108, 115, 8904, 8906, 8914, 8917, 32768, 10905, 110, 116, 101, 114, 115, 59, 32768, 9191, 59, 32768, 8467, 512, 59, 100, 8922, 8924, 32768, 10901, 111, 116, 59, 32768, 10903, 768, 97, 112, 115, 8936, 8941, 8960, 99, 114, 59, 32768, 275, 116, 121, 768, 59, 115, 118, 8950, 8952, 8957, 32768, 8709, 101, 116, 59, 32768, 8709, 59, 32768, 8709, 112, 512, 49, 59, 8966, 8975, 516, 8970, 8973, 59, 32768, 8196, 59, 32768, 8197, 32768, 8195, 512, 103, 115, 8982, 8985, 59, 32768, 331, 112, 59, 32768, 8194, 512, 103, 112, 8994, 8999, 111, 110, 59, 32768, 281, 102, 59, 32896, 55349, 56662, 768, 97, 108, 115, 9011, 9023, 9028, 114, 512, 59, 115, 9017, 9019, 32768, 8917, 108, 59, 32768, 10723, 117, 115, 59, 32768, 10865, 105, 768, 59, 108, 118, 9036, 9038, 9043, 32768, 949, 111, 110, 59, 32768, 949, 59, 32768, 1013, 1024, 99, 115, 117, 118, 9055, 9071, 9099, 9128, 512, 105, 111, 9060, 9065, 114, 99, 59, 32768, 8790, 108, 111, 110, 59, 32768, 8789, 1082, 9077, 0, 0, 9081, 109, 59, 32768, 8770, 97, 110, 116, 512, 103, 108, 9088, 9093, 116, 114, 59, 32768, 10902, 101, 115, 115, 59, 32768, 10901, 768, 97, 101, 105, 9106, 9111, 9116, 108, 115, 59, 32768, 61, 115, 116, 59, 32768, 8799, 118, 512, 59, 68, 9122, 9124, 32768, 8801, 68, 59, 32768, 10872, 112, 97, 114, 115, 108, 59, 32768, 10725, 512, 68, 97, 9141, 9146, 111, 116, 59, 32768, 8787, 114, 114, 59, 32768, 10609, 768, 99, 100, 105, 9158, 9162, 9167, 114, 59, 32768, 8495, 111, 116, 59, 32768, 8784, 109, 59, 32768, 8770, 512, 97, 104, 9176, 9179, 59, 32768, 951, 33024, 240, 59, 32768, 240, 512, 109, 114, 9189, 9195, 108, 33024, 235, 59, 32768, 235, 111, 59, 32768, 8364, 768, 99, 105, 112, 9206, 9210, 9215, 108, 59, 32768, 33, 115, 116, 59, 32768, 8707, 512, 101, 111, 9220, 9230, 99, 116, 97, 116, 105, 111, 110, 59, 32768, 8496, 110, 101, 110, 116, 105, 97, 108, 101, 59, 32768, 8519, 4914, 9262, 0, 9276, 0, 9280, 9287, 0, 0, 9318, 9324, 0, 9331, 0, 9352, 9357, 9386, 0, 9395, 9497, 108, 108, 105, 110, 103, 100, 111, 116, 115, 101, 113, 59, 32768, 8786, 121, 59, 32768, 1092, 109, 97, 108, 101, 59, 32768, 9792, 768, 105, 108, 114, 9293, 9299, 9313, 108, 105, 103, 59, 32768, 64259, 1082, 9305, 0, 0, 9309, 103, 59, 32768, 64256, 105, 103, 59, 32768, 64260, 59, 32896, 55349, 56611, 108, 105, 103, 59, 32768, 64257, 108, 105, 103, 59, 32896, 102, 106, 768, 97, 108, 116, 9337, 9341, 9346, 116, 59, 32768, 9837, 105, 103, 59, 32768, 64258, 110, 115, 59, 32768, 9649, 111, 102, 59, 32768, 402, 833, 9361, 0, 9366, 102, 59, 32896, 55349, 56663, 512, 97, 107, 9370, 9375, 108, 108, 59, 32768, 8704, 512, 59, 118, 9380, 9382, 32768, 8916, 59, 32768, 10969, 97, 114, 116, 105, 110, 116, 59, 32768, 10765, 512, 97, 111, 9399, 9491, 512, 99, 115, 9404, 9487, 1794, 9413, 9443, 9453, 9470, 9474, 0, 9484, 1795, 9421, 9426, 9429, 9434, 9437, 0, 9440, 33024, 189, 59, 32768, 189, 59, 32768, 8531, 33024, 188, 59, 32768, 188, 59, 32768, 8533, 59, 32768, 8537, 59, 32768, 8539, 772, 9447, 0, 9450, 59, 32768, 8532, 59, 32768, 8534, 1285, 9459, 9464, 0, 0, 9467, 33024, 190, 59, 32768, 190, 59, 32768, 8535, 59, 32768, 8540, 53, 59, 32768, 8536, 775, 9478, 0, 9481, 59, 32768, 8538, 59, 32768, 8541, 56, 59, 32768, 8542, 108, 59, 32768, 8260, 119, 110, 59, 32768, 8994, 99, 114, 59, 32896, 55349, 56507, 4352, 69, 97, 98, 99, 100, 101, 102, 103, 105, 106, 108, 110, 111, 114, 115, 116, 118, 9537, 9547, 9575, 9582, 9595, 9600, 9679, 9684, 9694, 9700, 9705, 9725, 9773, 9779, 9785, 9810, 9917, 512, 59, 108, 9542, 9544, 32768, 8807, 59, 32768, 10892, 768, 99, 109, 112, 9554, 9560, 9572, 117, 116, 101, 59, 32768, 501, 109, 97, 512, 59, 100, 9567, 9569, 32768, 947, 59, 32768, 989, 59, 32768, 10886, 114, 101, 118, 101, 59, 32768, 287, 512, 105, 121, 9587, 9592, 114, 99, 59, 32768, 285, 59, 32768, 1075, 111, 116, 59, 32768, 289, 1024, 59, 108, 113, 115, 9609, 9611, 9614, 9633, 32768, 8805, 59, 32768, 8923, 768, 59, 113, 115, 9621, 9623, 9626, 32768, 8805, 59, 32768, 8807, 108, 97, 110, 116, 59, 32768, 10878, 1024, 59, 99, 100, 108, 9642, 9644, 9648, 9667, 32768, 10878, 99, 59, 32768, 10921, 111, 116, 512, 59, 111, 9655, 9657, 32768, 10880, 512, 59, 108, 9662, 9664, 32768, 10882, 59, 32768, 10884, 512, 59, 101, 9672, 9675, 32896, 8923, 65024, 115, 59, 32768, 10900, 114, 59, 32896, 55349, 56612, 512, 59, 103, 9689, 9691, 32768, 8811, 59, 32768, 8921, 109, 101, 108, 59, 32768, 8503, 99, 121, 59, 32768, 1107, 1024, 59, 69, 97, 106, 9714, 9716, 9719, 9722, 32768, 8823, 59, 32768, 10898, 59, 32768, 10917, 59, 32768, 10916, 1024, 69, 97, 101, 115, 9734, 9737, 9751, 9768, 59, 32768, 8809, 112, 512, 59, 112, 9743, 9745, 32768, 10890, 114, 111, 120, 59, 32768, 10890, 512, 59, 113, 9756, 9758, 32768, 10888, 512, 59, 113, 9763, 9765, 32768, 10888, 59, 32768, 8809, 105, 109, 59, 32768, 8935, 112, 102, 59, 32896, 55349, 56664, 97, 118, 101, 59, 32768, 96, 512, 99, 105, 9790, 9794, 114, 59, 32768, 8458, 109, 768, 59, 101, 108, 9802, 9804, 9807, 32768, 8819, 59, 32768, 10894, 59, 32768, 10896, 34304, 62, 59, 99, 100, 108, 113, 114, 9824, 9826, 9838, 9843, 9849, 9856, 32768, 62, 512, 99, 105, 9831, 9834, 59, 32768, 10919, 114, 59, 32768, 10874, 111, 116, 59, 32768, 8919, 80, 97, 114, 59, 32768, 10645, 117, 101, 115, 116, 59, 32768, 10876, 1280, 97, 100, 101, 108, 115, 9867, 9882, 9887, 9906, 9912, 833, 9872, 0, 9879, 112, 114, 111, 120, 59, 32768, 10886, 114, 59, 32768, 10616, 111, 116, 59, 32768, 8919, 113, 512, 108, 113, 9893, 9899, 101, 115, 115, 59, 32768, 8923, 108, 101, 115, 115, 59, 32768, 10892, 101, 115, 115, 59, 32768, 8823, 105, 109, 59, 32768, 8819, 512, 101, 110, 9922, 9932, 114, 116, 110, 101, 113, 113, 59, 32896, 8809, 65024, 69, 59, 32896, 8809, 65024, 2560, 65, 97, 98, 99, 101, 102, 107, 111, 115, 121, 9958, 9963, 10015, 10020, 10026, 10060, 10065, 10085, 10147, 10171, 114, 114, 59, 32768, 8660, 1024, 105, 108, 109, 114, 9972, 9978, 9982, 9988, 114, 115, 112, 59, 32768, 8202, 102, 59, 32768, 189, 105, 108, 116, 59, 32768, 8459, 512, 100, 114, 9993, 9998, 99, 121, 59, 32768, 1098, 768, 59, 99, 119, 10005, 10007, 10012, 32768, 8596, 105, 114, 59, 32768, 10568, 59, 32768, 8621, 97, 114, 59, 32768, 8463, 105, 114, 99, 59, 32768, 293, 768, 97, 108, 114, 10033, 10048, 10054, 114, 116, 115, 512, 59, 117, 10041, 10043, 32768, 9829, 105, 116, 59, 32768, 9829, 108, 105, 112, 59, 32768, 8230, 99, 111, 110, 59, 32768, 8889, 114, 59, 32896, 55349, 56613, 115, 512, 101, 119, 10071, 10078, 97, 114, 111, 119, 59, 32768, 10533, 97, 114, 111, 119, 59, 32768, 10534, 1280, 97, 109, 111, 112, 114, 10096, 10101, 10107, 10136, 10141, 114, 114, 59, 32768, 8703, 116, 104, 116, 59, 32768, 8763, 107, 512, 108, 114, 10113, 10124, 101, 102, 116, 97, 114, 114, 111, 119, 59, 32768, 8617, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8618, 102, 59, 32896, 55349, 56665, 98, 97, 114, 59, 32768, 8213, 768, 99, 108, 116, 10154, 10159, 10165, 114, 59, 32896, 55349, 56509, 97, 115, 104, 59, 32768, 8463, 114, 111, 107, 59, 32768, 295, 512, 98, 112, 10176, 10182, 117, 108, 108, 59, 32768, 8259, 104, 101, 110, 59, 32768, 8208, 5426, 10211, 0, 10220, 0, 10239, 10255, 10267, 0, 10276, 10312, 0, 0, 10318, 10371, 10458, 10485, 10491, 0, 10500, 10545, 10558, 99, 117, 116, 101, 33024, 237, 59, 32768, 237, 768, 59, 105, 121, 10226, 10228, 10235, 32768, 8291, 114, 99, 33024, 238, 59, 32768, 238, 59, 32768, 1080, 512, 99, 120, 10243, 10247, 121, 59, 32768, 1077, 99, 108, 33024, 161, 59, 32768, 161, 512, 102, 114, 10259, 10262, 59, 32768, 8660, 59, 32896, 55349, 56614, 114, 97, 118, 101, 33024, 236, 59, 32768, 236, 1024, 59, 105, 110, 111, 10284, 10286, 10300, 10306, 32768, 8520, 512, 105, 110, 10291, 10296, 110, 116, 59, 32768, 10764, 116, 59, 32768, 8749, 102, 105, 110, 59, 32768, 10716, 116, 97, 59, 32768, 8489, 108, 105, 103, 59, 32768, 307, 768, 97, 111, 112, 10324, 10361, 10365, 768, 99, 103, 116, 10331, 10335, 10357, 114, 59, 32768, 299, 768, 101, 108, 112, 10342, 10345, 10351, 59, 32768, 8465, 105, 110, 101, 59, 32768, 8464, 97, 114, 116, 59, 32768, 8465, 104, 59, 32768, 305, 102, 59, 32768, 8887, 101, 100, 59, 32768, 437, 1280, 59, 99, 102, 111, 116, 10381, 10383, 10389, 10403, 10409, 32768, 8712, 97, 114, 101, 59, 32768, 8453, 105, 110, 512, 59, 116, 10396, 10398, 32768, 8734, 105, 101, 59, 32768, 10717, 100, 111, 116, 59, 32768, 305, 1280, 59, 99, 101, 108, 112, 10420, 10422, 10427, 10444, 10451, 32768, 8747, 97, 108, 59, 32768, 8890, 512, 103, 114, 10432, 10438, 101, 114, 115, 59, 32768, 8484, 99, 97, 108, 59, 32768, 8890, 97, 114, 104, 107, 59, 32768, 10775, 114, 111, 100, 59, 32768, 10812, 1024, 99, 103, 112, 116, 10466, 10470, 10475, 10480, 121, 59, 32768, 1105, 111, 110, 59, 32768, 303, 102, 59, 32896, 55349, 56666, 97, 59, 32768, 953, 114, 111, 100, 59, 32768, 10812, 117, 101, 115, 116, 33024, 191, 59, 32768, 191, 512, 99, 105, 10504, 10509, 114, 59, 32896, 55349, 56510, 110, 1280, 59, 69, 100, 115, 118, 10521, 10523, 10526, 10531, 10541, 32768, 8712, 59, 32768, 8953, 111, 116, 59, 32768, 8949, 512, 59, 118, 10536, 10538, 32768, 8948, 59, 32768, 8947, 59, 32768, 8712, 512, 59, 105, 10549, 10551, 32768, 8290, 108, 100, 101, 59, 32768, 297, 828, 10562, 0, 10567, 99, 121, 59, 32768, 1110, 108, 33024, 239, 59, 32768, 239, 1536, 99, 102, 109, 111, 115, 117, 10585, 10598, 10603, 10609, 10615, 10630, 512, 105, 121, 10590, 10595, 114, 99, 59, 32768, 309, 59, 32768, 1081, 114, 59, 32896, 55349, 56615, 97, 116, 104, 59, 32768, 567, 112, 102, 59, 32896, 55349, 56667, 820, 10620, 0, 10625, 114, 59, 32896, 55349, 56511, 114, 99, 121, 59, 32768, 1112, 107, 99, 121, 59, 32768, 1108, 2048, 97, 99, 102, 103, 104, 106, 111, 115, 10653, 10666, 10680, 10685, 10692, 10697, 10702, 10708, 112, 112, 97, 512, 59, 118, 10661, 10663, 32768, 954, 59, 32768, 1008, 512, 101, 121, 10671, 10677, 100, 105, 108, 59, 32768, 311, 59, 32768, 1082, 114, 59, 32896, 55349, 56616, 114, 101, 101, 110, 59, 32768, 312, 99, 121, 59, 32768, 1093, 99, 121, 59, 32768, 1116, 112, 102, 59, 32896, 55349, 56668, 99, 114, 59, 32896, 55349, 56512, 5888, 65, 66, 69, 72, 97, 98, 99, 100, 101, 102, 103, 104, 106, 108, 109, 110, 111, 112, 114, 115, 116, 117, 118, 10761, 10783, 10789, 10799, 10804, 10957, 11011, 11047, 11094, 11349, 11372, 11382, 11409, 11414, 11451, 11478, 11526, 11698, 11711, 11755, 11823, 11910, 11929, 768, 97, 114, 116, 10768, 10773, 10777, 114, 114, 59, 32768, 8666, 114, 59, 32768, 8656, 97, 105, 108, 59, 32768, 10523, 97, 114, 114, 59, 32768, 10510, 512, 59, 103, 10794, 10796, 32768, 8806, 59, 32768, 10891, 97, 114, 59, 32768, 10594, 4660, 10824, 0, 10830, 0, 10838, 0, 0, 0, 0, 0, 10844, 10850, 0, 10867, 10870, 10877, 0, 10933, 117, 116, 101, 59, 32768, 314, 109, 112, 116, 121, 118, 59, 32768, 10676, 114, 97, 110, 59, 32768, 8466, 98, 100, 97, 59, 32768, 955, 103, 768, 59, 100, 108, 10857, 10859, 10862, 32768, 10216, 59, 32768, 10641, 101, 59, 32768, 10216, 59, 32768, 10885, 117, 111, 33024, 171, 59, 32768, 171, 114, 2048, 59, 98, 102, 104, 108, 112, 115, 116, 10894, 10896, 10907, 10911, 10915, 10919, 10923, 10928, 32768, 8592, 512, 59, 102, 10901, 10903, 32768, 8676, 115, 59, 32768, 10527, 115, 59, 32768, 10525, 107, 59, 32768, 8617, 112, 59, 32768, 8619, 108, 59, 32768, 10553, 105, 109, 59, 32768, 10611, 108, 59, 32768, 8610, 768, 59, 97, 101, 10939, 10941, 10946, 32768, 10923, 105, 108, 59, 32768, 10521, 512, 59, 115, 10951, 10953, 32768, 10925, 59, 32896, 10925, 65024, 768, 97, 98, 114, 10964, 10969, 10974, 114, 114, 59, 32768, 10508, 114, 107, 59, 32768, 10098, 512, 97, 107, 10979, 10991, 99, 512, 101, 107, 10985, 10988, 59, 32768, 123, 59, 32768, 91, 512, 101, 115, 10996, 10999, 59, 32768, 10635, 108, 512, 100, 117, 11005, 11008, 59, 32768, 10639, 59, 32768, 10637, 1024, 97, 101, 117, 121, 11020, 11026, 11040, 11044, 114, 111, 110, 59, 32768, 318, 512, 100, 105, 11031, 11036, 105, 108, 59, 32768, 316, 108, 59, 32768, 8968, 98, 59, 32768, 123, 59, 32768, 1083, 1024, 99, 113, 114, 115, 11056, 11060, 11072, 11090, 97, 59, 32768, 10550, 117, 111, 512, 59, 114, 11067, 11069, 32768, 8220, 59, 32768, 8222, 512, 100, 117, 11077, 11083, 104, 97, 114, 59, 32768, 10599, 115, 104, 97, 114, 59, 32768, 10571, 104, 59, 32768, 8626, 1280, 59, 102, 103, 113, 115, 11105, 11107, 11228, 11231, 11250, 32768, 8804, 116, 1280, 97, 104, 108, 114, 116, 11119, 11136, 11157, 11169, 11216, 114, 114, 111, 119, 512, 59, 116, 11128, 11130, 32768, 8592, 97, 105, 108, 59, 32768, 8610, 97, 114, 112, 111, 111, 110, 512, 100, 117, 11147, 11153, 111, 119, 110, 59, 32768, 8637, 112, 59, 32768, 8636, 101, 102, 116, 97, 114, 114, 111, 119, 115, 59, 32768, 8647, 105, 103, 104, 116, 768, 97, 104, 115, 11180, 11194, 11204, 114, 114, 111, 119, 512, 59, 115, 11189, 11191, 32768, 8596, 59, 32768, 8646, 97, 114, 112, 111, 111, 110, 115, 59, 32768, 8651, 113, 117, 105, 103, 97, 114, 114, 111, 119, 59, 32768, 8621, 104, 114, 101, 101, 116, 105, 109, 101, 115, 59, 32768, 8907, 59, 32768, 8922, 768, 59, 113, 115, 11238, 11240, 11243, 32768, 8804, 59, 32768, 8806, 108, 97, 110, 116, 59, 32768, 10877, 1280, 59, 99, 100, 103, 115, 11261, 11263, 11267, 11286, 11298, 32768, 10877, 99, 59, 32768, 10920, 111, 116, 512, 59, 111, 11274, 11276, 32768, 10879, 512, 59, 114, 11281, 11283, 32768, 10881, 59, 32768, 10883, 512, 59, 101, 11291, 11294, 32896, 8922, 65024, 115, 59, 32768, 10899, 1280, 97, 100, 101, 103, 115, 11309, 11317, 11322, 11339, 11344, 112, 112, 114, 111, 120, 59, 32768, 10885, 111, 116, 59, 32768, 8918, 113, 512, 103, 113, 11328, 11333, 116, 114, 59, 32768, 8922, 103, 116, 114, 59, 32768, 10891, 116, 114, 59, 32768, 8822, 105, 109, 59, 32768, 8818, 768, 105, 108, 114, 11356, 11362, 11368, 115, 104, 116, 59, 32768, 10620, 111, 111, 114, 59, 32768, 8970, 59, 32896, 55349, 56617, 512, 59, 69, 11377, 11379, 32768, 8822, 59, 32768, 10897, 562, 11386, 11405, 114, 512, 100, 117, 11391, 11394, 59, 32768, 8637, 512, 59, 108, 11399, 11401, 32768, 8636, 59, 32768, 10602, 108, 107, 59, 32768, 9604, 99, 121, 59, 32768, 1113, 1280, 59, 97, 99, 104, 116, 11425, 11427, 11432, 11440, 11446, 32768, 8810, 114, 114, 59, 32768, 8647, 111, 114, 110, 101, 114, 59, 32768, 8990, 97, 114, 100, 59, 32768, 10603, 114, 105, 59, 32768, 9722, 512, 105, 111, 11456, 11462, 100, 111, 116, 59, 32768, 320, 117, 115, 116, 512, 59, 97, 11470, 11472, 32768, 9136, 99, 104, 101, 59, 32768, 9136, 1024, 69, 97, 101, 115, 11487, 11490, 11504, 11521, 59, 32768, 8808, 112, 512, 59, 112, 11496, 11498, 32768, 10889, 114, 111, 120, 59, 32768, 10889, 512, 59, 113, 11509, 11511, 32768, 10887, 512, 59, 113, 11516, 11518, 32768, 10887, 59, 32768, 8808, 105, 109, 59, 32768, 8934, 2048, 97, 98, 110, 111, 112, 116, 119, 122, 11543, 11556, 11561, 11616, 11640, 11660, 11667, 11680, 512, 110, 114, 11548, 11552, 103, 59, 32768, 10220, 114, 59, 32768, 8701, 114, 107, 59, 32768, 10214, 103, 768, 108, 109, 114, 11569, 11596, 11604, 101, 102, 116, 512, 97, 114, 11577, 11584, 114, 114, 111, 119, 59, 32768, 10229, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 10231, 97, 112, 115, 116, 111, 59, 32768, 10236, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 10230, 112, 97, 114, 114, 111, 119, 512, 108, 114, 11627, 11633, 101, 102, 116, 59, 32768, 8619, 105, 103, 104, 116, 59, 32768, 8620, 768, 97, 102, 108, 11647, 11651, 11655, 114, 59, 32768, 10629, 59, 32896, 55349, 56669, 117, 115, 59, 32768, 10797, 105, 109, 101, 115, 59, 32768, 10804, 562, 11671, 11676, 115, 116, 59, 32768, 8727, 97, 114, 59, 32768, 95, 768, 59, 101, 102, 11687, 11689, 11695, 32768, 9674, 110, 103, 101, 59, 32768, 9674, 59, 32768, 10731, 97, 114, 512, 59, 108, 11705, 11707, 32768, 40, 116, 59, 32768, 10643, 1280, 97, 99, 104, 109, 116, 11722, 11727, 11735, 11747, 11750, 114, 114, 59, 32768, 8646, 111, 114, 110, 101, 114, 59, 32768, 8991, 97, 114, 512, 59, 100, 11742, 11744, 32768, 8651, 59, 32768, 10605, 59, 32768, 8206, 114, 105, 59, 32768, 8895, 1536, 97, 99, 104, 105, 113, 116, 11768, 11774, 11779, 11782, 11798, 11817, 113, 117, 111, 59, 32768, 8249, 114, 59, 32896, 55349, 56513, 59, 32768, 8624, 109, 768, 59, 101, 103, 11790, 11792, 11795, 32768, 8818, 59, 32768, 10893, 59, 32768, 10895, 512, 98, 117, 11803, 11806, 59, 32768, 91, 111, 512, 59, 114, 11812, 11814, 32768, 8216, 59, 32768, 8218, 114, 111, 107, 59, 32768, 322, 34816, 60, 59, 99, 100, 104, 105, 108, 113, 114, 11841, 11843, 11855, 11860, 11866, 11872, 11878, 11885, 32768, 60, 512, 99, 105, 11848, 11851, 59, 32768, 10918, 114, 59, 32768, 10873, 111, 116, 59, 32768, 8918, 114, 101, 101, 59, 32768, 8907, 109, 101, 115, 59, 32768, 8905, 97, 114, 114, 59, 32768, 10614, 117, 101, 115, 116, 59, 32768, 10875, 512, 80, 105, 11890, 11895, 97, 114, 59, 32768, 10646, 768, 59, 101, 102, 11902, 11904, 11907, 32768, 9667, 59, 32768, 8884, 59, 32768, 9666, 114, 512, 100, 117, 11916, 11923, 115, 104, 97, 114, 59, 32768, 10570, 104, 97, 114, 59, 32768, 10598, 512, 101, 110, 11934, 11944, 114, 116, 110, 101, 113, 113, 59, 32896, 8808, 65024, 69, 59, 32896, 8808, 65024, 3584, 68, 97, 99, 100, 101, 102, 104, 105, 108, 110, 111, 112, 115, 117, 11978, 11984, 12061, 12075, 12081, 12095, 12100, 12104, 12170, 12181, 12188, 12204, 12207, 12223, 68, 111, 116, 59, 32768, 8762, 1024, 99, 108, 112, 114, 11993, 11999, 12019, 12055, 114, 33024, 175, 59, 32768, 175, 512, 101, 116, 12004, 12007, 59, 32768, 9794, 512, 59, 101, 12012, 12014, 32768, 10016, 115, 101, 59, 32768, 10016, 512, 59, 115, 12024, 12026, 32768, 8614, 116, 111, 1024, 59, 100, 108, 117, 12037, 12039, 12045, 12051, 32768, 8614, 111, 119, 110, 59, 32768, 8615, 101, 102, 116, 59, 32768, 8612, 112, 59, 32768, 8613, 107, 101, 114, 59, 32768, 9646, 512, 111, 121, 12066, 12072, 109, 109, 97, 59, 32768, 10793, 59, 32768, 1084, 97, 115, 104, 59, 32768, 8212, 97, 115, 117, 114, 101, 100, 97, 110, 103, 108, 101, 59, 32768, 8737, 114, 59, 32896, 55349, 56618, 111, 59, 32768, 8487, 768, 99, 100, 110, 12111, 12118, 12146, 114, 111, 33024, 181, 59, 32768, 181, 1024, 59, 97, 99, 100, 12127, 12129, 12134, 12139, 32768, 8739, 115, 116, 59, 32768, 42, 105, 114, 59, 32768, 10992, 111, 116, 33024, 183, 59, 32768, 183, 117, 115, 768, 59, 98, 100, 12155, 12157, 12160, 32768, 8722, 59, 32768, 8863, 512, 59, 117, 12165, 12167, 32768, 8760, 59, 32768, 10794, 564, 12174, 12178, 112, 59, 32768, 10971, 114, 59, 32768, 8230, 112, 108, 117, 115, 59, 32768, 8723, 512, 100, 112, 12193, 12199, 101, 108, 115, 59, 32768, 8871, 102, 59, 32896, 55349, 56670, 59, 32768, 8723, 512, 99, 116, 12212, 12217, 114, 59, 32896, 55349, 56514, 112, 111, 115, 59, 32768, 8766, 768, 59, 108, 109, 12230, 12232, 12240, 32768, 956, 116, 105, 109, 97, 112, 59, 32768, 8888, 97, 112, 59, 32768, 8888, 6144, 71, 76, 82, 86, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 108, 109, 111, 112, 114, 115, 116, 117, 118, 119, 12294, 12315, 12364, 12376, 12393, 12472, 12496, 12547, 12553, 12636, 12641, 12703, 12725, 12747, 12752, 12876, 12881, 12957, 13033, 13089, 13294, 13359, 13384, 13499, 512, 103, 116, 12299, 12303, 59, 32896, 8921, 824, 512, 59, 118, 12308, 12311, 32896, 8811, 8402, 59, 32896, 8811, 824, 768, 101, 108, 116, 12322, 12348, 12352, 102, 116, 512, 97, 114, 12329, 12336, 114, 114, 111, 119, 59, 32768, 8653, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8654, 59, 32896, 8920, 824, 512, 59, 118, 12357, 12360, 32896, 8810, 8402, 59, 32896, 8810, 824, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8655, 512, 68, 100, 12381, 12387, 97, 115, 104, 59, 32768, 8879, 97, 115, 104, 59, 32768, 8878, 1280, 98, 99, 110, 112, 116, 12404, 12409, 12415, 12420, 12452, 108, 97, 59, 32768, 8711, 117, 116, 101, 59, 32768, 324, 103, 59, 32896, 8736, 8402, 1280, 59, 69, 105, 111, 112, 12431, 12433, 12437, 12442, 12446, 32768, 8777, 59, 32896, 10864, 824, 100, 59, 32896, 8779, 824, 115, 59, 32768, 329, 114, 111, 120, 59, 32768, 8777, 117, 114, 512, 59, 97, 12459, 12461, 32768, 9838, 108, 512, 59, 115, 12467, 12469, 32768, 9838, 59, 32768, 8469, 836, 12477, 0, 12483, 112, 33024, 160, 59, 32768, 160, 109, 112, 512, 59, 101, 12489, 12492, 32896, 8782, 824, 59, 32896, 8783, 824, 1280, 97, 101, 111, 117, 121, 12507, 12519, 12525, 12540, 12544, 833, 12512, 0, 12515, 59, 32768, 10819, 111, 110, 59, 32768, 328, 100, 105, 108, 59, 32768, 326, 110, 103, 512, 59, 100, 12532, 12534, 32768, 8775, 111, 116, 59, 32896, 10861, 824, 112, 59, 32768, 10818, 59, 32768, 1085, 97, 115, 104, 59, 32768, 8211, 1792, 59, 65, 97, 100, 113, 115, 120, 12568, 12570, 12575, 12596, 12602, 12608, 12623, 32768, 8800, 114, 114, 59, 32768, 8663, 114, 512, 104, 114, 12581, 12585, 107, 59, 32768, 10532, 512, 59, 111, 12590, 12592, 32768, 8599, 119, 59, 32768, 8599, 111, 116, 59, 32896, 8784, 824, 117, 105, 118, 59, 32768, 8802, 512, 101, 105, 12613, 12618, 97, 114, 59, 32768, 10536, 109, 59, 32896, 8770, 824, 105, 115, 116, 512, 59, 115, 12631, 12633, 32768, 8708, 59, 32768, 8708, 114, 59, 32896, 55349, 56619, 1024, 69, 101, 115, 116, 12650, 12654, 12688, 12693, 59, 32896, 8807, 824, 768, 59, 113, 115, 12661, 12663, 12684, 32768, 8817, 768, 59, 113, 115, 12670, 12672, 12676, 32768, 8817, 59, 32896, 8807, 824, 108, 97, 110, 116, 59, 32896, 10878, 824, 59, 32896, 10878, 824, 105, 109, 59, 32768, 8821, 512, 59, 114, 12698, 12700, 32768, 8815, 59, 32768, 8815, 768, 65, 97, 112, 12710, 12715, 12720, 114, 114, 59, 32768, 8654, 114, 114, 59, 32768, 8622, 97, 114, 59, 32768, 10994, 768, 59, 115, 118, 12732, 12734, 12744, 32768, 8715, 512, 59, 100, 12739, 12741, 32768, 8956, 59, 32768, 8954, 59, 32768, 8715, 99, 121, 59, 32768, 1114, 1792, 65, 69, 97, 100, 101, 115, 116, 12767, 12772, 12776, 12781, 12785, 12853, 12858, 114, 114, 59, 32768, 8653, 59, 32896, 8806, 824, 114, 114, 59, 32768, 8602, 114, 59, 32768, 8229, 1024, 59, 102, 113, 115, 12794, 12796, 12821, 12842, 32768, 8816, 116, 512, 97, 114, 12802, 12809, 114, 114, 111, 119, 59, 32768, 8602, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8622, 768, 59, 113, 115, 12828, 12830, 12834, 32768, 8816, 59, 32896, 8806, 824, 108, 97, 110, 116, 59, 32896, 10877, 824, 512, 59, 115, 12847, 12850, 32896, 10877, 824, 59, 32768, 8814, 105, 109, 59, 32768, 8820, 512, 59, 114, 12863, 12865, 32768, 8814, 105, 512, 59, 101, 12871, 12873, 32768, 8938, 59, 32768, 8940, 105, 100, 59, 32768, 8740, 512, 112, 116, 12886, 12891, 102, 59, 32896, 55349, 56671, 33536, 172, 59, 105, 110, 12899, 12901, 12936, 32768, 172, 110, 1024, 59, 69, 100, 118, 12911, 12913, 12917, 12923, 32768, 8713, 59, 32896, 8953, 824, 111, 116, 59, 32896, 8949, 824, 818, 12928, 12931, 12934, 59, 32768, 8713, 59, 32768, 8951, 59, 32768, 8950, 105, 512, 59, 118, 12942, 12944, 32768, 8716, 818, 12949, 12952, 12955, 59, 32768, 8716, 59, 32768, 8958, 59, 32768, 8957, 768, 97, 111, 114, 12964, 12992, 12999, 114, 1024, 59, 97, 115, 116, 12974, 12976, 12983, 12988, 32768, 8742, 108, 108, 101, 108, 59, 32768, 8742, 108, 59, 32896, 11005, 8421, 59, 32896, 8706, 824, 108, 105, 110, 116, 59, 32768, 10772, 768, 59, 99, 101, 13006, 13008, 13013, 32768, 8832, 117, 101, 59, 32768, 8928, 512, 59, 99, 13018, 13021, 32896, 10927, 824, 512, 59, 101, 13026, 13028, 32768, 8832, 113, 59, 32896, 10927, 824, 1024, 65, 97, 105, 116, 13042, 13047, 13066, 13077, 114, 114, 59, 32768, 8655, 114, 114, 768, 59, 99, 119, 13056, 13058, 13062, 32768, 8603, 59, 32896, 10547, 824, 59, 32896, 8605, 824, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8603, 114, 105, 512, 59, 101, 13084, 13086, 32768, 8939, 59, 32768, 8941, 1792, 99, 104, 105, 109, 112, 113, 117, 13104, 13128, 13151, 13169, 13174, 13179, 13194, 1024, 59, 99, 101, 114, 13113, 13115, 13120, 13124, 32768, 8833, 117, 101, 59, 32768, 8929, 59, 32896, 10928, 824, 59, 32896, 55349, 56515, 111, 114, 116, 1086, 13137, 0, 0, 13142, 105, 100, 59, 32768, 8740, 97, 114, 97, 108, 108, 101, 108, 59, 32768, 8742, 109, 512, 59, 101, 13157, 13159, 32768, 8769, 512, 59, 113, 13164, 13166, 32768, 8772, 59, 32768, 8772, 105, 100, 59, 32768, 8740, 97, 114, 59, 32768, 8742, 115, 117, 512, 98, 112, 13186, 13190, 101, 59, 32768, 8930, 101, 59, 32768, 8931, 768, 98, 99, 112, 13201, 13241, 13254, 1024, 59, 69, 101, 115, 13210, 13212, 13216, 13219, 32768, 8836, 59, 32896, 10949, 824, 59, 32768, 8840, 101, 116, 512, 59, 101, 13226, 13229, 32896, 8834, 8402, 113, 512, 59, 113, 13235, 13237, 32768, 8840, 59, 32896, 10949, 824, 99, 512, 59, 101, 13247, 13249, 32768, 8833, 113, 59, 32896, 10928, 824, 1024, 59, 69, 101, 115, 13263, 13265, 13269, 13272, 32768, 8837, 59, 32896, 10950, 824, 59, 32768, 8841, 101, 116, 512, 59, 101, 13279, 13282, 32896, 8835, 8402, 113, 512, 59, 113, 13288, 13290, 32768, 8841, 59, 32896, 10950, 824, 1024, 103, 105, 108, 114, 13303, 13307, 13315, 13319, 108, 59, 32768, 8825, 108, 100, 101, 33024, 241, 59, 32768, 241, 103, 59, 32768, 8824, 105, 97, 110, 103, 108, 101, 512, 108, 114, 13330, 13344, 101, 102, 116, 512, 59, 101, 13338, 13340, 32768, 8938, 113, 59, 32768, 8940, 105, 103, 104, 116, 512, 59, 101, 13353, 13355, 32768, 8939, 113, 59, 32768, 8941, 512, 59, 109, 13364, 13366, 32768, 957, 768, 59, 101, 115, 13373, 13375, 13380, 32768, 35, 114, 111, 59, 32768, 8470, 112, 59, 32768, 8199, 2304, 68, 72, 97, 100, 103, 105, 108, 114, 115, 13403, 13409, 13415, 13420, 13426, 13439, 13446, 13476, 13493, 97, 115, 104, 59, 32768, 8877, 97, 114, 114, 59, 32768, 10500, 112, 59, 32896, 8781, 8402, 97, 115, 104, 59, 32768, 8876, 512, 101, 116, 13431, 13435, 59, 32896, 8805, 8402, 59, 32896, 62, 8402, 110, 102, 105, 110, 59, 32768, 10718, 768, 65, 101, 116, 13453, 13458, 13462, 114, 114, 59, 32768, 10498, 59, 32896, 8804, 8402, 512, 59, 114, 13467, 13470, 32896, 60, 8402, 105, 101, 59, 32896, 8884, 8402, 512, 65, 116, 13481, 13486, 114, 114, 59, 32768, 10499, 114, 105, 101, 59, 32896, 8885, 8402, 105, 109, 59, 32896, 8764, 8402, 768, 65, 97, 110, 13506, 13511, 13532, 114, 114, 59, 32768, 8662, 114, 512, 104, 114, 13517, 13521, 107, 59, 32768, 10531, 512, 59, 111, 13526, 13528, 32768, 8598, 119, 59, 32768, 8598, 101, 97, 114, 59, 32768, 10535, 9252, 13576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13579, 0, 13596, 13617, 13653, 13659, 13673, 13695, 13708, 0, 0, 13713, 13750, 0, 13788, 13794, 0, 13815, 13890, 13913, 13937, 13944, 59, 32768, 9416, 512, 99, 115, 13583, 13591, 117, 116, 101, 33024, 243, 59, 32768, 243, 116, 59, 32768, 8859, 512, 105, 121, 13600, 13613, 114, 512, 59, 99, 13606, 13608, 32768, 8858, 33024, 244, 59, 32768, 244, 59, 32768, 1086, 1280, 97, 98, 105, 111, 115, 13627, 13632, 13638, 13642, 13646, 115, 104, 59, 32768, 8861, 108, 97, 99, 59, 32768, 337, 118, 59, 32768, 10808, 116, 59, 32768, 8857, 111, 108, 100, 59, 32768, 10684, 108, 105, 103, 59, 32768, 339, 512, 99, 114, 13663, 13668, 105, 114, 59, 32768, 10687, 59, 32896, 55349, 56620, 1600, 13680, 0, 0, 13684, 0, 13692, 110, 59, 32768, 731, 97, 118, 101, 33024, 242, 59, 32768, 242, 59, 32768, 10689, 512, 98, 109, 13699, 13704, 97, 114, 59, 32768, 10677, 59, 32768, 937, 110, 116, 59, 32768, 8750, 1024, 97, 99, 105, 116, 13721, 13726, 13741, 13746, 114, 114, 59, 32768, 8634, 512, 105, 114, 13731, 13735, 114, 59, 32768, 10686, 111, 115, 115, 59, 32768, 10683, 110, 101, 59, 32768, 8254, 59, 32768, 10688, 768, 97, 101, 105, 13756, 13761, 13766, 99, 114, 59, 32768, 333, 103, 97, 59, 32768, 969, 768, 99, 100, 110, 13773, 13779, 13782, 114, 111, 110, 59, 32768, 959, 59, 32768, 10678, 117, 115, 59, 32768, 8854, 112, 102, 59, 32896, 55349, 56672, 768, 97, 101, 108, 13800, 13804, 13809, 114, 59, 32768, 10679, 114, 112, 59, 32768, 10681, 117, 115, 59, 32768, 8853, 1792, 59, 97, 100, 105, 111, 115, 118, 13829, 13831, 13836, 13869, 13875, 13879, 13886, 32768, 8744, 114, 114, 59, 32768, 8635, 1024, 59, 101, 102, 109, 13845, 13847, 13859, 13864, 32768, 10845, 114, 512, 59, 111, 13853, 13855, 32768, 8500, 102, 59, 32768, 8500, 33024, 170, 59, 32768, 170, 33024, 186, 59, 32768, 186, 103, 111, 102, 59, 32768, 8886, 114, 59, 32768, 10838, 108, 111, 112, 101, 59, 32768, 10839, 59, 32768, 10843, 768, 99, 108, 111, 13896, 13900, 13908, 114, 59, 32768, 8500, 97, 115, 104, 33024, 248, 59, 32768, 248, 108, 59, 32768, 8856, 105, 573, 13917, 13924, 100, 101, 33024, 245, 59, 32768, 245, 101, 115, 512, 59, 97, 13930, 13932, 32768, 8855, 115, 59, 32768, 10806, 109, 108, 33024, 246, 59, 32768, 246, 98, 97, 114, 59, 32768, 9021, 5426, 13972, 0, 14013, 0, 14017, 14053, 0, 14058, 14086, 0, 0, 14107, 14199, 0, 14202, 0, 0, 14229, 14425, 0, 14438, 114, 1024, 59, 97, 115, 116, 13981, 13983, 13997, 14009, 32768, 8741, 33280, 182, 59, 108, 13989, 13991, 32768, 182, 108, 101, 108, 59, 32768, 8741, 1082, 14003, 0, 0, 14007, 109, 59, 32768, 10995, 59, 32768, 11005, 59, 32768, 8706, 121, 59, 32768, 1087, 114, 1280, 99, 105, 109, 112, 116, 14028, 14033, 14038, 14043, 14046, 110, 116, 59, 32768, 37, 111, 100, 59, 32768, 46, 105, 108, 59, 32768, 8240, 59, 32768, 8869, 101, 110, 107, 59, 32768, 8241, 114, 59, 32896, 55349, 56621, 768, 105, 109, 111, 14064, 14074, 14080, 512, 59, 118, 14069, 14071, 32768, 966, 59, 32768, 981, 109, 97, 116, 59, 32768, 8499, 110, 101, 59, 32768, 9742, 768, 59, 116, 118, 14092, 14094, 14103, 32768, 960, 99, 104, 102, 111, 114, 107, 59, 32768, 8916, 59, 32768, 982, 512, 97, 117, 14111, 14132, 110, 512, 99, 107, 14117, 14128, 107, 512, 59, 104, 14123, 14125, 32768, 8463, 59, 32768, 8462, 118, 59, 32768, 8463, 115, 2304, 59, 97, 98, 99, 100, 101, 109, 115, 116, 14152, 14154, 14160, 14163, 14168, 14179, 14182, 14188, 14193, 32768, 43, 99, 105, 114, 59, 32768, 10787, 59, 32768, 8862, 105, 114, 59, 32768, 10786, 512, 111, 117, 14173, 14176, 59, 32768, 8724, 59, 32768, 10789, 59, 32768, 10866, 110, 33024, 177, 59, 32768, 177, 105, 109, 59, 32768, 10790, 119, 111, 59, 32768, 10791, 59, 32768, 177, 768, 105, 112, 117, 14208, 14216, 14221, 110, 116, 105, 110, 116, 59, 32768, 10773, 102, 59, 32896, 55349, 56673, 110, 100, 33024, 163, 59, 32768, 163, 2560, 59, 69, 97, 99, 101, 105, 110, 111, 115, 117, 14249, 14251, 14254, 14258, 14263, 14336, 14348, 14367, 14413, 14418, 32768, 8826, 59, 32768, 10931, 112, 59, 32768, 10935, 117, 101, 59, 32768, 8828, 512, 59, 99, 14268, 14270, 32768, 10927, 1536, 59, 97, 99, 101, 110, 115, 14283, 14285, 14293, 14302, 14306, 14331, 32768, 8826, 112, 112, 114, 111, 120, 59, 32768, 10935, 117, 114, 108, 121, 101, 113, 59, 32768, 8828, 113, 59, 32768, 10927, 768, 97, 101, 115, 14313, 14321, 14326, 112, 112, 114, 111, 120, 59, 32768, 10937, 113, 113, 59, 32768, 10933, 105, 109, 59, 32768, 8936, 105, 109, 59, 32768, 8830, 109, 101, 512, 59, 115, 14343, 14345, 32768, 8242, 59, 32768, 8473, 768, 69, 97, 115, 14355, 14358, 14362, 59, 32768, 10933, 112, 59, 32768, 10937, 105, 109, 59, 32768, 8936, 768, 100, 102, 112, 14374, 14377, 14402, 59, 32768, 8719, 768, 97, 108, 115, 14384, 14390, 14396, 108, 97, 114, 59, 32768, 9006, 105, 110, 101, 59, 32768, 8978, 117, 114, 102, 59, 32768, 8979, 512, 59, 116, 14407, 14409, 32768, 8733, 111, 59, 32768, 8733, 105, 109, 59, 32768, 8830, 114, 101, 108, 59, 32768, 8880, 512, 99, 105, 14429, 14434, 114, 59, 32896, 55349, 56517, 59, 32768, 968, 110, 99, 115, 112, 59, 32768, 8200, 1536, 102, 105, 111, 112, 115, 117, 14457, 14462, 14467, 14473, 14480, 14486, 114, 59, 32896, 55349, 56622, 110, 116, 59, 32768, 10764, 112, 102, 59, 32896, 55349, 56674, 114, 105, 109, 101, 59, 32768, 8279, 99, 114, 59, 32896, 55349, 56518, 768, 97, 101, 111, 14493, 14513, 14526, 116, 512, 101, 105, 14499, 14508, 114, 110, 105, 111, 110, 115, 59, 32768, 8461, 110, 116, 59, 32768, 10774, 115, 116, 512, 59, 101, 14520, 14522, 32768, 63, 113, 59, 32768, 8799, 116, 33024, 34, 59, 32768, 34, 5376, 65, 66, 72, 97, 98, 99, 100, 101, 102, 104, 105, 108, 109, 110, 111, 112, 114, 115, 116, 117, 120, 14575, 14597, 14603, 14608, 14775, 14829, 14865, 14901, 14943, 14966, 15000, 15139, 15159, 15176, 15182, 15236, 15261, 15267, 15309, 15352, 15360, 768, 97, 114, 116, 14582, 14587, 14591, 114, 114, 59, 32768, 8667, 114, 59, 32768, 8658, 97, 105, 108, 59, 32768, 10524, 97, 114, 114, 59, 32768, 10511, 97, 114, 59, 32768, 10596, 1792, 99, 100, 101, 110, 113, 114, 116, 14623, 14637, 14642, 14650, 14672, 14679, 14751, 512, 101, 117, 14628, 14632, 59, 32896, 8765, 817, 116, 101, 59, 32768, 341, 105, 99, 59, 32768, 8730, 109, 112, 116, 121, 118, 59, 32768, 10675, 103, 1024, 59, 100, 101, 108, 14660, 14662, 14665, 14668, 32768, 10217, 59, 32768, 10642, 59, 32768, 10661, 101, 59, 32768, 10217, 117, 111, 33024, 187, 59, 32768, 187, 114, 2816, 59, 97, 98, 99, 102, 104, 108, 112, 115, 116, 119, 14703, 14705, 14709, 14720, 14723, 14727, 14731, 14735, 14739, 14744, 14748, 32768, 8594, 112, 59, 32768, 10613, 512, 59, 102, 14714, 14716, 32768, 8677, 115, 59, 32768, 10528, 59, 32768, 10547, 115, 59, 32768, 10526, 107, 59, 32768, 8618, 112, 59, 32768, 8620, 108, 59, 32768, 10565, 105, 109, 59, 32768, 10612, 108, 59, 32768, 8611, 59, 32768, 8605, 512, 97, 105, 14756, 14761, 105, 108, 59, 32768, 10522, 111, 512, 59, 110, 14767, 14769, 32768, 8758, 97, 108, 115, 59, 32768, 8474, 768, 97, 98, 114, 14782, 14787, 14792, 114, 114, 59, 32768, 10509, 114, 107, 59, 32768, 10099, 512, 97, 107, 14797, 14809, 99, 512, 101, 107, 14803, 14806, 59, 32768, 125, 59, 32768, 93, 512, 101, 115, 14814, 14817, 59, 32768, 10636, 108, 512, 100, 117, 14823, 14826, 59, 32768, 10638, 59, 32768, 10640, 1024, 97, 101, 117, 121, 14838, 14844, 14858, 14862, 114, 111, 110, 59, 32768, 345, 512, 100, 105, 14849, 14854, 105, 108, 59, 32768, 343, 108, 59, 32768, 8969, 98, 59, 32768, 125, 59, 32768, 1088, 1024, 99, 108, 113, 115, 14874, 14878, 14885, 14897, 97, 59, 32768, 10551, 100, 104, 97, 114, 59, 32768, 10601, 117, 111, 512, 59, 114, 14892, 14894, 32768, 8221, 59, 32768, 8221, 104, 59, 32768, 8627, 768, 97, 99, 103, 14908, 14934, 14938, 108, 1024, 59, 105, 112, 115, 14918, 14920, 14925, 14931, 32768, 8476, 110, 101, 59, 32768, 8475, 97, 114, 116, 59, 32768, 8476, 59, 32768, 8477, 116, 59, 32768, 9645, 33024, 174, 59, 32768, 174, 768, 105, 108, 114, 14950, 14956, 14962, 115, 104, 116, 59, 32768, 10621, 111, 111, 114, 59, 32768, 8971, 59, 32896, 55349, 56623, 512, 97, 111, 14971, 14990, 114, 512, 100, 117, 14977, 14980, 59, 32768, 8641, 512, 59, 108, 14985, 14987, 32768, 8640, 59, 32768, 10604, 512, 59, 118, 14995, 14997, 32768, 961, 59, 32768, 1009, 768, 103, 110, 115, 15007, 15123, 15127, 104, 116, 1536, 97, 104, 108, 114, 115, 116, 15022, 15039, 15060, 15086, 15099, 15111, 114, 114, 111, 119, 512, 59, 116, 15031, 15033, 32768, 8594, 97, 105, 108, 59, 32768, 8611, 97, 114, 112, 111, 111, 110, 512, 100, 117, 15050, 15056, 111, 119, 110, 59, 32768, 8641, 112, 59, 32768, 8640, 101, 102, 116, 512, 97, 104, 15068, 15076, 114, 114, 111, 119, 115, 59, 32768, 8644, 97, 114, 112, 111, 111, 110, 115, 59, 32768, 8652, 105, 103, 104, 116, 97, 114, 114, 111, 119, 115, 59, 32768, 8649, 113, 117, 105, 103, 97, 114, 114, 111, 119, 59, 32768, 8605, 104, 114, 101, 101, 116, 105, 109, 101, 115, 59, 32768, 8908, 103, 59, 32768, 730, 105, 110, 103, 100, 111, 116, 115, 101, 113, 59, 32768, 8787, 768, 97, 104, 109, 15146, 15151, 15156, 114, 114, 59, 32768, 8644, 97, 114, 59, 32768, 8652, 59, 32768, 8207, 111, 117, 115, 116, 512, 59, 97, 15168, 15170, 32768, 9137, 99, 104, 101, 59, 32768, 9137, 109, 105, 100, 59, 32768, 10990, 1024, 97, 98, 112, 116, 15191, 15204, 15209, 15229, 512, 110, 114, 15196, 15200, 103, 59, 32768, 10221, 114, 59, 32768, 8702, 114, 107, 59, 32768, 10215, 768, 97, 102, 108, 15216, 15220, 15224, 114, 59, 32768, 10630, 59, 32896, 55349, 56675, 117, 115, 59, 32768, 10798, 105, 109, 101, 115, 59, 32768, 10805, 512, 97, 112, 15241, 15253, 114, 512, 59, 103, 15247, 15249, 32768, 41, 116, 59, 32768, 10644, 111, 108, 105, 110, 116, 59, 32768, 10770, 97, 114, 114, 59, 32768, 8649, 1024, 97, 99, 104, 113, 15276, 15282, 15287, 15290, 113, 117, 111, 59, 32768, 8250, 114, 59, 32896, 55349, 56519, 59, 32768, 8625, 512, 98, 117, 15295, 15298, 59, 32768, 93, 111, 512, 59, 114, 15304, 15306, 32768, 8217, 59, 32768, 8217, 768, 104, 105, 114, 15316, 15322, 15328, 114, 101, 101, 59, 32768, 8908, 109, 101, 115, 59, 32768, 8906, 105, 1024, 59, 101, 102, 108, 15338, 15340, 15343, 15346, 32768, 9657, 59, 32768, 8885, 59, 32768, 9656, 116, 114, 105, 59, 32768, 10702, 108, 117, 104, 97, 114, 59, 32768, 10600, 59, 32768, 8478, 6706, 15391, 15398, 15404, 15499, 15516, 15592, 0, 15606, 15660, 0, 0, 15752, 15758, 0, 15827, 15863, 15886, 16000, 16006, 16038, 16086, 0, 16467, 0, 0, 16506, 99, 117, 116, 101, 59, 32768, 347, 113, 117, 111, 59, 32768, 8218, 2560, 59, 69, 97, 99, 101, 105, 110, 112, 115, 121, 15424, 15426, 15429, 15441, 15446, 15458, 15463, 15482, 15490, 15495, 32768, 8827, 59, 32768, 10932, 833, 15434, 0, 15437, 59, 32768, 10936, 111, 110, 59, 32768, 353, 117, 101, 59, 32768, 8829, 512, 59, 100, 15451, 15453, 32768, 10928, 105, 108, 59, 32768, 351, 114, 99, 59, 32768, 349, 768, 69, 97, 115, 15470, 15473, 15477, 59, 32768, 10934, 112, 59, 32768, 10938, 105, 109, 59, 32768, 8937, 111, 108, 105, 110, 116, 59, 32768, 10771, 105, 109, 59, 32768, 8831, 59, 32768, 1089, 111, 116, 768, 59, 98, 101, 15507, 15509, 15512, 32768, 8901, 59, 32768, 8865, 59, 32768, 10854, 1792, 65, 97, 99, 109, 115, 116, 120, 15530, 15535, 15556, 15562, 15566, 15572, 15587, 114, 114, 59, 32768, 8664, 114, 512, 104, 114, 15541, 15545, 107, 59, 32768, 10533, 512, 59, 111, 15550, 15552, 32768, 8600, 119, 59, 32768, 8600, 116, 33024, 167, 59, 32768, 167, 105, 59, 32768, 59, 119, 97, 114, 59, 32768, 10537, 109, 512, 105, 110, 15578, 15584, 110, 117, 115, 59, 32768, 8726, 59, 32768, 8726, 116, 59, 32768, 10038, 114, 512, 59, 111, 15597, 15600, 32896, 55349, 56624, 119, 110, 59, 32768, 8994, 1024, 97, 99, 111, 121, 15614, 15619, 15632, 15654, 114, 112, 59, 32768, 9839, 512, 104, 121, 15624, 15629, 99, 121, 59, 32768, 1097, 59, 32768, 1096, 114, 116, 1086, 15640, 0, 0, 15645, 105, 100, 59, 32768, 8739, 97, 114, 97, 108, 108, 101, 108, 59, 32768, 8741, 33024, 173, 59, 32768, 173, 512, 103, 109, 15664, 15681, 109, 97, 768, 59, 102, 118, 15673, 15675, 15678, 32768, 963, 59, 32768, 962, 59, 32768, 962, 2048, 59, 100, 101, 103, 108, 110, 112, 114, 15698, 15700, 15705, 15715, 15725, 15735, 15739, 15745, 32768, 8764, 111, 116, 59, 32768, 10858, 512, 59, 113, 15710, 15712, 32768, 8771, 59, 32768, 8771, 512, 59, 69, 15720, 15722, 32768, 10910, 59, 32768, 10912, 512, 59, 69, 15730, 15732, 32768, 10909, 59, 32768, 10911, 101, 59, 32768, 8774, 108, 117, 115, 59, 32768, 10788, 97, 114, 114, 59, 32768, 10610, 97, 114, 114, 59, 32768, 8592, 1024, 97, 101, 105, 116, 15766, 15788, 15796, 15808, 512, 108, 115, 15771, 15783, 108, 115, 101, 116, 109, 105, 110, 117, 115, 59, 32768, 8726, 104, 112, 59, 32768, 10803, 112, 97, 114, 115, 108, 59, 32768, 10724, 512, 100, 108, 15801, 15804, 59, 32768, 8739, 101, 59, 32768, 8995, 512, 59, 101, 15813, 15815, 32768, 10922, 512, 59, 115, 15820, 15822, 32768, 10924, 59, 32896, 10924, 65024, 768, 102, 108, 112, 15833, 15839, 15857, 116, 99, 121, 59, 32768, 1100, 512, 59, 98, 15844, 15846, 32768, 47, 512, 59, 97, 15851, 15853, 32768, 10692, 114, 59, 32768, 9023, 102, 59, 32896, 55349, 56676, 97, 512, 100, 114, 15868, 15882, 101, 115, 512, 59, 117, 15875, 15877, 32768, 9824, 105, 116, 59, 32768, 9824, 59, 32768, 8741, 768, 99, 115, 117, 15892, 15921, 15977, 512, 97, 117, 15897, 15909, 112, 512, 59, 115, 15903, 15905, 32768, 8851, 59, 32896, 8851, 65024, 112, 512, 59, 115, 15915, 15917, 32768, 8852, 59, 32896, 8852, 65024, 117, 512, 98, 112, 15927, 15952, 768, 59, 101, 115, 15934, 15936, 15939, 32768, 8847, 59, 32768, 8849, 101, 116, 512, 59, 101, 15946, 15948, 32768, 8847, 113, 59, 32768, 8849, 768, 59, 101, 115, 15959, 15961, 15964, 32768, 8848, 59, 32768, 8850, 101, 116, 512, 59, 101, 15971, 15973, 32768, 8848, 113, 59, 32768, 8850, 768, 59, 97, 102, 15984, 15986, 15996, 32768, 9633, 114, 566, 15991, 15994, 59, 32768, 9633, 59, 32768, 9642, 59, 32768, 9642, 97, 114, 114, 59, 32768, 8594, 1024, 99, 101, 109, 116, 16014, 16019, 16025, 16031, 114, 59, 32896, 55349, 56520, 116, 109, 110, 59, 32768, 8726, 105, 108, 101, 59, 32768, 8995, 97, 114, 102, 59, 32768, 8902, 512, 97, 114, 16042, 16053, 114, 512, 59, 102, 16048, 16050, 32768, 9734, 59, 32768, 9733, 512, 97, 110, 16058, 16081, 105, 103, 104, 116, 512, 101, 112, 16067, 16076, 112, 115, 105, 108, 111, 110, 59, 32768, 1013, 104, 105, 59, 32768, 981, 115, 59, 32768, 175, 1280, 98, 99, 109, 110, 112, 16096, 16221, 16288, 16291, 16295, 2304, 59, 69, 100, 101, 109, 110, 112, 114, 115, 16115, 16117, 16120, 16125, 16137, 16143, 16154, 16160, 16166, 32768, 8834, 59, 32768, 10949, 111, 116, 59, 32768, 10941, 512, 59, 100, 16130, 16132, 32768, 8838, 111, 116, 59, 32768, 10947, 117, 108, 116, 59, 32768, 10945, 512, 69, 101, 16148, 16151, 59, 32768, 10955, 59, 32768, 8842, 108, 117, 115, 59, 32768, 10943, 97, 114, 114, 59, 32768, 10617, 768, 101, 105, 117, 16173, 16206, 16210, 116, 768, 59, 101, 110, 16181, 16183, 16194, 32768, 8834, 113, 512, 59, 113, 16189, 16191, 32768, 8838, 59, 32768, 10949, 101, 113, 512, 59, 113, 16201, 16203, 32768, 8842, 59, 32768, 10955, 109, 59, 32768, 10951, 512, 98, 112, 16215, 16218, 59, 32768, 10965, 59, 32768, 10963, 99, 1536, 59, 97, 99, 101, 110, 115, 16235, 16237, 16245, 16254, 16258, 16283, 32768, 8827, 112, 112, 114, 111, 120, 59, 32768, 10936, 117, 114, 108, 121, 101, 113, 59, 32768, 8829, 113, 59, 32768, 10928, 768, 97, 101, 115, 16265, 16273, 16278, 112, 112, 114, 111, 120, 59, 32768, 10938, 113, 113, 59, 32768, 10934, 105, 109, 59, 32768, 8937, 105, 109, 59, 32768, 8831, 59, 32768, 8721, 103, 59, 32768, 9834, 3328, 49, 50, 51, 59, 69, 100, 101, 104, 108, 109, 110, 112, 115, 16322, 16327, 16332, 16337, 16339, 16342, 16356, 16368, 16382, 16388, 16394, 16405, 16411, 33024, 185, 59, 32768, 185, 33024, 178, 59, 32768, 178, 33024, 179, 59, 32768, 179, 32768, 8835, 59, 32768, 10950, 512, 111, 115, 16347, 16351, 116, 59, 32768, 10942, 117, 98, 59, 32768, 10968, 512, 59, 100, 16361, 16363, 32768, 8839, 111, 116, 59, 32768, 10948, 115, 512, 111, 117, 16374, 16378, 108, 59, 32768, 10185, 98, 59, 32768, 10967, 97, 114, 114, 59, 32768, 10619, 117, 108, 116, 59, 32768, 10946, 512, 69, 101, 16399, 16402, 59, 32768, 10956, 59, 32768, 8843, 108, 117, 115, 59, 32768, 10944, 768, 101, 105, 117, 16418, 16451, 16455, 116, 768, 59, 101, 110, 16426, 16428, 16439, 32768, 8835, 113, 512, 59, 113, 16434, 16436, 32768, 8839, 59, 32768, 10950, 101, 113, 512, 59, 113, 16446, 16448, 32768, 8843, 59, 32768, 10956, 109, 59, 32768, 10952, 512, 98, 112, 16460, 16463, 59, 32768, 10964, 59, 32768, 10966, 768, 65, 97, 110, 16473, 16478, 16499, 114, 114, 59, 32768, 8665, 114, 512, 104, 114, 16484, 16488, 107, 59, 32768, 10534, 512, 59, 111, 16493, 16495, 32768, 8601, 119, 59, 32768, 8601, 119, 97, 114, 59, 32768, 10538, 108, 105, 103, 33024, 223, 59, 32768, 223, 5938, 16538, 16552, 16557, 16579, 16584, 16591, 0, 16596, 16692, 0, 0, 0, 0, 0, 16731, 16780, 0, 16787, 16908, 0, 0, 0, 16938, 1091, 16543, 0, 0, 16549, 103, 101, 116, 59, 32768, 8982, 59, 32768, 964, 114, 107, 59, 32768, 9140, 768, 97, 101, 121, 16563, 16569, 16575, 114, 111, 110, 59, 32768, 357, 100, 105, 108, 59, 32768, 355, 59, 32768, 1090, 111, 116, 59, 32768, 8411, 108, 114, 101, 99, 59, 32768, 8981, 114, 59, 32896, 55349, 56625, 1024, 101, 105, 107, 111, 16604, 16641, 16670, 16684, 835, 16609, 0, 16624, 101, 512, 52, 102, 16614, 16617, 59, 32768, 8756, 111, 114, 101, 59, 32768, 8756, 97, 768, 59, 115, 118, 16631, 16633, 16638, 32768, 952, 121, 109, 59, 32768, 977, 59, 32768, 977, 512, 99, 110, 16646, 16665, 107, 512, 97, 115, 16652, 16660, 112, 112, 114, 111, 120, 59, 32768, 8776, 105, 109, 59, 32768, 8764, 115, 112, 59, 32768, 8201, 512, 97, 115, 16675, 16679, 112, 59, 32768, 8776, 105, 109, 59, 32768, 8764, 114, 110, 33024, 254, 59, 32768, 254, 829, 16696, 16701, 16727, 100, 101, 59, 32768, 732, 101, 115, 33536, 215, 59, 98, 100, 16710, 16712, 16723, 32768, 215, 512, 59, 97, 16717, 16719, 32768, 8864, 114, 59, 32768, 10801, 59, 32768, 10800, 116, 59, 32768, 8749, 768, 101, 112, 115, 16737, 16741, 16775, 97, 59, 32768, 10536, 1024, 59, 98, 99, 102, 16750, 16752, 16757, 16762, 32768, 8868, 111, 116, 59, 32768, 9014, 105, 114, 59, 32768, 10993, 512, 59, 111, 16767, 16770, 32896, 55349, 56677, 114, 107, 59, 32768, 10970, 97, 59, 32768, 10537, 114, 105, 109, 101, 59, 32768, 8244, 768, 97, 105, 112, 16793, 16798, 16899, 100, 101, 59, 32768, 8482, 1792, 97, 100, 101, 109, 112, 115, 116, 16813, 16868, 16873, 16876, 16883, 16889, 16893, 110, 103, 108, 101, 1280, 59, 100, 108, 113, 114, 16828, 16830, 16836, 16850, 16853, 32768, 9653, 111, 119, 110, 59, 32768, 9663, 101, 102, 116, 512, 59, 101, 16844, 16846, 32768, 9667, 113, 59, 32768, 8884, 59, 32768, 8796, 105, 103, 104, 116, 512, 59, 101, 16862, 16864, 32768, 9657, 113, 59, 32768, 8885, 111, 116, 59, 32768, 9708, 59, 32768, 8796, 105, 110, 117, 115, 59, 32768, 10810, 108, 117, 115, 59, 32768, 10809, 98, 59, 32768, 10701, 105, 109, 101, 59, 32768, 10811, 101, 122, 105, 117, 109, 59, 32768, 9186, 768, 99, 104, 116, 16914, 16926, 16931, 512, 114, 121, 16919, 16923, 59, 32896, 55349, 56521, 59, 32768, 1094, 99, 121, 59, 32768, 1115, 114, 111, 107, 59, 32768, 359, 512, 105, 111, 16942, 16947, 120, 116, 59, 32768, 8812, 104, 101, 97, 100, 512, 108, 114, 16956, 16967, 101, 102, 116, 97, 114, 114, 111, 119, 59, 32768, 8606, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8608, 4608, 65, 72, 97, 98, 99, 100, 102, 103, 104, 108, 109, 111, 112, 114, 115, 116, 117, 119, 17016, 17021, 17026, 17043, 17057, 17072, 17095, 17110, 17119, 17139, 17172, 17187, 17202, 17290, 17330, 17336, 17365, 17381, 114, 114, 59, 32768, 8657, 97, 114, 59, 32768, 10595, 512, 99, 114, 17031, 17039, 117, 116, 101, 33024, 250, 59, 32768, 250, 114, 59, 32768, 8593, 114, 820, 17049, 0, 17053, 121, 59, 32768, 1118, 118, 101, 59, 32768, 365, 512, 105, 121, 17062, 17069, 114, 99, 33024, 251, 59, 32768, 251, 59, 32768, 1091, 768, 97, 98, 104, 17079, 17084, 17090, 114, 114, 59, 32768, 8645, 108, 97, 99, 59, 32768, 369, 97, 114, 59, 32768, 10606, 512, 105, 114, 17100, 17106, 115, 104, 116, 59, 32768, 10622, 59, 32896, 55349, 56626, 114, 97, 118, 101, 33024, 249, 59, 32768, 249, 562, 17123, 17135, 114, 512, 108, 114, 17128, 17131, 59, 32768, 8639, 59, 32768, 8638, 108, 107, 59, 32768, 9600, 512, 99, 116, 17144, 17167, 1088, 17150, 0, 0, 17163, 114, 110, 512, 59, 101, 17156, 17158, 32768, 8988, 114, 59, 32768, 8988, 111, 112, 59, 32768, 8975, 114, 105, 59, 32768, 9720, 512, 97, 108, 17177, 17182, 99, 114, 59, 32768, 363, 33024, 168, 59, 32768, 168, 512, 103, 112, 17192, 17197, 111, 110, 59, 32768, 371, 102, 59, 32896, 55349, 56678, 1536, 97, 100, 104, 108, 115, 117, 17215, 17222, 17233, 17257, 17262, 17280, 114, 114, 111, 119, 59, 32768, 8593, 111, 119, 110, 97, 114, 114, 111, 119, 59, 32768, 8597, 97, 114, 112, 111, 111, 110, 512, 108, 114, 17244, 17250, 101, 102, 116, 59, 32768, 8639, 105, 103, 104, 116, 59, 32768, 8638, 117, 115, 59, 32768, 8846, 105, 768, 59, 104, 108, 17270, 17272, 17275, 32768, 965, 59, 32768, 978, 111, 110, 59, 32768, 965, 112, 97, 114, 114, 111, 119, 115, 59, 32768, 8648, 768, 99, 105, 116, 17297, 17320, 17325, 1088, 17303, 0, 0, 17316, 114, 110, 512, 59, 101, 17309, 17311, 32768, 8989, 114, 59, 32768, 8989, 111, 112, 59, 32768, 8974, 110, 103, 59, 32768, 367, 114, 105, 59, 32768, 9721, 99, 114, 59, 32896, 55349, 56522, 768, 100, 105, 114, 17343, 17348, 17354, 111, 116, 59, 32768, 8944, 108, 100, 101, 59, 32768, 361, 105, 512, 59, 102, 17360, 17362, 32768, 9653, 59, 32768, 9652, 512, 97, 109, 17370, 17375, 114, 114, 59, 32768, 8648, 108, 33024, 252, 59, 32768, 252, 97, 110, 103, 108, 101, 59, 32768, 10663, 3840, 65, 66, 68, 97, 99, 100, 101, 102, 108, 110, 111, 112, 114, 115, 122, 17420, 17425, 17437, 17443, 17613, 17617, 17623, 17667, 17672, 17678, 17693, 17699, 17705, 17711, 17754, 114, 114, 59, 32768, 8661, 97, 114, 512, 59, 118, 17432, 17434, 32768, 10984, 59, 32768, 10985, 97, 115, 104, 59, 32768, 8872, 512, 110, 114, 17448, 17454, 103, 114, 116, 59, 32768, 10652, 1792, 101, 107, 110, 112, 114, 115, 116, 17469, 17478, 17485, 17494, 17515, 17526, 17578, 112, 115, 105, 108, 111, 110, 59, 32768, 1013, 97, 112, 112, 97, 59, 32768, 1008, 111, 116, 104, 105, 110, 103, 59, 32768, 8709, 768, 104, 105, 114, 17501, 17505, 17508, 105, 59, 32768, 981, 59, 32768, 982, 111, 112, 116, 111, 59, 32768, 8733, 512, 59, 104, 17520, 17522, 32768, 8597, 111, 59, 32768, 1009, 512, 105, 117, 17531, 17537, 103, 109, 97, 59, 32768, 962, 512, 98, 112, 17542, 17560, 115, 101, 116, 110, 101, 113, 512, 59, 113, 17553, 17556, 32896, 8842, 65024, 59, 32896, 10955, 65024, 115, 101, 116, 110, 101, 113, 512, 59, 113, 17571, 17574, 32896, 8843, 65024, 59, 32896, 10956, 65024, 512, 104, 114, 17583, 17589, 101, 116, 97, 59, 32768, 977, 105, 97, 110, 103, 108, 101, 512, 108, 114, 17600, 17606, 101, 102, 116, 59, 32768, 8882, 105, 103, 104, 116, 59, 32768, 8883, 121, 59, 32768, 1074, 97, 115, 104, 59, 32768, 8866, 768, 101, 108, 114, 17630, 17648, 17654, 768, 59, 98, 101, 17637, 17639, 17644, 32768, 8744, 97, 114, 59, 32768, 8891, 113, 59, 32768, 8794, 108, 105, 112, 59, 32768, 8942, 512, 98, 116, 17659, 17664, 97, 114, 59, 32768, 124, 59, 32768, 124, 114, 59, 32896, 55349, 56627, 116, 114, 105, 59, 32768, 8882, 115, 117, 512, 98, 112, 17685, 17689, 59, 32896, 8834, 8402, 59, 32896, 8835, 8402, 112, 102, 59, 32896, 55349, 56679, 114, 111, 112, 59, 32768, 8733, 116, 114, 105, 59, 32768, 8883, 512, 99, 117, 17716, 17721, 114, 59, 32896, 55349, 56523, 512, 98, 112, 17726, 17740, 110, 512, 69, 101, 17732, 17736, 59, 32896, 10955, 65024, 59, 32896, 8842, 65024, 110, 512, 69, 101, 17746, 17750, 59, 32896, 10956, 65024, 59, 32896, 8843, 65024, 105, 103, 122, 97, 103, 59, 32768, 10650, 1792, 99, 101, 102, 111, 112, 114, 115, 17777, 17783, 17815, 17820, 17826, 17829, 17842, 105, 114, 99, 59, 32768, 373, 512, 100, 105, 17788, 17809, 512, 98, 103, 17793, 17798, 97, 114, 59, 32768, 10847, 101, 512, 59, 113, 17804, 17806, 32768, 8743, 59, 32768, 8793, 101, 114, 112, 59, 32768, 8472, 114, 59, 32896, 55349, 56628, 112, 102, 59, 32896, 55349, 56680, 59, 32768, 8472, 512, 59, 101, 17834, 17836, 32768, 8768, 97, 116, 104, 59, 32768, 8768, 99, 114, 59, 32896, 55349, 56524, 5428, 17871, 17891, 0, 17897, 0, 17902, 17917, 0, 0, 17920, 17935, 17940, 17945, 0, 0, 17977, 17992, 0, 18008, 18024, 18029, 768, 97, 105, 117, 17877, 17881, 17886, 112, 59, 32768, 8898, 114, 99, 59, 32768, 9711, 112, 59, 32768, 8899, 116, 114, 105, 59, 32768, 9661, 114, 59, 32896, 55349, 56629, 512, 65, 97, 17906, 17911, 114, 114, 59, 32768, 10234, 114, 114, 59, 32768, 10231, 59, 32768, 958, 512, 65, 97, 17924, 17929, 114, 114, 59, 32768, 10232, 114, 114, 59, 32768, 10229, 97, 112, 59, 32768, 10236, 105, 115, 59, 32768, 8955, 768, 100, 112, 116, 17951, 17956, 17970, 111, 116, 59, 32768, 10752, 512, 102, 108, 17961, 17965, 59, 32896, 55349, 56681, 117, 115, 59, 32768, 10753, 105, 109, 101, 59, 32768, 10754, 512, 65, 97, 17981, 17986, 114, 114, 59, 32768, 10233, 114, 114, 59, 32768, 10230, 512, 99, 113, 17996, 18001, 114, 59, 32896, 55349, 56525, 99, 117, 112, 59, 32768, 10758, 512, 112, 116, 18012, 18018, 108, 117, 115, 59, 32768, 10756, 114, 105, 59, 32768, 9651, 101, 101, 59, 32768, 8897, 101, 100, 103, 101, 59, 32768, 8896, 2048, 97, 99, 101, 102, 105, 111, 115, 117, 18052, 18068, 18081, 18087, 18092, 18097, 18103, 18109, 99, 512, 117, 121, 18058, 18065, 116, 101, 33024, 253, 59, 32768, 253, 59, 32768, 1103, 512, 105, 121, 18073, 18078, 114, 99, 59, 32768, 375, 59, 32768, 1099, 110, 33024, 165, 59, 32768, 165, 114, 59, 32896, 55349, 56630, 99, 121, 59, 32768, 1111, 112, 102, 59, 32896, 55349, 56682, 99, 114, 59, 32896, 55349, 56526, 512, 99, 109, 18114, 18118, 121, 59, 32768, 1102, 108, 33024, 255, 59, 32768, 255, 2560, 97, 99, 100, 101, 102, 104, 105, 111, 115, 119, 18145, 18152, 18166, 18171, 18186, 18191, 18196, 18204, 18210, 18216, 99, 117, 116, 101, 59, 32768, 378, 512, 97, 121, 18157, 18163, 114, 111, 110, 59, 32768, 382, 59, 32768, 1079, 111, 116, 59, 32768, 380, 512, 101, 116, 18176, 18182, 116, 114, 102, 59, 32768, 8488, 97, 59, 32768, 950, 114, 59, 32896, 55349, 56631, 99, 121, 59, 32768, 1078, 103, 114, 97, 114, 114, 59, 32768, 8669, 112, 102, 59, 32896, 55349, 56683, 99, 114, 59, 32896, 55349, 56527, 512, 106, 110, 18221, 18224, 59, 32768, 8205, 106, 59, 32768, 8204]);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Generated using scripts/write-decode-map.ts\n// prettier-ignore\nexports.default = new Uint16Array([1024, 97, 103, 108, 113, 9, 23, 27, 31, 1086, 15, 0, 0, 19, 112, 59, 32768, 38, 111, 115, 59, 32768, 39, 116, 59, 32768, 62, 116, 59, 32768, 60, 117, 111, 116, 59, 32768, 34]);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.encodeHTML5 = exports.encodeHTML4 = exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = exports.encode = exports.decodeStrict = exports.decode = exports.EncodingMode = exports.DecodingMode = exports.EntityLevel = void 0;\nvar decode_1 = require(\"./decode\");\nvar encode_1 = require(\"./encode\");\n/** The level of entities to support. */\nvar EntityLevel;\n(function (EntityLevel) {\n    /** Support only XML entities. */\n    EntityLevel[EntityLevel[\"XML\"] = 0] = \"XML\";\n    /** Support HTML entities, which are a superset of XML entities. */\n    EntityLevel[EntityLevel[\"HTML\"] = 1] = \"HTML\";\n})(EntityLevel = exports.EntityLevel || (exports.EntityLevel = {}));\n/** Determines whether some entities are allowed to be written without a trailing `;`. */\nvar DecodingMode;\n(function (DecodingMode) {\n    /** Support legacy HTML entities. */\n    DecodingMode[DecodingMode[\"Legacy\"] = 0] = \"Legacy\";\n    /** Do not support legacy HTML entities. */\n    DecodingMode[DecodingMode[\"Strict\"] = 1] = \"Strict\";\n})(DecodingMode = exports.DecodingMode || (exports.DecodingMode = {}));\nvar EncodingMode;\n(function (EncodingMode) {\n    /**\n     * The output is UTF-8 encoded. Only characters that need escaping within\n     * HTML will be escaped.\n     */\n    EncodingMode[EncodingMode[\"UTF8\"] = 0] = \"UTF8\";\n    /**\n     * The output consists only of ASCII characters. Characters that need\n     * escaping within HTML, and characters that aren't ASCII characters will\n     * be escaped.\n     */\n    EncodingMode[EncodingMode[\"ASCII\"] = 1] = \"ASCII\";\n    /**\n     * Encode all characters that have an equivalent entity, as well as all\n     * characters that are not ASCII characters.\n     */\n    EncodingMode[EncodingMode[\"Extensive\"] = 2] = \"Extensive\";\n})(EncodingMode = exports.EncodingMode || (exports.EncodingMode = {}));\n/**\n * Decodes a string with entities.\n *\n * @param data String to decode.\n * @param options Decoding options.\n */\nfunction decode(data, options) {\n    if (options === void 0) { options = EntityLevel.XML; }\n    var opts = typeof options === \"number\" ? { level: options } : options;\n    if (opts.level === EntityLevel.HTML) {\n        if (opts.mode === DecodingMode.Strict) {\n            return decode_1.decodeHTMLStrict(data);\n        }\n        return decode_1.decodeHTML(data);\n    }\n    return decode_1.decodeXML(data);\n}\nexports.decode = decode;\n/**\n * Decodes a string with entities. Does not allow missing trailing semicolons for entities.\n *\n * @param data String to decode.\n * @param options Decoding options.\n * @deprecated Use `decode` with the `mode` set to `Strict`.\n */\nfunction decodeStrict(data, options) {\n    if (options === void 0) { options = EntityLevel.XML; }\n    var opts = typeof options === \"number\" ? { level: options } : options;\n    if (opts.level === EntityLevel.HTML) {\n        if (opts.mode === DecodingMode.Legacy) {\n            return decode_1.decodeHTML(data);\n        }\n        return decode_1.decodeHTMLStrict(data);\n    }\n    return decode_1.decodeXML(data);\n}\nexports.decodeStrict = decodeStrict;\n/**\n * Encodes a string with entities.\n *\n * @param data String to encode.\n * @param options Encoding options.\n */\nfunction encode(data, options) {\n    if (options === void 0) { options = EntityLevel.XML; }\n    var opts = typeof options === \"number\" ? { level: options } : options;\n    // Mode `UTF8` just escapes XML entities\n    if (opts.mode === EncodingMode.UTF8)\n        return encode_1.escapeUTF8(data);\n    if (opts.level === EntityLevel.HTML) {\n        if (opts.mode === EncodingMode.ASCII) {\n            return encode_1.encodeNonAsciiHTML(data);\n        }\n        return encode_1.encodeHTML(data);\n    }\n    // ASCII and Extensive are equivalent\n    return encode_1.encodeXML(data);\n}\nexports.encode = encode;\nvar encode_2 = require(\"./encode\");\nObject.defineProperty(exports, \"encodeXML\", { enumerable: true, get: function () { return encode_2.encodeXML; } });\nObject.defineProperty(exports, \"encodeHTML\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeNonAsciiHTML\", { enumerable: true, get: function () { return encode_2.encodeNonAsciiHTML; } });\nObject.defineProperty(exports, \"escape\", { enumerable: true, get: function () { return encode_2.escape; } });\nObject.defineProperty(exports, \"escapeUTF8\", { enumerable: true, get: function () { return encode_2.escapeUTF8; } });\n// Legacy aliases (deprecated)\nObject.defineProperty(exports, \"encodeHTML4\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeHTML5\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nvar decode_2 = require(\"./decode\");\nObject.defineProperty(exports, \"decodeXML\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\nObject.defineProperty(exports, \"decodeHTML\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTMLStrict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\n// Legacy aliases (deprecated)\nObject.defineProperty(exports, \"decodeHTML4\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML5\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML4Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeHTML5Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeXMLStrict\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\n","/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param  {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n  var str = '' + string;\n  var match = matchHtmlRegExp.exec(str);\n\n  if (!match) {\n    return str;\n  }\n\n  var escape;\n  var html = '';\n  var index = 0;\n  var lastIndex = 0;\n\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34: // \"\n        escape = '&quot;';\n        break;\n      case 38: // &\n        escape = '&amp;';\n        break;\n      case 39: // '\n        escape = '&#39;';\n        break;\n      case 60: // <\n        escape = '&lt;';\n        break;\n      case 62: // >\n        escape = '&gt;';\n        break;\n      default:\n        continue;\n    }\n\n    if (lastIndex !== index) {\n      html += str.substring(lastIndex, index);\n    }\n\n    lastIndex = index + 1;\n    html += escape;\n  }\n\n  return lastIndex !== index\n    ? html + str.substring(lastIndex, index)\n    : html;\n}\n","'use strict';\n\nmodule.exports = string => {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it’s always valid, and a \\unnnn escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n\t\t.replace(/-/g, '\\\\x2d');\n};\n","module.exports = function (glob, opts) {\n  if (typeof glob !== 'string') {\n    throw new TypeError('Expected a string');\n  }\n\n  var str = String(glob);\n\n  // The regexp we are building, as a string.\n  var reStr = \"\";\n\n  // Whether we are matching so called \"extended\" globs (like bash) and should\n  // support single character matching, matching ranges of characters, group\n  // matching, etc.\n  var extended = opts ? !!opts.extended : false;\n\n  // When globstar is _false_ (default), '/foo/*' is translated a regexp like\n  // '^\\/foo\\/.*$' which will match any string beginning with '/foo/'\n  // When globstar is _true_, '/foo/*' is translated to regexp like\n  // '^\\/foo\\/[^/]*$' which will match any string beginning with '/foo/' BUT\n  // which does not have a '/' to the right of it.\n  // E.g. with '/foo/*' these will match: '/foo/bar', '/foo/bar.txt' but\n  // these will not '/foo/bar/baz', '/foo/bar/baz.txt'\n  // Lastely, when globstar is _true_, '/foo/**' is equivelant to '/foo/*' when\n  // globstar is _false_\n  var globstar = opts ? !!opts.globstar : false;\n\n  // If we are doing extended matching, this boolean is true when we are inside\n  // a group (eg {*.html,*.js}), and false otherwise.\n  var inGroup = false;\n\n  // RegExp flags (eg \"i\" ) to pass in to RegExp constructor.\n  var flags = opts && typeof( opts.flags ) === \"string\" ? opts.flags : \"\";\n\n  var c;\n  for (var i = 0, len = str.length; i < len; i++) {\n    c = str[i];\n\n    switch (c) {\n    case \"/\":\n    case \"$\":\n    case \"^\":\n    case \"+\":\n    case \".\":\n    case \"(\":\n    case \")\":\n    case \"=\":\n    case \"!\":\n    case \"|\":\n      reStr += \"\\\\\" + c;\n      break;\n\n    case \"?\":\n      if (extended) {\n        reStr += \".\";\n\t    break;\n      }\n\n    case \"[\":\n    case \"]\":\n      if (extended) {\n        reStr += c;\n\t    break;\n      }\n\n    case \"{\":\n      if (extended) {\n        inGroup = true;\n\t    reStr += \"(\";\n\t    break;\n      }\n\n    case \"}\":\n      if (extended) {\n        inGroup = false;\n\t    reStr += \")\";\n\t    break;\n      }\n\n    case \",\":\n      if (inGroup) {\n        reStr += \"|\";\n\t    break;\n      }\n      reStr += \"\\\\\" + c;\n      break;\n\n    case \"*\":\n      // Move over all consecutive \"*\"'s.\n      // Also store the previous and next characters\n      var prevChar = str[i - 1];\n      var starCount = 1;\n      while(str[i + 1] === \"*\") {\n        starCount++;\n        i++;\n      }\n      var nextChar = str[i + 1];\n\n      if (!globstar) {\n        // globstar is disabled, so treat any number of \"*\" as one\n        reStr += \".*\";\n      } else {\n        // globstar is enabled, so determine if this is a globstar segment\n        var isGlobstar = starCount > 1                      // multiple \"*\"'s\n          && (prevChar === \"/\" || prevChar === undefined)   // from the start of the segment\n          && (nextChar === \"/\" || nextChar === undefined)   // to the end of the segment\n\n        if (isGlobstar) {\n          // it's a globstar, so match zero or more path segments\n          reStr += \"((?:[^/]*(?:\\/|$))*)\";\n          i++; // move over the \"/\"\n        } else {\n          // it's not a globstar, so only match one path segment\n          reStr += \"([^/]*)\";\n        }\n      }\n      break;\n\n    default:\n      reStr += c;\n    }\n  }\n\n  // When regexp 'g' flag is specified don't\n  // constrain the regular expression with ^ & $\n  if (!flags || !~flags.indexOf('g')) {\n    reStr = \"^\" + reStr + \"$\";\n  }\n\n  return new RegExp(reStr, flags);\n};\n","/** Types of elements found in htmlparser2's DOM */\nexport var ElementType;\n(function (ElementType) {\n    /** Type for the root element of a document */\n    ElementType[\"Root\"] = \"root\";\n    /** Type for Text */\n    ElementType[\"Text\"] = \"text\";\n    /** Type for <? ... ?> */\n    ElementType[\"Directive\"] = \"directive\";\n    /** Type for <!-- ... --> */\n    ElementType[\"Comment\"] = \"comment\";\n    /** Type for <script> tags */\n    ElementType[\"Script\"] = \"script\";\n    /** Type for <style> tags */\n    ElementType[\"Style\"] = \"style\";\n    /** Type for Any tag */\n    ElementType[\"Tag\"] = \"tag\";\n    /** Type for <![CDATA[ ... ]]> */\n    ElementType[\"CDATA\"] = \"cdata\";\n    /** Type for <!doctype ...> */\n    ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType || (ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n * @param element Element to test\n * @param element.type Node type discriminator to check.\n */\nexport function isTag(element) {\n    return (element.type === ElementType.Tag ||\n        element.type === ElementType.Script ||\n        element.type === ElementType.Style);\n}\n// Exports for backwards compatibility\n/** Type for the root element of a document */\n// eslint-disable-next-line prefer-destructuring\nexport const Root = ElementType.Root;\n/** Type for Text */\n// eslint-disable-next-line prefer-destructuring\nexport const Text = ElementType.Text;\n/** Type for <? ... ?> */\n// eslint-disable-next-line prefer-destructuring\nexport const Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\n// eslint-disable-next-line prefer-destructuring\nexport const Comment = ElementType.Comment;\n/** Type for <script> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Script = ElementType.Script;\n/** Type for <style> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Style = ElementType.Style;\n/** Type for Any tag */\n// eslint-disable-next-line prefer-destructuring\nexport const Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\n// eslint-disable-next-line prefer-destructuring\nexport const CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\n// eslint-disable-next-line prefer-destructuring\nexport const Doctype = ElementType.Doctype;\n","import { ElementType, isTag as isTagRaw } from \"domelementtype\";\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nexport class Node {\n    /** Parent of the node */\n    parent = null;\n    /** Previous sibling */\n    prev = null;\n    /** Next sibling */\n    next = null;\n    /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n    startIndex = null;\n    /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n    endIndex = null;\n    // Read-write aliases for properties\n    /**\n     * Same as {@link parent}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get parentNode() {\n        return this.parent;\n    }\n    set parentNode(parent) {\n        this.parent = parent;\n    }\n    /**\n     * Same as {@link prev}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get previousSibling() {\n        return this.prev;\n    }\n    set previousSibling(previous) {\n        this.prev = previous;\n    }\n    /**\n     * Same as {@link next}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get nextSibling() {\n        return this.next;\n    }\n    set nextSibling(next) {\n        this.next = next;\n    }\n    /**\n     * Clone this node, and optionally its children.\n     * @param recursive Clone child nodes as well.\n     * @returns A clone of the node.\n     */\n    cloneNode(recursive = false) {\n        return cloneNode(this, recursive);\n    }\n}\n/**\n * A node that contains some data.\n */\nexport class DataNode extends Node {\n    data;\n    /**\n     * @param data The content of the data node\n     */\n    constructor(data) {\n        super();\n        this.data = data;\n    }\n    /**\n     * Same as {@link data}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get nodeValue() {\n        return this.data;\n    }\n    set nodeValue(data) {\n        this.data = data;\n    }\n}\n/**\n * Text within the document.\n */\nexport class Text extends DataNode {\n    type = ElementType.Text;\n    get nodeType() {\n        return 3;\n    }\n}\n/**\n * Comments within the document.\n */\nexport class Comment extends DataNode {\n    type = ElementType.Comment;\n    get nodeType() {\n        return 8;\n    }\n}\n/**\n * Processing instructions, including doc types.\n */\nexport class ProcessingInstruction extends DataNode {\n    type = ElementType.Directive;\n    name;\n    constructor(name, data) {\n        super(data);\n        this.name = name;\n    }\n    get nodeType() {\n        return 1;\n    }\n    /** If this is a doctype, the document type name (parse5 only). */\n    \"x-name\";\n    /** If this is a doctype, the document type public identifier (parse5 only). */\n    \"x-publicId\";\n    /** If this is a doctype, the document type system identifier (parse5 only). */\n    \"x-systemId\";\n}\n/**\n * A node that can have children.\n */\nexport class NodeWithChildren extends Node {\n    children;\n    /**\n     * @param children Children of the node. Only certain node types can have children.\n     */\n    constructor(children) {\n        super();\n        this.children = children;\n    }\n    // Aliases\n    /** First child of the node. */\n    get firstChild() {\n        return this.children[0] ?? null;\n    }\n    /** Last child of the node. */\n    get lastChild() {\n        return this.children.length > 0\n            ? this.children[this.children.length - 1]\n            : null;\n    }\n    /**\n     * Same as {@link children}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get childNodes() {\n        return this.children;\n    }\n    set childNodes(children) {\n        this.children = children;\n    }\n}\n/**\n * CDATA nodes.\n */\nexport class CDATA extends NodeWithChildren {\n    type = ElementType.CDATA;\n    get nodeType() {\n        return 4;\n    }\n}\n/**\n * The root node of the document.\n */\nexport class Document extends NodeWithChildren {\n    type = ElementType.Root;\n    get nodeType() {\n        return 9;\n    }\n}\n/**\n * An element within the DOM.\n */\nexport class Element extends NodeWithChildren {\n    name;\n    attribs;\n    type;\n    /**\n     * @param name Name of the tag, eg. `div`, `span`.\n     * @param attribs Object mapping attribute names to attribute values.\n     * @param children Children of the node.\n     * @param type Node type used for the new node instance.\n     */\n    constructor(name, attribs, children = [], type = name === \"script\"\n        ? ElementType.Script\n        : name === \"style\"\n            ? ElementType.Style\n            : ElementType.Tag) {\n        super(children);\n        this.name = name;\n        this.attribs = attribs;\n        this.type = type;\n    }\n    get nodeType() {\n        return 1;\n    }\n    // DOM Level 1 aliases\n    /**\n     * Same as {@link name}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get tagName() {\n        return this.name;\n    }\n    set tagName(name) {\n        this.name = name;\n    }\n    get attributes() {\n        return Object.keys(this.attribs).map((name) => ({\n            name,\n            value: this.attribs[name],\n            namespace: this[\"x-attribsNamespace\"]?.[name],\n            prefix: this[\"x-attribsPrefix\"]?.[name],\n        }));\n    }\n    /** Element namespace (parse5 only). */\n    namespace;\n    /** Element attribute namespaces (parse5 only). */\n    \"x-attribsNamespace\";\n    /** Element attribute namespace-related prefixes (parse5 only). */\n    \"x-attribsPrefix\";\n}\n/**\n * Checks if `node` is an element node.\n * @param node Node to check.\n * @returns `true` if the node is an element node.\n */\nexport function isTag(node) {\n    return isTagRaw(node);\n}\n/**\n * Checks if `node` is a CDATA node.\n * @param node Node to check.\n * @returns `true` if the node is a CDATA node.\n */\nexport function isCDATA(node) {\n    return node.type === ElementType.CDATA;\n}\n/**\n * Checks if `node` is a text node.\n * @param node Node to check.\n * @returns `true` if the node is a text node.\n */\nexport function isText(node) {\n    return node.type === ElementType.Text;\n}\n/**\n * Checks if `node` is a comment node.\n * @param node Node to check.\n * @returns `true` if the node is a comment node.\n */\nexport function isComment(node) {\n    return node.type === ElementType.Comment;\n}\n/**\n * Checks if `node` is a directive node.\n * @param node Node to check.\n * @returns `true` if the node is a directive node.\n */\nexport function isDirective(node) {\n    return node.type === ElementType.Directive;\n}\n/**\n * Checks if `node` is a document node.\n * @param node Node to check.\n * @returns `true` if the node is a document node.\n */\nexport function isDocument(node) {\n    return node.type === ElementType.Root;\n}\n/**\n * Checks if `node` has children.\n * @param node Node to check.\n * @returns `true` if the node has children.\n */\nexport function hasChildren(node) {\n    return Object.hasOwn(node, \"children\");\n}\n/**\n * Clone a node, and optionally its children.\n * @param node Node to clone.\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nexport function cloneNode(node, recursive = false) {\n    let result;\n    if (isText(node)) {\n        result = new Text(node.data);\n    }\n    else if (isComment(node)) {\n        result = new Comment(node.data);\n    }\n    else if (isTag(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new Element(node.name, { ...node.attribs }, children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        if (node.namespace != null) {\n            clone.namespace = node.namespace;\n        }\n        if (node[\"x-attribsNamespace\"]) {\n            clone[\"x-attribsNamespace\"] = { ...node[\"x-attribsNamespace\"] };\n        }\n        if (node[\"x-attribsPrefix\"]) {\n            clone[\"x-attribsPrefix\"] = { ...node[\"x-attribsPrefix\"] };\n        }\n        result = clone;\n    }\n    else if (isCDATA(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new CDATA(children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        result = clone;\n    }\n    else if (isDocument(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new Document(children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        if (node[\"x-mode\"]) {\n            clone[\"x-mode\"] = node[\"x-mode\"];\n        }\n        result = clone;\n    }\n    else if (isDirective(node)) {\n        const instruction = new ProcessingInstruction(node.name, node.data);\n        if (node[\"x-name\"] != null) {\n            instruction[\"x-name\"] = node[\"x-name\"];\n            instruction[\"x-publicId\"] = node[\"x-publicId\"];\n            instruction[\"x-systemId\"] = node[\"x-systemId\"];\n        }\n        result = instruction;\n    }\n    else {\n        throw new Error(`Not implemented yet: ${node.type}`);\n    }\n    result.startIndex = node.startIndex;\n    result.endIndex = node.endIndex;\n    if (node.sourceCodeLocation != null) {\n        result.sourceCodeLocation = node.sourceCodeLocation;\n    }\n    return result;\n}\n/**\n * Clone a list of child nodes.\n * @param childs The child nodes to clone.\n * @returns A list of cloned child nodes.\n */\nfunction cloneChildren(childs) {\n    const children = childs.map((child) => cloneNode(child, true));\n    for (let index = 1; index < children.length; index++) {\n        children[index].prev = children[index - 1];\n        children[index - 1].next = children[index];\n    }\n    return children;\n}\n",null,null,null,null,"import {\n  BOOLEAN,\n  getPropertyInfo,\n  isCustomAttribute,\n  OVERLOADED_BOOLEAN,\n  possibleStandardNames,\n} from 'react-property';\n\nimport { PRESERVE_CUSTOM_ATTRIBUTES, setStyleProp } from './utilities';\n\n// https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components\n// https://developer.mozilla.org/docs/Web/HTML/Attributes\nconst UNCONTROLLED_COMPONENT_ATTRIBUTES = ['checked', 'value'] as const;\nconst UNCONTROLLED_COMPONENT_NAMES = ['input', 'select', 'textarea'] as const;\n\ntype UncontrolledComponentAttributes =\n  (typeof UNCONTROLLED_COMPONENT_ATTRIBUTES)[number];\n\ntype UncontrolledComponentNames = (typeof UNCONTROLLED_COMPONENT_NAMES)[number];\n\nconst valueOnlyInputs = {\n  reset: true,\n  submit: true,\n} as const;\n\nexport type ValueOnlyInputsKeys = keyof typeof valueOnlyInputs;\n\nexport type Attributes = Record<PropertyKey, string>;\n\nexport type Props = Record<PropertyKey, string | boolean> & {\n  dangerouslySetInnerHTML?: {\n    __html: string;\n  };\n  key?: string | number;\n  style?: Record<PropertyKey, string>;\n};\n\n/**\n * Converts HTML/SVG DOM attributes to React props.\n *\n * @param attributes - HTML/SVG DOM attributes.\n * @param nodeName - DOM node name.\n * @returns - React props.\n */\nexport default function attributesToProps(\n  attributes: Attributes = {},\n  nodeName?: string,\n): Props {\n  const props: Props = {};\n\n  const isInputValueOnly = Boolean(\n    attributes.type && valueOnlyInputs[attributes.type as ValueOnlyInputsKeys],\n  );\n\n  for (const attributeName in attributes) {\n    const attributeValue = attributes[attributeName];\n\n    // ARIA (aria-*) or custom data (data-*) attribute\n    if (isCustomAttribute(attributeName)) {\n      props[attributeName] = attributeValue;\n      continue;\n    }\n\n    // convert HTML/SVG attribute to React prop\n    const attributeNameLowerCased = attributeName.toLowerCase();\n    let propName = getPropName(attributeNameLowerCased);\n\n    if (propName) {\n      const propertyInfo = getPropertyInfo(propName) as\n        | { type: number }\n        | undefined;\n\n      // convert attribute to uncontrolled component prop (e.g., `value` to `defaultValue`)\n      if (\n        UNCONTROLLED_COMPONENT_ATTRIBUTES.includes(\n          propName as UncontrolledComponentAttributes,\n        ) &&\n        UNCONTROLLED_COMPONENT_NAMES.includes(\n          nodeName as UncontrolledComponentNames,\n        ) &&\n        !isInputValueOnly\n      ) {\n        propName = getPropName('default' + attributeNameLowerCased);\n      }\n\n      props[propName] = attributeValue;\n\n      switch (propertyInfo?.type) {\n        case BOOLEAN:\n          props[propName] = true;\n          break;\n        case OVERLOADED_BOOLEAN:\n          if (attributeValue === '') {\n            props[propName] = true;\n          }\n          break;\n      }\n      continue;\n    }\n\n    // preserve custom attribute if React >=16\n    if (PRESERVE_CUSTOM_ATTRIBUTES) {\n      props[attributeName] = attributeValue;\n    }\n  }\n\n  // transform inline style to object\n  setStyleProp(attributes.style, props);\n\n  return props;\n}\n\n/**\n * Gets prop name from lowercased attribute name.\n *\n * @param attributeName - Lowercased attribute name.\n * @returns - Prop name.\n */\nfunction getPropName(attributeName: string): string {\n  return possibleStandardNames[attributeName];\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */\n\nimport type { DOMNode, Element, Text } from 'html-dom-parser';\nimport type { JSX } from 'react';\nimport { cloneElement, createElement, isValidElement } from 'react';\n\nimport type { Props } from './attributes-to-props';\nimport attributesToProps from './attributes-to-props';\nimport type { HTMLReactParserOptions } from './types';\nimport {\n  canTextBeChildOfNode,\n  isCustomComponent,\n  PRESERVE_CUSTOM_ATTRIBUTES,\n  returnFirstArg,\n  setStyleProp,\n} from './utilities';\n\nconst React = {\n  cloneElement,\n  createElement,\n  isValidElement,\n} as const;\n\n/**\n * Converts DOM nodes to JSX element(s).\n *\n * @param nodes - DOM nodes.\n * @param options - Options.\n * @returns - String or JSX element(s).\n */\nexport default function domToReact(\n  nodes: DOMNode[],\n  options: HTMLReactParserOptions = {},\n): string | JSX.Element | JSX.Element[] {\n  const reactElements: JSX.Element[] = [];\n\n  const hasReplace = typeof options.replace === 'function';\n  const transform = options.transform ?? returnFirstArg;\n  const { cloneElement, createElement, isValidElement } =\n    options.library ?? React;\n\n  const nodesLength = nodes.length;\n\n  for (let index = 0; index < nodesLength; index++) {\n    const node = nodes[index];\n\n    // replace with custom React element (if present)\n    if (hasReplace) {\n      let replaceElement = options.replace?.(node, index) as JSX.Element;\n\n      if (isValidElement(replaceElement)) {\n        // set \"key\" prop for sibling elements\n        // https://react.dev/learn/rendering-lists#rules-of-keys\n        if (nodesLength > 1) {\n          replaceElement = cloneElement(replaceElement, {\n            key: replaceElement.key ?? index,\n          });\n        }\n\n        reactElements.push(\n          transform(replaceElement, node, index) as JSX.Element,\n        );\n\n        continue;\n      }\n    }\n\n    if (node.type === 'text') {\n      const isWhitespace = !node.data.trim().length;\n\n      // We have a whitespace node that can't be nested in its parent\n      // so skip it\n      if (\n        isWhitespace &&\n        node.parent &&\n        !canTextBeChildOfNode(node.parent as Element)\n      ) {\n        continue;\n      }\n\n      // Trim is enabled and we have a whitespace node\n      // so skip it\n      if (options.trim && isWhitespace) {\n        continue;\n      }\n\n      // We have a text node that's not whitespace and it can be nested\n      // in its parent so add it to the results\n      reactElements.push(transform(node.data, node, index) as JSX.Element);\n      continue;\n    }\n\n    const element = node as Element;\n    let props: Props = {};\n\n    if (skipAttributesToProps(element)) {\n      setStyleProp(element.attribs.style, element.attribs);\n      props = element.attribs;\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n    } else if (element.attribs) {\n      props = attributesToProps(element.attribs, element.name);\n    }\n\n    let children: ReturnType<typeof domToReact> | undefined;\n\n    switch (node.type) {\n      case 'script':\n      case 'style':\n        // prevent text in <script> or <style> from being escaped\n        // https://react.dev/reference/react-dom/components/common#dangerously-setting-the-inner-html\n        if (node.children[0]) {\n          props.dangerouslySetInnerHTML = {\n            __html: (node.children[0] as Text).data,\n          };\n        }\n        break;\n\n      case 'tag':\n        // setting textarea value in children is an antipattern in React\n        // https://react.dev/reference/react-dom/components/textarea#caveats\n        if (node.name === 'textarea' && node.children[0]) {\n          props.defaultValue = (node.children[0] as Text).data;\n          // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n        } else if (node.children?.length) {\n          // continue recursion of creating React elements (if applicable)\n          children = domToReact(node.children as Text[], options);\n        }\n        break;\n\n      // skip all other cases (e.g., comment)\n      default:\n        continue;\n    }\n\n    // set \"key\" prop for sibling elements\n    // https://react.dev/learn/rendering-lists#rules-of-keys\n    if (nodesLength > 1) {\n      props.key = index;\n    }\n\n    reactElements.push(\n      transform(\n        createElement(node.name, props, children),\n        node,\n        index,\n      ) as JSX.Element,\n    );\n  }\n\n  return reactElements.length === 1 ? reactElements[0] : reactElements;\n}\n\n/**\n * Determines whether DOM element attributes should be transformed to props.\n * Web Components should not have their attributes transformed except for `style`.\n *\n * @param node - Element node.\n * @returns - Whether the node attributes should be converted to props.\n */\nfunction skipAttributesToProps(node: Element): boolean {\n  return (\n    PRESERVE_CUSTOM_ATTRIBUTES &&\n    node.type === 'tag' &&\n    isCustomComponent(node.name, node.attribs)\n  );\n}\n","import htmlToDOM from 'html-dom-parser';\n\nimport attributesToProps from './attributes-to-props';\nimport domToReact from './dom-to-react';\nimport type { HTMLReactParserOptions } from './types';\n\nexport { Comment, Element, ProcessingInstruction, Text } from 'domhandler';\nexport type { DOMNode } from 'html-dom-parser';\n\nexport type { HTMLReactParserOptions };\nexport { attributesToProps, domToReact, htmlToDOM };\n\nconst domParserOptions = { lowerCaseAttributeNames: false } as const;\n\n/**\n * Converts HTML string to React elements.\n *\n * @param html - HTML string.\n * @param options - Parser options.\n * @returns - React element(s), empty array, or string.\n */\nexport default function HTMLReactParser(\n  html: string,\n  options?: HTMLReactParserOptions,\n): ReturnType<typeof domToReact> {\n  if (typeof html !== 'string') {\n    throw new TypeError('First argument must be a string');\n  }\n\n  if (!html) {\n    return [];\n  }\n\n  return domToReact(\n    htmlToDOM(html, options?.htmlparser2 ?? domParserOptions),\n    options,\n  );\n}\n","import type { Element } from 'html-dom-parser';\nimport { version } from 'react';\nimport StyleToJS from 'style-to-js';\n\nimport type { Props } from './attributes-to-props';\n\nconst RESERVED_SVG_MATHML_ELEMENTS = new Set([\n  'annotation-xml',\n  'color-profile',\n  'font-face',\n  'font-face-src',\n  'font-face-uri',\n  'font-face-format',\n  'font-face-name',\n  'missing-glyph',\n] as const);\n\ntype ReservedSvgMathmlElements =\n  typeof RESERVED_SVG_MATHML_ELEMENTS extends Set<infer T> ? T : never;\n\n/**\n * Check if a tag is a custom component.\n *\n * @see {@link https://github.com/facebook/react/blob/v16.6.3/packages/react-dom/src/shared/isCustomComponent.js}\n *\n * @param tagName - Tag name.\n * @param props - Props passed to the element.\n * @returns - Whether the tag is custom component.\n */\nexport function isCustomComponent(\n  tagName: string,\n  props?: Record<PropertyKey, string>,\n): boolean {\n  if (!tagName.includes('-')) {\n    return Boolean(props && typeof props.is === 'string');\n  }\n\n  // These are reserved SVG and MathML elements.\n  // We don't mind this whitelist too much because we expect it to never grow.\n  // The alternative is to track the namespace in a few places which is convoluted.\n  // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts\n  if (RESERVED_SVG_MATHML_ELEMENTS.has(tagName as ReservedSvgMathmlElements)) {\n    return false;\n  }\n\n  return true;\n}\n\nconst styleOptions = {\n  reactCompat: true,\n} as const;\n\n/**\n * Sets style prop.\n *\n * @param style - Inline style.\n * @param props - Props object.\n */\nexport function setStyleProp(style: string, props: Props): void {\n  if (typeof style !== 'string') {\n    return;\n  }\n\n  if (!style.trim()) {\n    props.style = {};\n    return;\n  }\n\n  try {\n    props.style = StyleToJS(style, styleOptions);\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  } catch (error) {\n    props.style = {};\n  }\n}\n\n/**\n * @see https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html\n */\nexport const PRESERVE_CUSTOM_ATTRIBUTES = Number(version.split('.')[0]) >= 16;\n\n/**\n * @see https://github.com/facebook/react/blob/cae635054e17a6f107a39d328649137b83f25972/packages/react-dom/src/client/validateDOMNesting.js#L213\n */\nexport const ELEMENTS_WITH_NO_TEXT_CHILDREN = new Set([\n  'tr',\n  'tbody',\n  'thead',\n  'tfoot',\n  'colgroup',\n  'table',\n  'head',\n  'html',\n  'frameset',\n] as const);\n\ntype ElementsWithNoTextChildren =\n  typeof ELEMENTS_WITH_NO_TEXT_CHILDREN extends Set<infer T> ? T : never;\n\n/**\n * Checks if the given node can contain text nodes\n *\n * @param node - Element node.\n * @returns - Whether the node can contain text nodes.\n */\nexport const canTextBeChildOfNode = (node: Element) =>\n  !ELEMENTS_WITH_NO_TEXT_CHILDREN.has(node.name as ElementsWithNoTextChildren);\n\n/**\n * Returns the first argument as is.\n *\n * @param arg - The argument to be returned.\n * @returns - The input argument `arg`.\n */\nexport const returnFirstArg = <T>(arg: T): T => arg;\n","// http://www.w3.org/TR/CSS21/grammar.html\n// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027\nvar COMMENT_REGEX = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\n\nvar NEWLINE_REGEX = /\\n/g;\nvar WHITESPACE_REGEX = /^\\s*/;\n\n// declaration\nvar PROPERTY_REGEX = /^(\\*?[-#/*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/;\nvar COLON_REGEX = /^:\\s*/;\nvar VALUE_REGEX = /^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};])+)/;\nvar SEMICOLON_REGEX = /^[;\\s]*/;\n\n// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill\nvar TRIM_REGEX = /^\\s+|\\s+$/g;\n\n// strings\nvar NEWLINE = '\\n';\nvar FORWARD_SLASH = '/';\nvar ASTERISK = '*';\nvar EMPTY_STRING = '';\n\n// types\nvar TYPE_COMMENT = 'comment';\nvar TYPE_DECLARATION = 'declaration';\n\n/**\n * @param {String} style\n * @param {Object} [options]\n * @return {Object[]}\n * @throws {TypeError}\n * @throws {Error}\n */\nexport default function (style, options) {\n  if (typeof style !== 'string') {\n    throw new TypeError('First argument must be a string');\n  }\n\n  if (!style) return [];\n\n  options = options || {};\n\n  /**\n   * Positional.\n   */\n  var lineno = 1;\n  var column = 1;\n\n  /**\n   * Update lineno and column based on `str`.\n   *\n   * @param {String} str\n   */\n  function updatePosition(str) {\n    var lines = str.match(NEWLINE_REGEX);\n    if (lines) lineno += lines.length;\n    var i = str.lastIndexOf(NEWLINE);\n    column = ~i ? str.length - i : column + str.length;\n  }\n\n  /**\n   * Mark position and patch `node.position`.\n   *\n   * @return {Function}\n   */\n  function position() {\n    var start = { line: lineno, column: column };\n    return function (node) {\n      node.position = new Position(start);\n      whitespace();\n      return node;\n    };\n  }\n\n  /**\n   * Store position information for a node.\n   *\n   * @constructor\n   * @property {Object} start\n   * @property {Object} end\n   * @property {undefined|String} source\n   */\n  function Position(start) {\n    this.start = start;\n    this.end = { line: lineno, column: column };\n    this.source = options.source;\n  }\n\n  /**\n   * Non-enumerable source string.\n   */\n  Position.prototype.content = style;\n\n  var errorsList = [];\n\n  /**\n   * Error `msg`.\n   *\n   * @param {String} msg\n   * @throws {Error}\n   */\n  function error(msg) {\n    var err = new Error(\n      options.source + ':' + lineno + ':' + column + ': ' + msg\n    );\n    err.reason = msg;\n    err.filename = options.source;\n    err.line = lineno;\n    err.column = column;\n    err.source = style;\n\n    if (options.silent) {\n      errorsList.push(err);\n    } else {\n      throw err;\n    }\n  }\n\n  /**\n   * Match `re` and return captures.\n   *\n   * @param {RegExp} re\n   * @return {undefined|Array}\n   */\n  function match(re) {\n    var m = re.exec(style);\n    if (!m) return;\n    var str = m[0];\n    updatePosition(str);\n    style = style.slice(str.length);\n    return m;\n  }\n\n  /**\n   * Parse whitespace.\n   */\n  function whitespace() {\n    match(WHITESPACE_REGEX);\n  }\n\n  /**\n   * Parse comments.\n   *\n   * @param {Object[]} [rules]\n   * @return {Object[]}\n   */\n  function comments(rules) {\n    var c;\n    rules = rules || [];\n    while ((c = comment())) {\n      if (c !== false) {\n        rules.push(c);\n      }\n    }\n    return rules;\n  }\n\n  /**\n   * Parse comment.\n   *\n   * @return {Object}\n   * @throws {Error}\n   */\n  function comment() {\n    var pos = position();\n    if (FORWARD_SLASH != style.charAt(0) || ASTERISK != style.charAt(1)) return;\n\n    var i = 2;\n    while (\n      EMPTY_STRING != style.charAt(i) &&\n      (ASTERISK != style.charAt(i) || FORWARD_SLASH != style.charAt(i + 1))\n    ) {\n      ++i;\n    }\n    i += 2;\n\n    if (EMPTY_STRING === style.charAt(i - 1)) {\n      return error('End of comment missing');\n    }\n\n    var str = style.slice(2, i - 2);\n    column += 2;\n    updatePosition(str);\n    style = style.slice(i);\n    column += 2;\n\n    return pos({\n      type: TYPE_COMMENT,\n      comment: str\n    });\n  }\n\n  /**\n   * Parse declaration.\n   *\n   * @return {Object}\n   * @throws {Error}\n   */\n  function declaration() {\n    var pos = position();\n\n    // prop\n    var prop = match(PROPERTY_REGEX);\n    if (!prop) return;\n    comment();\n\n    // :\n    if (!match(COLON_REGEX)) return error(\"property missing ':'\");\n\n    // val\n    var val = match(VALUE_REGEX);\n\n    var ret = pos({\n      type: TYPE_DECLARATION,\n      property: trim(prop[0].replace(COMMENT_REGEX, EMPTY_STRING)),\n      value: val\n        ? trim(val[0].replace(COMMENT_REGEX, EMPTY_STRING))\n        : EMPTY_STRING\n    });\n\n    // ;\n    match(SEMICOLON_REGEX);\n\n    return ret;\n  }\n\n  /**\n   * Parse declarations.\n   *\n   * @return {Object[]}\n   */\n  function declarations() {\n    var decls = [];\n\n    comments(decls);\n\n    // declarations\n    var decl;\n    while ((decl = declaration())) {\n      if (decl !== false) {\n        decls.push(decl);\n        comments(decls);\n      }\n    }\n\n    return decls;\n  }\n\n  whitespace();\n  return declarations();\n}\n\n/**\n * Trim `str`.\n *\n * @param {String} str\n * @return {String}\n */\nfunction trim(str) {\n  return str ? str.replace(TRIM_REGEX, EMPTY_STRING) : EMPTY_STRING;\n}\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/*!\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o) {\n  return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isPlainObject(o) {\n  var ctor,prot;\n\n  if (isObject(o) === false) return false;\n\n  // If has modified constructor\n  ctor = o.constructor;\n  if (ctor === undefined) return true;\n\n  // If has modified prototype\n  prot = ctor.prototype;\n  if (isObject(prot) === false) return false;\n\n  // If constructor does not have an Object-specific method\n  if (prot.hasOwnProperty('isPrototypeOf') === false) {\n    return false;\n  }\n\n  // Most likely a plain Object\n  return true;\n}\n\nexports.isPlainObject = isPlainObject;\n","const dayjs = require('dayjs');\n\n// Strip characters browsers ignore inside URLs (control chars and\n// embedded HTML comments) that are commonly used to sneak XSS\n// payloads past simple scheme checks.\nfunction cleanHref(href) {\n  // Browsers ignore character codes of 32 (space) and below in a surprising\n  // number of situations. Start reading here:\n  // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#Embedded_tab\n  // eslint-disable-next-line no-control-regex\n  href = href.replace(/[\\x00-\\x20]+/g, '');\n  // Clobber any comments in URLs, which the browser might\n  // interpret inside an XML data island, allowing\n  // a javascript: URL to be snuck through\n  while (true) {\n    const firstIndex = href.indexOf('<!--');\n    if (firstIndex === -1) {\n      break;\n    }\n    const lastIndex = href.indexOf('-->', firstIndex + 4);\n    if (lastIndex === -1) {\n      break;\n    }\n    href = href.substring(0, firstIndex) + href.substring(lastIndex + 3);\n  }\n  return href;\n}\n\n// Returns true if `href` should be rejected as unsafe. Used to block\n// `javascript:`, `data:` and other dangerous schemes both when\n// validating URL fields and when sanitizing HTML attribute values.\n//\n// `options.allowedSchemes` is an array of permitted URL schemes\n// (defaults to the schemes long permitted by `launder().url`).\n// `options.allowProtocolRelative` controls whether protocol-relative\n// URLs (e.g. `//example.com`) are permitted. Defaults to true.\nfunction naughtyHref(href, options) {\n  options = options || {};\n  const allowedSchemes = options.allowedSchemes ||\n    [ 'http', 'https', 'ftp', 'mailto', 'tel', 'sms' ];\n  const allowProtocolRelative = (options.allowProtocolRelative !== false);\n  if (typeof href !== 'string') {\n    return false;\n  }\n  href = cleanHref(href);\n  // Case insensitive so we don't get faked out by JAVASCRIPT #1\n  // Allow more characters after the first so we don't get faked\n  // out by certain schemes browsers accept\n  const matches = href.match(/^([a-zA-Z][a-zA-Z0-9.\\-+]*):/);\n  if (!matches) {\n    // Protocol-relative URL starting with any combination of '/' and '\\'\n    if (href.match(/^[/\\\\]{2}/)) {\n      return !allowProtocolRelative;\n    }\n    // No scheme\n    return false;\n  }\n  const scheme = matches[1].toLowerCase();\n  return allowedSchemes.indexOf(scheme) === -1;\n}\n\nmodule.exports = function(options) {\n  const self = {};\n  self.options = options || {};\n\n  self.filterTag = self.options.filterTag || function(tag) {\n    tag = tag.trim();\n    return tag.toLowerCase();\n  };\n\n  self.string = function(s, def) {\n    if (typeof (s) !== 'string') {\n      if ((typeof (s) === 'number') || (typeof (s) === 'boolean')) {\n        s += '';\n      } else {\n        s = '';\n      }\n    }\n    s = s.trim();\n    if (def !== undefined) {\n      if (s === '') {\n        s = def;\n      }\n    }\n    return s;\n  };\n\n  self.strings = function(strings) {\n    if (!Array.isArray(strings)) {\n      return [];\n    }\n    return strings.map(function(s) {\n      return self.string(s);\n    });\n  };\n\n  self.integer = function(i, def, min, max) {\n    if (def === undefined) {\n      def = 0;\n    }\n    if (typeof (i) === 'number') {\n      i = Math.floor(i);\n    } else {\n      try {\n        i = parseInt(i, 10);\n        if (isNaN(i)) {\n          i = def;\n        }\n      } catch (e) {\n        i = def;\n      }\n    }\n    if ((typeof (min) === 'number') && (i < min)) {\n      i = min;\n    }\n    if ((typeof (max) === 'number') && (i > max)) {\n      i = max;\n    }\n    return i;\n  };\n\n  self.padInteger = function(i, places) {\n    let s = i + '';\n    while (s.length < places) {\n      s = '0' + s;\n    }\n    return s;\n  };\n\n  self.float = function(i, def, min, max) {\n    if (def === undefined) {\n      def = 0;\n    }\n    if (!(typeof (i) === 'number')) {\n      try {\n        i = parseFloat(i, 10);\n        if (isNaN(i)) {\n          i = def;\n        }\n      } catch (e) {\n        i = def;\n      }\n    }\n    if ((typeof (min) === 'number') && (i < min)) {\n      i = min;\n    }\n    if ((typeof (max) === 'number') && (i > max)) {\n      i = max;\n    }\n    return i;\n  };\n\n  self.naughtyHref = naughtyHref;\n\n  self.url = function(s, def, httpsFix) {\n    s = self.string(s, def);\n    // Allow the default to be undefined, null, false, etc.\n    if (s === def) {\n      return s;\n    }\n    // Strip characters browsers ignore that are commonly used to\n    // smuggle dangerous schemes past validation.\n    s = cleanHref(s);\n    // Reject naughty URLs (e.g. `javascript:`, `data:`) before fixUrl\n    // runs. Otherwise fixUrl could mask such schemes by prepending\n    // `https://` to anything containing a `.`, turning\n    // `javascript:alert(document.domain)` into a syntactically odd\n    // but accepted `https://...` URL.\n    if (naughtyHref(s)) {\n      return def;\n    }\n    s = fixUrl(s);\n    if (s === null) {\n      return def;\n    }\n    return s;\n\n    function fixUrl(href) {\n      if (href.match(/^(((https?|ftp):\\/\\/)|((mailto|tel|sms):)|#|([^/.]+)?\\/|[^/.]+$)/)) {\n        // All good - no change required\n        return href;\n      } else if (href.match(/^[^/.]+\\.[^/.]+/)) {\n        // Smells like a domain name. Educated guess: they left off http://\n        const protocol = httpsFix ? 'https://' : 'http://';\n        return protocol + href;\n      } else {\n        return null;\n      }\n    };\n  };\n\n  self.select = function(s, choices, def) {\n    s = self.string(s);\n    if (!choices || !choices.length) {\n      return def;\n    }\n    let choice;\n    if (typeof (choices[0]) === 'object') {\n      choice = choices.find(function(choice) {\n        if ((choice.value === null) || (choice.value === undefined)) {\n          // Don't crash on invalid choices\n          return false;\n        }\n        return choice.value.toString() === s;\n      });\n      if (choice != null) {\n        return choice.value;\n      }\n      return def;\n    }\n    choice = choices.find(function(choice) {\n      if ((choice === null) || (choice === undefined)) {\n        // Don't crash on invalid choices\n        return false;\n      }\n      return choice.toString() === s;\n    });\n    if (choice !== undefined) {\n      return choice;\n    }\n    return def;\n  };\n\n  self.boolean = function(b, def) {\n    if (b === true) {\n      return true;\n    }\n    if (b === false) {\n      return false;\n    }\n    b = self.string(b, def);\n    if (b === def) {\n      if (b === undefined) {\n        return false;\n      }\n      return b;\n    }\n    b = b.toLowerCase().charAt(0);\n    if ((b === '') || (b === 'n') || (b === '0') || (b === 'f')) {\n      return false;\n    }\n    if ((b === 't') || (b === 'y') || (b === '1')) {\n      return true;\n    }\n    return false;\n  };\n\n  // Given an `options` object in which options[name] is a string\n  // set to '0', '1', or 'any', this method adds mongodb criteria\n  // to the `criteria` object.\n  //\n  // '0' or false means \"the property must be false or absent,\" '1' or true\n  // means \"the property must be true,\" and 'any' or null means \"we don't care\n  // what the property is.\"\n  //\n  // See `booleanOrNull` for additional synonyms accepted for the\n  // three possible values.\n  //\n  // An empty string is considered equivalent to '0'.\n  //\n  // This is not the same as apos.sanitizeBoolean which is concerned only with\n  // true or false and does not address \"any.\"\n  //\n  // `def` defaults to `any`.\n  //\n  // This method is most often used with REST API parameters and forms.\n\n  self.addBooleanFilterToCriteria = function(options, name, criteria, def) {\n    // if any or null, we aren't changing criteria\n    if (def === undefined) {\n      def = null;\n    }\n\n    // allow object or boolean\n    let value = (typeof (options) === 'object' && options !== null) ? options[name] : options;\n    value = (value === undefined) ? def : value;\n    value = self.booleanOrNull(value);\n\n    if (value === null) {\n      // Don't care, show all\n    } else if (!value) {\n      // Must be absent or false. Hooray for $ne\n      criteria[name] = { $ne: true };\n    } else {\n      // Must be true\n      criteria[name] = true;\n    }\n  };\n\n  // This method is used for tristate filters, i.e. \"published,\"\n  // \"unpublished\", and \"show me both\".\n  //\n  // Accepts `true`, `false`, or `null` and returns them exactly\n  // as such; if the parameter is none of those or their synonyms\n  // below, returns `def`.\n  //\n  // Also accepts the strings `'yes'` (or starting with y), `'no'` (or\n  // starting with n), `'true'` (or starting with t), `'false'`\n  // (or starting with f), `'1'`, `'0'` and the strings `'any'` and\n  // `'null'`. The string `'null'` must be an exact match, anything\n  // else starting with `n` is taken as `no` (false).\n  //\n  // These various synonyms are useful for string input, such as from\n  // a user friendly query string.\n\n  self.booleanOrNull = function(b, def) {\n    if (b === true) {\n      return b;\n    }\n    if (b === false) {\n      return b;\n    }\n    if (b === null) {\n      return b;\n    }\n\n    b = self.string(b, def);\n    if (b === def) {\n      if (def === undefined) {\n        return null;\n      }\n      return b;\n    }\n\n    // String 'null' must match as a full string to disambiguate from string 'n' for 'no'\n    if (b === 'null') {\n      return null;\n    }\n\n    b = b.toLowerCase().charAt(0);\n\n    if ((b === '') || (b === 'n') || (b === '0') || (b === 'f')) {\n      return false;\n    }\n\n    if ((b === 't') || (b === 'y') || (b === '1')) {\n      return true;\n    }\n\n    if ((b === 'a')) {\n      return null;\n    }\n\n    return def;\n  };\n\n  // Accept a user-entered string in YYYY-MM-DD, MM/DD, MM/DD/YY, or MM/DD/YYYY format\n  // (tolerates missing leading zeroes on MM and DD). Also accepts a Date object.\n  // Returns YYYY-MM-DD.\n  //\n  // The current year is assumed when MM/DD is used. If there is no explicit default\n  // any unparseable date is returned as today's date.\n  //\n  // If the default is explicitly `null` (not `undefined`) then `null` is returned for\n  // any unparseable date.\n  //\n  // The `now` argument can be passed for performance if you prefer to call\n  // `new Date()` just once before many calls to this method and pass that single\n  // value to all of them.\n\n  self.date = function(date, def, now) {\n    let components;\n\n    function returnDefault() {\n      if (def === undefined) {\n        def = dayjs().format('YYYY-MM-DD');\n      }\n      return def;\n    }\n\n    if (typeof (date) === 'string') {\n      if (date.match(/\\//)) {\n        components = date.split('/');\n        if (components.length === 2) {\n          // Convert mm/dd to yyyy-mm-dd\n          return (now || new Date()).getFullYear() + '-' + self.padInteger(components[0], 2) + '-' + self.padInteger(components[1], 2);\n        } else if (components.length === 3) {\n          // Convert mm/dd/yy to mm/dd/yyyy\n          if (components[2] < 100) {\n            // Add the current century. If the result is more than\n            // 50 years in the future, assume they meant the\n            // previous century. Thus in 2015, we find that\n            // we get the intuitive result for both 1/1/75,\n            // 1/1/99 and 1/1/25. It's a nasty habit among\n            // us imprecise humans. -Tom\n            const d = (now || new Date());\n            const nowYear = d.getFullYear() % 100;\n            const nowCentury = d.getFullYear() - nowYear;\n            let theirYear = parseInt(components[2]) + nowCentury;\n            if (theirYear - d.getFullYear() > 50) {\n              theirYear -= 100;\n            }\n            components[2] = theirYear;\n          }\n          // Convert mm/dd/yyyy to yyyy-mm-dd\n          return self.padInteger(components[2], 4) + '-' + self.padInteger(components[0], 2) + '-' + self.padInteger(components[1], 2);\n        } else {\n          return returnDefault();\n        }\n      } else if (date.match(/-/)) {\n        components = date.split('-');\n        if (components.length === 2) {\n          // Convert mm-dd to yyyy-mm-dd\n          return (now || new Date()).getFullYear() + '-' + self.padInteger(components[0], 2) + '-' + self.padInteger(components[1], 2);\n        } else if (components.length === 3) {\n          // Convert yyyy-mm-dd (with questionable padding) to yyyy-mm-dd\n          return self.padInteger(components[0], 4) + '-' + self.padInteger(components[1], 2) + '-' + self.padInteger(components[2], 2);\n        } else {\n          return returnDefault();\n        }\n      }\n    }\n    try {\n      if (date === null) {\n        return returnDefault();\n      }\n      date = (now || new Date(date));\n      if (isNaN(date.getTime())) {\n        return returnDefault();\n      }\n      return date.getFullYear() + '-' + self.padInteger(date.getMonth() + 1, 2) + '-' + self.padInteger(date.getDate(), 2);\n    } catch (e) {\n      return returnDefault();\n    }\n  };\n\n  // This is likely not relevent to you unless you're using Apostrophe\n  // Given a date object, return a date string in Apostrophe's preferred sortable,\n  // comparable, JSON-able format, which is YYYY-MM-DD. If `date` is undefined\n  // the current date is used.\n  self.formatDate = function(date) {\n    return dayjs(date).format('YYYY-MM-DD');\n  };\n\n  // Accepts a user-entered string in 12-hour or 24-hour time and returns a string\n  // in 24-hour time. This method is tolerant of syntax such as `4pm`; minutes and\n  // seconds are optional.\n  //\n  // If `def` is not set the default is the current time.\n\n  self.time = function(time, def) {\n    time = self.string(time).toLowerCase();\n    time = time.trim();\n    const components = time.match(/^(\\d+)([:|.](\\d+))?([:|.](\\d+))?\\s*(am|pm|AM|PM|a|p|A|M)?$/);\n    if (components) {\n      let hours = parseInt(components[1], 10);\n      const minutes = (components[3] !== undefined) ? parseInt(components[3], 10) : 0;\n      const seconds = (components[5] !== undefined) ? parseInt(components[5], 10) : 0;\n      let ampm = (components[6]) ? components[6].toLowerCase() : components[6];\n      ampm = ampm && ampm.charAt(0);\n      if ((hours === 12) && (ampm === 'a')) {\n        hours -= 12;\n      } else if ((hours === 12) && (ampm === 'p')) {\n        // Leave it be\n      } else if (ampm === 'p') {\n        hours += 12;\n      }\n      if ((hours === 24) || (hours === '24')) {\n        hours = 0;\n      }\n      return self.padInteger(hours, 2) + ':' + self.padInteger(minutes, 2) + ':' + self.padInteger(seconds, 2);\n    } else {\n      if (def !== undefined) {\n        return def;\n      }\n      return dayjs().format('HH:mm');\n    }\n  };\n\n  // This is likely not relevent to you unless you're using Apostrophe\n  // Given a JavaScript Date object, return a time string in\n  // Apostrophe's preferred sortable, comparable, JSON-able format:\n  // 24-hour time, with seconds.\n  //\n  // If `date` is missing the current time is used.\n\n  self.formatTime = function(date) {\n    return dayjs(date).format('HH:mm:ss');\n  };\n\n  // Sanitize tags. Tags should be submitted as an array of strings,\n  // or a comma-separated string.\n  //\n  // This method ensures the input is an array or string and, if\n  // an array, that the elements of the array are strings.\n  //\n  // If a filterTag function is passed as an option when initializing\n  // Launder, then all tags are passed through it (as individual\n  // strings, one per call) and the return value is used instead. You\n  // may also pass a filterTag when calling this function\n\n  self.tags = function(tags, filter) {\n    if (typeof (tags) === 'string') {\n      tags = tags.split(/,\\s*/);\n    }\n    if (!Array.isArray(tags)) {\n      return [];\n    }\n    const strings = tags.map(tag => self.string(tag));\n    const rewritten = strings.map(filter || self.filterTag);\n    const filtered = rewritten.filter(tag => tag.length > 0);\n    return filtered;\n  };\n\n  // Sanitize an id. IDs must consist solely of upper and lower case\n  // letters, numbers, and digits unless options.idRegExp is set.\n\n  self.idRegExp = self.options.idRegExp || /^[A-Za-z0-9_]+$/;\n\n  self.id = function(s, def) {\n    const id = self.string(s, def);\n    if (id === def) {\n      return id;\n    }\n    if (!id.match(self.idRegExp)) {\n      return def;\n    }\n    return id;\n  };\n\n  // Sanitize an array of IDs. IDs must consist solely of upper and lower case\n  // letters and numbers, digits, and underscores. Any elements that are not\n  // IDs are omitted from the final array.\n  self.ids = function(ids) {\n    if (!Array.isArray(ids)) {\n      return [];\n    }\n    const result = ids.filter(function(id) {\n      return (self.id(id) !== undefined);\n    });\n    return result;\n  };\n  return self;\n};\n\n// Expose `naughtyHref` statically so callers (notably sanitize-html)\n// can use it without instantiating a launder.\nmodule.exports.naughtyHref = naughtyHref;\n","(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()","/*\nCopyright 2021-2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { IEncryptedFile, IEncryptedFileJWK } from '.';\n\nexport async function encryptAttachment(plaintextBuffer: ArrayBuffer): Promise<{\n    data: ArrayBuffer;\n    info: IEncryptedFile;\n}> {\n    // Generate an IV where the first 8 bytes are random and the high 8 bytes\n    // are zero. We set the counter low bits to 0 since it makes it unlikely\n    // that the 64 bit counter will overflow.\n    const ivArray = new Uint8Array(16); // Uint8Array of AES IV\n    window.crypto.getRandomValues(ivArray.subarray(0, 8));\n    // Load the encryption key.\n    const cryptoKey = await window.crypto.subtle.generateKey(\n        { 'name': 'AES-CTR', 'length': 256 }, true, ['encrypt', 'decrypt'],\n    );\n    // Export the Key as JWK.\n    const exportedKey = await window.crypto.subtle.exportKey('jwk', cryptoKey);\n    // Encrypt the input ArrayBuffer.\n    // Use half of the iv as the counter by setting the \"length\" to 64.\n    const ciphertextBuffer = await window.crypto.subtle.encrypt(\n        { name: 'AES-CTR', counter: ivArray, length: 64 }, cryptoKey, plaintextBuffer,\n    );\n    // SHA-256 the encrypted data.\n    const sha256Buffer = await window.crypto.subtle.digest('SHA-256', ciphertextBuffer);\n    return {\n        data: ciphertextBuffer,\n        info: {\n            v: 'v2',\n            key: exportedKey as IEncryptedFileJWK,\n            iv: encodeBase64(ivArray),\n            hashes: {\n                sha256: encodeBase64(new Uint8Array(sha256Buffer)),\n            },\n        },\n    };\n}\n\nexport async function decryptAttachment(ciphertextBuffer: ArrayBuffer, info: IEncryptedFile): Promise<ArrayBuffer> {\n    if (info === undefined || info.key === undefined || info.iv === undefined\n        || info.hashes === undefined || info.hashes.sha256 === undefined) {\n        throw new Error('Invalid info. Missing info.key, info.iv or info.hashes.sha256 key');\n    }\n\n    if (info.v && !info.v.match(/^v[1-2]$/)) {\n        throw new Error(`Unsupported protocol version: ${info.v}`);\n    }\n\n    const ivArray = decodeBase64(info.iv);\n    const expectedSha256base64 = info.hashes.sha256;\n    // Load the AES from the \"key\" key of the inf bao object.\n    const cryptoKey = await window.crypto.subtle.importKey(\n        'jwk', info.key, { 'name': 'AES-CTR' }, false, ['encrypt', 'decrypt'],\n    );\n    const digestResult = await window.crypto.subtle.digest('SHA-256', ciphertextBuffer);\n    if (encodeBase64(new Uint8Array(digestResult)) != expectedSha256base64) {\n        throw new Error('Mismatched SHA-256 digest');\n    }\n    let counterLength: number;\n    if (info.v == 'v1' || info.v == 'v2') {\n        // Version 1 and 2 use a 64 bit counter.\n        counterLength = 64;\n    } else {\n        // Version 0 uses a 128 bit counter.\n        counterLength = 128;\n    }\n    return window.crypto.subtle.decrypt(\n        { name: 'AES-CTR', counter: ivArray, length: counterLength }, cryptoKey, ciphertextBuffer,\n    );\n}\n\nexport function encodeBase64(uint8Array: Uint8Array): string {\n    // Misinterpt the Uint8Array as Latin-1.\n    // window.btoa expects a unicode string with codepoints in the range 0-255.\n    const latin1String = String.fromCharCode.apply(null, uint8Array);\n    // Use the builtin base64 encoder.\n    const paddedBase64 = window.btoa(latin1String);\n    // Calculate the unpadded length.\n    const inputLength = uint8Array.length;\n    const outputLength = 4 * Math.floor((inputLength + 2) / 3) + (inputLength + 2) % 3 - 2;\n    // Return the unpadded base64.\n    return paddedBase64.slice(0, outputLength);\n}\n\nexport function decodeBase64(base64: string): Uint8Array {\n    // Pad the base64 up to the next multiple of 4.\n    const paddedBase64 = base64 + '==='.slice(0, (4 - base64.length % 4) % 4);\n    // Decode the base64 as a misinterpreted Latin-1 string.\n    // window.atob returns a unicode string with codepoints in the range 0-255.\n    const latin1String = window.atob(paddedBase64);\n    // Encode the string as a Uint8Array as Latin-1.\n    const uint8Array = new Uint8Array(latin1String.length);\n    for (let i = 0; i < latin1String.length; i++) {\n        uint8Array[i] = latin1String.charCodeAt(i);\n    }\n    return uint8Array;\n}\n\nexport default {\n    encryptAttachment,\n    decryptAttachment,\n    encodeBase64,\n    decodeBase64,\n};\n","\n'use strict';\n\n\nvar encodeCache = {};\n\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache(exclude) {\n  var i, ch, cache = encodeCache[exclude];\n  if (cache) { return cache; }\n\n  cache = encodeCache[exclude] = [];\n\n  for (i = 0; i < 128; i++) {\n    ch = String.fromCharCode(i);\n\n    if (/^[0-9a-z]$/i.test(ch)) {\n      // always allow unencoded alphanumeric characters\n      cache.push(ch);\n    } else {\n      cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2));\n    }\n  }\n\n  for (i = 0; i < exclude.length; i++) {\n    cache[exclude.charCodeAt(i)] = exclude[i];\n  }\n\n  return cache;\n}\n\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n//  - string       - string to encode\n//  - exclude      - list of characters to ignore (in addition to a-zA-Z0-9)\n//  - keepEscaped  - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode(string, exclude, keepEscaped) {\n  var i, l, code, nextCode, cache,\n      result = '';\n\n  if (typeof exclude !== 'string') {\n    // encode(string, keepEscaped)\n    keepEscaped  = exclude;\n    exclude = encode.defaultChars;\n  }\n\n  if (typeof keepEscaped === 'undefined') {\n    keepEscaped = true;\n  }\n\n  cache = getEncodeCache(exclude);\n\n  for (i = 0, l = string.length; i < l; i++) {\n    code = string.charCodeAt(i);\n\n    if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n      if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n        result += string.slice(i, i + 3);\n        i += 2;\n        continue;\n      }\n    }\n\n    if (code < 128) {\n      result += cache[code];\n      continue;\n    }\n\n    if (code >= 0xD800 && code <= 0xDFFF) {\n      if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n        nextCode = string.charCodeAt(i + 1);\n        if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n          result += encodeURIComponent(string[i] + string[i + 1]);\n          i++;\n          continue;\n        }\n      }\n      result += '%EF%BF%BD';\n      continue;\n    }\n\n    result += encodeURIComponent(string[i]);\n  }\n\n  return result;\n}\n\nencode.defaultChars   = \";/?:@&=+$,-_.!~*'()#\";\nencode.componentChars = \"-_.!~*'()\";\n\n\nmodule.exports = encode;\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,o),i.l=!0,i.exports}return o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var i in e)o.d(n,i,function(t){return e[t]}.bind(null,i));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){function o(e,t){if(null==e)return{};var o,n,i=function(e,t){if(null==e)return{};var o,n,i={},r=Object.keys(e);for(n=0;n<r.length;n++)o=r[n],t.indexOf(o)>=0||(i[o]=e[o]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)o=r[n],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o])}return i}var n=t.AudioContext||t.webkitAudioContext,i=function e(){var t=this,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!e.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,wavBitDepth:16,sourceNode:{context:null}},o),this.encodedSamplePosition=0,this.initAudioContext(),this.initialize=this.initWorklet().then((function(){return t.initEncoder()}))};i.isRecordingSupported=function(){var e=t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia;return n&&e&&t.WebAssembly},i.version=\"8.0.5\",i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){return e.stop()})):this.stream.stop())},i.prototype.close=function(){return this.monitorGainNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode&&this.sourceNode.disconnect(),this.clearStream(),this.encoder&&(this.encoderNode.disconnect(),this.encoder.postMessage({command:\"close\"})),this.config.sourceNode.context?Promise.resolve():this.audioContext.close()},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o<e.numberOfChannels;o++)t[o]=e.getChannelData(o);this.encoder.postMessage({command:\"encode\",buffers:t})}},i.prototype.initAudioContext=function(){this.audioContext=this.config.sourceNode.context?this.config.sourceNode.context:new n,this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain)},i.prototype.initEncoder=function(){var e=this;this.audioContext.audioWorklet?(this.encoderNode=new AudioWorkletNode(this.audioContext,\"encoder-worklet\",{numberOfOutputs:0}),this.encoder=this.encoderNode.port):(console.log(\"audioWorklet support not detected. Falling back to scriptProcessor\"),this.encodeBuffers=function(){return delete e.encodeBuffers},this.encoderNode=this.audioContext.createScriptProcessor(this.config.bufferLength,this.config.numberOfChannels,this.config.numberOfChannels),this.encoderNode.onaudioprocess=function(t){var o=t.inputBuffer;return e.encodeBuffers(o)},this.encoderNode.connect(this.audioContext.destination),this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initSourceNode=function(){var e=this;return this.config.sourceNode.context?(this.sourceNode=this.config.sourceNode,Promise.resolve()):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then((function(t){e.stream=t,e.sourceNode=e.audioContext.createMediaStreamSource(t)}))},i.prototype.initWorker=function(){var e=this,t=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,new Promise((function(n){e.encoder.addEventListener(\"message\",(function o(i){var r=i.data;switch(r.message){case\"ready\":n();break;case\"page\":e.encodedSamplePosition=r.samplePosition,t(r.page);break;case\"done\":e.encoder.removeEventListener(\"message\",o),e.finish()}})),e.encoder.start&&e.encoder.start();var i=e.config,r=(i.sourceNode,o(i,[\"sourceNode\"]));e.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:e.audioContext.sampleRate,wavSampleRate:e.audioContext.sampleRate},r))}))},i.prototype.initWorklet=function(){return this.audioContext.audioWorklet?this.audioContext.audioWorklet.addModule(this.config.encoderPath):Promise.resolve()},i.prototype.pause=function(e){var t=this;if(\"recording\"===this.state)return this.state=\"paused\",this.recordingGainNode.disconnect(),e&&this.config.streamPages?new Promise((function(e){t.encoder.addEventListener(\"message\",(function o(n){\"flushed\"===n.data.message&&(t.encoder.removeEventListener(\"message\",o),t.onpause(),e())})),t.encoder.start&&t.encoder.start(),t.encoder.postMessage({command:\"flush\"})})):(this.onpause(),Promise.resolve())},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.recordingGainNode.connect(this.encoderNode),this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(){var e=this;return\"inactive\"===this.state?(this.state=\"loading\",this.encodedSamplePosition=0,this.audioContext.resume().then((function(){return e.initialize})).then((function(){return Promise.all([e.initSourceNode(),e.initWorker()])})).then((function(){e.state=\"recording\",e.encoder.postMessage({command:\"getHeaderPages\"}),e.sourceNode.connect(e.monitorGainNode),e.sourceNode.connect(e.recordingGainNode),e.monitorGainNode.connect(e.audioContext.destination),e.recordingGainNode.connect(e.encoderNode),e.onstart()})).catch((function(t){throw e.state=\"inactive\",t}))):Promise.resolve()},i.prototype.stop=function(){var e=this;return\"paused\"===this.state||\"recording\"===this.state?(this.state=\"inactive\",this.recordingGainNode.connect(this.encoderNode),this.monitorGainNode.disconnect(),this.clearStream(),new Promise((function(t){e.encoder.addEventListener(\"message\",(function o(n){\"done\"===n.data.message&&(e.encoder.removeEventListener(\"message\",o),t())})),e.encoder.start&&e.encoder.start(),e.encoder.postMessage({command:\"done\"})}))):Promise.resolve()},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop()},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/**\n * Srcset Parser\n *\n * By Alex Bell |  MIT License\n *\n * JS Parser for the string value that appears in markup <img srcset=\"here\">\n *\n * @returns Array [{url: _, d: _, w: _, h:_}, ...]\n *\n * Based super duper closely on the reference algorithm at:\n * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute\n *\n * Most comments are copied in directly from the spec\n * (except for comments in parens).\n */\n\n(function (root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([], factory);\n\t} else if (typeof module === 'object' && module.exports) {\n\t\t// Node. Does not work with strict CommonJS, but\n\t\t// only CommonJS-like environments that support module.exports,\n\t\t// like Node.\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Browser globals (root is window)\n\t\troot.parseSrcset = factory();\n\t}\n}(this, function () {\n\n\t// 1. Let input be the value passed to this algorithm.\n\treturn function (input) {\n\n\t\t// UTILITY FUNCTIONS\n\n\t\t// Manual is faster than RegEx\n\t\t// http://bjorn.tipling.com/state-and-regular-expressions-in-javascript\n\t\t// http://jsperf.com/whitespace-character/5\n\t\tfunction isSpace(c) {\n\t\t\treturn (c === \"\\u0020\" || // space\n\t\t\tc === \"\\u0009\" || // horizontal tab\n\t\t\tc === \"\\u000A\" || // new line\n\t\t\tc === \"\\u000C\" || // form feed\n\t\t\tc === \"\\u000D\");  // carriage return\n\t\t}\n\n\t\tfunction collectCharacters(regEx) {\n\t\t\tvar chars,\n\t\t\t\tmatch = regEx.exec(input.substring(pos));\n\t\t\tif (match) {\n\t\t\t\tchars = match[ 0 ];\n\t\t\t\tpos += chars.length;\n\t\t\t\treturn chars;\n\t\t\t}\n\t\t}\n\n\t\tvar inputLength = input.length,\n\n\t\t\t// (Don't use \\s, to avoid matching non-breaking space)\n\t\t\tregexLeadingSpaces = /^[ \\t\\n\\r\\u000c]+/,\n\t\t\tregexLeadingCommasOrSpaces = /^[, \\t\\n\\r\\u000c]+/,\n\t\t\tregexLeadingNotSpaces = /^[^ \\t\\n\\r\\u000c]+/,\n\t\t\tregexTrailingCommas = /[,]+$/,\n\t\t\tregexNonNegativeInteger = /^\\d+$/,\n\n\t\t\t// ( Positive or negative or unsigned integers or decimals, without or without exponents.\n\t\t\t// Must include at least one digit.\n\t\t\t// According to spec tests any decimal point must be followed by a digit.\n\t\t\t// No leading plus sign is allowed.)\n\t\t\t// https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number\n\t\t\tregexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/,\n\n\t\t\turl,\n\t\t\tdescriptors,\n\t\t\tcurrentDescriptor,\n\t\t\tstate,\n\t\t\tc,\n\n\t\t\t// 2. Let position be a pointer into input, initially pointing at the start\n\t\t\t//    of the string.\n\t\t\tpos = 0,\n\n\t\t\t// 3. Let candidates be an initially empty source set.\n\t\t\tcandidates = [];\n\n\t\t// 4. Splitting loop: Collect a sequence of characters that are space\n\t\t//    characters or U+002C COMMA characters. If any U+002C COMMA characters\n\t\t//    were collected, that is a parse error.\n\t\twhile (true) {\n\t\t\tcollectCharacters(regexLeadingCommasOrSpaces);\n\n\t\t\t// 5. If position is past the end of input, return candidates and abort these steps.\n\t\t\tif (pos >= inputLength) {\n\t\t\t\treturn candidates; // (we're done, this is the sole return path)\n\t\t\t}\n\n\t\t\t// 6. Collect a sequence of characters that are not space characters,\n\t\t\t//    and let that be url.\n\t\t\turl = collectCharacters(regexLeadingNotSpaces);\n\n\t\t\t// 7. Let descriptors be a new empty list.\n\t\t\tdescriptors = [];\n\n\t\t\t// 8. If url ends with a U+002C COMMA character (,), follow these substeps:\n\t\t\t//\t\t(1). Remove all trailing U+002C COMMA characters from url. If this removed\n\t\t\t//         more than one character, that is a parse error.\n\t\t\tif (url.slice(-1) === \",\") {\n\t\t\t\turl = url.replace(regexTrailingCommas, \"\");\n\t\t\t\t// (Jump ahead to step 9 to skip tokenization and just push the candidate).\n\t\t\t\tparseDescriptors();\n\n\t\t\t\t//\tOtherwise, follow these substeps:\n\t\t\t} else {\n\t\t\t\ttokenize();\n\t\t\t} // (close else of step 8)\n\n\t\t\t// 16. Return to the step labeled splitting loop.\n\t\t} // (Close of big while loop.)\n\n\t\t/**\n\t\t * Tokenizes descriptor properties prior to parsing\n\t\t * Returns undefined.\n\t\t */\n\t\tfunction tokenize() {\n\n\t\t\t// 8.1. Descriptor tokeniser: Skip whitespace\n\t\t\tcollectCharacters(regexLeadingSpaces);\n\n\t\t\t// 8.2. Let current descriptor be the empty string.\n\t\t\tcurrentDescriptor = \"\";\n\n\t\t\t// 8.3. Let state be in descriptor.\n\t\t\tstate = \"in descriptor\";\n\n\t\t\twhile (true) {\n\n\t\t\t\t// 8.4. Let c be the character at position.\n\t\t\t\tc = input.charAt(pos);\n\n\t\t\t\t//  Do the following depending on the value of state.\n\t\t\t\t//  For the purpose of this step, \"EOF\" is a special character representing\n\t\t\t\t//  that position is past the end of input.\n\n\t\t\t\t// In descriptor\n\t\t\t\tif (state === \"in descriptor\") {\n\t\t\t\t\t// Do the following, depending on the value of c:\n\n\t\t\t\t\t// Space character\n\t\t\t\t\t// If current descriptor is not empty, append current descriptor to\n\t\t\t\t\t// descriptors and let current descriptor be the empty string.\n\t\t\t\t\t// Set state to after descriptor.\n\t\t\t\t\tif (isSpace(c)) {\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t\tcurrentDescriptor = \"\";\n\t\t\t\t\t\t\tstate = \"after descriptor\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// U+002C COMMA (,)\n\t\t\t\t\t\t// Advance position to the next character in input. If current descriptor\n\t\t\t\t\t\t// is not empty, append current descriptor to descriptors. Jump to the step\n\t\t\t\t\t\t// labeled descriptor parser.\n\t\t\t\t\t} else if (c === \",\") {\n\t\t\t\t\t\tpos += 1;\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// U+0028 LEFT PARENTHESIS (()\n\t\t\t\t\t\t// Append c to current descriptor. Set state to in parens.\n\t\t\t\t\t} else if (c === \"\\u0028\") {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t\tstate = \"in parens\";\n\n\t\t\t\t\t\t// EOF\n\t\t\t\t\t\t// If current descriptor is not empty, append current descriptor to\n\t\t\t\t\t\t// descriptors. Jump to the step labeled descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Append c to current descriptor.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t}\n\t\t\t\t\t// (end \"in descriptor\"\n\n\t\t\t\t\t// In parens\n\t\t\t\t} else if (state === \"in parens\") {\n\n\t\t\t\t\t// U+0029 RIGHT PARENTHESIS ())\n\t\t\t\t\t// Append c to current descriptor. Set state to in descriptor.\n\t\t\t\t\tif (c === \")\") {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t\tstate = \"in descriptor\";\n\n\t\t\t\t\t\t// EOF\n\t\t\t\t\t\t// Append current descriptor to descriptors. Jump to the step labeled\n\t\t\t\t\t\t// descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Append c to current descriptor.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t}\n\n\t\t\t\t\t// After descriptor\n\t\t\t\t} else if (state === \"after descriptor\") {\n\n\t\t\t\t\t// Do the following, depending on the value of c:\n\t\t\t\t\t// Space character: Stay in this state.\n\t\t\t\t\tif (isSpace(c)) {\n\n\t\t\t\t\t\t// EOF: Jump to the step labeled descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Set state to in descriptor. Set position to the previous character in input.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate = \"in descriptor\";\n\t\t\t\t\t\tpos -= 1;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Advance position to the next character in input.\n\t\t\t\tpos += 1;\n\n\t\t\t\t// Repeat this step.\n\t\t\t} // (close while true loop)\n\t\t}\n\n\t\t/**\n\t\t * Adds descriptor properties to a candidate, pushes to the candidates array\n\t\t * @return undefined\n\t\t */\n\t\t// Declared outside of the while loop so that it's only created once.\n\t\tfunction parseDescriptors() {\n\n\t\t\t// 9. Descriptor parser: Let error be no.\n\t\t\tvar pError = false,\n\n\t\t\t\t// 10. Let width be absent.\n\t\t\t\t// 11. Let density be absent.\n\t\t\t\t// 12. Let future-compat-h be absent. (We're implementing it now as h)\n\t\t\t\tw, d, h, i,\n\t\t\t\tcandidate = {},\n\t\t\t\tdesc, lastChar, value, intVal, floatVal;\n\n\t\t\t// 13. For each descriptor in descriptors, run the appropriate set of steps\n\t\t\t// from the following list:\n\t\t\tfor (i = 0 ; i < descriptors.length; i++) {\n\t\t\t\tdesc = descriptors[ i ];\n\n\t\t\t\tlastChar = desc[ desc.length - 1 ];\n\t\t\t\tvalue = desc.substring(0, desc.length - 1);\n\t\t\t\tintVal = parseInt(value, 10);\n\t\t\t\tfloatVal = parseFloat(value);\n\n\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\n\t\t\t\t// a U+0077 LATIN SMALL LETTER W character\n\t\t\t\tif (regexNonNegativeInteger.test(value) && (lastChar === \"w\")) {\n\n\t\t\t\t\t// If width and density are not both absent, then let error be yes.\n\t\t\t\t\tif (w || d) {pError = true;}\n\n\t\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\n\t\t\t\t\t// If the result is zero, let error be yes.\n\t\t\t\t\t// Otherwise, let width be the result.\n\t\t\t\t\tif (intVal === 0) {pError = true;} else {w = intVal;}\n\n\t\t\t\t\t// If the descriptor consists of a valid floating-point number followed by\n\t\t\t\t\t// a U+0078 LATIN SMALL LETTER X character\n\t\t\t\t} else if (regexFloatingPoint.test(value) && (lastChar === \"x\")) {\n\n\t\t\t\t\t// If width, density and future-compat-h are not all absent, then let error\n\t\t\t\t\t// be yes.\n\t\t\t\t\tif (w || d || h) {pError = true;}\n\n\t\t\t\t\t// Apply the rules for parsing floating-point number values to the descriptor.\n\t\t\t\t\t// If the result is less than zero, let error be yes. Otherwise, let density\n\t\t\t\t\t// be the result.\n\t\t\t\t\tif (floatVal < 0) {pError = true;} else {d = floatVal;}\n\n\t\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\n\t\t\t\t\t// a U+0068 LATIN SMALL LETTER H character\n\t\t\t\t} else if (regexNonNegativeInteger.test(value) && (lastChar === \"h\")) {\n\n\t\t\t\t\t// If height and density are not both absent, then let error be yes.\n\t\t\t\t\tif (h || d) {pError = true;}\n\n\t\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\n\t\t\t\t\t// If the result is zero, let error be yes. Otherwise, let future-compat-h\n\t\t\t\t\t// be the result.\n\t\t\t\t\tif (intVal === 0) {pError = true;} else {h = intVal;}\n\n\t\t\t\t\t// Anything else, Let error be yes.\n\t\t\t\t} else {pError = true;}\n\t\t\t} // (close step 13 for loop)\n\n\t\t\t// 15. If error is still no, then append a new image source to candidates whose\n\t\t\t// URL is url, associated with a width width if not absent and a pixel\n\t\t\t// density density if not absent. Otherwise, there is a parse error.\n\t\t\tif (!pError) {\n\t\t\t\tcandidate.url = url;\n\t\t\t\tif (w) { candidate.w = w;}\n\t\t\t\tif (d) { candidate.d = d;}\n\t\t\t\tif (h) { candidate.h = h;}\n\t\t\t\tcandidates.push(candidate);\n\t\t\t} else if (console && console.log) {\n\t\t\t\tconsole.log(\"Invalid srcset descriptor found in '\" +\n\t\t\t\t\tinput + \"' at '\" + desc + \"'.\");\n\t\t\t}\n\t\t} // (close parseDescriptors fn)\n\n\t}\n}));\n","var x=String;\nvar create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x,blackBright:x,redBright:x,greenBright:x,yellowBright:x,blueBright:x,magentaBright:x,cyanBright:x,whiteBright:x,bgBlackBright:x,bgRedBright:x,bgGreenBright:x,bgYellowBright:x,bgBlueBright:x,bgMagentaBright:x,bgCyanBright:x,bgWhiteBright:x}};\nmodule.exports=create();\nmodule.exports.createColors = create;\n","'use strict'\n\nlet Container = require('./container')\n\nclass AtRule extends Container {\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'atrule'\n  }\n\n  append(...children) {\n    if (!this.proxyOf.nodes) this.nodes = []\n    return super.append(...children)\n  }\n\n  prepend(...children) {\n    if (!this.proxyOf.nodes) this.nodes = []\n    return super.prepend(...children)\n  }\n}\n\nmodule.exports = AtRule\nAtRule.default = AtRule\n\nContainer.registerAtRule(AtRule)\n","'use strict'\n\nlet Node = require('./node')\n\nclass Comment extends Node {\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'comment'\n  }\n}\n\nmodule.exports = Comment\nComment.default = Comment\n","'use strict'\n\nlet Comment = require('./comment')\nlet Declaration = require('./declaration')\nlet Node = require('./node')\nlet { isClean, my } = require('./symbols')\n\nlet AtRule, parse, Root, Rule\n\nfunction cleanSource(nodes) {\n  return nodes.map(i => {\n    if (i.nodes) i.nodes = cleanSource(i.nodes)\n    delete i.source\n    return i\n  })\n}\n\nfunction markTreeDirty(node) {\n  node[isClean] = false\n  if (node.proxyOf.nodes) {\n    for (let i of node.proxyOf.nodes) {\n      markTreeDirty(i)\n    }\n  }\n}\n\nclass Container extends Node {\n  get first() {\n    if (!this.proxyOf.nodes) return undefined\n    return this.proxyOf.nodes[0]\n  }\n\n  get last() {\n    if (!this.proxyOf.nodes) return undefined\n    return this.proxyOf.nodes[this.proxyOf.nodes.length - 1]\n  }\n\n  append(...children) {\n    for (let child of children) {\n      let nodes = this.normalize(child, this.last)\n      for (let node of nodes) this.proxyOf.nodes.push(node)\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  cleanRaws(keepBetween) {\n    super.cleanRaws(keepBetween)\n    if (this.nodes) {\n      for (let node of this.nodes) node.cleanRaws(keepBetween)\n    }\n  }\n\n  each(callback) {\n    if (!this.proxyOf.nodes) return undefined\n    let iterator = this.getIterator()\n\n    let index, result\n    while (this.indexes[iterator] < this.proxyOf.nodes.length) {\n      index = this.indexes[iterator]\n      result = callback(this.proxyOf.nodes[index], index)\n      if (result === false) break\n\n      this.indexes[iterator] += 1\n    }\n\n    delete this.indexes[iterator]\n    return result\n  }\n\n  every(condition) {\n    return this.nodes.every(condition)\n  }\n\n  getIterator() {\n    if (!this.lastEach) this.lastEach = 0\n    if (!this.indexes) this.indexes = {}\n\n    this.lastEach += 1\n    let iterator = this.lastEach\n    this.indexes[iterator] = 0\n\n    return iterator\n  }\n\n  getProxyProcessor() {\n    return {\n      get(node, prop) {\n        if (prop === 'proxyOf') {\n          return node\n        } else if (!node[prop]) {\n          return node[prop]\n        } else if (\n          prop === 'each' ||\n          (typeof prop === 'string' && prop.startsWith('walk'))\n        ) {\n          return (...args) => {\n            return node[prop](\n              ...args.map(i => {\n                if (typeof i === 'function') {\n                  return (child, index) => i(child.toProxy(), index)\n                } else {\n                  return i\n                }\n              })\n            )\n          }\n        } else if (prop === 'every' || prop === 'some') {\n          return cb => {\n            return node[prop]((child, ...other) =>\n              cb(child.toProxy(), ...other)\n            )\n          }\n        } else if (prop === 'root') {\n          return () => node.root().toProxy()\n        } else if (prop === 'nodes') {\n          return node.nodes.map(i => i.toProxy())\n        } else if (prop === 'first' || prop === 'last') {\n          return node[prop].toProxy()\n        } else {\n          return node[prop]\n        }\n      },\n\n      set(node, prop, value) {\n        if (node[prop] === value) return true\n        node[prop] = value\n        if (prop === 'name' || prop === 'params' || prop === 'selector') {\n          node.markDirty()\n        }\n        return true\n      }\n    }\n  }\n\n  index(child) {\n    if (typeof child === 'number') return child\n    if (child.proxyOf) child = child.proxyOf\n    return this.proxyOf.nodes.indexOf(child)\n  }\n\n  insertAfter(exist, add) {\n    let existIndex = this.index(exist)\n    let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse()\n    existIndex = this.index(exist)\n    for (let node of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node)\n\n    let index\n    for (let id in this.indexes) {\n      index = this.indexes[id]\n      if (existIndex < index) {\n        this.indexes[id] = index + nodes.length\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  insertBefore(exist, add) {\n    let existIndex = this.index(exist)\n    let type = existIndex === 0 ? 'prepend' : false\n    let nodes = this.normalize(\n      add,\n      this.proxyOf.nodes[existIndex],\n      type\n    ).reverse()\n    existIndex = this.index(exist)\n    for (let node of nodes) this.proxyOf.nodes.splice(existIndex, 0, node)\n\n    let index\n    for (let id in this.indexes) {\n      index = this.indexes[id]\n      if (existIndex <= index) {\n        this.indexes[id] = index + nodes.length\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  normalize(nodes, sample) {\n    if (typeof nodes === 'string') {\n      nodes = cleanSource(parse(nodes).nodes)\n    } else if (typeof nodes === 'undefined') {\n      nodes = []\n    } else if (Array.isArray(nodes)) {\n      nodes = nodes.slice(0)\n      for (let i of nodes) {\n        if (i.parent) i.parent.removeChild(i, 'ignore')\n      }\n    } else if (nodes.type === 'root' && this.type !== 'document') {\n      nodes = nodes.nodes.slice(0)\n      for (let i of nodes) {\n        if (i.parent) i.parent.removeChild(i, 'ignore')\n      }\n    } else if (nodes.type) {\n      nodes = [nodes]\n    } else if (nodes.prop) {\n      if (typeof nodes.value === 'undefined') {\n        throw new Error('Value field is missed in node creation')\n      } else if (typeof nodes.value !== 'string') {\n        nodes.value = String(nodes.value)\n      }\n      nodes = [new Declaration(nodes)]\n    } else if (nodes.selector || nodes.selectors) {\n      nodes = [new Rule(nodes)]\n    } else if (nodes.name) {\n      nodes = [new AtRule(nodes)]\n    } else if (nodes.text) {\n      nodes = [new Comment(nodes)]\n    } else {\n      throw new Error('Unknown node type in node creation')\n    }\n\n    let processed = nodes.map(i => {\n      /* c8 ignore next */\n      if (!i[my]) Container.rebuild(i)\n      i = i.proxyOf\n      if (i.parent) i.parent.removeChild(i)\n      if (i[isClean]) markTreeDirty(i)\n\n      if (!i.raws) i.raws = {}\n      if (typeof i.raws.before === 'undefined') {\n        if (sample && typeof sample.raws.before !== 'undefined') {\n          i.raws.before = sample.raws.before.replace(/\\S/g, '')\n        }\n      }\n      i.parent = this.proxyOf\n      return i\n    })\n\n    return processed\n  }\n\n  prepend(...children) {\n    children = children.reverse()\n    for (let child of children) {\n      let nodes = this.normalize(child, this.first, 'prepend').reverse()\n      for (let node of nodes) this.proxyOf.nodes.unshift(node)\n      for (let id in this.indexes) {\n        this.indexes[id] = this.indexes[id] + nodes.length\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  push(child) {\n    child.parent = this\n    this.proxyOf.nodes.push(child)\n    return this\n  }\n\n  removeAll() {\n    for (let node of this.proxyOf.nodes) node.parent = undefined\n    this.proxyOf.nodes = []\n\n    this.markDirty()\n\n    return this\n  }\n\n  removeChild(child) {\n    child = this.index(child)\n    this.proxyOf.nodes[child].parent = undefined\n    this.proxyOf.nodes.splice(child, 1)\n\n    let index\n    for (let id in this.indexes) {\n      index = this.indexes[id]\n      if (index >= child) {\n        this.indexes[id] = index - 1\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  replaceValues(pattern, opts, callback) {\n    if (!callback) {\n      callback = opts\n      opts = {}\n    }\n\n    this.walkDecls(decl => {\n      if (opts.props && !opts.props.includes(decl.prop)) return\n      if (opts.fast && !decl.value.includes(opts.fast)) return\n\n      decl.value = decl.value.replace(pattern, callback)\n    })\n\n    this.markDirty()\n\n    return this\n  }\n\n  some(condition) {\n    return this.nodes.some(condition)\n  }\n\n  walk(callback) {\n    return this.each((child, i) => {\n      let result\n      try {\n        result = callback(child, i)\n      } catch (e) {\n        throw child.addToError(e)\n      }\n      if (result !== false && child.walk) {\n        result = child.walk(callback)\n      }\n\n      return result\n    })\n  }\n\n  walkAtRules(name, callback) {\n    if (!callback) {\n      callback = name\n      return this.walk((child, i) => {\n        if (child.type === 'atrule') {\n          return callback(child, i)\n        }\n      })\n    }\n    if (name instanceof RegExp) {\n      return this.walk((child, i) => {\n        if (child.type === 'atrule' && name.test(child.name)) {\n          return callback(child, i)\n        }\n      })\n    }\n    return this.walk((child, i) => {\n      if (child.type === 'atrule' && child.name === name) {\n        return callback(child, i)\n      }\n    })\n  }\n\n  walkComments(callback) {\n    return this.walk((child, i) => {\n      if (child.type === 'comment') {\n        return callback(child, i)\n      }\n    })\n  }\n\n  walkDecls(prop, callback) {\n    if (!callback) {\n      callback = prop\n      return this.walk((child, i) => {\n        if (child.type === 'decl') {\n          return callback(child, i)\n        }\n      })\n    }\n    if (prop instanceof RegExp) {\n      return this.walk((child, i) => {\n        if (child.type === 'decl' && prop.test(child.prop)) {\n          return callback(child, i)\n        }\n      })\n    }\n    return this.walk((child, i) => {\n      if (child.type === 'decl' && child.prop === prop) {\n        return callback(child, i)\n      }\n    })\n  }\n\n  walkRules(selector, callback) {\n    if (!callback) {\n      callback = selector\n\n      return this.walk((child, i) => {\n        if (child.type === 'rule') {\n          return callback(child, i)\n        }\n      })\n    }\n    if (selector instanceof RegExp) {\n      return this.walk((child, i) => {\n        if (child.type === 'rule' && selector.test(child.selector)) {\n          return callback(child, i)\n        }\n      })\n    }\n    return this.walk((child, i) => {\n      if (child.type === 'rule' && child.selector === selector) {\n        return callback(child, i)\n      }\n    })\n  }\n}\n\nContainer.registerParse = dependant => {\n  parse = dependant\n}\n\nContainer.registerRule = dependant => {\n  Rule = dependant\n}\n\nContainer.registerAtRule = dependant => {\n  AtRule = dependant\n}\n\nContainer.registerRoot = dependant => {\n  Root = dependant\n}\n\nmodule.exports = Container\nContainer.default = Container\n\n/* c8 ignore start */\nContainer.rebuild = node => {\n  if (node.type === 'atrule') {\n    Object.setPrototypeOf(node, AtRule.prototype)\n  } else if (node.type === 'rule') {\n    Object.setPrototypeOf(node, Rule.prototype)\n  } else if (node.type === 'decl') {\n    Object.setPrototypeOf(node, Declaration.prototype)\n  } else if (node.type === 'comment') {\n    Object.setPrototypeOf(node, Comment.prototype)\n  } else if (node.type === 'root') {\n    Object.setPrototypeOf(node, Root.prototype)\n  }\n\n  node[my] = true\n\n  if (node.nodes) {\n    node.nodes.forEach(child => {\n      Container.rebuild(child)\n    })\n  }\n}\n/* c8 ignore stop */\n","'use strict'\n\nlet pico = require('picocolors')\n\nlet terminalHighlight = require('./terminal-highlight')\n\nclass CssSyntaxError extends Error {\n  constructor(message, line, column, source, file, plugin) {\n    super(message)\n    this.name = 'CssSyntaxError'\n    this.reason = message\n\n    if (file) {\n      this.file = file\n    }\n    if (source) {\n      this.source = source\n    }\n    if (plugin) {\n      this.plugin = plugin\n    }\n    if (typeof line !== 'undefined' && typeof column !== 'undefined') {\n      if (typeof line === 'number') {\n        this.line = line\n        this.column = column\n      } else {\n        this.line = line.line\n        this.column = line.column\n        this.endLine = column.line\n        this.endColumn = column.column\n      }\n    }\n\n    this.setMessage()\n\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, CssSyntaxError)\n    }\n  }\n\n  setMessage() {\n    this.message = this.plugin ? this.plugin + ': ' : ''\n    this.message += this.file ? this.file : '<css input>'\n    if (typeof this.line !== 'undefined') {\n      this.message += ':' + this.line + ':' + this.column\n    }\n    this.message += ': ' + this.reason\n  }\n\n  showSourceCode(color) {\n    if (!this.source) return ''\n\n    let css = this.source\n    if (color == null) color = pico.isColorSupported\n\n    let aside = text => text\n    let mark = text => text\n    let highlight = text => text\n    if (color) {\n      let { bold, gray, red } = pico.createColors(true)\n      mark = text => bold(red(text))\n      aside = text => gray(text)\n      if (terminalHighlight) {\n        highlight = text => terminalHighlight(text)\n      }\n    }\n\n    let lines = css.split(/\\r?\\n/)\n    let start = Math.max(this.line - 3, 0)\n    let end = Math.min(this.line + 2, lines.length)\n    let maxWidth = String(end).length\n\n    return lines\n      .slice(start, end)\n      .map((line, index) => {\n        let number = start + 1 + index\n        let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | '\n        if (number === this.line) {\n          if (line.length > 160) {\n            let padding = 20\n            let subLineStart = Math.max(0, this.column - padding)\n            let subLineEnd = Math.max(\n              this.column + padding,\n              this.endColumn + padding\n            )\n            let subLine = line.slice(subLineStart, subLineEnd)\n\n            let spacing =\n              aside(gutter.replace(/\\d/g, ' ')) +\n              line\n                .slice(0, Math.min(this.column - 1, padding - 1))\n                .replace(/[^\\t]/g, ' ')\n\n            return (\n              mark('>') +\n              aside(gutter) +\n              highlight(subLine) +\n              '\\n ' +\n              spacing +\n              mark('^')\n            )\n          }\n\n          let spacing =\n            aside(gutter.replace(/\\d/g, ' ')) +\n            line.slice(0, this.column - 1).replace(/[^\\t]/g, ' ')\n\n          return (\n            mark('>') +\n            aside(gutter) +\n            highlight(line) +\n            '\\n ' +\n            spacing +\n            mark('^')\n          )\n        }\n\n        return ' ' + aside(gutter) + highlight(line)\n      })\n      .join('\\n')\n  }\n\n  toString() {\n    let code = this.showSourceCode()\n    if (code) {\n      code = '\\n\\n' + code + '\\n'\n    }\n    return this.name + ': ' + this.message + code\n  }\n}\n\nmodule.exports = CssSyntaxError\nCssSyntaxError.default = CssSyntaxError\n","'use strict'\n\nlet Node = require('./node')\n\nclass Declaration extends Node {\n  get variable() {\n    return this.prop.startsWith('--') || this.prop[0] === '$'\n  }\n\n  constructor(defaults) {\n    if (\n      defaults &&\n      typeof defaults.value !== 'undefined' &&\n      typeof defaults.value !== 'string'\n    ) {\n      defaults = { ...defaults, value: String(defaults.value) }\n    }\n    super(defaults)\n    this.type = 'decl'\n  }\n}\n\nmodule.exports = Declaration\nDeclaration.default = Declaration\n","'use strict'\n\nlet Container = require('./container')\n\nlet LazyResult, Processor\n\nclass Document extends Container {\n  constructor(defaults) {\n    // type needs to be passed to super, otherwise child roots won't be normalized correctly\n    super({ type: 'document', ...defaults })\n\n    if (!this.nodes) {\n      this.nodes = []\n    }\n  }\n\n  toResult(opts = {}) {\n    let lazy = new LazyResult(new Processor(), this, opts)\n\n    return lazy.stringify()\n  }\n}\n\nDocument.registerLazyResult = dependant => {\n  LazyResult = dependant\n}\n\nDocument.registerProcessor = dependant => {\n  Processor = dependant\n}\n\nmodule.exports = Document\nDocument.default = Document\n","'use strict'\n\nlet AtRule = require('./at-rule')\nlet Comment = require('./comment')\nlet Declaration = require('./declaration')\nlet Input = require('./input')\nlet PreviousMap = require('./previous-map')\nlet Root = require('./root')\nlet Rule = require('./rule')\n\nfunction fromJSON(json, inputs) {\n  if (Array.isArray(json)) return json.map(n => fromJSON(n))\n\n  let { inputs: ownInputs, ...defaults } = json\n  if (ownInputs) {\n    inputs = []\n    for (let input of ownInputs) {\n      let inputHydrated = { ...input, __proto__: Input.prototype }\n      if (inputHydrated.map) {\n        inputHydrated.map = {\n          ...inputHydrated.map,\n          __proto__: PreviousMap.prototype\n        }\n      }\n      inputs.push(inputHydrated)\n    }\n  }\n  // Rehydrate children separately and attach them after construction.\n  // Passing them through the container constructor would re-run insertion\n  // spacing normalization and overwrite each child's own `raws.before`.\n  let nodes\n  if (defaults.nodes) {\n    nodes = json.nodes.map(n => fromJSON(n, inputs))\n    delete defaults.nodes\n  }\n  if (defaults.source) {\n    let { inputId, ...source } = defaults.source\n    defaults.source = source\n    if (inputId != null) {\n      defaults.source.input = inputs[inputId]\n    }\n  }\n\n  let node\n  if (defaults.type === 'root') {\n    node = new Root(defaults)\n  } else if (defaults.type === 'decl') {\n    node = new Declaration(defaults)\n  } else if (defaults.type === 'rule') {\n    node = new Rule(defaults)\n  } else if (defaults.type === 'comment') {\n    node = new Comment(defaults)\n  } else if (defaults.type === 'atrule') {\n    node = new AtRule(defaults)\n  } else {\n    throw new Error('Unknown node type: ' + json.type)\n  }\n\n  if (nodes) {\n    node.nodes = nodes\n    for (let child of nodes) child.parent = node\n  }\n\n  return node\n}\n\nmodule.exports = fromJSON\nfromJSON.default = fromJSON\n","'use strict'\n\nlet { nanoid } = require('nanoid/non-secure')\nlet { isAbsolute, resolve } = require('path')\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { fileURLToPath, pathToFileURL } = require('url')\n\nlet CssSyntaxError = require('./css-syntax-error')\nlet PreviousMap = require('./previous-map')\nlet terminalHighlight = require('./terminal-highlight')\n\nlet lineToIndexCache = Symbol('lineToIndexCache')\n\nlet sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)\nlet pathAvailable = Boolean(resolve && isAbsolute)\n\nfunction getLineToIndex(input) {\n  if (input[lineToIndexCache]) return input[lineToIndexCache]\n  let lines = input.css.split('\\n')\n  let lineToIndex = new Array(lines.length)\n  let prevIndex = 0\n\n  for (let i = 0, l = lines.length; i < l; i++) {\n    lineToIndex[i] = prevIndex\n    prevIndex += lines[i].length + 1\n  }\n\n  input[lineToIndexCache] = lineToIndex\n  return lineToIndex\n}\n\nclass Input {\n  get from() {\n    return this.file || this.id\n  }\n\n  constructor(css, opts = {}) {\n    if (\n      css === null ||\n      typeof css === 'undefined' ||\n      (typeof css === 'object' && !css.toString)\n    ) {\n      throw new Error(`PostCSS received ${css} instead of CSS string`)\n    }\n\n    this.css = css.toString()\n\n    if (this.css[0] === '\\uFEFF' || this.css[0] === '\\uFFFE') {\n      this.hasBOM = true\n      this.css = this.css.slice(1)\n    } else {\n      this.hasBOM = false\n    }\n\n    this.document = this.css\n    if (opts.document) this.document = opts.document.toString()\n\n    if (opts.from) {\n      if (\n        !pathAvailable ||\n        /^\\w+:\\/\\//.test(opts.from) ||\n        isAbsolute(opts.from)\n      ) {\n        this.file = opts.from\n      } else {\n        this.file = resolve(opts.from)\n      }\n    }\n\n    if (pathAvailable && sourceMapAvailable) {\n      let map = new PreviousMap(this.css, opts)\n      if (map.text) {\n        this.map = map\n        let file = map.consumer().file\n        if (!this.file && file) this.file = this.mapResolve(file)\n      }\n    }\n\n    if (!this.file) {\n      this.id = '<input css ' + nanoid(6) + '>'\n    }\n    if (this.map) this.map.file = this.from\n  }\n\n  error(message, line, column, opts = {}) {\n    let endColumn, endLine, endOffset, offset, result\n\n    if (line && typeof line === 'object') {\n      let start = line\n      let end = column\n      if (typeof start.offset === 'number') {\n        offset = start.offset\n        let pos = this.fromOffset(offset)\n        line = pos.line\n        column = pos.col\n      } else {\n        line = start.line\n        column = start.column\n        offset = this.fromLineAndColumn(line, column)\n      }\n      if (typeof end.offset === 'number') {\n        endOffset = end.offset\n        let pos = this.fromOffset(endOffset)\n        endLine = pos.line\n        endColumn = pos.col\n      } else {\n        endLine = end.line\n        endColumn = end.column\n        endOffset = this.fromLineAndColumn(end.line, end.column)\n      }\n    } else if (!column) {\n      offset = line\n      let pos = this.fromOffset(offset)\n      line = pos.line\n      column = pos.col\n    } else {\n      offset = this.fromLineAndColumn(line, column)\n    }\n\n    let origin = this.origin(line, column, endLine, endColumn)\n    if (origin) {\n      result = new CssSyntaxError(\n        message,\n        origin.endLine === undefined\n          ? origin.line\n          : { column: origin.column, line: origin.line },\n        origin.endLine === undefined\n          ? origin.column\n          : { column: origin.endColumn, line: origin.endLine },\n        origin.source,\n        origin.file,\n        opts.plugin\n      )\n    } else {\n      result = new CssSyntaxError(\n        message,\n        endLine === undefined ? line : { column, line },\n        endLine === undefined ? column : { column: endColumn, line: endLine },\n        this.css,\n        this.file,\n        opts.plugin\n      )\n    }\n\n    result.input = {\n      column,\n      endColumn,\n      endLine,\n      endOffset,\n      line,\n      offset,\n      source: this.css\n    }\n    if (this.file) {\n      if (pathToFileURL) {\n        result.input.url = pathToFileURL(this.file).toString()\n      }\n      result.input.file = this.file\n    }\n\n    return result\n  }\n\n  fromLineAndColumn(line, column) {\n    let lineToIndex = getLineToIndex(this)\n    let index = lineToIndex[line - 1]\n    return index + column - 1\n  }\n\n  fromOffset(offset) {\n    let lineToIndex = getLineToIndex(this)\n    let lastLine = lineToIndex[lineToIndex.length - 1]\n\n    let min = 0\n    if (offset >= lastLine) {\n      min = lineToIndex.length - 1\n    } else {\n      let max = lineToIndex.length - 2\n      let mid\n      while (min < max) {\n        mid = min + ((max - min) >> 1)\n        if (offset < lineToIndex[mid]) {\n          max = mid - 1\n        } else if (offset >= lineToIndex[mid + 1]) {\n          min = mid + 1\n        } else {\n          min = mid\n          break\n        }\n      }\n    }\n    return {\n      col: offset - lineToIndex[min] + 1,\n      line: min + 1\n    }\n  }\n\n  mapResolve(file) {\n    if (/^\\w+:\\/\\//.test(file)) {\n      return file\n    }\n    return resolve(this.map.consumer().sourceRoot || this.map.root || '.', file)\n  }\n\n  origin(line, column, endLine, endColumn) {\n    if (!this.map) return false\n    let consumer = this.map.consumer()\n\n    let from = consumer.originalPositionFor({ column: column - 1, line })\n    if (!from.source) return false\n\n    let to\n    if (typeof endLine === 'number') {\n      to = consumer.originalPositionFor({\n        column: endColumn - 1,\n        line: endLine\n      })\n    }\n\n    let fromUrl\n\n    if (isAbsolute(from.source)) {\n      fromUrl = pathToFileURL(from.source)\n    } else {\n      fromUrl = new URL(\n        from.source,\n        this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile)\n      )\n    }\n\n    let result = {\n      column: from.column + 1,\n      endColumn: to && to.column + 1,\n      endLine: to && to.line,\n      line: from.line,\n      url: fromUrl.toString()\n    }\n\n    if (fromUrl.protocol === 'file:') {\n      if (fileURLToPath) {\n        result.file = fileURLToPath(fromUrl)\n      } else {\n        /* c8 ignore next 2 */\n        throw new Error(`file: protocol is not available in this PostCSS build`)\n      }\n    }\n\n    let source = consumer.sourceContentFor(from.source)\n    if (source) result.source = source\n\n    return result\n  }\n\n  toJSON() {\n    let json = {}\n    for (let name of ['hasBOM', 'css', 'file', 'id']) {\n      if (this[name] != null) {\n        json[name] = this[name]\n      }\n    }\n    if (this.map) {\n      json.map = { ...this.map }\n      if (json.map.consumerCache) {\n        json.map.consumerCache = undefined\n      }\n    }\n    return json\n  }\n}\n\nmodule.exports = Input\nInput.default = Input\n\nif (terminalHighlight && terminalHighlight.registerInput) {\n  terminalHighlight.registerInput(Input)\n}\n","'use strict'\n\nlet Container = require('./container')\nlet Document = require('./document')\nlet MapGenerator = require('./map-generator')\nlet parse = require('./parse')\nlet Result = require('./result')\nlet Root = require('./root')\nlet stringify = require('./stringify')\nlet { isClean, my } = require('./symbols')\nlet warnOnce = require('./warn-once')\n\nconst TYPE_TO_CLASS_NAME = {\n  atrule: 'AtRule',\n  comment: 'Comment',\n  decl: 'Declaration',\n  document: 'Document',\n  root: 'Root',\n  rule: 'Rule'\n}\n\nconst PLUGIN_PROPS = {\n  AtRule: true,\n  AtRuleExit: true,\n  Comment: true,\n  CommentExit: true,\n  Declaration: true,\n  DeclarationExit: true,\n  Document: true,\n  DocumentExit: true,\n  Once: true,\n  OnceExit: true,\n  postcssPlugin: true,\n  prepare: true,\n  Root: true,\n  RootExit: true,\n  Rule: true,\n  RuleExit: true\n}\n\nconst NOT_VISITORS = {\n  Once: true,\n  postcssPlugin: true,\n  prepare: true\n}\n\nconst CHILDREN = 0\n\nfunction isPromise(obj) {\n  return typeof obj === 'object' && typeof obj.then === 'function'\n}\n\nfunction getEvents(node) {\n  let key = false\n  let type = TYPE_TO_CLASS_NAME[node.type]\n  if (node.type === 'decl') {\n    key = node.prop.toLowerCase()\n  } else if (node.type === 'atrule') {\n    key = node.name.toLowerCase()\n  }\n\n  if (key && node.append) {\n    return [\n      type,\n      type + '-' + key,\n      CHILDREN,\n      type + 'Exit',\n      type + 'Exit-' + key\n    ]\n  } else if (key) {\n    return [type, type + '-' + key, type + 'Exit', type + 'Exit-' + key]\n  } else if (node.append) {\n    return [type, CHILDREN, type + 'Exit']\n  } else {\n    return [type, type + 'Exit']\n  }\n}\n\nfunction toStack(node) {\n  let events\n  if (node.type === 'document') {\n    events = ['Document', CHILDREN, 'DocumentExit']\n  } else if (node.type === 'root') {\n    events = ['Root', CHILDREN, 'RootExit']\n  } else {\n    events = getEvents(node)\n  }\n\n  return {\n    eventIndex: 0,\n    events,\n    iterator: 0,\n    node,\n    visitorIndex: 0,\n    visitors: []\n  }\n}\n\nfunction cleanMarks(node) {\n  node[isClean] = false\n  if (node.nodes) node.nodes.forEach(i => cleanMarks(i))\n  return node\n}\n\nlet postcss = {}\n\nclass LazyResult {\n  get content() {\n    return this.stringify().content\n  }\n\n  get css() {\n    return this.stringify().css\n  }\n\n  get map() {\n    return this.stringify().map\n  }\n\n  get messages() {\n    return this.sync().messages\n  }\n\n  get opts() {\n    return this.result.opts\n  }\n\n  get processor() {\n    return this.result.processor\n  }\n\n  get root() {\n    return this.sync().root\n  }\n\n  get [Symbol.toStringTag]() {\n    return 'LazyResult'\n  }\n\n  constructor(processor, css, opts) {\n    this.stringified = false\n    this.processed = false\n\n    let root\n    if (\n      typeof css === 'object' &&\n      css !== null &&\n      (css.type === 'root' || css.type === 'document')\n    ) {\n      root = cleanMarks(css)\n    } else if (css instanceof LazyResult || css instanceof Result) {\n      root = cleanMarks(css.root)\n      if (css.map) {\n        if (typeof opts.map === 'undefined') opts.map = {}\n        if (!opts.map.inline) opts.map.inline = false\n        opts.map.prev = css.map\n      }\n    } else {\n      let parser = parse\n      if (opts.syntax) parser = opts.syntax.parse\n      if (opts.parser) parser = opts.parser\n      if (parser.parse) parser = parser.parse\n\n      try {\n        root = parser(css, opts)\n      } catch (error) {\n        this.processed = true\n        this.error = error\n      }\n\n      if (root && !root[my]) {\n        /* c8 ignore next 2 */\n        Container.rebuild(root)\n      }\n    }\n\n    this.result = new Result(processor, root, opts)\n    this.helpers = { ...postcss, postcss, result: this.result }\n    this.plugins = this.processor.plugins.map(plugin => {\n      if (typeof plugin === 'object' && plugin.prepare) {\n        return { ...plugin, ...plugin.prepare(this.result) }\n      } else {\n        return plugin\n      }\n    })\n  }\n\n  async() {\n    if (this.error) return Promise.reject(this.error)\n    if (this.processed) return Promise.resolve(this.result)\n    if (!this.processing) {\n      this.processing = this.runAsync()\n    }\n    return this.processing\n  }\n\n  catch(onRejected) {\n    return this.async().catch(onRejected)\n  }\n\n  finally(onFinally) {\n    return this.async().then(onFinally, onFinally)\n  }\n\n  getAsyncError() {\n    throw new Error('Use process(css).then(cb) to work with async plugins')\n  }\n\n  handleError(error, node) {\n    let plugin = this.result.lastPlugin\n    try {\n      if (node) node.addToError(error)\n      this.error = error\n      if (error.name === 'CssSyntaxError' && !error.plugin) {\n        error.plugin = plugin.postcssPlugin\n        error.setMessage()\n      } else if (plugin.postcssVersion) {\n        if (process.env.NODE_ENV !== 'production') {\n          let pluginName = plugin.postcssPlugin\n          let pluginVer = plugin.postcssVersion\n          let runtimeVer = this.result.processor.version\n          let a = pluginVer.split('.')\n          let b = runtimeVer.split('.')\n\n          if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) {\n            // eslint-disable-next-line no-console\n            console.error(\n              'Unknown error from PostCSS plugin. Your current PostCSS ' +\n                'version is ' +\n                runtimeVer +\n                ', but ' +\n                pluginName +\n                ' uses ' +\n                pluginVer +\n                '. Perhaps this is the source of the error below.'\n            )\n          }\n        }\n      }\n    } catch (err) {\n      /* c8 ignore next 3 */\n      // eslint-disable-next-line no-console\n      if (console && console.error) console.error(err)\n    }\n    return error\n  }\n\n  prepareVisitors() {\n    this.listeners = {}\n    let add = (plugin, type, cb) => {\n      if (!this.listeners[type]) this.listeners[type] = []\n      this.listeners[type].push([plugin, cb])\n    }\n    for (let plugin of this.plugins) {\n      if (typeof plugin === 'object') {\n        for (let event in plugin) {\n          if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) {\n            throw new Error(\n              `Unknown event ${event} in ${plugin.postcssPlugin}. ` +\n                `Try to update PostCSS (${this.processor.version} now).`\n            )\n          }\n          if (!NOT_VISITORS[event]) {\n            if (typeof plugin[event] === 'object') {\n              for (let filter in plugin[event]) {\n                if (filter === '*') {\n                  add(plugin, event, plugin[event][filter])\n                } else {\n                  add(\n                    plugin,\n                    event + '-' + filter.toLowerCase(),\n                    plugin[event][filter]\n                  )\n                }\n              }\n            } else if (typeof plugin[event] === 'function') {\n              add(plugin, event, plugin[event])\n            }\n          }\n        }\n      }\n    }\n    this.hasListener = Object.keys(this.listeners).length > 0\n  }\n\n  async runAsync() {\n    this.plugin = 0\n    for (let i = 0; i < this.plugins.length; i++) {\n      let plugin = this.plugins[i]\n      let promise = this.runOnRoot(plugin)\n      if (isPromise(promise)) {\n        try {\n          await promise\n        } catch (error) {\n          throw this.handleError(error)\n        }\n      }\n    }\n\n    this.prepareVisitors()\n    if (this.hasListener) {\n      let root = this.result.root\n      while (!root[isClean]) {\n        root[isClean] = true\n        let stack = [toStack(root)]\n        while (stack.length > 0) {\n          let promise = this.visitTick(stack)\n          if (isPromise(promise)) {\n            try {\n              await promise\n            } catch (e) {\n              let node = stack[stack.length - 1].node\n              throw this.handleError(e, node)\n            }\n          }\n        }\n      }\n\n      if (this.listeners.OnceExit) {\n        for (let [plugin, visitor] of this.listeners.OnceExit) {\n          this.result.lastPlugin = plugin\n          try {\n            if (root.type === 'document') {\n              let roots = root.nodes.map(subRoot =>\n                visitor(subRoot, this.helpers)\n              )\n\n              await Promise.all(roots)\n            } else {\n              await visitor(root, this.helpers)\n            }\n          } catch (e) {\n            throw this.handleError(e)\n          }\n        }\n      }\n    }\n\n    this.processed = true\n    return this.stringify()\n  }\n\n  runOnRoot(plugin) {\n    this.result.lastPlugin = plugin\n    try {\n      if (typeof plugin === 'object' && plugin.Once) {\n        if (this.result.root.type === 'document') {\n          let roots = this.result.root.nodes.map(root =>\n            plugin.Once(root, this.helpers)\n          )\n\n          if (isPromise(roots[0])) {\n            return Promise.all(roots)\n          }\n\n          return roots\n        }\n\n        return plugin.Once(this.result.root, this.helpers)\n      } else if (typeof plugin === 'function') {\n        return plugin(this.result.root, this.result)\n      }\n    } catch (error) {\n      throw this.handleError(error)\n    }\n  }\n\n  stringify() {\n    if (this.error) throw this.error\n    if (this.stringified) return this.result\n    this.stringified = true\n\n    this.sync()\n\n    let opts = this.result.opts\n    let str = stringify\n    if (opts.syntax) str = opts.syntax.stringify\n    if (opts.stringifier) str = opts.stringifier\n    if (str.stringify) str = str.stringify\n\n    let rootSource = this.result.root.source\n    if (\n      opts.map === undefined &&\n      !(rootSource && rootSource.input && rootSource.input.map)\n    ) {\n      let result = ''\n      str(this.result.root, i => {\n        result += i\n      })\n      this.result.css = result\n      return this.result\n    }\n\n    let map = new MapGenerator(str, this.result.root, this.result.opts)\n    let data = map.generate()\n    this.result.css = data[0]\n    this.result.map = data[1]\n\n    return this.result\n  }\n\n  sync() {\n    if (this.error) throw this.error\n    if (this.processed) return this.result\n    this.processed = true\n\n    if (this.processing) {\n      throw this.getAsyncError()\n    }\n\n    for (let plugin of this.plugins) {\n      let promise = this.runOnRoot(plugin)\n      if (isPromise(promise)) {\n        throw this.getAsyncError()\n      }\n    }\n\n    this.prepareVisitors()\n    if (this.hasListener) {\n      let root = this.result.root\n      while (!root[isClean]) {\n        root[isClean] = true\n        this.walkSync(root)\n      }\n      if (this.listeners.OnceExit) {\n        if (root.type === 'document') {\n          for (let subRoot of root.nodes) {\n            this.visitSync(this.listeners.OnceExit, subRoot)\n          }\n        } else {\n          this.visitSync(this.listeners.OnceExit, root)\n        }\n      }\n    }\n\n    return this.result\n  }\n\n  then(onFulfilled, onRejected) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!('from' in this.opts)) {\n        warnOnce(\n          'Without `from` option PostCSS could generate wrong source map ' +\n            'and will not find Browserslist config. Set it to CSS file path ' +\n            'or to `undefined` to prevent this warning.'\n        )\n      }\n    }\n    return this.async().then(onFulfilled, onRejected)\n  }\n\n  toString() {\n    return this.css\n  }\n\n  visitSync(visitors, node) {\n    for (let [plugin, visitor] of visitors) {\n      this.result.lastPlugin = plugin\n      let promise\n      try {\n        promise = visitor(node, this.helpers)\n      } catch (e) {\n        throw this.handleError(e, node.proxyOf)\n      }\n      if (node.type !== 'root' && node.type !== 'document' && !node.parent) {\n        return true\n      }\n      if (isPromise(promise)) {\n        throw this.getAsyncError()\n      }\n    }\n  }\n\n  visitTick(stack) {\n    let visit = stack[stack.length - 1]\n    let { node, visitors } = visit\n\n    if (node.type !== 'root' && node.type !== 'document' && !node.parent) {\n      stack.pop()\n      return\n    }\n\n    if (visitors.length > 0 && visit.visitorIndex < visitors.length) {\n      let [plugin, visitor] = visitors[visit.visitorIndex]\n      visit.visitorIndex += 1\n      if (visit.visitorIndex === visitors.length) {\n        visit.visitors = []\n        visit.visitorIndex = 0\n      }\n      this.result.lastPlugin = plugin\n      try {\n        return visitor(node.toProxy(), this.helpers)\n      } catch (e) {\n        throw this.handleError(e, node)\n      }\n    }\n\n    if (visit.iterator !== 0) {\n      let iterator = visit.iterator\n      let child\n      while ((child = node.nodes[node.indexes[iterator]])) {\n        node.indexes[iterator] += 1\n        if (!child[isClean]) {\n          child[isClean] = true\n          stack.push(toStack(child))\n          return\n        }\n      }\n      visit.iterator = 0\n      delete node.indexes[iterator]\n    }\n\n    let events = visit.events\n    while (visit.eventIndex < events.length) {\n      let event = events[visit.eventIndex]\n      visit.eventIndex += 1\n      if (event === CHILDREN) {\n        if (node.nodes && node.nodes.length) {\n          node[isClean] = true\n          visit.iterator = node.getIterator()\n        }\n        return\n      } else if (this.listeners[event]) {\n        visit.visitors = this.listeners[event]\n        return\n      }\n    }\n    stack.pop()\n  }\n\n  walkSync(node) {\n    node[isClean] = true\n    let events = getEvents(node)\n    for (let event of events) {\n      if (event === CHILDREN) {\n        if (node.nodes) {\n          node.each(child => {\n            if (!child[isClean]) this.walkSync(child)\n          })\n        }\n      } else {\n        let visitors = this.listeners[event]\n        if (visitors) {\n          if (this.visitSync(visitors, node.toProxy())) return\n        }\n      }\n    }\n  }\n\n  warnings() {\n    return this.sync().warnings()\n  }\n}\n\nLazyResult.registerPostcss = dependant => {\n  postcss = dependant\n}\n\nmodule.exports = LazyResult\nLazyResult.default = LazyResult\n\nRoot.registerLazyResult(LazyResult)\nDocument.registerLazyResult(LazyResult)\n","'use strict'\n\nlet list = {\n  comma(string) {\n    return list.split(string, [','], true)\n  },\n\n  space(string) {\n    let spaces = [' ', '\\n', '\\t']\n    return list.split(string, spaces)\n  },\n\n  split(string, separators, last) {\n    let array = []\n    let current = ''\n    let split = false\n\n    let func = 0\n    let inQuote = false\n    let prevQuote = ''\n    let escape = false\n\n    for (let letter of string) {\n      if (escape) {\n        escape = false\n      } else if (letter === '\\\\') {\n        escape = true\n      } else if (inQuote) {\n        if (letter === prevQuote) {\n          inQuote = false\n        }\n      } else if (letter === '\"' || letter === \"'\") {\n        inQuote = true\n        prevQuote = letter\n      } else if (letter === '(') {\n        func += 1\n      } else if (letter === ')') {\n        if (func > 0) func -= 1\n      } else if (func === 0) {\n        if (separators.includes(letter)) split = true\n      }\n\n      if (split) {\n        if (current !== '') array.push(current.trim())\n        current = ''\n        split = false\n      } else {\n        current += letter\n      }\n    }\n\n    if (last || current !== '') array.push(current.trim())\n    return array\n  }\n}\n\nmodule.exports = list\nlist.default = list\n","'use strict'\n\nlet { dirname, relative, resolve, sep } = require('path')\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { pathToFileURL } = require('url')\n\nlet Input = require('./input')\n\nlet sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)\nlet pathAvailable = Boolean(dirname && resolve && relative && sep)\n\nclass MapGenerator {\n  constructor(stringify, root, opts, cssString) {\n    this.stringify = stringify\n    this.mapOpts = opts.map || {}\n    this.root = root\n    this.opts = opts\n    this.css = cssString\n    this.originalCSS = cssString\n    this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute\n\n    this.memoizedFileURLs = new Map()\n    this.memoizedPaths = new Map()\n    this.memoizedURLs = new Map()\n  }\n\n  addAnnotation() {\n    let content\n\n    if (this.isInline()) {\n      content =\n        'data:application/json;base64,' + this.toBase64(this.map.toString())\n    } else if (typeof this.mapOpts.annotation === 'string') {\n      content = this.mapOpts.annotation\n    } else if (typeof this.mapOpts.annotation === 'function') {\n      content = this.mapOpts.annotation(this.opts.to, this.root)\n    } else {\n      content = this.outputFile() + '.map'\n    }\n    let eol = '\\n'\n    if (this.css.includes('\\r\\n')) eol = '\\r\\n'\n\n    this.css += eol + '/*# sourceMappingURL=' + content + ' */'\n  }\n\n  applyPrevMaps() {\n    for (let prev of this.previous()) {\n      let from = this.toUrl(this.path(prev.file))\n      let root = prev.root || dirname(prev.file)\n      let map\n\n      if (this.mapOpts.sourcesContent === false) {\n        map = new SourceMapConsumer(prev.text)\n        if (map.sourcesContent) {\n          map.sourcesContent = null\n        }\n      } else {\n        map = prev.consumer()\n      }\n\n      this.map.applySourceMap(map, from, this.toUrl(this.path(root)))\n    }\n  }\n\n  clearAnnotation() {\n    if (this.mapOpts.annotation === false) return\n\n    if (this.root) {\n      let node\n      for (let i = this.root.nodes.length - 1; i >= 0; i--) {\n        node = this.root.nodes[i]\n        if (node.type !== 'comment') continue\n        if (node.text.startsWith('# sourceMappingURL=')) {\n          this.root.removeChild(i)\n        }\n      }\n    } else if (this.css) {\n      let startIndex\n      while ((startIndex = this.css.lastIndexOf('/*#')) !== -1) {\n        let endIndex = this.css.indexOf('*/', startIndex + 3)\n        if (endIndex === -1) break\n        while (startIndex > 0 && this.css[startIndex - 1] === '\\n') {\n          startIndex--\n        }\n        this.css = this.css.slice(0, startIndex) + this.css.slice(endIndex + 2)\n      }\n    }\n  }\n\n  generate() {\n    this.clearAnnotation()\n    if (pathAvailable && sourceMapAvailable && this.isMap()) {\n      return this.generateMap()\n    } else {\n      let result = ''\n      this.stringify(this.root, i => {\n        result += i\n      })\n      return [result]\n    }\n  }\n\n  generateMap() {\n    if (this.root) {\n      this.generateString()\n    } else if (this.previous().length === 1) {\n      let prev = this.previous()[0].consumer()\n      prev.file = this.outputFile()\n      this.map = SourceMapGenerator.fromSourceMap(prev, {\n        ignoreInvalidMapping: true\n      })\n    } else {\n      this.map = new SourceMapGenerator({\n        file: this.outputFile(),\n        ignoreInvalidMapping: true\n      })\n      this.map.addMapping({\n        generated: { column: 0, line: 1 },\n        original: { column: 0, line: 1 },\n        source: this.opts.from\n          ? this.toUrl(this.path(this.opts.from))\n          : '<no source>'\n      })\n    }\n\n    if (this.isSourcesContent()) this.setSourcesContent()\n    if (this.root && this.previous().length > 0) this.applyPrevMaps()\n    if (this.isAnnotation()) this.addAnnotation()\n\n    if (this.isInline()) {\n      return [this.css]\n    } else {\n      return [this.css, this.map]\n    }\n  }\n\n  generateString() {\n    this.css = ''\n    this.map = new SourceMapGenerator({\n      file: this.outputFile(),\n      ignoreInvalidMapping: true\n    })\n\n    let line = 1\n    let column = 1\n\n    let noSource = '<no source>'\n    let mapping = {\n      generated: { column: 0, line: 0 },\n      original: { column: 0, line: 0 },\n      source: ''\n    }\n\n    let last, lines\n    this.stringify(this.root, (str, node, type) => {\n      this.css += str\n\n      if (node && type !== 'end') {\n        mapping.generated.line = line\n        mapping.generated.column = column - 1\n        if (node.source && node.source.start) {\n          mapping.source = this.sourcePath(node)\n          mapping.original.line = node.source.start.line\n          mapping.original.column = node.source.start.column - 1\n          this.map.addMapping(mapping)\n        } else {\n          mapping.source = noSource\n          mapping.original.line = 1\n          mapping.original.column = 0\n          this.map.addMapping(mapping)\n        }\n      }\n\n      lines = str.match(/\\n/g)\n      if (lines) {\n        line += lines.length\n        last = str.lastIndexOf('\\n')\n        column = str.length - last\n      } else {\n        column += str.length\n      }\n\n      if (node && type !== 'start') {\n        let p = node.parent || { raws: {} }\n        let childless =\n          node.type === 'decl' || (node.type === 'atrule' && !node.nodes)\n        if (!childless || node !== p.last || p.raws.semicolon) {\n          if (node.source && node.source.end) {\n            mapping.source = this.sourcePath(node)\n            mapping.original.line = node.source.end.line\n            mapping.original.column = node.source.end.column - 1\n            mapping.generated.line = line\n            mapping.generated.column = column - 2\n            this.map.addMapping(mapping)\n          } else {\n            mapping.source = noSource\n            mapping.original.line = 1\n            mapping.original.column = 0\n            mapping.generated.line = line\n            mapping.generated.column = column - 1\n            this.map.addMapping(mapping)\n          }\n        }\n      }\n    })\n  }\n\n  isAnnotation() {\n    if (this.isInline()) {\n      return true\n    }\n    if (typeof this.mapOpts.annotation !== 'undefined') {\n      return this.mapOpts.annotation\n    }\n    if (this.previous().length) {\n      return this.previous().some(i => i.annotation)\n    }\n    return true\n  }\n\n  isInline() {\n    if (typeof this.mapOpts.inline !== 'undefined') {\n      return this.mapOpts.inline\n    }\n\n    let annotation = this.mapOpts.annotation\n    if (typeof annotation !== 'undefined' && annotation !== true) {\n      return false\n    }\n\n    if (this.previous().length) {\n      return this.previous().some(i => i.inline)\n    }\n    return true\n  }\n\n  isMap() {\n    if (typeof this.opts.map !== 'undefined') {\n      return !!this.opts.map\n    }\n    return this.previous().length > 0\n  }\n\n  isSourcesContent() {\n    if (typeof this.mapOpts.sourcesContent !== 'undefined') {\n      return this.mapOpts.sourcesContent\n    }\n    if (this.previous().length) {\n      return this.previous().some(i => i.withContent())\n    }\n    return true\n  }\n\n  outputFile() {\n    if (this.opts.to) {\n      return this.path(this.opts.to)\n    } else if (this.opts.from) {\n      return this.path(this.opts.from)\n    } else {\n      return 'to.css'\n    }\n  }\n\n  path(file) {\n    if (this.mapOpts.absolute) return file\n    if (file.charCodeAt(0) === 60 /* `<` */) return file\n    if (/^\\w+:\\/\\//.test(file)) return file\n    let cached = this.memoizedPaths.get(file)\n    if (cached) return cached\n\n    let from = this.opts.to ? dirname(this.opts.to) : '.'\n\n    if (typeof this.mapOpts.annotation === 'string') {\n      from = dirname(resolve(from, this.mapOpts.annotation))\n    }\n\n    let path = relative(from, file)\n    this.memoizedPaths.set(file, path)\n\n    return path\n  }\n\n  previous() {\n    if (!this.previousMaps) {\n      this.previousMaps = []\n      if (this.root) {\n        this.root.walk(node => {\n          if (node.source && node.source.input.map) {\n            let map = node.source.input.map\n            if (!this.previousMaps.includes(map)) {\n              this.previousMaps.push(map)\n            }\n          }\n        })\n      } else {\n        let input = new Input(this.originalCSS, this.opts)\n        if (input.map) this.previousMaps.push(input.map)\n      }\n    }\n\n    return this.previousMaps\n  }\n\n  setSourcesContent() {\n    let already = {}\n    if (this.root) {\n      this.root.walk(node => {\n        if (node.source) {\n          let from = node.source.input.from\n          if (from && !already[from]) {\n            already[from] = true\n            let fromUrl = this.usesFileUrls\n              ? this.toFileUrl(from)\n              : this.toUrl(this.path(from))\n            this.map.setSourceContent(fromUrl, node.source.input.css)\n          }\n        }\n      })\n    } else if (this.css) {\n      let from = this.opts.from\n        ? this.toUrl(this.path(this.opts.from))\n        : '<no source>'\n      this.map.setSourceContent(from, this.css)\n    }\n  }\n\n  sourcePath(node) {\n    if (this.mapOpts.from) {\n      return this.toUrl(this.mapOpts.from)\n    } else if (this.usesFileUrls) {\n      return this.toFileUrl(node.source.input.from)\n    } else {\n      return this.toUrl(this.path(node.source.input.from))\n    }\n  }\n\n  toBase64(str) {\n    if (Buffer) {\n      return Buffer.from(str).toString('base64')\n    } else {\n      return window.btoa(unescape(encodeURIComponent(str)))\n    }\n  }\n\n  toFileUrl(path) {\n    let cached = this.memoizedFileURLs.get(path)\n    if (cached) return cached\n\n    if (pathToFileURL) {\n      let fileURL = pathToFileURL(path).toString()\n      this.memoizedFileURLs.set(path, fileURL)\n\n      return fileURL\n    } else {\n      throw new Error(\n        '`map.absolute` option is not available in this PostCSS build'\n      )\n    }\n  }\n\n  toUrl(path) {\n    let cached = this.memoizedURLs.get(path)\n    if (cached) return cached\n\n    if (sep === '\\\\') {\n      path = path.replace(/\\\\/g, '/')\n    }\n\n    let url = encodeURI(path).replace(/[#?]/g, encodeURIComponent)\n    this.memoizedURLs.set(path, url)\n\n    return url\n  }\n}\n\nmodule.exports = MapGenerator\n","'use strict'\n\nlet MapGenerator = require('./map-generator')\nlet parse = require('./parse')\nlet Result = require('./result')\nlet stringify = require('./stringify')\nlet warnOnce = require('./warn-once')\n\nclass NoWorkResult {\n  get content() {\n    return this.result.css\n  }\n\n  get css() {\n    return this.result.css\n  }\n\n  get map() {\n    return this.result.map\n  }\n\n  get messages() {\n    return []\n  }\n\n  get opts() {\n    return this.result.opts\n  }\n\n  get processor() {\n    return this.result.processor\n  }\n\n  get root() {\n    if (this._root) {\n      return this._root\n    }\n\n    let root\n    let parser = parse\n\n    try {\n      root = parser(this._css, this._opts)\n    } catch (error) {\n      this.error = error\n    }\n\n    if (this.error) {\n      throw this.error\n    } else {\n      this._root = root\n      return root\n    }\n  }\n\n  get [Symbol.toStringTag]() {\n    return 'NoWorkResult'\n  }\n\n  constructor(processor, css, opts) {\n    css = css.toString()\n    this.stringified = false\n\n    this._processor = processor\n    this._css = css\n    this._opts = opts\n    this._map = undefined\n\n    let str = stringify\n    this.result = new Result(this._processor, undefined, this._opts)\n    this.result.css = css\n\n    let self = this\n    Object.defineProperty(this.result, 'root', {\n      get() {\n        return self.root\n      }\n    })\n\n    let map = new MapGenerator(str, undefined, this._opts, css)\n    if (map.isMap()) {\n      let [generatedCSS, generatedMap] = map.generate()\n      if (generatedCSS) {\n        this.result.css = generatedCSS\n      }\n      if (generatedMap) {\n        this.result.map = generatedMap\n      }\n    } else {\n      map.clearAnnotation()\n      this.result.css = map.css\n    }\n  }\n\n  async() {\n    if (this.error) return Promise.reject(this.error)\n    return Promise.resolve(this.result)\n  }\n\n  catch(onRejected) {\n    return this.async().catch(onRejected)\n  }\n\n  finally(onFinally) {\n    return this.async().then(onFinally, onFinally)\n  }\n\n  sync() {\n    if (this.error) throw this.error\n    return this.result\n  }\n\n  then(onFulfilled, onRejected) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!('from' in this._opts)) {\n        warnOnce(\n          'Without `from` option PostCSS could generate wrong source map ' +\n            'and will not find Browserslist config. Set it to CSS file path ' +\n            'or to `undefined` to prevent this warning.'\n        )\n      }\n    }\n\n    return this.async().then(onFulfilled, onRejected)\n  }\n\n  toString() {\n    return this._css\n  }\n\n  warnings() {\n    return []\n  }\n}\n\nmodule.exports = NoWorkResult\nNoWorkResult.default = NoWorkResult\n","'use strict'\n\nlet CssSyntaxError = require('./css-syntax-error')\nlet Stringifier = require('./stringifier')\nlet stringify = require('./stringify')\nlet { isClean, my } = require('./symbols')\n\nfunction cloneNode(obj, parent) {\n  let cloned = new obj.constructor()\n\n  for (let i in obj) {\n    if (!Object.prototype.hasOwnProperty.call(obj, i)) {\n      /* c8 ignore next 2 */\n      continue\n    }\n    if (i === 'proxyCache') continue\n    let value = obj[i]\n    let type = typeof value\n\n    if (i === 'parent' && type === 'object') {\n      if (parent) cloned[i] = parent\n    } else if (i === 'source') {\n      cloned[i] = value\n    } else if (Array.isArray(value)) {\n      cloned[i] = value.map(j => cloneNode(j, cloned))\n    } else {\n      if (type === 'object' && value !== null) value = cloneNode(value)\n      cloned[i] = value\n    }\n  }\n\n  return cloned\n}\n\nfunction sourceOffset(inputCSS, position) {\n  // Not all custom syntaxes support `offset` in `source.start` and `source.end`\n  if (position && typeof position.offset !== 'undefined') {\n    return position.offset\n  }\n\n  let column = 1\n  let line = 1\n  let offset = 0\n\n  for (let i = 0; i < inputCSS.length; i++) {\n    if (line === position.line && column === position.column) {\n      offset = i\n      break\n    }\n\n    if (inputCSS[i] === '\\n') {\n      column = 1\n      line += 1\n    } else {\n      column += 1\n    }\n  }\n\n  return offset\n}\n\nclass Node {\n  get proxyOf() {\n    return this\n  }\n\n  constructor(defaults = {}) {\n    this.raws = {}\n    this[isClean] = false\n    this[my] = true\n\n    for (let name in defaults) {\n      if (name === 'nodes') {\n        this.nodes = []\n        for (let node of defaults[name]) {\n          // Clone only nodes that already belong to another tree, so passing a\n          // freshly created (parent-less) node adopts that instance instead of\n          // a copy and keeps the caller's reference usable. See #1987.\n          if (typeof node.clone === 'function' && node.parent) {\n            this.append(node.clone())\n          } else {\n            this.append(node)\n          }\n        }\n      } else {\n        this[name] = defaults[name]\n      }\n    }\n  }\n\n  addToError(error) {\n    error.postcssNode = this\n    if (error.stack && this.source && /\\n\\s{4}at /.test(error.stack)) {\n      let s = this.source\n      error.stack = error.stack.replace(\n        /\\n\\s{4}at /,\n        `$&${s.input.from}:${s.start.line}:${s.start.column}$&`\n      )\n    }\n    return error\n  }\n\n  after(add) {\n    this.parent.insertAfter(this, add)\n    return this\n  }\n\n  assign(overrides = {}) {\n    for (let name in overrides) {\n      this[name] = overrides[name]\n    }\n    return this\n  }\n\n  before(add) {\n    this.parent.insertBefore(this, add)\n    return this\n  }\n\n  cleanRaws(keepBetween) {\n    delete this.raws.before\n    delete this.raws.after\n    if (!keepBetween) delete this.raws.between\n  }\n\n  clone(overrides = {}) {\n    let cloned = cloneNode(this)\n    for (let name in overrides) {\n      cloned[name] = overrides[name]\n    }\n    return cloned\n  }\n\n  cloneAfter(overrides = {}) {\n    let cloned = this.clone(overrides)\n    this.parent.insertAfter(this, cloned)\n    return cloned\n  }\n\n  cloneBefore(overrides = {}) {\n    let cloned = this.clone(overrides)\n    this.parent.insertBefore(this, cloned)\n    return cloned\n  }\n\n  error(message, opts = {}) {\n    if (this.source) {\n      let { end, start } = this.rangeBy(opts)\n      return this.source.input.error(\n        message,\n        { column: start.column, line: start.line },\n        { column: end.column, line: end.line },\n        opts\n      )\n    }\n    return new CssSyntaxError(message)\n  }\n\n  getProxyProcessor() {\n    return {\n      get(node, prop) {\n        if (prop === 'proxyOf') {\n          return node\n        } else if (prop === 'root') {\n          return () => node.root().toProxy()\n        } else {\n          return node[prop]\n        }\n      },\n\n      set(node, prop, value) {\n        if (node[prop] === value) return true\n        node[prop] = value\n        if (\n          prop === 'prop' ||\n          prop === 'value' ||\n          prop === 'name' ||\n          prop === 'params' ||\n          prop === 'important' ||\n          /* c8 ignore next */\n          prop === 'text'\n        ) {\n          node.markDirty()\n        }\n        return true\n      }\n    }\n  }\n\n  /* c8 ignore next 3 */\n  markClean() {\n    this[isClean] = true\n  }\n\n  markDirty() {\n    if (this[isClean]) {\n      this[isClean] = false\n      let next = this\n      while ((next = next.parent)) {\n        next[isClean] = false\n      }\n    }\n  }\n\n  next() {\n    if (!this.parent) return undefined\n    let index = this.parent.index(this)\n    return this.parent.nodes[index + 1]\n  }\n\n  positionBy(opts = {}) {\n    let inputString =\n      'document' in this.source.input\n        ? this.source.input.document\n        : this.source.input.css\n    let pos = {\n      column: this.source.start.column,\n      line: this.source.start.line,\n      offset: sourceOffset(inputString, this.source.start)\n    }\n    if (opts.index) {\n      pos = this.positionInside(opts.index)\n    } else if (opts.word) {\n      let stringRepresentation = inputString.slice(\n        sourceOffset(inputString, this.source.start),\n        sourceOffset(inputString, this.source.end)\n      )\n      let index = stringRepresentation.indexOf(opts.word)\n      if (index !== -1) pos = this.positionInside(index)\n    }\n    return pos\n  }\n\n  positionInside(index) {\n    let column = this.source.start.column\n    let line = this.source.start.line\n    let inputString =\n      'document' in this.source.input\n        ? this.source.input.document\n        : this.source.input.css\n    let offset = sourceOffset(inputString, this.source.start)\n    let end = offset + index\n\n    for (let i = offset; i < end; i++) {\n      if (inputString[i] === '\\n') {\n        column = 1\n        line += 1\n      } else {\n        column += 1\n      }\n    }\n\n    return { column, line, offset: end }\n  }\n\n  prev() {\n    if (!this.parent) return undefined\n    let index = this.parent.index(this)\n    return this.parent.nodes[index - 1]\n  }\n\n  rangeBy(opts = {}) {\n    let inputString =\n      'document' in this.source.input\n        ? this.source.input.document\n        : this.source.input.css\n    let start = {\n      column: this.source.start.column,\n      line: this.source.start.line,\n      offset: sourceOffset(inputString, this.source.start)\n    }\n    let end = this.source.end\n      ? {\n          column: this.source.end.column + 1,\n          line: this.source.end.line,\n          offset:\n            typeof this.source.end.offset === 'number'\n              ? // `source.end.offset` is exclusive, so we don't need to add 1\n                this.source.end.offset\n              : // Since line/column in this.source.end is inclusive,\n                // the `sourceOffset(... , this.source.end)` returns an inclusive offset.\n                // So, we add 1 to convert it to exclusive.\n                sourceOffset(inputString, this.source.end) + 1\n        }\n      : {\n          column: start.column + 1,\n          line: start.line,\n          offset: start.offset + 1\n        }\n\n    if (opts.word) {\n      let stringRepresentation = inputString.slice(\n        sourceOffset(inputString, this.source.start),\n        sourceOffset(inputString, this.source.end)\n      )\n      let index = stringRepresentation.indexOf(opts.word)\n      if (index !== -1) {\n        start = this.positionInside(index)\n        end = this.positionInside(index + opts.word.length)\n      }\n    } else {\n      if (opts.start) {\n        start = {\n          column: opts.start.column,\n          line: opts.start.line,\n          offset: sourceOffset(inputString, opts.start)\n        }\n      } else if (typeof opts.index === 'number') {\n        start = this.positionInside(opts.index)\n      }\n\n      if (opts.end) {\n        end = {\n          column: opts.end.column,\n          line: opts.end.line,\n          offset: sourceOffset(inputString, opts.end)\n        }\n      } else if (typeof opts.endIndex === 'number') {\n        end = this.positionInside(opts.endIndex)\n      } else if (typeof opts.index === 'number') {\n        end = this.positionInside(opts.index + 1)\n      }\n    }\n\n    if (\n      end.line < start.line ||\n      (end.line === start.line && end.column <= start.column)\n    ) {\n      end = {\n        column: start.column + 1,\n        line: start.line,\n        offset: start.offset + 1\n      }\n    }\n\n    return { end, start }\n  }\n\n  raw(prop, defaultType) {\n    let str = new Stringifier()\n    return str.raw(this, prop, defaultType)\n  }\n\n  remove() {\n    if (this.parent) {\n      this.parent.removeChild(this)\n    }\n    this.parent = undefined\n    return this\n  }\n\n  replaceWith(...nodes) {\n    if (this.parent) {\n      let bookmark = this\n      let foundSelf = false\n      for (let node of nodes) {\n        if (node === this) {\n          foundSelf = true\n        } else if (foundSelf) {\n          this.parent.insertAfter(bookmark, node)\n          bookmark = node\n        } else {\n          this.parent.insertBefore(bookmark, node)\n        }\n      }\n\n      if (!foundSelf) {\n        this.remove()\n      }\n    }\n\n    return this\n  }\n\n  root() {\n    let result = this\n    while (result.parent && result.parent.type !== 'document') {\n      result = result.parent\n    }\n    return result\n  }\n\n  toJSON(_, inputs) {\n    let fixed = {}\n    let emitInputs = inputs == null\n    inputs = inputs || new Map()\n    let inputsNextIndex = 0\n\n    for (let name in this) {\n      if (!Object.prototype.hasOwnProperty.call(this, name)) {\n        /* c8 ignore next 2 */\n        continue\n      }\n      if (name === 'parent' || name === 'proxyCache') continue\n      let value = this[name]\n\n      if (Array.isArray(value)) {\n        fixed[name] = value.map(i => {\n          if (typeof i === 'object' && i.toJSON) {\n            return i.toJSON(null, inputs)\n          } else {\n            return i\n          }\n        })\n      } else if (typeof value === 'object' && value.toJSON) {\n        fixed[name] = value.toJSON(null, inputs)\n      } else if (name === 'source') {\n        if (value == null) continue\n        let inputId = inputs.get(value.input)\n        if (inputId == null) {\n          inputId = inputsNextIndex\n          inputs.set(value.input, inputsNextIndex)\n          inputsNextIndex++\n        }\n        fixed[name] = {\n          end: value.end,\n          inputId,\n          start: value.start\n        }\n      } else {\n        fixed[name] = value\n      }\n    }\n\n    if (emitInputs) {\n      fixed.inputs = [...inputs.keys()].map(input => input.toJSON())\n    }\n\n    return fixed\n  }\n\n  toProxy() {\n    if (!this.proxyCache) {\n      this.proxyCache = new Proxy(this, this.getProxyProcessor())\n    }\n    return this.proxyCache\n  }\n\n  toString(stringifier = stringify) {\n    if (stringifier.stringify) stringifier = stringifier.stringify\n    let result = ''\n    stringifier(this, i => {\n      result += i\n    })\n    return result\n  }\n\n  warn(result, text, opts = {}) {\n    let data = { node: this }\n    for (let i in opts) data[i] = opts[i]\n    return result.warn(text, data)\n  }\n}\n\nmodule.exports = Node\nNode.default = Node\n","'use strict'\n\nlet Container = require('./container')\nlet Input = require('./input')\nlet Parser = require('./parser')\n\nfunction parse(css, opts) {\n  let input = new Input(css, opts)\n  let parser = new Parser(input)\n  try {\n    parser.parse()\n  } catch (e) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (e.name === 'CssSyntaxError' && opts && opts.from) {\n        if (/\\.scss$/i.test(opts.from)) {\n          e.message +=\n            '\\nYou tried to parse SCSS with ' +\n            'the standard CSS parser; ' +\n            'try again with the postcss-scss parser'\n        } else if (/\\.sass/i.test(opts.from)) {\n          e.message +=\n            '\\nYou tried to parse Sass with ' +\n            'the standard CSS parser; ' +\n            'try again with the postcss-sass parser'\n        } else if (/\\.less$/i.test(opts.from)) {\n          e.message +=\n            '\\nYou tried to parse Less with ' +\n            'the standard CSS parser; ' +\n            'try again with the postcss-less parser'\n        }\n      }\n    }\n    throw e\n  }\n\n  return parser.root\n}\n\nmodule.exports = parse\nparse.default = parse\n\nContainer.registerParse(parse)\n","'use strict'\n\nlet AtRule = require('./at-rule')\nlet Comment = require('./comment')\nlet Declaration = require('./declaration')\nlet Root = require('./root')\nlet Rule = require('./rule')\nlet tokenizer = require('./tokenize')\n\nconst SAFE_COMMENT_NEIGHBOR = {\n  empty: true,\n  space: true\n}\n\nfunction findLastWithPosition(tokens) {\n  for (let i = tokens.length - 1; i >= 0; i--) {\n    let token = tokens[i]\n    let pos = token[3] || token[2]\n    if (pos) return pos\n  }\n}\n\nfunction tokensToString(tokens, from, to) {\n  let result = ''\n  for (let i = from; i < to; i++) result += tokens[i][1]\n  return result\n}\n\nclass Parser {\n  constructor(input) {\n    this.input = input\n\n    this.root = new Root()\n    this.current = this.root\n    this.spaces = ''\n    this.semicolon = false\n\n    this.createTokenizer()\n    this.root.source = { input, start: { column: 1, line: 1, offset: 0 } }\n  }\n\n  atrule(token) {\n    let node = new AtRule()\n    node.name = token[1].slice(1)\n    if (node.name === '') {\n      this.unnamedAtrule(node, token)\n    }\n    this.init(node, token[2])\n\n    let type\n    let prev\n    let shift\n    let last = false\n    let open = false\n    let params = []\n    let brackets = []\n\n    while (!this.tokenizer.endOfFile()) {\n      token = this.tokenizer.nextToken()\n      type = token[0]\n\n      if (type === '(' || type === '[') {\n        brackets.push(type === '(' ? ')' : ']')\n      } else if (type === '{' && brackets.length > 0) {\n        brackets.push('}')\n      } else if (type === brackets[brackets.length - 1]) {\n        brackets.pop()\n      }\n\n      if (brackets.length === 0) {\n        if (type === ';') {\n          node.source.end = this.getPosition(token[2])\n          node.source.end.offset++\n          this.semicolon = true\n          break\n        } else if (type === '{') {\n          open = true\n          break\n        } else if (type === '}') {\n          if (params.length > 0) {\n            shift = params.length - 1\n            prev = params[shift]\n            while (prev && prev[0] === 'space') {\n              prev = params[--shift]\n            }\n            if (prev) {\n              node.source.end = this.getPosition(prev[3] || prev[2])\n              node.source.end.offset++\n            }\n          }\n          this.end(token)\n          break\n        } else {\n          params.push(token)\n        }\n      } else {\n        params.push(token)\n      }\n\n      if (this.tokenizer.endOfFile()) {\n        last = true\n        break\n      }\n    }\n\n    node.raws.between = this.spacesAndCommentsFromEnd(params)\n    if (params.length) {\n      node.raws.afterName = this.spacesAndCommentsFromStart(params)\n      this.raw(node, 'params', params)\n      if (last) {\n        token = params[params.length - 1]\n        node.source.end = this.getPosition(token[3] || token[2])\n        node.source.end.offset++\n        this.spaces = node.raws.between\n        node.raws.between = ''\n      }\n    } else {\n      node.raws.afterName = ''\n      node.params = ''\n    }\n\n    if (open) {\n      node.nodes = []\n      this.current = node\n    }\n  }\n\n  checkMissedSemicolon(tokens) {\n    let colon = this.colon(tokens)\n    if (colon === false) return\n\n    let founded = 0\n    let token\n    for (let j = colon - 1; j >= 0; j--) {\n      token = tokens[j]\n      if (token[0] !== 'space') {\n        founded += 1\n        if (founded === 2) break\n      }\n    }\n    // If the token is a word, e.g. `!important`, `red` or any other valid\n    // property's value. Then we need to return the colon after that word\n    // token. [3] is the \"end\" colon of that word. And because we need it\n    // after that one we do +1 to get the next one.\n    throw this.input.error(\n      'Missed semicolon',\n      token[0] === 'word' ? token[3] + 1 : token[2]\n    )\n  }\n\n  colon(tokens) {\n    let brackets = 0\n    let prev, token, type\n    for (let [i, element] of tokens.entries()) {\n      token = element\n      type = token[0]\n\n      if (type === '(') {\n        brackets += 1\n      }\n      if (type === ')') {\n        brackets -= 1\n      }\n      if (brackets === 0 && type === ':') {\n        if (!prev) {\n          this.doubleColon(token)\n        } else if (prev[0] === 'word' && prev[1] === 'progid') {\n          continue\n        } else {\n          return i\n        }\n      }\n\n      prev = token\n    }\n    return false\n  }\n\n  comment(token) {\n    let node = new Comment()\n    this.init(node, token[2])\n    node.source.end = this.getPosition(token[3] || token[2])\n    node.source.end.offset++\n\n    let text = token[1].slice(2, -2)\n    if (!text.trim()) {\n      node.text = ''\n      node.raws.left = text\n      node.raws.right = ''\n    } else {\n      let match = text.match(/^(\\s*)([^]*\\S)(\\s*)$/)\n      node.text = match[2]\n      node.raws.left = match[1]\n      node.raws.right = match[3]\n    }\n  }\n\n  createTokenizer() {\n    this.tokenizer = tokenizer(this.input)\n  }\n\n  decl(tokens, customProperty) {\n    let node = new Declaration()\n    this.init(node, tokens[0][2])\n\n    let last = tokens[tokens.length - 1]\n    if (last[0] === ';') {\n      this.semicolon = true\n      tokens.pop()\n    }\n\n    node.source.end = this.getPosition(\n      last[3] || last[2] || findLastWithPosition(tokens)\n    )\n    node.source.end.offset++\n\n    let start = 0\n    while (tokens[start][0] !== 'word') {\n      if (start === tokens.length - 1) this.unknownWord([tokens[start]])\n      start++\n    }\n    node.raws.before += tokensToString(tokens, 0, start)\n    node.source.start = this.getPosition(tokens[start][2])\n\n    let propStart = start\n    while (start < tokens.length) {\n      let type = tokens[start][0]\n      if (type === ':' || type === 'space' || type === 'comment') {\n        break\n      }\n      start++\n    }\n    node.prop = tokensToString(tokens, propStart, start)\n\n    let betweenStart = start\n    let token\n    while (start < tokens.length) {\n      token = tokens[start]\n      start++\n      if (token[0] === ':') break\n      if (token[0] === 'word' && /\\w/.test(token[1])) {\n        this.unknownWord([token])\n      }\n    }\n    node.raws.between = tokensToString(tokens, betweenStart, start)\n\n    if (node.prop[0] === '_' || node.prop[0] === '*') {\n      node.raws.before += node.prop[0]\n      node.prop = node.prop.slice(1)\n    }\n\n    let firstSpacesStart = start\n    while (start < tokens.length) {\n      let next = tokens[start][0]\n      if (next !== 'space' && next !== 'comment') break\n      start++\n    }\n    let firstSpaces = tokens.slice(firstSpacesStart, start)\n\n    tokens = tokens.slice(start)\n\n    this.precheckMissedSemicolon(tokens)\n\n    for (let i = tokens.length - 1; i >= 0; i--) {\n      token = tokens[i]\n      if (token[1].toLowerCase() === '!important') {\n        node.important = true\n        let string = this.stringFrom(tokens, i)\n        string = this.spacesFromEnd(tokens) + string\n        if (string !== ' !important') node.raws.important = string\n        break\n      } else if (token[1].toLowerCase() === 'important') {\n        let cache = tokens.slice(0)\n        let str = ''\n        for (let j = i; j > 0; j--) {\n          let type = cache[j][0]\n          if (str.trim().startsWith('!') && type !== 'space') {\n            break\n          }\n          str = cache.pop()[1] + str\n        }\n        if (str.trim().startsWith('!')) {\n          node.important = true\n          node.raws.important = str\n          tokens = cache\n        }\n      }\n\n      if (token[0] !== 'space' && token[0] !== 'comment') {\n        break\n      }\n    }\n\n    let hasWord = tokens.some(i => i[0] !== 'space' && i[0] !== 'comment')\n\n    if (hasWord) {\n      node.raws.between += firstSpaces.map(i => i[1]).join('')\n      firstSpaces = []\n    }\n    this.raw(node, 'value', firstSpaces.concat(tokens), customProperty)\n\n    if (node.value.includes(':') && !customProperty) {\n      this.checkMissedSemicolon(tokens)\n    }\n  }\n\n  doubleColon(token) {\n    throw this.input.error(\n      'Double colon',\n      { offset: token[2] },\n      { offset: token[2] + token[1].length }\n    )\n  }\n\n  emptyRule(token) {\n    let node = new Rule()\n    this.init(node, token[2])\n    node.selector = ''\n    node.raws.between = ''\n    this.current = node\n  }\n\n  end(token) {\n    if (this.current.nodes && this.current.nodes.length) {\n      this.current.raws.semicolon = this.semicolon\n    }\n    this.semicolon = false\n\n    this.current.raws.after = (this.current.raws.after || '') + this.spaces\n    this.spaces = ''\n\n    if (this.current.parent) {\n      this.current.source.end = this.getPosition(token[2])\n      this.current.source.end.offset++\n      this.current = this.current.parent\n    } else {\n      this.unexpectedClose(token)\n    }\n  }\n\n  endFile() {\n    if (this.current.parent) this.unclosedBlock()\n    if (this.current.nodes && this.current.nodes.length) {\n      this.current.raws.semicolon = this.semicolon\n    }\n    this.current.raws.after = (this.current.raws.after || '') + this.spaces\n    this.root.source.end = this.getPosition(this.tokenizer.position())\n  }\n\n  freeSemicolon(token) {\n    this.spaces += token[1]\n    if (this.current.nodes) {\n      let prev = this.current.nodes[this.current.nodes.length - 1]\n      if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) {\n        prev.raws.ownSemicolon = this.spaces\n        this.spaces = ''\n        prev.source.end = this.getPosition(token[2])\n        prev.source.end.offset += prev.raws.ownSemicolon.length\n      }\n    }\n  }\n\n  // Helpers\n\n  getPosition(offset) {\n    let pos = this.input.fromOffset(offset)\n    return {\n      column: pos.col,\n      line: pos.line,\n      offset\n    }\n  }\n\n  init(node, offset) {\n    this.current.push(node)\n    node.source = {\n      input: this.input,\n      start: this.getPosition(offset)\n    }\n    node.raws.before = this.spaces\n    this.spaces = ''\n    if (node.type !== 'comment') this.semicolon = false\n  }\n\n  other(start) {\n    let end = false\n    let type = null\n    let colon = false\n    let bracket = null\n    let brackets = []\n    let customProperty = start[1].startsWith('--')\n\n    let tokens = []\n    let token = start\n    while (token) {\n      type = token[0]\n      tokens.push(token)\n\n      if (type === '(' || type === '[') {\n        if (!bracket) bracket = token\n        brackets.push(type === '(' ? ')' : ']')\n      } else if (customProperty && colon && type === '{') {\n        if (!bracket) bracket = token\n        brackets.push('}')\n      } else if (brackets.length === 0) {\n        if (type === ';') {\n          if (colon) {\n            this.decl(tokens, customProperty)\n            return\n          } else {\n            break\n          }\n        } else if (type === '{') {\n          this.rule(tokens)\n          return\n        } else if (type === '}') {\n          this.tokenizer.back(tokens.pop())\n          end = true\n          break\n        } else if (type === ':') {\n          colon = true\n        }\n      } else if (type === brackets[brackets.length - 1]) {\n        brackets.pop()\n        if (brackets.length === 0) bracket = null\n      }\n\n      token = this.tokenizer.nextToken()\n    }\n\n    if (this.tokenizer.endOfFile()) end = true\n    if (brackets.length > 0) this.unclosedBracket(bracket)\n\n    if (end && colon) {\n      if (!customProperty) {\n        while (tokens.length) {\n          token = tokens[tokens.length - 1][0]\n          if (token !== 'space' && token !== 'comment') break\n          this.tokenizer.back(tokens.pop())\n        }\n      }\n      this.decl(tokens, customProperty)\n    } else {\n      this.unknownWord(tokens)\n    }\n  }\n\n  parse() {\n    let token\n    while (!this.tokenizer.endOfFile()) {\n      token = this.tokenizer.nextToken()\n\n      switch (token[0]) {\n        case 'space':\n          this.spaces += token[1]\n          break\n\n        case ';':\n          this.freeSemicolon(token)\n          break\n\n        case '}':\n          this.end(token)\n          break\n\n        case 'comment':\n          this.comment(token)\n          break\n\n        case 'at-word':\n          this.atrule(token)\n          break\n\n        case '{':\n          this.emptyRule(token)\n          break\n\n        default:\n          this.other(token)\n          break\n      }\n    }\n    this.endFile()\n  }\n\n  precheckMissedSemicolon(/* tokens */) {\n    // Hook for Safe Parser\n  }\n\n  raw(node, prop, tokens, customProperty) {\n    let token, type\n    let length = tokens.length\n    let value = ''\n    let clean = true\n    let next, prev\n\n    for (let i = 0; i < length; i += 1) {\n      token = tokens[i]\n      type = token[0]\n      if (type === 'space' && i === length - 1 && !customProperty) {\n        clean = false\n      } else if (type === 'comment') {\n        prev = tokens[i - 1] ? tokens[i - 1][0] : 'empty'\n        next = tokens[i + 1] ? tokens[i + 1][0] : 'empty'\n        if (!SAFE_COMMENT_NEIGHBOR[prev] && !SAFE_COMMENT_NEIGHBOR[next]) {\n          if (value.slice(-1) === ',') {\n            clean = false\n          } else {\n            value += token[1]\n          }\n        } else {\n          clean = false\n        }\n      } else {\n        value += token[1]\n      }\n    }\n    if (!clean) {\n      let raw = tokens.reduce((all, i) => all + i[1], '')\n      node.raws[prop] = { raw, value }\n    }\n    node[prop] = value\n  }\n\n  rule(tokens) {\n    tokens.pop()\n\n    let node = new Rule()\n    this.init(node, tokens[0][2])\n\n    node.raws.between = this.spacesAndCommentsFromEnd(tokens)\n    this.raw(node, 'selector', tokens)\n    this.current = node\n  }\n\n  spacesAndCommentsFromEnd(tokens) {\n    let lastTokenType\n    let spaces = ''\n    while (tokens.length) {\n      lastTokenType = tokens[tokens.length - 1][0]\n      if (lastTokenType !== 'space' && lastTokenType !== 'comment') break\n      spaces = tokens.pop()[1] + spaces\n    }\n    return spaces\n  }\n\n  // Errors\n\n  spacesAndCommentsFromStart(tokens) {\n    let next\n    let spaces = ''\n    while (tokens.length) {\n      next = tokens[0][0]\n      if (next !== 'space' && next !== 'comment') break\n      spaces += tokens.shift()[1]\n    }\n    return spaces\n  }\n\n  spacesFromEnd(tokens) {\n    let lastTokenType\n    let spaces = ''\n    while (tokens.length) {\n      lastTokenType = tokens[tokens.length - 1][0]\n      if (lastTokenType !== 'space') break\n      spaces = tokens.pop()[1] + spaces\n    }\n    return spaces\n  }\n\n  stringFrom(tokens, from) {\n    let result = ''\n    for (let i = from; i < tokens.length; i++) {\n      result += tokens[i][1]\n    }\n    tokens.splice(from, tokens.length - from)\n    return result\n  }\n\n  unclosedBlock() {\n    let pos = this.current.source.start\n    throw this.input.error('Unclosed block', pos.line, pos.column)\n  }\n\n  unclosedBracket(bracket) {\n    throw this.input.error(\n      'Unclosed bracket',\n      { offset: bracket[2] },\n      { offset: bracket[2] + 1 }\n    )\n  }\n\n  unexpectedClose(token) {\n    throw this.input.error(\n      'Unexpected }',\n      { offset: token[2] },\n      { offset: token[2] + 1 }\n    )\n  }\n\n  unknownWord(tokens) {\n    throw this.input.error(\n      'Unknown word ' + tokens[0][1],\n      { offset: tokens[0][2] },\n      { offset: tokens[0][2] + tokens[0][1].length }\n    )\n  }\n\n  unnamedAtrule(node, token) {\n    throw this.input.error(\n      'At-rule without name',\n      { offset: token[2] },\n      { offset: token[2] + token[1].length }\n    )\n  }\n}\n\nmodule.exports = Parser\n","'use strict'\n\nlet AtRule = require('./at-rule')\nlet Comment = require('./comment')\nlet Container = require('./container')\nlet CssSyntaxError = require('./css-syntax-error')\nlet Declaration = require('./declaration')\nlet Document = require('./document')\nlet fromJSON = require('./fromJSON')\nlet Input = require('./input')\nlet LazyResult = require('./lazy-result')\nlet list = require('./list')\nlet Node = require('./node')\nlet parse = require('./parse')\nlet Processor = require('./processor')\nlet Result = require('./result.js')\nlet Root = require('./root')\nlet Rule = require('./rule')\nlet stringify = require('./stringify')\nlet Warning = require('./warning')\n\nfunction postcss(...plugins) {\n  if (plugins.length === 1 && Array.isArray(plugins[0])) {\n    plugins = plugins[0]\n  }\n  return new Processor(plugins)\n}\n\npostcss.plugin = function plugin(name, initializer) {\n  let warningPrinted = false\n  function creator(...args) {\n    // eslint-disable-next-line no-console\n    if (console && console.warn && !warningPrinted) {\n      warningPrinted = true\n      // eslint-disable-next-line no-console\n      console.warn(\n        name +\n          ': postcss.plugin was deprecated. Migration guide:\\n' +\n          'https://evilmartians.com/chronicles/postcss-8-plugin-migration'\n      )\n      if (process.env.LANG && process.env.LANG.startsWith('cn')) {\n        /* c8 ignore next 7 */\n        // eslint-disable-next-line no-console\n        console.warn(\n          name +\n            ': 里面 postcss.plugin 被弃用. 迁移指南:\\n' +\n            'https://www.w3ctech.com/topic/2226'\n        )\n      }\n    }\n    let transformer = initializer(...args)\n    transformer.postcssPlugin = name\n    transformer.postcssVersion = new Processor().version\n    return transformer\n  }\n\n  let cache\n  Object.defineProperty(creator, 'postcss', {\n    get() {\n      if (!cache) cache = creator()\n      return cache\n    }\n  })\n\n  creator.process = function (css, processOpts, pluginOpts) {\n    return postcss([creator(pluginOpts)]).process(css, processOpts)\n  }\n\n  return creator\n}\n\npostcss.stringify = stringify\npostcss.parse = parse\npostcss.fromJSON = fromJSON\npostcss.list = list\n\npostcss.comment = defaults => new Comment(defaults)\npostcss.atRule = defaults => new AtRule(defaults)\npostcss.decl = defaults => new Declaration(defaults)\npostcss.rule = defaults => new Rule(defaults)\npostcss.root = defaults => new Root(defaults)\npostcss.document = defaults => new Document(defaults)\n\npostcss.CssSyntaxError = CssSyntaxError\npostcss.Declaration = Declaration\npostcss.Container = Container\npostcss.Processor = Processor\npostcss.Document = Document\npostcss.Comment = Comment\npostcss.Warning = Warning\npostcss.AtRule = AtRule\npostcss.Result = Result\npostcss.Input = Input\npostcss.Rule = Rule\npostcss.Root = Root\npostcss.Node = Node\n\nLazyResult.registerPostcss(postcss)\n\nmodule.exports = postcss\npostcss.default = postcss\n","'use strict'\n\nlet { existsSync, readFileSync } = require('fs')\nlet { dirname, join } = require('path')\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\n\nfunction fromBase64(str) {\n  if (Buffer) {\n    return Buffer.from(str, 'base64').toString()\n  } else {\n    /* c8 ignore next 2 */\n    return window.atob(str)\n  }\n}\n\nclass PreviousMap {\n  constructor(css, opts) {\n    if (opts.map === false) return\n    if (opts.unsafeMap) this.unsafeMap = true\n    this.loadAnnotation(css)\n    this.inline = this.startWith(this.annotation, 'data:')\n\n    let prev = opts.map ? opts.map.prev : undefined\n    let text = this.loadMap(opts.from, prev)\n    if (!this.mapFile && opts.from) {\n      this.mapFile = opts.from\n    }\n    if (this.mapFile) this.root = dirname(this.mapFile)\n    if (text) this.text = text\n  }\n\n  consumer() {\n    if (!this.consumerCache) {\n      this.consumerCache = new SourceMapConsumer(this.json || this.text)\n    }\n    return this.consumerCache\n  }\n\n  decodeInline(text) {\n    let baseCharsetUri = /^data:application\\/json;charset=utf-?8;base64,/\n    let baseUri = /^data:application\\/json;base64,/\n    let charsetUri = /^data:application\\/json;charset=utf-?8,/\n    let uri = /^data:application\\/json,/\n\n    let uriMatch = text.match(charsetUri) || text.match(uri)\n    if (uriMatch) {\n      return decodeURIComponent(text.substr(uriMatch[0].length))\n    }\n\n    let baseUriMatch = text.match(baseCharsetUri) || text.match(baseUri)\n    if (baseUriMatch) {\n      return fromBase64(text.substr(baseUriMatch[0].length))\n    }\n\n    let encoding = text.slice('data:application/json;'.length)\n    encoding = encoding.slice(0, encoding.indexOf(','))\n    throw new Error('Unsupported source map encoding ' + encoding)\n  }\n\n  getAnnotationURL(sourceMapString) {\n    return sourceMapString.replace(/^\\/\\*\\s*# sourceMappingURL=/, '').trim()\n  }\n\n  isMap(map) {\n    if (typeof map !== 'object') return false\n    return (\n      typeof map.mappings === 'string' ||\n      typeof map._mappings === 'string' ||\n      Array.isArray(map.sections)\n    )\n  }\n\n  loadAnnotation(css) {\n    let comments = css.match(/\\/\\*\\s*# sourceMappingURL=/g)\n    if (!comments) return\n\n    // sourceMappingURLs from comments, strings, etc.\n    let start = css.lastIndexOf(comments.pop())\n    let end = css.indexOf('*/', start)\n\n    if (start > -1 && end > -1) {\n      // Locate the last sourceMappingURL to avoid pickin\n      this.annotation = this.getAnnotationURL(css.substring(start, end))\n    }\n  }\n\n  loadFile(path, cssFile, trusted) {\n    /* c8 ignore next 5 */\n    if (!trusted && !this.unsafeMap) {\n      if (!/\\.map$/i.test(path)) {\n        return undefined\n      }\n    }\n    this.root = dirname(path)\n    if (existsSync(path)) {\n      this.mapFile = path\n      return readFileSync(path, 'utf-8').toString().trim()\n    }\n  }\n\n  loadMap(file, prev) {\n    if (prev === false) return false\n\n    if (prev) {\n      if (typeof prev === 'string') {\n        return prev\n      } else if (typeof prev === 'function') {\n        let prevPath = prev(file)\n        if (prevPath) {\n          let map = this.loadFile(prevPath, file, true)\n          if (!map) {\n            throw new Error(\n              'Unable to load previous source map: ' + prevPath.toString()\n            )\n          }\n          return map\n        }\n      } else if (prev instanceof SourceMapConsumer) {\n        return SourceMapGenerator.fromSourceMap(prev).toString()\n      } else if (prev instanceof SourceMapGenerator) {\n        return prev.toString()\n      } else if (this.isMap(prev)) {\n        return JSON.stringify(prev)\n      } else {\n        throw new Error(\n          'Unsupported previous source map format: ' + prev.toString()\n        )\n      }\n    } else if (this.inline) {\n      return this.decodeInline(this.annotation)\n    } else if (this.annotation) {\n      let map = this.annotation\n      if (file) map = join(dirname(file), map)\n      let unknown = this.loadFile(map, file, false)\n      if (unknown) {\n        try {\n          /* c8 ignore next 4 */\n          this.json = JSON.parse(unknown.replace(/^\\)]}'[^\\n]*\\n/, ''))\n        } catch {\n          return undefined\n        }\n      }\n      return unknown\n    }\n  }\n\n  startWith(string, start) {\n    if (!string) return false\n    return string.substr(0, start.length) === start\n  }\n\n  withContent() {\n    return !!(\n      this.consumer().sourcesContent &&\n      this.consumer().sourcesContent.length > 0\n    )\n  }\n}\n\nmodule.exports = PreviousMap\nPreviousMap.default = PreviousMap\n","'use strict'\n\nlet Document = require('./document')\nlet LazyResult = require('./lazy-result')\nlet NoWorkResult = require('./no-work-result')\nlet Root = require('./root')\n\nclass Processor {\n  constructor(plugins = []) {\n    this.version = '8.5.16'\n    this.plugins = this.normalize(plugins)\n  }\n\n  normalize(plugins) {\n    let normalized = []\n    for (let i of plugins) {\n      if (i.postcss === true) {\n        i = i()\n      } else if (i.postcss) {\n        i = i.postcss\n      }\n\n      if (typeof i === 'object' && Array.isArray(i.plugins)) {\n        normalized = normalized.concat(i.plugins)\n      } else if (typeof i === 'object' && i.postcssPlugin) {\n        normalized.push(i)\n      } else if (typeof i === 'function') {\n        normalized.push(i)\n      } else if (typeof i === 'object' && (i.parse || i.stringify)) {\n        if (process.env.NODE_ENV !== 'production') {\n          throw new Error(\n            'PostCSS syntaxes cannot be used as plugins. Instead, please use ' +\n              'one of the syntax/parser/stringifier options as outlined ' +\n              'in your PostCSS runner documentation.'\n          )\n        }\n      } else {\n        throw new Error(i + ' is not a PostCSS plugin')\n      }\n    }\n    return normalized\n  }\n\n  process(css, opts = {}) {\n    if (\n      !this.plugins.length &&\n      !opts.parser &&\n      !opts.stringifier &&\n      !opts.syntax\n    ) {\n      return new NoWorkResult(this, css, opts)\n    } else {\n      return new LazyResult(this, css, opts)\n    }\n  }\n\n  use(plugin) {\n    this.plugins = this.plugins.concat(this.normalize([plugin]))\n    return this\n  }\n}\n\nmodule.exports = Processor\nProcessor.default = Processor\n\nRoot.registerProcessor(Processor)\nDocument.registerProcessor(Processor)\n","'use strict'\n\nlet Warning = require('./warning')\n\nclass Result {\n  get content() {\n    return this.css\n  }\n\n  constructor(processor, root, opts) {\n    this.processor = processor\n    this.messages = []\n    this.root = root\n    this.opts = opts\n    this.css = ''\n    this.map = undefined\n  }\n\n  toString() {\n    return this.css\n  }\n\n  warn(text, opts = {}) {\n    if (!opts.plugin) {\n      if (this.lastPlugin && this.lastPlugin.postcssPlugin) {\n        opts.plugin = this.lastPlugin.postcssPlugin\n      }\n    }\n\n    let warning = new Warning(text, opts)\n    this.messages.push(warning)\n\n    return warning\n  }\n\n  warnings() {\n    return this.messages.filter(i => i.type === 'warning')\n  }\n}\n\nmodule.exports = Result\nResult.default = Result\n","'use strict'\n\nlet Container = require('./container')\n\nlet LazyResult, Processor\n\nclass Root extends Container {\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'root'\n    if (!this.nodes) this.nodes = []\n  }\n\n  normalize(child, sample, type) {\n    let nodes = super.normalize(child)\n\n    if (sample) {\n      if (type === 'prepend') {\n        if (this.nodes.length > 1) {\n          sample.raws.before = this.nodes[1].raws.before\n        } else {\n          delete sample.raws.before\n        }\n      } else if (this.first !== sample) {\n        for (let node of nodes) {\n          node.raws.before = sample.raws.before\n        }\n      }\n    }\n\n    return nodes\n  }\n\n  removeChild(child, ignore) {\n    let index = this.index(child)\n\n    if (!ignore && index === 0 && this.nodes.length > 1) {\n      this.nodes[1].raws.before = this.nodes[index].raws.before\n    }\n\n    return super.removeChild(child)\n  }\n\n  toResult(opts = {}) {\n    let lazy = new LazyResult(new Processor(), this, opts)\n    return lazy.stringify()\n  }\n}\n\nRoot.registerLazyResult = dependant => {\n  LazyResult = dependant\n}\n\nRoot.registerProcessor = dependant => {\n  Processor = dependant\n}\n\nmodule.exports = Root\nRoot.default = Root\n\nContainer.registerRoot(Root)\n","'use strict'\n\nlet Container = require('./container')\nlet list = require('./list')\n\nclass Rule extends Container {\n  get selectors() {\n    return list.comma(this.selector)\n  }\n\n  set selectors(values) {\n    let match = this.selector ? this.selector.match(/,\\s*/) : null\n    let sep = match ? match[0] : ',' + this.raw('between', 'beforeOpen')\n    this.selector = values.join(sep)\n  }\n\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'rule'\n    if (!this.nodes) this.nodes = []\n  }\n}\n\nmodule.exports = Rule\nRule.default = Rule\n\nContainer.registerRule(Rule)\n","'use strict'\n\n// Escapes sequences that could break out of an HTML <style> context.\n// Uses CSS unicode escaping (\\3c = '<') which is valid CSS and parsed\n// correctly by all compliant CSS consumers.\nconst STYLE_TAG = /(<)(\\/?style\\b)/gi\nconst COMMENT_OPEN = /(<)(!--)/g\n\nfunction escapeHTMLInCSS(str) {\n  if (typeof str !== 'string') return str\n  if (!str.includes('<')) return str\n  return str.replace(STYLE_TAG, '\\\\3c $2').replace(COMMENT_OPEN, '\\\\3c $2')\n}\n\nconst DEFAULT_RAW = {\n  after: '\\n',\n  beforeClose: '\\n',\n  beforeComment: '\\n',\n  beforeDecl: '\\n',\n  beforeOpen: ' ',\n  beforeRule: '\\n',\n  colon: ': ',\n  commentLeft: ' ',\n  commentRight: ' ',\n  emptyBody: '',\n  indent: '    ',\n  semicolon: false\n}\n\nfunction capitalize(str) {\n  return str[0].toUpperCase() + str.slice(1)\n}\n\nclass Stringifier {\n  constructor(builder) {\n    this.builder = builder\n  }\n\n  atrule(node, semicolon) {\n    let raws = node.raws\n    let name = '@' + node.name\n    let params = node.params ? this.rawValue(node, 'params') : ''\n\n    if (typeof raws.afterName !== 'undefined') {\n      name += raws.afterName\n    } else if (params) {\n      name += ' '\n    }\n\n    if (node.nodes) {\n      this.block(node, name + params)\n    } else {\n      let end = (raws.between || '') + (semicolon ? ';' : '')\n      this.builder(escapeHTMLInCSS(name + params + end), node)\n    }\n  }\n\n  beforeAfter(node, detect) {\n    let value\n    if (node.type === 'decl') {\n      value = this.raw(node, null, 'beforeDecl')\n    } else if (node.type === 'comment') {\n      value = this.raw(node, null, 'beforeComment')\n    } else if (detect === 'before') {\n      value = this.raw(node, null, 'beforeRule')\n    } else {\n      value = this.raw(node, null, 'beforeClose')\n    }\n\n    let buf = node.parent\n    let depth = 0\n    while (buf && buf.type !== 'root') {\n      depth += 1\n      buf = buf.parent\n    }\n\n    if (value.includes('\\n')) {\n      let indent = this.raw(node, null, 'indent')\n      if (indent.length) {\n        for (let step = 0; step < depth; step++) value += indent\n      }\n    }\n\n    return value\n  }\n\n  block(node, start) {\n    let between = this.raw(node, 'between', 'beforeOpen')\n    this.builder(escapeHTMLInCSS(start + between) + '{', node, 'start')\n\n    let after\n    if (node.nodes && node.nodes.length) {\n      this.body(node)\n      after = this.raw(node, 'after')\n    } else {\n      after = this.raw(node, 'after', 'emptyBody')\n    }\n\n    if (after) this.builder(escapeHTMLInCSS(after))\n    this.builder('}', node, 'end')\n  }\n\n  body(node) {\n    let nodes = node.nodes\n    let last = nodes.length - 1\n    while (last > 0) {\n      if (nodes[last].type !== 'comment') break\n      last -= 1\n    }\n\n    let semicolon = this.raw(node, 'semicolon')\n    let isDocument = node.type === 'document'\n    for (let i = 0; i < nodes.length; i++) {\n      let child = nodes[i]\n      let before = this.raw(child, 'before')\n      if (before) this.builder(isDocument ? before : escapeHTMLInCSS(before))\n      this.stringify(child, last !== i || semicolon)\n    }\n  }\n\n  comment(node) {\n    let left = this.raw(node, 'left', 'commentLeft')\n    let right = this.raw(node, 'right', 'commentRight')\n    this.builder(escapeHTMLInCSS('/*' + left + node.text + right + '*/'), node)\n  }\n\n  decl(node, semicolon) {\n    let raws = node.raws\n    let between = this.raw(node, 'between', 'colon')\n\n    let string = node.prop + between + this.rawValue(node, 'value')\n\n    if (node.important) {\n      string += raws.important || ' !important'\n    }\n\n    if (semicolon) string += ';'\n    this.builder(escapeHTMLInCSS(string), node)\n  }\n\n  document(node) {\n    this.body(node)\n  }\n\n  raw(node, own, detect) {\n    let value\n    if (!detect) detect = own\n\n    // Already had\n    if (own) {\n      value = node.raws[own]\n      if (typeof value !== 'undefined') return value\n    }\n\n    let parent = node.parent\n\n    if (detect === 'before') {\n      // Hack for first rule in CSS\n      if (!parent || (parent.type === 'root' && parent.first === node)) {\n        return ''\n      }\n\n      // `root` nodes in `document` should use only their own raws\n      if (parent && parent.type === 'document') {\n        return ''\n      }\n    }\n\n    // Floating child without parent\n    if (!parent) return DEFAULT_RAW[detect]\n\n    // Detect style by other nodes\n    let root = node.root()\n    let cache = root.rawCache || (root.rawCache = {})\n    if (typeof cache[detect] !== 'undefined') {\n      return cache[detect]\n    }\n\n    if (detect === 'before' || detect === 'after') {\n      return this.beforeAfter(node, detect)\n    } else {\n      let method = 'raw' + capitalize(detect)\n      if (this[method]) {\n        value = this[method](root, node)\n      } else {\n        root.walk(i => {\n          value = i.raws[own]\n          if (typeof value !== 'undefined') return false\n        })\n      }\n    }\n\n    if (typeof value === 'undefined') value = DEFAULT_RAW[detect]\n\n    cache[detect] = value\n    return value\n  }\n\n  rawBeforeClose(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && i.nodes.length > 0) {\n        if (typeof i.raws.after !== 'undefined') {\n          value = i.raws.after\n          if (value.includes('\\n')) {\n            value = value.replace(/[^\\n]+$/, '')\n          }\n          return false\n        }\n      }\n    })\n    if (value) value = value.replace(/\\S/g, '')\n    return value\n  }\n\n  rawBeforeComment(root, node) {\n    let value\n    root.walkComments(i => {\n      if (typeof i.raws.before !== 'undefined') {\n        value = i.raws.before\n        if (value.includes('\\n')) {\n          value = value.replace(/[^\\n]+$/, '')\n        }\n        return false\n      }\n    })\n    if (typeof value === 'undefined') {\n      value = this.raw(node, null, 'beforeDecl')\n    } else if (value) {\n      value = value.replace(/\\S/g, '')\n    }\n    return value\n  }\n\n  rawBeforeDecl(root, node) {\n    let value\n    root.walkDecls(i => {\n      if (typeof i.raws.before !== 'undefined') {\n        value = i.raws.before\n        if (value.includes('\\n')) {\n          value = value.replace(/[^\\n]+$/, '')\n        }\n        return false\n      }\n    })\n    if (typeof value === 'undefined') {\n      value = this.raw(node, null, 'beforeRule')\n    } else if (value) {\n      value = value.replace(/\\S/g, '')\n    }\n    return value\n  }\n\n  rawBeforeOpen(root) {\n    let value\n    root.walk(i => {\n      if (i.type !== 'decl') {\n        value = i.raws.between\n        if (typeof value !== 'undefined') return false\n      }\n    })\n    return value\n  }\n\n  rawBeforeRule(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && (i.parent !== root || root.first !== i)) {\n        if (typeof i.raws.before !== 'undefined') {\n          value = i.raws.before\n          if (value.includes('\\n')) {\n            value = value.replace(/[^\\n]+$/, '')\n          }\n          return false\n        }\n      }\n    })\n    if (value) value = value.replace(/\\S/g, '')\n    return value\n  }\n\n  rawColon(root) {\n    let value\n    root.walkDecls(i => {\n      if (typeof i.raws.between !== 'undefined') {\n        value = i.raws.between.replace(/[^\\s:]/g, '')\n        return false\n      }\n    })\n    return value\n  }\n\n  rawEmptyBody(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && i.nodes.length === 0) {\n        value = i.raws.after\n        if (typeof value !== 'undefined') return false\n      }\n    })\n    return value\n  }\n\n  rawIndent(root) {\n    if (root.raws.indent) return root.raws.indent\n    let value\n    root.walk(i => {\n      let p = i.parent\n      if (p && p !== root && p.parent && p.parent === root) {\n        if (typeof i.raws.before !== 'undefined') {\n          let parts = i.raws.before.split('\\n')\n          value = parts[parts.length - 1]\n          value = value.replace(/\\S/g, '')\n          return false\n        }\n      }\n    })\n    return value\n  }\n\n  rawSemicolon(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && i.nodes.length && i.last.type === 'decl') {\n        value = i.raws.semicolon\n        if (typeof value !== 'undefined') return false\n      }\n    })\n    return value\n  }\n\n  rawValue(node, prop) {\n    let value = node[prop]\n    let raw = node.raws[prop]\n    if (raw && raw.value === value) {\n      return raw.raw\n    }\n\n    return value\n  }\n\n  root(node) {\n    this.body(node)\n    if (node.raws.after) {\n      let after = node.raws.after\n      let isDocument = node.parent && node.parent.type === 'document'\n      this.builder(isDocument ? after : escapeHTMLInCSS(after))\n    }\n  }\n\n  rule(node) {\n    this.block(node, this.rawValue(node, 'selector'))\n    if (node.raws.ownSemicolon) {\n      this.builder(escapeHTMLInCSS(node.raws.ownSemicolon), node, 'end')\n    }\n  }\n\n  stringify(node, semicolon) {\n    /* c8 ignore start */\n    if (!this[node.type]) {\n      throw new Error(\n        'Unknown AST node type ' +\n          node.type +\n          '. ' +\n          'Maybe you need to change PostCSS stringifier.'\n      )\n    }\n    /* c8 ignore stop */\n    this[node.type](node, semicolon)\n  }\n}\n\nmodule.exports = Stringifier\nStringifier.default = Stringifier\n","'use strict'\n\nlet Stringifier = require('./stringifier')\n\nfunction stringify(node, builder) {\n  let str = new Stringifier(builder)\n  str.stringify(node)\n}\n\nmodule.exports = stringify\nstringify.default = stringify\n","'use strict'\n\nmodule.exports.isClean = Symbol('isClean')\n\nmodule.exports.my = Symbol('my')\n","'use strict'\n\nconst SINGLE_QUOTE = \"'\".charCodeAt(0)\nconst DOUBLE_QUOTE = '\"'.charCodeAt(0)\nconst BACKSLASH = '\\\\'.charCodeAt(0)\nconst SLASH = '/'.charCodeAt(0)\nconst NEWLINE = '\\n'.charCodeAt(0)\nconst SPACE = ' '.charCodeAt(0)\nconst FEED = '\\f'.charCodeAt(0)\nconst TAB = '\\t'.charCodeAt(0)\nconst CR = '\\r'.charCodeAt(0)\nconst OPEN_SQUARE = '['.charCodeAt(0)\nconst CLOSE_SQUARE = ']'.charCodeAt(0)\nconst OPEN_PARENTHESES = '('.charCodeAt(0)\nconst CLOSE_PARENTHESES = ')'.charCodeAt(0)\nconst OPEN_CURLY = '{'.charCodeAt(0)\nconst CLOSE_CURLY = '}'.charCodeAt(0)\nconst SEMICOLON = ';'.charCodeAt(0)\nconst ASTERISK = '*'.charCodeAt(0)\nconst COLON = ':'.charCodeAt(0)\nconst AT = '@'.charCodeAt(0)\n\nconst RE_AT_END = /[\\t\\n\\f\\r \"#'()/;[\\\\\\]{}]/g\nconst RE_WORD_END = /[\\t\\n\\f\\r !\"#'():;@[\\\\\\]{}]|\\/(?=\\*)/g\nconst RE_BAD_BRACKET = /.[\\r\\n\"'(/\\\\]/\nconst RE_HEX_ESCAPE = /[\\da-f]/i\n\nmodule.exports = function tokenizer(input, options = {}) {\n  let css = input.css.valueOf()\n  let ignore = options.ignoreErrors\n\n  let code, content, escape, next, quote\n  let currentToken, escaped, escapePos, n, prev\n\n  let length = css.length\n  let pos = 0\n  let buffer = []\n  let returned = []\n  let lastBadParen = -1\n\n  function position() {\n    return pos\n  }\n\n  function unclosed(what) {\n    throw input.error('Unclosed ' + what, pos)\n  }\n\n  function endOfFile() {\n    return returned.length === 0 && pos >= length\n  }\n\n  function nextToken(opts) {\n    if (returned.length) return returned.pop()\n    if (pos >= length) return\n\n    let ignoreUnclosed = opts ? opts.ignoreUnclosed : false\n\n    code = css.charCodeAt(pos)\n\n    switch (code) {\n      case NEWLINE:\n      case SPACE:\n      case TAB:\n      case CR:\n      case FEED: {\n        next = pos\n        do {\n          next += 1\n          code = css.charCodeAt(next)\n        } while (\n          code === SPACE ||\n          code === NEWLINE ||\n          code === TAB ||\n          code === CR ||\n          code === FEED\n        )\n\n        currentToken = ['space', css.slice(pos, next)]\n        pos = next - 1\n        break\n      }\n\n      case OPEN_SQUARE:\n      case CLOSE_SQUARE:\n      case OPEN_CURLY:\n      case CLOSE_CURLY:\n      case COLON:\n      case SEMICOLON:\n      case CLOSE_PARENTHESES: {\n        let controlChar = String.fromCharCode(code)\n        currentToken = [controlChar, controlChar, pos]\n        break\n      }\n\n      case OPEN_PARENTHESES: {\n        prev = buffer.length ? buffer.pop()[1] : ''\n        n = css.charCodeAt(pos + 1)\n        if (\n          prev === 'url' &&\n          n !== SINGLE_QUOTE &&\n          n !== DOUBLE_QUOTE &&\n          n !== SPACE &&\n          n !== NEWLINE &&\n          n !== TAB &&\n          n !== FEED &&\n          n !== CR\n        ) {\n          next = pos\n          do {\n            escaped = false\n            next = css.indexOf(')', next + 1)\n            if (next === -1) {\n              if (ignore || ignoreUnclosed) {\n                next = pos\n                break\n              } else {\n                unclosed('bracket')\n              }\n            }\n            escapePos = next\n            while (css.charCodeAt(escapePos - 1) === BACKSLASH) {\n              escapePos -= 1\n              escaped = !escaped\n            }\n          } while (escaped)\n\n          currentToken = ['brackets', css.slice(pos, next + 1), pos, next]\n\n          pos = next\n        } else if (pos <= lastBadParen) {\n          currentToken = ['(', '(', pos]\n        } else {\n          next = css.indexOf(')', pos + 1)\n          content = css.slice(pos, next + 1)\n\n          if (next === -1 || RE_BAD_BRACKET.test(content)) {\n            lastBadParen = next === -1 ? length : next\n            currentToken = ['(', '(', pos]\n          } else {\n            currentToken = ['brackets', content, pos, next]\n            pos = next\n          }\n        }\n\n        break\n      }\n\n      case SINGLE_QUOTE:\n      case DOUBLE_QUOTE: {\n        quote = code === SINGLE_QUOTE ? \"'\" : '\"'\n        next = pos\n        do {\n          escaped = false\n          next = css.indexOf(quote, next + 1)\n          if (next === -1) {\n            if (ignore || ignoreUnclosed) {\n              next = pos + 1\n              break\n            } else {\n              unclosed('string')\n            }\n          }\n          escapePos = next\n          while (css.charCodeAt(escapePos - 1) === BACKSLASH) {\n            escapePos -= 1\n            escaped = !escaped\n          }\n        } while (escaped)\n\n        currentToken = ['string', css.slice(pos, next + 1), pos, next]\n        pos = next\n        break\n      }\n\n      case AT: {\n        RE_AT_END.lastIndex = pos + 1\n        RE_AT_END.test(css)\n        if (RE_AT_END.lastIndex === 0) {\n          next = css.length - 1\n        } else {\n          next = RE_AT_END.lastIndex - 2\n        }\n\n        currentToken = ['at-word', css.slice(pos, next + 1), pos, next]\n\n        pos = next\n        break\n      }\n\n      case BACKSLASH: {\n        next = pos\n        escape = true\n        while (css.charCodeAt(next + 1) === BACKSLASH) {\n          next += 1\n          escape = !escape\n        }\n        code = css.charCodeAt(next + 1)\n        if (\n          escape &&\n          code !== SLASH &&\n          code !== SPACE &&\n          code !== NEWLINE &&\n          code !== TAB &&\n          code !== CR &&\n          code !== FEED\n        ) {\n          next += 1\n          if (RE_HEX_ESCAPE.test(css.charAt(next))) {\n            while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) {\n              next += 1\n            }\n            if (css.charCodeAt(next + 1) === SPACE) {\n              next += 1\n            }\n          }\n        }\n\n        currentToken = ['word', css.slice(pos, next + 1), pos, next]\n\n        pos = next\n        break\n      }\n\n      default: {\n        if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) {\n          next = css.indexOf('*/', pos + 2) + 1\n          if (next === 0) {\n            if (ignore || ignoreUnclosed) {\n              next = css.length\n            } else {\n              unclosed('comment')\n            }\n          }\n\n          currentToken = ['comment', css.slice(pos, next + 1), pos, next]\n          pos = next\n        } else {\n          RE_WORD_END.lastIndex = pos + 1\n          RE_WORD_END.test(css)\n          if (RE_WORD_END.lastIndex === 0) {\n            next = css.length - 1\n          } else {\n            next = RE_WORD_END.lastIndex - 2\n          }\n\n          currentToken = ['word', css.slice(pos, next + 1), pos, next]\n          buffer.push(currentToken)\n          pos = next\n        }\n\n        break\n      }\n    }\n\n    pos++\n    return currentToken\n  }\n\n  function back(token) {\n    returned.push(token)\n  }\n\n  return {\n    back,\n    endOfFile,\n    nextToken,\n    position\n  }\n}\n","/* eslint-disable no-console */\n'use strict'\n\nlet printed = {}\n\nmodule.exports = function warnOnce(message) {\n  if (printed[message]) return\n  printed[message] = true\n\n  if (typeof console !== 'undefined' && console.warn) {\n    console.warn(message)\n  }\n}\n","'use strict'\n\nclass Warning {\n  constructor(text, opts = {}) {\n    this.type = 'warning'\n    this.text = text\n\n    if (opts.node && opts.node.source) {\n      let range = opts.node.rangeBy(opts)\n      this.line = range.start.line\n      this.column = range.start.column\n      this.endLine = range.end.line\n      this.endColumn = range.end.column\n    }\n\n    for (let opt in opts) this[opt] = opts[opt]\n  }\n\n  toString() {\n    if (this.node) {\n      return this.node.error(this.text, {\n        index: this.index,\n        plugin: this.plugin,\n        word: this.word\n      }).message\n    }\n\n    if (this.plugin) {\n      return this.plugin + ': ' + this.text\n    }\n\n    return this.text\n  }\n}\n\nmodule.exports = Warning\nWarning.default = Warning\n","\nconst canPromise = require('./can-promise')\n\nconst QRCode = require('./core/qrcode')\nconst CanvasRenderer = require('./renderer/canvas')\nconst SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n  const args = [].slice.call(arguments, 1)\n  const argsNum = args.length\n  const isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n  if (!isLastArgCb && !canPromise()) {\n    throw new Error('Callback required as last argument')\n  }\n\n  if (isLastArgCb) {\n    if (argsNum < 2) {\n      throw new Error('Too few arguments provided')\n    }\n\n    if (argsNum === 2) {\n      cb = text\n      text = canvas\n      canvas = opts = undefined\n    } else if (argsNum === 3) {\n      if (canvas.getContext && typeof cb === 'undefined') {\n        cb = opts\n        opts = undefined\n      } else {\n        cb = opts\n        opts = text\n        text = canvas\n        canvas = undefined\n      }\n    }\n  } else {\n    if (argsNum < 1) {\n      throw new Error('Too few arguments provided')\n    }\n\n    if (argsNum === 1) {\n      text = canvas\n      canvas = opts = undefined\n    } else if (argsNum === 2 && !canvas.getContext) {\n      opts = text\n      text = canvas\n      canvas = undefined\n    }\n\n    return new Promise(function (resolve, reject) {\n      try {\n        const data = QRCode.create(text, opts)\n        resolve(renderFunc(data, canvas, opts))\n      } catch (e) {\n        reject(e)\n      }\n    })\n  }\n\n  try {\n    const data = QRCode.create(text, opts)\n    cb(null, renderFunc(data, canvas, opts))\n  } catch (e) {\n    cb(e)\n  }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n  return SvgRenderer.render(data, opts)\n})\n","// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n  return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n","/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nconst getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param  {Number} version QR Code version\n * @return {Array}          Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n  if (version === 1) return []\n\n  const posCount = Math.floor(version / 7) + 2\n  const size = getSymbolSize(version)\n  const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n  const positions = [size - 7] // Last coord is always (size - 7)\n\n  for (let i = 1; i < posCount - 1; i++) {\n    positions[i] = positions[i - 1] - intervals\n  }\n\n  positions.push(6) // First coord is always 6\n\n  return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * let pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param  {Number} version QR Code version\n * @return {Array}          Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n  const coords = []\n  const pos = exports.getRowColCoords(version)\n  const posLength = pos.length\n\n  for (let i = 0; i < posLength; i++) {\n    for (let j = 0; j < posLength; j++) {\n      // Skip if position is occupied by finder patterns\n      if ((i === 0 && j === 0) || // top-left\n          (i === 0 && j === posLength - 1) || // bottom-left\n          (i === posLength - 1 && j === 0)) { // top-right\n        continue\n      }\n\n      coords.push([pos[i], pos[j]])\n    }\n  }\n\n  return coords\n}\n","const Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nconst ALPHA_NUM_CHARS = [\n  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n  ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n  this.mode = Mode.ALPHANUMERIC\n  this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n  return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n  return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n  return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n  let i\n\n  // Input data characters are divided into groups of two characters\n  // and encoded as 11-bit binary codes.\n  for (i = 0; i + 2 <= this.data.length; i += 2) {\n    // The character value of the first character is multiplied by 45\n    let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n    // The character value of the second digit is added to the product\n    value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n    // The sum is then stored as 11-bit binary number\n    bitBuffer.put(value, 11)\n  }\n\n  // If the number of input data characters is not a multiple of two,\n  // the character value of the final character is encoded as a 6-bit binary number.\n  if (this.data.length % 2) {\n    bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n  }\n}\n\nmodule.exports = AlphanumericData\n","function BitBuffer () {\n  this.buffer = []\n  this.length = 0\n}\n\nBitBuffer.prototype = {\n\n  get: function (index) {\n    const bufIndex = Math.floor(index / 8)\n    return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n  },\n\n  put: function (num, length) {\n    for (let i = 0; i < length; i++) {\n      this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n    }\n  },\n\n  getLengthInBits: function () {\n    return this.length\n  },\n\n  putBit: function (bit) {\n    const bufIndex = Math.floor(this.length / 8)\n    if (this.buffer.length <= bufIndex) {\n      this.buffer.push(0)\n    }\n\n    if (bit) {\n      this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n    }\n\n    this.length++\n  }\n}\n\nmodule.exports = BitBuffer\n","/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n  if (!size || size < 1) {\n    throw new Error('BitMatrix size must be defined and greater than 0')\n  }\n\n  this.size = size\n  this.data = new Uint8Array(size * size)\n  this.reservedBit = new Uint8Array(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number}  row\n * @param {Number}  col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n  const index = row * this.size + col\n  this.data[index] = value\n  if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param  {Number}  row\n * @param  {Number}  col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n  return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number}  row\n * @param {Number}  col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n  this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number}   row\n * @param {Number}   col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n  return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n","const Mode = require('./mode')\n\nfunction ByteData (data) {\n  this.mode = Mode.BYTE\n  if (typeof (data) === 'string') {\n    this.data = new TextEncoder().encode(data)\n  } else {\n    this.data = new Uint8Array(data)\n  }\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n  return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n  return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n  return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n  for (let i = 0, l = this.data.length; i < l; i++) {\n    bitBuffer.put(this.data[i], 8)\n  }\n}\n\nmodule.exports = ByteData\n","const ECLevel = require('./error-correction-level')\r\n\r\nconst EC_BLOCKS_TABLE = [\r\n// L  M  Q  H\r\n  1, 1, 1, 1,\r\n  1, 1, 1, 1,\r\n  1, 1, 2, 2,\r\n  1, 2, 2, 4,\r\n  1, 2, 4, 4,\r\n  2, 4, 4, 4,\r\n  2, 4, 6, 5,\r\n  2, 4, 6, 6,\r\n  2, 5, 8, 8,\r\n  4, 5, 8, 8,\r\n  4, 5, 8, 11,\r\n  4, 8, 10, 11,\r\n  4, 9, 12, 16,\r\n  4, 9, 16, 16,\r\n  6, 10, 12, 18,\r\n  6, 10, 17, 16,\r\n  6, 11, 16, 19,\r\n  6, 13, 18, 21,\r\n  7, 14, 21, 25,\r\n  8, 16, 20, 25,\r\n  8, 17, 23, 25,\r\n  9, 17, 23, 34,\r\n  9, 18, 25, 30,\r\n  10, 20, 27, 32,\r\n  12, 21, 29, 35,\r\n  12, 23, 34, 37,\r\n  12, 25, 34, 40,\r\n  13, 26, 35, 42,\r\n  14, 28, 38, 45,\r\n  15, 29, 40, 48,\r\n  16, 31, 43, 51,\r\n  17, 33, 45, 54,\r\n  18, 35, 48, 57,\r\n  19, 37, 51, 60,\r\n  19, 38, 53, 63,\r\n  20, 40, 56, 66,\r\n  21, 43, 59, 70,\r\n  22, 45, 62, 74,\r\n  24, 47, 65, 77,\r\n  25, 49, 68, 81\r\n]\r\n\r\nconst EC_CODEWORDS_TABLE = [\r\n// L  M  Q  H\r\n  7, 10, 13, 17,\r\n  10, 16, 22, 28,\r\n  15, 26, 36, 44,\r\n  20, 36, 52, 64,\r\n  26, 48, 72, 88,\r\n  36, 64, 96, 112,\r\n  40, 72, 108, 130,\r\n  48, 88, 132, 156,\r\n  60, 110, 160, 192,\r\n  72, 130, 192, 224,\r\n  80, 150, 224, 264,\r\n  96, 176, 260, 308,\r\n  104, 198, 288, 352,\r\n  120, 216, 320, 384,\r\n  132, 240, 360, 432,\r\n  144, 280, 408, 480,\r\n  168, 308, 448, 532,\r\n  180, 338, 504, 588,\r\n  196, 364, 546, 650,\r\n  224, 416, 600, 700,\r\n  224, 442, 644, 750,\r\n  252, 476, 690, 816,\r\n  270, 504, 750, 900,\r\n  300, 560, 810, 960,\r\n  312, 588, 870, 1050,\r\n  336, 644, 952, 1110,\r\n  360, 700, 1020, 1200,\r\n  390, 728, 1050, 1260,\r\n  420, 784, 1140, 1350,\r\n  450, 812, 1200, 1440,\r\n  480, 868, 1290, 1530,\r\n  510, 924, 1350, 1620,\r\n  540, 980, 1440, 1710,\r\n  570, 1036, 1530, 1800,\r\n  570, 1064, 1590, 1890,\r\n  600, 1120, 1680, 1980,\r\n  630, 1204, 1770, 2100,\r\n  660, 1260, 1860, 2220,\r\n  720, 1316, 1950, 2310,\r\n  750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param  {Number} version              QR Code version\r\n * @param  {Number} errorCorrectionLevel Error correction level\r\n * @return {Number}                      Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n  switch (errorCorrectionLevel) {\r\n    case ECLevel.L:\r\n      return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n    case ECLevel.M:\r\n      return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n    case ECLevel.Q:\r\n      return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n    case ECLevel.H:\r\n      return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n    default:\r\n      return undefined\r\n  }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param  {Number} version              QR Code version\r\n * @param  {Number} errorCorrectionLevel Error correction level\r\n * @return {Number}                      Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n  switch (errorCorrectionLevel) {\r\n    case ECLevel.L:\r\n      return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n    case ECLevel.M:\r\n      return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n    case ECLevel.Q:\r\n      return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n    case ECLevel.H:\r\n      return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n    default:\r\n      return undefined\r\n  }\r\n}\r\n","exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n  if (typeof string !== 'string') {\n    throw new Error('Param is not a string')\n  }\n\n  const lcStr = string.toLowerCase()\n\n  switch (lcStr) {\n    case 'l':\n    case 'low':\n      return exports.L\n\n    case 'm':\n    case 'medium':\n      return exports.M\n\n    case 'q':\n    case 'quartile':\n      return exports.Q\n\n    case 'h':\n    case 'high':\n      return exports.H\n\n    default:\n      throw new Error('Unknown EC Level: ' + string)\n  }\n}\n\nexports.isValid = function isValid (level) {\n  return level && typeof level.bit !== 'undefined' &&\n    level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n  if (exports.isValid(value)) {\n    return value\n  }\n\n  try {\n    return fromString(value)\n  } catch (e) {\n    return defaultValue\n  }\n}\n","const getSymbolSize = require('./utils').getSymbolSize\nconst FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param  {Number} version QR Code version\n * @return {Array}          Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n  const size = getSymbolSize(version)\n\n  return [\n    // top-left\n    [0, 0],\n    // top-right\n    [size - FINDER_PATTERN_SIZE, 0],\n    // bottom-left\n    [0, size - FINDER_PATTERN_SIZE]\n  ]\n}\n","const Utils = require('./utils')\n\nconst G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nconst G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nconst G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param  {Number} errorCorrectionLevel Error correction level\n * @param  {Number} mask                 Mask pattern\n * @return {Number}                      Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n  const data = ((errorCorrectionLevel.bit << 3) | mask)\n  let d = data << 10\n\n  while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n    d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n  }\n\n  // xor final data with mask pattern in order to ensure that\n  // no combination of Error Correction Level and data mask pattern\n  // will result in an all-zero data string\n  return ((data << 10) | d) ^ G15_MASK\n}\n","const EXP_TABLE = new Uint8Array(512)\nconst LOG_TABLE = new Uint8Array(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n  let x = 1\n  for (let i = 0; i < 255; i++) {\n    EXP_TABLE[i] = x\n    LOG_TABLE[x] = i\n\n    x <<= 1 // multiply by 2\n\n    // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n    // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n    if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n      x ^= 0x11D\n    }\n  }\n\n  // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n  // stay inside the bounds (because we will mainly use this table for the multiplication of\n  // two GF numbers, no more).\n  // @see {@link mul}\n  for (let i = 255; i < 512; i++) {\n    EXP_TABLE[i] = EXP_TABLE[i - 255]\n  }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param  {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n  if (n < 1) throw new Error('log(' + n + ')')\n  return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param  {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n  return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param  {Number} x\n * @param  {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n  if (x === 0 || y === 0) return 0\n\n  // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n  // @see {@link initTables}\n  return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n","const Mode = require('./mode')\nconst Utils = require('./utils')\n\nfunction KanjiData (data) {\n  this.mode = Mode.KANJI\n  this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n  return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n  return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n  return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n  let i\n\n  // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n  // These byte values are shifted from the JIS X 0208 values.\n  // JIS X 0208 gives details of the shift coded representation.\n  for (i = 0; i < this.data.length; i++) {\n    let value = Utils.toSJIS(this.data[i])\n\n    // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n    if (value >= 0x8140 && value <= 0x9FFC) {\n      // Subtract 0x8140 from Shift JIS value\n      value -= 0x8140\n\n    // For characters with Shift JIS values from 0xE040 to 0xEBBF\n    } else if (value >= 0xE040 && value <= 0xEBBF) {\n      // Subtract 0xC140 from Shift JIS value\n      value -= 0xC140\n    } else {\n      throw new Error(\n        'Invalid SJIS character: ' + this.data[i] + '\\n' +\n        'Make sure your charset is UTF-8')\n    }\n\n    // Multiply most significant byte of result by 0xC0\n    // and add least significant byte to product\n    value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n    // Convert result to a 13-bit binary string\n    bitBuffer.put(value, 13)\n  }\n}\n\nmodule.exports = KanjiData\n","/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n  PATTERN000: 0,\n  PATTERN001: 1,\n  PATTERN010: 2,\n  PATTERN011: 3,\n  PATTERN100: 4,\n  PATTERN101: 5,\n  PATTERN110: 6,\n  PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nconst PenaltyScores = {\n  N1: 3,\n  N2: 3,\n  N3: 40,\n  N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param  {Number}  mask    Mask pattern\n * @return {Boolean}         true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n  return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param  {Number|String} value        Mask pattern value\n * @return {Number}                     Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n  return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n  const size = data.size\n  let points = 0\n  let sameCountCol = 0\n  let sameCountRow = 0\n  let lastCol = null\n  let lastRow = null\n\n  for (let row = 0; row < size; row++) {\n    sameCountCol = sameCountRow = 0\n    lastCol = lastRow = null\n\n    for (let col = 0; col < size; col++) {\n      let module = data.get(row, col)\n      if (module === lastCol) {\n        sameCountCol++\n      } else {\n        if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n        lastCol = module\n        sameCountCol = 1\n      }\n\n      module = data.get(col, row)\n      if (module === lastRow) {\n        sameCountRow++\n      } else {\n        if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n        lastRow = module\n        sameCountRow = 1\n      }\n    }\n\n    if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n    if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n  }\n\n  return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n  const size = data.size\n  let points = 0\n\n  for (let row = 0; row < size - 1; row++) {\n    for (let col = 0; col < size - 1; col++) {\n      const last = data.get(row, col) +\n        data.get(row, col + 1) +\n        data.get(row + 1, col) +\n        data.get(row + 1, col + 1)\n\n      if (last === 4 || last === 0) points++\n    }\n  }\n\n  return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n  const size = data.size\n  let points = 0\n  let bitsCol = 0\n  let bitsRow = 0\n\n  for (let row = 0; row < size; row++) {\n    bitsCol = bitsRow = 0\n    for (let col = 0; col < size; col++) {\n      bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n      if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n      bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n      if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n    }\n  }\n\n  return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n  let darkCount = 0\n  const modulesCount = data.data.length\n\n  for (let i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n  const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n  return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param  {Number} maskPattern Pattern reference value\n * @param  {Number} i           Row\n * @param  {Number} j           Column\n * @return {Boolean}            Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n  switch (maskPattern) {\n    case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n    case exports.Patterns.PATTERN001: return i % 2 === 0\n    case exports.Patterns.PATTERN010: return j % 3 === 0\n    case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n    case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n    case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n    case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n    case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n    default: throw new Error('bad maskPattern:' + maskPattern)\n  }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param  {Number}    pattern Pattern reference number\n * @param  {BitMatrix} data    BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n  const size = data.size\n\n  for (let col = 0; col < size; col++) {\n    for (let row = 0; row < size; row++) {\n      if (data.isReserved(row, col)) continue\n      data.xor(row, col, getMaskAt(pattern, row, col))\n    }\n  }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param  {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n  const numPatterns = Object.keys(exports.Patterns).length\n  let bestPattern = 0\n  let lowerPenalty = Infinity\n\n  for (let p = 0; p < numPatterns; p++) {\n    setupFormatFunc(p)\n    exports.applyMask(p, data)\n\n    // Calculate penalty\n    const penalty =\n      exports.getPenaltyN1(data) +\n      exports.getPenaltyN2(data) +\n      exports.getPenaltyN3(data) +\n      exports.getPenaltyN4(data)\n\n    // Undo previously applied mask\n    exports.applyMask(p, data)\n\n    if (penalty < lowerPenalty) {\n      lowerPenalty = penalty\n      bestPattern = p\n    }\n  }\n\n  return bestPattern\n}\n","const VersionCheck = require('./version-check')\nconst Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n  id: 'Numeric',\n  bit: 1 << 0,\n  ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n *      26 alphabetic characters (A - Z),\n *   and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n  id: 'Alphanumeric',\n  bit: 1 << 1,\n  ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n  id: 'Byte',\n  bit: 1 << 2,\n  ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n  id: 'Kanji',\n  bit: 1 << 3,\n  ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n  bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param  {Mode}   mode    Data mode\n * @param  {Number} version QR Code version\n * @return {Number}         Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n  if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n  if (!VersionCheck.isValid(version)) {\n    throw new Error('Invalid version: ' + version)\n  }\n\n  if (version >= 1 && version < 10) return mode.ccBits[0]\n  else if (version < 27) return mode.ccBits[1]\n  return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param  {String} dataStr Input data string\n * @return {Mode}           Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n  if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n  else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n  else if (Regex.testKanji(dataStr)) return exports.KANJI\n  else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String}  Mode name\n */\nexports.toString = function toString (mode) {\n  if (mode && mode.id) return mode.id\n  throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param   {Mode}    mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n  return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param   {String} string Mode name\n * @returns {Mode}          Mode object\n */\nfunction fromString (string) {\n  if (typeof string !== 'string') {\n    throw new Error('Param is not a string')\n  }\n\n  const lcStr = string.toLowerCase()\n\n  switch (lcStr) {\n    case 'numeric':\n      return exports.NUMERIC\n    case 'alphanumeric':\n      return exports.ALPHANUMERIC\n    case 'kanji':\n      return exports.KANJI\n    case 'byte':\n      return exports.BYTE\n    default:\n      throw new Error('Unknown mode: ' + string)\n  }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param  {Mode|String} value        Encoding mode\n * @param  {Mode}        defaultValue Fallback value\n * @return {Mode}                     Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n  if (exports.isValid(value)) {\n    return value\n  }\n\n  try {\n    return fromString(value)\n  } catch (e) {\n    return defaultValue\n  }\n}\n","const Mode = require('./mode')\n\nfunction NumericData (data) {\n  this.mode = Mode.NUMERIC\n  this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n  return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n  return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n  return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n  let i, group, value\n\n  // The input data string is divided into groups of three digits,\n  // and each group is converted to its 10-bit binary equivalent.\n  for (i = 0; i + 3 <= this.data.length; i += 3) {\n    group = this.data.substr(i, 3)\n    value = parseInt(group, 10)\n\n    bitBuffer.put(value, 10)\n  }\n\n  // If the number of input digits is not an exact multiple of three,\n  // the final one or two digits are converted to 4 or 7 bits respectively.\n  const remainingNum = this.data.length - i\n  if (remainingNum > 0) {\n    group = this.data.substr(i)\n    value = parseInt(group, 10)\n\n    bitBuffer.put(value, remainingNum * 3 + 1)\n  }\n}\n\nmodule.exports = NumericData\n","const GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param  {Uint8Array} p1 Polynomial\n * @param  {Uint8Array} p2 Polynomial\n * @return {Uint8Array}    Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n  const coeff = new Uint8Array(p1.length + p2.length - 1)\n\n  for (let i = 0; i < p1.length; i++) {\n    for (let j = 0; j < p2.length; j++) {\n      coeff[i + j] ^= GF.mul(p1[i], p2[j])\n    }\n  }\n\n  return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param  {Uint8Array} divident Polynomial\n * @param  {Uint8Array} divisor  Polynomial\n * @return {Uint8Array}          Remainder\n */\nexports.mod = function mod (divident, divisor) {\n  let result = new Uint8Array(divident)\n\n  while ((result.length - divisor.length) >= 0) {\n    const coeff = result[0]\n\n    for (let i = 0; i < divisor.length; i++) {\n      result[i] ^= GF.mul(divisor[i], coeff)\n    }\n\n    // remove all zeros from buffer head\n    let offset = 0\n    while (offset < result.length && result[offset] === 0) offset++\n    result = result.slice(offset)\n  }\n\n  return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param  {Number} degree Degree of the generator polynomial\n * @return {Uint8Array}    Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n  let poly = new Uint8Array([1])\n  for (let i = 0; i < degree; i++) {\n    poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]))\n  }\n\n  return poly\n}\n","const Utils = require('./utils')\nconst ECLevel = require('./error-correction-level')\nconst BitBuffer = require('./bit-buffer')\nconst BitMatrix = require('./bit-matrix')\nconst AlignmentPattern = require('./alignment-pattern')\nconst FinderPattern = require('./finder-pattern')\nconst MaskPattern = require('./mask-pattern')\nconst ECCode = require('./error-correction-code')\nconst ReedSolomonEncoder = require('./reed-solomon-encoder')\nconst Version = require('./version')\nconst FormatInfo = require('./format-info')\nconst Mode = require('./mode')\nconst Segments = require('./segments')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n *   http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n//   http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n//   http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param  {BitMatrix} matrix  Modules matrix\n * @param  {Number}    version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n  const size = matrix.size\n  const pos = FinderPattern.getPositions(version)\n\n  for (let i = 0; i < pos.length; i++) {\n    const row = pos[i][0]\n    const col = pos[i][1]\n\n    for (let r = -1; r <= 7; r++) {\n      if (row + r <= -1 || size <= row + r) continue\n\n      for (let c = -1; c <= 7; c++) {\n        if (col + c <= -1 || size <= col + c) continue\n\n        if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n          (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n          (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n          matrix.set(row + r, col + c, true, true)\n        } else {\n          matrix.set(row + r, col + c, false, true)\n        }\n      }\n    }\n  }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param  {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n  const size = matrix.size\n\n  for (let r = 8; r < size - 8; r++) {\n    const value = r % 2 === 0\n    matrix.set(r, 6, value, true)\n    matrix.set(6, r, value, true)\n  }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param  {BitMatrix} matrix  Modules matrix\n * @param  {Number}    version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n  const pos = AlignmentPattern.getPositions(version)\n\n  for (let i = 0; i < pos.length; i++) {\n    const row = pos[i][0]\n    const col = pos[i][1]\n\n    for (let r = -2; r <= 2; r++) {\n      for (let c = -2; c <= 2; c++) {\n        if (r === -2 || r === 2 || c === -2 || c === 2 ||\n          (r === 0 && c === 0)) {\n          matrix.set(row + r, col + c, true, true)\n        } else {\n          matrix.set(row + r, col + c, false, true)\n        }\n      }\n    }\n  }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param  {BitMatrix} matrix  Modules matrix\n * @param  {Number}    version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n  const size = matrix.size\n  const bits = Version.getEncodedBits(version)\n  let row, col, mod\n\n  for (let i = 0; i < 18; i++) {\n    row = Math.floor(i / 3)\n    col = i % 3 + size - 8 - 3\n    mod = ((bits >> i) & 1) === 1\n\n    matrix.set(row, col, mod, true)\n    matrix.set(col, row, mod, true)\n  }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param  {BitMatrix} matrix               Modules matrix\n * @param  {ErrorCorrectionLevel}    errorCorrectionLevel Error correction level\n * @param  {Number}    maskPattern          Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n  const size = matrix.size\n  const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n  let i, mod\n\n  for (i = 0; i < 15; i++) {\n    mod = ((bits >> i) & 1) === 1\n\n    // vertical\n    if (i < 6) {\n      matrix.set(i, 8, mod, true)\n    } else if (i < 8) {\n      matrix.set(i + 1, 8, mod, true)\n    } else {\n      matrix.set(size - 15 + i, 8, mod, true)\n    }\n\n    // horizontal\n    if (i < 8) {\n      matrix.set(8, size - i - 1, mod, true)\n    } else if (i < 9) {\n      matrix.set(8, 15 - i - 1 + 1, mod, true)\n    } else {\n      matrix.set(8, 15 - i - 1, mod, true)\n    }\n  }\n\n  // fixed module\n  matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param  {BitMatrix}  matrix Modules matrix\n * @param  {Uint8Array} data   Data codewords\n */\nfunction setupData (matrix, data) {\n  const size = matrix.size\n  let inc = -1\n  let row = size - 1\n  let bitIndex = 7\n  let byteIndex = 0\n\n  for (let col = size - 1; col > 0; col -= 2) {\n    if (col === 6) col--\n\n    while (true) {\n      for (let c = 0; c < 2; c++) {\n        if (!matrix.isReserved(row, col - c)) {\n          let dark = false\n\n          if (byteIndex < data.length) {\n            dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n          }\n\n          matrix.set(row, col - c, dark)\n          bitIndex--\n\n          if (bitIndex === -1) {\n            byteIndex++\n            bitIndex = 7\n          }\n        }\n      }\n\n      row += inc\n\n      if (row < 0 || size <= row) {\n        row -= inc\n        inc = -inc\n        break\n      }\n    }\n  }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param  {Number}   version              QR Code version\n * @param  {ErrorCorrectionLevel}   errorCorrectionLevel Error correction level\n * @param  {ByteData} data                 Data input\n * @return {Uint8Array}                    Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n  // Prepare data buffer\n  const buffer = new BitBuffer()\n\n  segments.forEach(function (data) {\n    // prefix data with mode indicator (4 bits)\n    buffer.put(data.mode.bit, 4)\n\n    // Prefix data with character count indicator.\n    // The character count indicator is a string of bits that represents the\n    // number of characters that are being encoded.\n    // The character count indicator must be placed after the mode indicator\n    // and must be a certain number of bits long, depending on the QR version\n    // and data mode\n    // @see {@link Mode.getCharCountIndicator}.\n    buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n    // add binary data sequence to buffer\n    data.write(buffer)\n  })\n\n  // Calculate required number of bits\n  const totalCodewords = Utils.getSymbolTotalCodewords(version)\n  const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n  const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n  // Add a terminator.\n  // If the bit string is shorter than the total number of required bits,\n  // a terminator of up to four 0s must be added to the right side of the string.\n  // If the bit string is more than four bits shorter than the required number of bits,\n  // add four 0s to the end.\n  if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n    buffer.put(0, 4)\n  }\n\n  // If the bit string is fewer than four bits shorter, add only the number of 0s that\n  // are needed to reach the required number of bits.\n\n  // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n  // pad the string on the right with 0s to make the string's length a multiple of 8.\n  while (buffer.getLengthInBits() % 8 !== 0) {\n    buffer.putBit(0)\n  }\n\n  // Add pad bytes if the string is still shorter than the total number of required bits.\n  // Extend the buffer to fill the data capacity of the symbol corresponding to\n  // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n  // and 00010001 (0x11) alternately.\n  const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n  for (let i = 0; i < remainingByte; i++) {\n    buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n  }\n\n  return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param  {BitBuffer} bitBuffer            Data to encode\n * @param  {Number}    version              QR Code version\n * @param  {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Uint8Array}                     Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n  // Total codewords for this QR code version (Data + Error correction)\n  const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n  // Total number of error correction codewords\n  const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n  // Total number of data codewords\n  const dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n  // Total number of blocks\n  const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n  // Calculate how many blocks each group should contain\n  const blocksInGroup2 = totalCodewords % ecTotalBlocks\n  const blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n  const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n  const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n  const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n  // Number of EC codewords is the same for both groups\n  const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n  // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n  const rs = new ReedSolomonEncoder(ecCount)\n\n  let offset = 0\n  const dcData = new Array(ecTotalBlocks)\n  const ecData = new Array(ecTotalBlocks)\n  let maxDataSize = 0\n  const buffer = new Uint8Array(bitBuffer.buffer)\n\n  // Divide the buffer into the required number of blocks\n  for (let b = 0; b < ecTotalBlocks; b++) {\n    const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n    // extract a block of data from buffer\n    dcData[b] = buffer.slice(offset, offset + dataSize)\n\n    // Calculate EC codewords for this data block\n    ecData[b] = rs.encode(dcData[b])\n\n    offset += dataSize\n    maxDataSize = Math.max(maxDataSize, dataSize)\n  }\n\n  // Create final data\n  // Interleave the data and error correction codewords from each block\n  const data = new Uint8Array(totalCodewords)\n  let index = 0\n  let i, r\n\n  // Add data codewords\n  for (i = 0; i < maxDataSize; i++) {\n    for (r = 0; r < ecTotalBlocks; r++) {\n      if (i < dcData[r].length) {\n        data[index++] = dcData[r][i]\n      }\n    }\n  }\n\n  // Apped EC codewords\n  for (i = 0; i < ecCount; i++) {\n    for (r = 0; r < ecTotalBlocks; r++) {\n      data[index++] = ecData[r][i]\n    }\n  }\n\n  return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param  {String} data                 Input string\n * @param  {Number} version              QR Code version\n * @param  {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param  {MaskPattern} maskPattern     Mask pattern\n * @return {Object}                      Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n  let segments\n\n  if (Array.isArray(data)) {\n    segments = Segments.fromArray(data)\n  } else if (typeof data === 'string') {\n    let estimatedVersion = version\n\n    if (!estimatedVersion) {\n      const rawSegments = Segments.rawSplit(data)\n\n      // Estimate best version that can contain raw splitted segments\n      estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel)\n    }\n\n    // Build optimized segments\n    // If estimated version is undefined, try with the highest version\n    segments = Segments.fromString(data, estimatedVersion || 40)\n  } else {\n    throw new Error('Invalid data')\n  }\n\n  // Get the min version that can contain data\n  const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel)\n\n  // If no version is found, data cannot be stored\n  if (!bestVersion) {\n    throw new Error('The amount of data is too big to be stored in a QR Code')\n  }\n\n  // If not specified, use min version as default\n  if (!version) {\n    version = bestVersion\n\n  // Check if the specified version can contain the data\n  } else if (version < bestVersion) {\n    throw new Error('\\n' +\n      'The chosen QR Code version cannot contain this amount of data.\\n' +\n      'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n    )\n  }\n\n  const dataBits = createData(version, errorCorrectionLevel, segments)\n\n  // Allocate matrix buffer\n  const moduleCount = Utils.getSymbolSize(version)\n  const modules = new BitMatrix(moduleCount)\n\n  // Add function modules\n  setupFinderPattern(modules, version)\n  setupTimingPattern(modules)\n  setupAlignmentPattern(modules, version)\n\n  // Add temporary dummy bits for format info just to set them as reserved.\n  // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n  // since the masking operation must be performed only on the encoding region.\n  // These blocks will be replaced with correct values later in code.\n  setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n  if (version >= 7) {\n    setupVersionInfo(modules, version)\n  }\n\n  // Add data codewords\n  setupData(modules, dataBits)\n\n  if (isNaN(maskPattern)) {\n    // Find best mask pattern\n    maskPattern = MaskPattern.getBestMask(modules,\n      setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n  }\n\n  // Apply mask pattern\n  MaskPattern.applyMask(maskPattern, modules)\n\n  // Replace format info bits with correct values\n  setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n  return {\n    modules: modules,\n    version: version,\n    errorCorrectionLevel: errorCorrectionLevel,\n    maskPattern: maskPattern,\n    segments: segments\n  }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data                 Input data\n * @param {Object} options                      Optional configurations\n * @param {Number} options.version              QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc         Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n  if (typeof data === 'undefined' || data === '') {\n    throw new Error('No input text')\n  }\n\n  let errorCorrectionLevel = ECLevel.M\n  let version\n  let mask\n\n  if (typeof options !== 'undefined') {\n    // Use higher error correction level as default\n    errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n    version = Version.from(options.version)\n    mask = MaskPattern.from(options.maskPattern)\n\n    if (options.toSJISFunc) {\n      Utils.setToSJISFunction(options.toSJISFunc)\n    }\n  }\n\n  return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n","const Polynomial = require('./polynomial')\n\nfunction ReedSolomonEncoder (degree) {\n  this.genPoly = undefined\n  this.degree = degree\n\n  if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param  {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n  // create an irreducible generator polynomial\n  this.degree = degree\n  this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param  {Uint8Array} data Buffer containing input data\n * @return {Uint8Array}      Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n  if (!this.genPoly) {\n    throw new Error('Encoder not initialized')\n  }\n\n  // Calculate EC for this data block\n  // extends data size to data+genPoly size\n  const paddedData = new Uint8Array(data.length + this.degree)\n  paddedData.set(data)\n\n  // The error correction codewords are the remainder after dividing the data codewords\n  // by a generator polynomial\n  const remainder = Polynomial.mod(paddedData, this.genPoly)\n\n  // return EC data blocks (last n byte, where n is the degree of genPoly)\n  // If coefficients number in remainder are less than genPoly degree,\n  // pad with 0s to the left to reach the needed number of coefficients\n  const start = this.degree - remainder.length\n  if (start > 0) {\n    const buff = new Uint8Array(this.degree)\n    buff.set(remainder, start)\n\n    return buff\n  }\n\n  return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n","const numeric = '[0-9]+'\nconst alphanumeric = '[A-Z $%*+\\\\-./:]+'\nlet kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n  '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n  '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n  '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nconst byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nconst TEST_KANJI = new RegExp('^' + kanji + '$')\nconst TEST_NUMERIC = new RegExp('^' + numeric + '$')\nconst TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n  return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n  return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n  return TEST_ALPHANUMERIC.test(str)\n}\n","const Mode = require('./mode')\nconst NumericData = require('./numeric-data')\nconst AlphanumericData = require('./alphanumeric-data')\nconst ByteData = require('./byte-data')\nconst KanjiData = require('./kanji-data')\nconst Regex = require('./regex')\nconst Utils = require('./utils')\nconst dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param  {String} str Input string\n * @return {Number}     Number of byte\n */\nfunction getStringByteLength (str) {\n  return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param  {Mode}   mode Segment mode\n * @param  {String} str  String to process\n * @return {Array}       Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n  const segments = []\n  let result\n\n  while ((result = regex.exec(str)) !== null) {\n    segments.push({\n      data: result[0],\n      index: result.index,\n      mode: mode,\n      length: result[0].length\n    })\n  }\n\n  return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param  {String} dataStr Input string\n * @return {Array}          Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n  const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n  const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n  let byteSegs\n  let kanjiSegs\n\n  if (Utils.isKanjiModeEnabled()) {\n    byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n    kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n  } else {\n    byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n    kanjiSegs = []\n  }\n\n  const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n  return segs\n    .sort(function (s1, s2) {\n      return s1.index - s2.index\n    })\n    .map(function (obj) {\n      return {\n        data: obj.data,\n        mode: obj.mode,\n        length: obj.length\n      }\n    })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param  {Number} length String length\n * @param  {Mode} mode     Segment mode\n * @return {Number}        Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n  switch (mode) {\n    case Mode.NUMERIC:\n      return NumericData.getBitsLength(length)\n    case Mode.ALPHANUMERIC:\n      return AlphanumericData.getBitsLength(length)\n    case Mode.KANJI:\n      return KanjiData.getBitsLength(length)\n    case Mode.BYTE:\n      return ByteData.getBitsLength(length)\n  }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param  {Array} segs Array of object with segments data\n * @return {Array}      Array of object with segments data\n */\nfunction mergeSegments (segs) {\n  return segs.reduce(function (acc, curr) {\n    const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n    if (prevSeg && prevSeg.mode === curr.mode) {\n      acc[acc.length - 1].data += curr.data\n      return acc\n    }\n\n    acc.push(curr)\n    return acc\n  }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param  {Array} segs Array of object with segments data\n * @return {Array}      Array of object with segments data\n */\nfunction buildNodes (segs) {\n  const nodes = []\n  for (let i = 0; i < segs.length; i++) {\n    const seg = segs[i]\n\n    switch (seg.mode) {\n      case Mode.NUMERIC:\n        nodes.push([seg,\n          { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n          { data: seg.data, mode: Mode.BYTE, length: seg.length }\n        ])\n        break\n      case Mode.ALPHANUMERIC:\n        nodes.push([seg,\n          { data: seg.data, mode: Mode.BYTE, length: seg.length }\n        ])\n        break\n      case Mode.KANJI:\n        nodes.push([seg,\n          { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n        ])\n        break\n      case Mode.BYTE:\n        nodes.push([\n          { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n        ])\n    }\n  }\n\n  return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param  {Array} nodes    Array of object with segments data\n * @param  {Number} version QR Code version\n * @return {Object}         Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n  const table = {}\n  const graph = { start: {} }\n  let prevNodeIds = ['start']\n\n  for (let i = 0; i < nodes.length; i++) {\n    const nodeGroup = nodes[i]\n    const currentNodeIds = []\n\n    for (let j = 0; j < nodeGroup.length; j++) {\n      const node = nodeGroup[j]\n      const key = '' + i + j\n\n      currentNodeIds.push(key)\n      table[key] = { node: node, lastCount: 0 }\n      graph[key] = {}\n\n      for (let n = 0; n < prevNodeIds.length; n++) {\n        const prevNodeId = prevNodeIds[n]\n\n        if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n          graph[prevNodeId][key] =\n            getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n            getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n          table[prevNodeId].lastCount += node.length\n        } else {\n          if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n          graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n            4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n        }\n      }\n    }\n\n    prevNodeIds = currentNodeIds\n  }\n\n  for (let n = 0; n < prevNodeIds.length; n++) {\n    graph[prevNodeIds[n]].end = 0\n  }\n\n  return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param  {String} data             Input data\n * @param  {Mode | String} modesHint Data mode\n * @return {Segment}                 Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n  let mode\n  const bestMode = Mode.getBestModeForData(data)\n\n  mode = Mode.from(modesHint, bestMode)\n\n  // Make sure data can be encoded\n  if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n    throw new Error('\"' + data + '\"' +\n      ' cannot be encoded with mode ' + Mode.toString(mode) +\n      '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n  }\n\n  // Use Mode.BYTE if Kanji support is disabled\n  if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n    mode = Mode.BYTE\n  }\n\n  switch (mode) {\n    case Mode.NUMERIC:\n      return new NumericData(data)\n\n    case Mode.ALPHANUMERIC:\n      return new AlphanumericData(data)\n\n    case Mode.KANJI:\n      return new KanjiData(data)\n\n    case Mode.BYTE:\n      return new ByteData(data)\n  }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param  {Array} array Array of objects with segments data\n * @return {Array}       Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n  return array.reduce(function (acc, seg) {\n    if (typeof seg === 'string') {\n      acc.push(buildSingleSegment(seg, null))\n    } else if (seg.data) {\n      acc.push(buildSingleSegment(seg.data, seg.mode))\n    }\n\n    return acc\n  }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param  {String} data    Input string\n * @param  {Number} version QR Code version\n * @return {Array}          Array of segments\n */\nexports.fromString = function fromString (data, version) {\n  const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n  const nodes = buildNodes(segs)\n  const graph = buildGraph(nodes, version)\n  const path = dijkstra.find_path(graph.map, 'start', 'end')\n\n  const optimizedSegs = []\n  for (let i = 1; i < path.length - 1; i++) {\n    optimizedSegs.push(graph.table[path[i]].node)\n  }\n\n  return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param  {string} data Input string\n * @return {Array}       Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n  return exports.fromArray(\n    getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n  )\n}\n","let toSJISFunction\nconst CODEWORDS_COUNT = [\n  0, // Not used\n  26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n  404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n  1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n  2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param  {Number} version QR Code version\n * @return {Number}         size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n  if (!version) throw new Error('\"version\" cannot be null or undefined')\n  if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n  return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param  {Number} version QR Code version\n * @return {Number}         Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n  return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param  {Number} data Value to encode\n * @return {Number}      Encoded value\n */\nexports.getBCHDigit = function (data) {\n  let digit = 0\n\n  while (data !== 0) {\n    digit++\n    data >>>= 1\n  }\n\n  return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n  if (typeof f !== 'function') {\n    throw new Error('\"toSJISFunc\" is not a valid function.')\n  }\n\n  toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n  return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n  return toSJISFunction(kanji)\n}\n","/**\n * Check if QR Code version is valid\n *\n * @param  {Number}  version QR Code version\n * @return {Boolean}         true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n  return !isNaN(version) && version >= 1 && version <= 40\n}\n","const Utils = require('./utils')\nconst ECCode = require('./error-correction-code')\nconst ECLevel = require('./error-correction-level')\nconst Mode = require('./mode')\nconst VersionCheck = require('./version-check')\n\n// Generator polynomial used to encode version information\nconst G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nconst G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n  for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n    if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n      return currentVersion\n    }\n  }\n\n  return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n  // Character count indicator + mode indicator bits\n  return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n  let totalBits = 0\n\n  segments.forEach(function (data) {\n    const reservedBits = getReservedBitsCount(data.mode, version)\n    totalBits += reservedBits + data.getBitsLength()\n  })\n\n  return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n  for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n    const length = getTotalBitsFromDataArray(segments, currentVersion)\n    if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n      return currentVersion\n    }\n  }\n\n  return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param  {Number|String} value        QR Code version\n * @param  {Number}        defaultValue Fallback value\n * @return {Number}                     QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n  if (VersionCheck.isValid(value)) {\n    return parseInt(value, 10)\n  }\n\n  return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param  {Number} version              QR Code version (1-40)\n * @param  {Number} errorCorrectionLevel Error correction level\n * @param  {Mode}   mode                 Data mode\n * @return {Number}                      Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n  if (!VersionCheck.isValid(version)) {\n    throw new Error('Invalid QR Code version')\n  }\n\n  // Use Byte mode as default\n  if (typeof mode === 'undefined') mode = Mode.BYTE\n\n  // Total codewords for this QR code version (Data + Error correction)\n  const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n  // Total number of error correction codewords\n  const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n  // Total number of data codewords\n  const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n  if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n  const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n  // Return max number of storable codewords\n  switch (mode) {\n    case Mode.NUMERIC:\n      return Math.floor((usableBits / 10) * 3)\n\n    case Mode.ALPHANUMERIC:\n      return Math.floor((usableBits / 11) * 2)\n\n    case Mode.KANJI:\n      return Math.floor(usableBits / 13)\n\n    case Mode.BYTE:\n    default:\n      return Math.floor(usableBits / 8)\n  }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param  {Segment} data                    Segment of data\n * @param  {Number} [errorCorrectionLevel=H] Error correction level\n * @param  {Mode} mode                       Data mode\n * @return {Number}                          QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n  let seg\n\n  const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n  if (Array.isArray(data)) {\n    if (data.length > 1) {\n      return getBestVersionForMixedData(data, ecl)\n    }\n\n    if (data.length === 0) {\n      return 1\n    }\n\n    seg = data[0]\n  } else {\n    seg = data\n  }\n\n  return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param  {Number} version QR Code version\n * @return {Number}         Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n  if (!VersionCheck.isValid(version) || version < 7) {\n    throw new Error('Invalid QR Code version')\n  }\n\n  let d = version << 12\n\n  while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n    d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n  }\n\n  return (version << 12) | d\n}\n","const Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n  ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n  if (!canvas.style) canvas.style = {}\n  canvas.height = size\n  canvas.width = size\n  canvas.style.height = size + 'px'\n  canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n  try {\n    return document.createElement('canvas')\n  } catch (e) {\n    throw new Error('You need to specify a canvas element')\n  }\n}\n\nexports.render = function render (qrData, canvas, options) {\n  let opts = options\n  let canvasEl = canvas\n\n  if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n    opts = canvas\n    canvas = undefined\n  }\n\n  if (!canvas) {\n    canvasEl = getCanvasElement()\n  }\n\n  opts = Utils.getOptions(opts)\n  const size = Utils.getImageWidth(qrData.modules.size, opts)\n\n  const ctx = canvasEl.getContext('2d')\n  const image = ctx.createImageData(size, size)\n  Utils.qrToImageData(image.data, qrData, opts)\n\n  clearCanvas(ctx, canvasEl, size)\n  ctx.putImageData(image, 0, 0)\n\n  return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n  let opts = options\n\n  if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n    opts = canvas\n    canvas = undefined\n  }\n\n  if (!opts) opts = {}\n\n  const canvasEl = exports.render(qrData, canvas, opts)\n\n  const type = opts.type || 'image/png'\n  const rendererOpts = opts.rendererOpts || {}\n\n  return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n","const Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n  const alpha = color.a / 255\n  const str = attrib + '=\"' + color.hex + '\"'\n\n  return alpha < 1\n    ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n    : str\n}\n\nfunction svgCmd (cmd, x, y) {\n  let str = cmd + x\n  if (typeof y !== 'undefined') str += ' ' + y\n\n  return str\n}\n\nfunction qrToPath (data, size, margin) {\n  let path = ''\n  let moveBy = 0\n  let newRow = false\n  let lineLength = 0\n\n  for (let i = 0; i < data.length; i++) {\n    const col = Math.floor(i % size)\n    const row = Math.floor(i / size)\n\n    if (!col && !newRow) newRow = true\n\n    if (data[i]) {\n      lineLength++\n\n      if (!(i > 0 && col > 0 && data[i - 1])) {\n        path += newRow\n          ? svgCmd('M', col + margin, 0.5 + row + margin)\n          : svgCmd('m', moveBy, 0)\n\n        moveBy = 0\n        newRow = false\n      }\n\n      if (!(col + 1 < size && data[i + 1])) {\n        path += svgCmd('h', lineLength)\n        lineLength = 0\n      }\n    } else {\n      moveBy++\n    }\n  }\n\n  return path\n}\n\nexports.render = function render (qrData, options, cb) {\n  const opts = Utils.getOptions(options)\n  const size = qrData.modules.size\n  const data = qrData.modules.data\n  const qrcodesize = size + opts.margin * 2\n\n  const bg = !opts.color.light.a\n    ? ''\n    : '<path ' + getColorAttrib(opts.color.light, 'fill') +\n      ' d=\"M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z\"/>'\n\n  const path =\n    '<path ' + getColorAttrib(opts.color.dark, 'stroke') +\n    ' d=\"' + qrToPath(data, size, opts.margin) + '\"/>'\n\n  const viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n  const width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n  const svgTag = '<svg xmlns=\"http://www.w3.org/2000/svg\" ' + width + viewBox + ' shape-rendering=\"crispEdges\">' + bg + path + '</svg>\\n'\n\n  if (typeof cb === 'function') {\n    cb(null, svgTag)\n  }\n\n  return svgTag\n}\n","function hex2rgba (hex) {\n  if (typeof hex === 'number') {\n    hex = hex.toString()\n  }\n\n  if (typeof hex !== 'string') {\n    throw new Error('Color should be defined as hex string')\n  }\n\n  let hexCode = hex.slice().replace('#', '').split('')\n  if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n    throw new Error('Invalid hex color: ' + hex)\n  }\n\n  // Convert from short to long form (fff -> ffffff)\n  if (hexCode.length === 3 || hexCode.length === 4) {\n    hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n      return [c, c]\n    }))\n  }\n\n  // Add default alpha value\n  if (hexCode.length === 6) hexCode.push('F', 'F')\n\n  const hexValue = parseInt(hexCode.join(''), 16)\n\n  return {\n    r: (hexValue >> 24) & 255,\n    g: (hexValue >> 16) & 255,\n    b: (hexValue >> 8) & 255,\n    a: hexValue & 255,\n    hex: '#' + hexCode.slice(0, 6).join('')\n  }\n}\n\nexports.getOptions = function getOptions (options) {\n  if (!options) options = {}\n  if (!options.color) options.color = {}\n\n  const margin = typeof options.margin === 'undefined' ||\n    options.margin === null ||\n    options.margin < 0\n    ? 4\n    : options.margin\n\n  const width = options.width && options.width >= 21 ? options.width : undefined\n  const scale = options.scale || 4\n\n  return {\n    width: width,\n    scale: width ? 4 : scale,\n    margin: margin,\n    color: {\n      dark: hex2rgba(options.color.dark || '#000000ff'),\n      light: hex2rgba(options.color.light || '#ffffffff')\n    },\n    type: options.type,\n    rendererOpts: options.rendererOpts || {}\n  }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n  return opts.width && opts.width >= qrSize + opts.margin * 2\n    ? opts.width / (qrSize + opts.margin * 2)\n    : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n  const scale = exports.getScale(qrSize, opts)\n  return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n  const size = qr.modules.size\n  const data = qr.modules.data\n  const scale = exports.getScale(size, opts)\n  const symbolSize = Math.floor((size + opts.margin * 2) * scale)\n  const scaledMargin = opts.margin * scale\n  const palette = [opts.color.light, opts.color.dark]\n\n  for (let i = 0; i < symbolSize; i++) {\n    for (let j = 0; j < symbolSize; j++) {\n      let posDst = (i * symbolSize + j) * 4\n      let pxColor = opts.color.light\n\n      if (i >= scaledMargin && j >= scaledMargin &&\n        i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n        const iSrc = Math.floor((i - scaledMargin) / scale)\n        const jSrc = Math.floor((j - scaledMargin) / scale)\n        pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n      }\n\n      imgData[posDst++] = pxColor.r\n      imgData[posDst++] = pxColor.g\n      imgData[posDst++] = pxColor.b\n      imgData[posDst] = pxColor.a\n    }\n  }\n}\n","'use strict';\n\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 */\n\n\n\n\n// A reserved attribute.\n// It is handled by React separately and shouldn't be written to the DOM.\nconst RESERVED = 0;\n\n// A simple string attribute.\n// Attributes that aren't in the filter are presumed to have this type.\nconst STRING = 1;\n\n// A string attribute that accepts booleans in React. In HTML, these are called\n// \"enumerated\" attributes with \"true\" and \"false\" as possible values.\n// When true, it should be set to a \"true\" string.\n// When false, it should be set to a \"false\" string.\nconst BOOLEANISH_STRING = 2;\n\n// A real boolean attribute.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\nconst BOOLEAN = 3;\n\n// An attribute that can be used as a flag as well as with a value.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n// For any other value, should be present with that value.\nconst OVERLOADED_BOOLEAN = 4;\n\n// An attribute that must be numeric or parse as a numeric.\n// When falsy, it should be removed.\nconst NUMERIC = 5;\n\n// An attribute that must be positive numeric or parse as a positive numeric.\n// When falsy, it should be removed.\nconst POSITIVE_NUMERIC = 6;\n\nfunction getPropertyInfo(name) {\n  return properties.hasOwnProperty(name) ? properties[name] : null;\n}\n\nfunction PropertyInfoRecord(\n  name,\n  type,\n  mustUseProperty,\n  attributeName,\n  attributeNamespace,\n  sanitizeURL,\n  removeEmptyString,\n) {\n  this.acceptsBooleans =\n    type === BOOLEANISH_STRING ||\n    type === BOOLEAN ||\n    type === OVERLOADED_BOOLEAN;\n  this.attributeName = attributeName;\n  this.attributeNamespace = attributeNamespace;\n  this.mustUseProperty = mustUseProperty;\n  this.propertyName = name;\n  this.type = type;\n  this.sanitizeURL = sanitizeURL;\n  this.removeEmptyString = removeEmptyString;\n}\n\n// When adding attributes to this list, be sure to also add them to\n// the `possibleStandardNames` module to ensure casing and incorrect\n// name warnings.\nconst properties = {};\n\n// These props are reserved by React. They shouldn't be written to the DOM.\nconst reservedProps = [\n  'children',\n  'dangerouslySetInnerHTML',\n  // TODO: This prevents the assignment of defaultValue to regular\n  // elements (not just inputs). Now that ReactDOMInput assigns to the\n  // defaultValue property -- do we need this?\n  'defaultValue',\n  'defaultChecked',\n  'innerHTML',\n  'suppressContentEditableWarning',\n  'suppressHydrationWarning',\n  'style',\n];\n\nreservedProps.forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    RESERVED,\n    false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// A few React string attributes have a different name.\n// This is a mapping from React prop names to the attribute names.\n[\n  ['acceptCharset', 'accept-charset'],\n  ['className', 'class'],\n  ['htmlFor', 'for'],\n  ['httpEquiv', 'http-equiv'],\n].forEach(([name, attributeName]) => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    STRING,\n    false, // mustUseProperty\n    attributeName, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are \"enumerated\" HTML attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    BOOLEANISH_STRING,\n    false, // mustUseProperty\n    name.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are \"enumerated\" SVG attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n// Since these are SVG attributes, their attribute names are case-sensitive.\n[\n  'autoReverse',\n  'externalResourcesRequired',\n  'focusable',\n  'preserveAlpha',\n].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    BOOLEANISH_STRING,\n    false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are HTML boolean attributes.\n[\n  'allowFullScreen',\n  'async',\n  // Note: there is a special case that prevents it from being written to the DOM\n  // on the client side because the browsers are inconsistent. Instead we call focus().\n  'autoFocus',\n  'autoPlay',\n  'controls',\n  'default',\n  'defer',\n  'disabled',\n  'disablePictureInPicture',\n  'disableRemotePlayback',\n  'formNoValidate',\n  'hidden',\n  'loop',\n  'noModule',\n  'noValidate',\n  'open',\n  'playsInline',\n  'readOnly',\n  'required',\n  'reversed',\n  'scoped',\n  'seamless',\n  // Microdata\n  'itemScope',\n].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    BOOLEAN,\n    false, // mustUseProperty\n    name.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are the few React props that we set as DOM properties\n// rather than attributes. These are all booleans.\n[\n  'checked',\n  // Note: `option.selected` is not updated if `select.multiple` is\n  // disabled with `removeAttribute`. We have special logic for handling this.\n  'multiple',\n  'muted',\n  'selected',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    BOOLEAN,\n    true, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are HTML attributes that are \"overloaded booleans\": they behave like\n// booleans, but can also accept a string value.\n[\n  'capture',\n  'download',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    OVERLOADED_BOOLEAN,\n    false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are HTML attributes that must be positive numbers.\n[\n  'cols',\n  'rows',\n  'size',\n  'span',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    POSITIVE_NUMERIC,\n    false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are HTML attributes that must be numbers.\n['rowSpan', 'start'].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    NUMERIC,\n    false, // mustUseProperty\n    name.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\nconst CAMELIZE = /[\\-\\:]([a-z])/g;\nconst capitalize = token => token[1].toUpperCase();\n\n// This is a list of all SVG attributes that need special casing, namespacing,\n// or boolean value assignment. Regular attributes that just accept strings\n// and have the same names are omitted, just like in the HTML attribute filter.\n// Some of these attributes can be hard to find. This list was created by\n// scraping the MDN documentation.\n[\n  'accent-height',\n  'alignment-baseline',\n  'arabic-form',\n  'baseline-shift',\n  'cap-height',\n  'clip-path',\n  'clip-rule',\n  'color-interpolation',\n  'color-interpolation-filters',\n  'color-profile',\n  'color-rendering',\n  'dominant-baseline',\n  'enable-background',\n  'fill-opacity',\n  'fill-rule',\n  'flood-color',\n  'flood-opacity',\n  'font-family',\n  'font-size',\n  'font-size-adjust',\n  'font-stretch',\n  'font-style',\n  'font-variant',\n  'font-weight',\n  'glyph-name',\n  'glyph-orientation-horizontal',\n  'glyph-orientation-vertical',\n  'horiz-adv-x',\n  'horiz-origin-x',\n  'image-rendering',\n  'letter-spacing',\n  'lighting-color',\n  'marker-end',\n  'marker-mid',\n  'marker-start',\n  'overline-position',\n  'overline-thickness',\n  'paint-order',\n  'panose-1',\n  'pointer-events',\n  'rendering-intent',\n  'shape-rendering',\n  'stop-color',\n  'stop-opacity',\n  'strikethrough-position',\n  'strikethrough-thickness',\n  'stroke-dasharray',\n  'stroke-dashoffset',\n  'stroke-linecap',\n  'stroke-linejoin',\n  'stroke-miterlimit',\n  'stroke-opacity',\n  'stroke-width',\n  'text-anchor',\n  'text-decoration',\n  'text-rendering',\n  'underline-position',\n  'underline-thickness',\n  'unicode-bidi',\n  'unicode-range',\n  'units-per-em',\n  'v-alphabetic',\n  'v-hanging',\n  'v-ideographic',\n  'v-mathematical',\n  'vector-effect',\n  'vert-adv-y',\n  'vert-origin-x',\n  'vert-origin-y',\n  'word-spacing',\n  'writing-mode',\n  'xmlns:xlink',\n  'x-height',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(attributeName => {\n  const name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(\n    name,\n    STRING,\n    false, // mustUseProperty\n    attributeName,\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// String SVG attributes with the xlink namespace.\n[\n  'xlink:actuate',\n  'xlink:arcrole',\n  'xlink:role',\n  'xlink:show',\n  'xlink:title',\n  'xlink:type',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(attributeName => {\n  const name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(\n    name,\n    STRING,\n    false, // mustUseProperty\n    attributeName,\n    'http://www.w3.org/1999/xlink',\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// String SVG attributes with the xml namespace.\n[\n  'xml:base',\n  'xml:lang',\n  'xml:space',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(attributeName => {\n  const name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(\n    name,\n    STRING,\n    false, // mustUseProperty\n    attributeName,\n    'http://www.w3.org/XML/1998/namespace',\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These attribute exists both in HTML and SVG.\n// The attribute name is case-sensitive in SVG so we can't just use\n// the React name like we do for attributes that exist only in HTML.\n['tabIndex', 'crossOrigin'].forEach(attributeName => {\n  properties[attributeName] = new PropertyInfoRecord(\n    attributeName,\n    STRING,\n    false, // mustUseProperty\n    attributeName.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These attributes accept URLs. These must not allow javascript: URLS.\n// These will also need to accept Trusted Types object in the future.\nconst xlinkHref = 'xlinkHref';\nproperties[xlinkHref] = new PropertyInfoRecord(\n  'xlinkHref',\n  STRING,\n  false, // mustUseProperty\n  'xlink:href',\n  'http://www.w3.org/1999/xlink',\n  true, // sanitizeURL\n  false, // removeEmptyString\n);\n\n['src', 'href', 'action', 'formAction'].forEach(attributeName => {\n  properties[attributeName] = new PropertyInfoRecord(\n    attributeName,\n    STRING,\n    false, // mustUseProperty\n    attributeName.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    true, // sanitizeURL\n    true, // removeEmptyString\n  );\n});\n\n// \nconst {\n  CAMELCASE,\n  SAME,\n  possibleStandardNames: possibleStandardNamesOptimized\n} = require('../lib/possibleStandardNamesOptimized');\n\nconst ATTRIBUTE_NAME_START_CHAR =\n  ':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';\n\nconst ATTRIBUTE_NAME_CHAR =\n  ATTRIBUTE_NAME_START_CHAR + '\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\n\n/**\n * Checks whether a property name is a custom attribute.\n *\n * @see https://github.com/facebook/react/blob/15-stable/src/renderers/dom/shared/HTMLDOMPropertyConfig.js#L23-L25\n *\n * @type {(attribute: string) => boolean}\n */\nconst isCustomAttribute =\n  RegExp.prototype.test.bind(\n    // eslint-disable-next-line no-misleading-character-class\n    new RegExp('^(data|aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$')\n  );\n\n/**\n * @type {Record<string, string>}\n */\nconst possibleStandardNames = Object.keys(\n  possibleStandardNamesOptimized\n).reduce((accumulator, standardName) => {\n  const propName = possibleStandardNamesOptimized[standardName];\n  if (propName === SAME) {\n    accumulator[standardName] = standardName;\n  } else if (propName === CAMELCASE) {\n    accumulator[standardName.toLowerCase()] = standardName;\n  } else {\n    accumulator[standardName] = propName;\n  }\n  return accumulator;\n}, {});\n\nexports.BOOLEAN = BOOLEAN;\nexports.BOOLEANISH_STRING = BOOLEANISH_STRING;\nexports.NUMERIC = NUMERIC;\nexports.OVERLOADED_BOOLEAN = OVERLOADED_BOOLEAN;\nexports.POSITIVE_NUMERIC = POSITIVE_NUMERIC;\nexports.RESERVED = RESERVED;\nexports.STRING = STRING;\nexports.getPropertyInfo = getPropertyInfo;\nexports.isCustomAttribute = isCustomAttribute;\nexports.possibleStandardNames = possibleStandardNames;\n","// An attribute in which the DOM/SVG standard name is the same as the React prop name (e.g., 'accept').\nvar SAME = 0;\nexports.SAME = SAME;\n\n// An attribute in which the React prop name is the camelcased version of the DOM/SVG standard name (e.g., 'acceptCharset').\nvar CAMELCASE = 1;\nexports.CAMELCASE = CAMELCASE;\n\nexports.possibleStandardNames = {\n  accept: 0,\n  acceptCharset: 1,\n  'accept-charset': 'acceptCharset',\n  accessKey: 1,\n  action: 0,\n  allowFullScreen: 1,\n  alt: 0,\n  as: 0,\n  async: 0,\n  autoCapitalize: 1,\n  autoComplete: 1,\n  autoCorrect: 1,\n  autoFocus: 1,\n  autoPlay: 1,\n  autoSave: 1,\n  capture: 0,\n  cellPadding: 1,\n  cellSpacing: 1,\n  challenge: 0,\n  charSet: 1,\n  checked: 0,\n  children: 0,\n  cite: 0,\n  class: 'className',\n  classID: 1,\n  className: 1,\n  cols: 0,\n  colSpan: 1,\n  content: 0,\n  contentEditable: 1,\n  contextMenu: 1,\n  controls: 0,\n  controlsList: 1,\n  coords: 0,\n  crossOrigin: 1,\n  dangerouslySetInnerHTML: 1,\n  data: 0,\n  dateTime: 1,\n  default: 0,\n  defaultChecked: 1,\n  defaultValue: 1,\n  defer: 0,\n  dir: 0,\n  disabled: 0,\n  disablePictureInPicture: 1,\n  disableRemotePlayback: 1,\n  download: 0,\n  draggable: 0,\n  encType: 1,\n  enterKeyHint: 1,\n  for: 'htmlFor',\n  form: 0,\n  formMethod: 1,\n  formAction: 1,\n  formEncType: 1,\n  formNoValidate: 1,\n  formTarget: 1,\n  frameBorder: 1,\n  headers: 0,\n  height: 0,\n  hidden: 0,\n  high: 0,\n  href: 0,\n  hrefLang: 1,\n  htmlFor: 1,\n  httpEquiv: 1,\n  'http-equiv': 'httpEquiv',\n  icon: 0,\n  id: 0,\n  innerHTML: 1,\n  inputMode: 1,\n  integrity: 0,\n  is: 0,\n  itemID: 1,\n  itemProp: 1,\n  itemRef: 1,\n  itemScope: 1,\n  itemType: 1,\n  keyParams: 1,\n  keyType: 1,\n  kind: 0,\n  label: 0,\n  lang: 0,\n  list: 0,\n  loop: 0,\n  low: 0,\n  manifest: 0,\n  marginWidth: 1,\n  marginHeight: 1,\n  max: 0,\n  maxLength: 1,\n  media: 0,\n  mediaGroup: 1,\n  method: 0,\n  min: 0,\n  minLength: 1,\n  multiple: 0,\n  muted: 0,\n  name: 0,\n  noModule: 1,\n  nonce: 0,\n  noValidate: 1,\n  open: 0,\n  optimum: 0,\n  pattern: 0,\n  placeholder: 0,\n  playsInline: 1,\n  poster: 0,\n  preload: 0,\n  profile: 0,\n  radioGroup: 1,\n  readOnly: 1,\n  referrerPolicy: 1,\n  rel: 0,\n  required: 0,\n  reversed: 0,\n  role: 0,\n  rows: 0,\n  rowSpan: 1,\n  sandbox: 0,\n  scope: 0,\n  scoped: 0,\n  scrolling: 0,\n  seamless: 0,\n  selected: 0,\n  shape: 0,\n  size: 0,\n  sizes: 0,\n  span: 0,\n  spellCheck: 1,\n  src: 0,\n  srcDoc: 1,\n  srcLang: 1,\n  srcSet: 1,\n  start: 0,\n  step: 0,\n  style: 0,\n  summary: 0,\n  tabIndex: 1,\n  target: 0,\n  title: 0,\n  type: 0,\n  useMap: 1,\n  value: 0,\n  width: 0,\n  wmode: 0,\n  wrap: 0,\n  about: 0,\n  accentHeight: 1,\n  'accent-height': 'accentHeight',\n  accumulate: 0,\n  additive: 0,\n  alignmentBaseline: 1,\n  'alignment-baseline': 'alignmentBaseline',\n  allowReorder: 1,\n  alphabetic: 0,\n  amplitude: 0,\n  arabicForm: 1,\n  'arabic-form': 'arabicForm',\n  ascent: 0,\n  attributeName: 1,\n  attributeType: 1,\n  autoReverse: 1,\n  azimuth: 0,\n  baseFrequency: 1,\n  baselineShift: 1,\n  'baseline-shift': 'baselineShift',\n  baseProfile: 1,\n  bbox: 0,\n  begin: 0,\n  bias: 0,\n  by: 0,\n  calcMode: 1,\n  capHeight: 1,\n  'cap-height': 'capHeight',\n  clip: 0,\n  clipPath: 1,\n  'clip-path': 'clipPath',\n  clipPathUnits: 1,\n  clipRule: 1,\n  'clip-rule': 'clipRule',\n  color: 0,\n  colorInterpolation: 1,\n  'color-interpolation': 'colorInterpolation',\n  colorInterpolationFilters: 1,\n  'color-interpolation-filters': 'colorInterpolationFilters',\n  colorProfile: 1,\n  'color-profile': 'colorProfile',\n  colorRendering: 1,\n  'color-rendering': 'colorRendering',\n  contentScriptType: 1,\n  contentStyleType: 1,\n  cursor: 0,\n  cx: 0,\n  cy: 0,\n  d: 0,\n  datatype: 0,\n  decelerate: 0,\n  descent: 0,\n  diffuseConstant: 1,\n  direction: 0,\n  display: 0,\n  divisor: 0,\n  dominantBaseline: 1,\n  'dominant-baseline': 'dominantBaseline',\n  dur: 0,\n  dx: 0,\n  dy: 0,\n  edgeMode: 1,\n  elevation: 0,\n  enableBackground: 1,\n  'enable-background': 'enableBackground',\n  end: 0,\n  exponent: 0,\n  externalResourcesRequired: 1,\n  fill: 0,\n  fillOpacity: 1,\n  'fill-opacity': 'fillOpacity',\n  fillRule: 1,\n  'fill-rule': 'fillRule',\n  filter: 0,\n  filterRes: 1,\n  filterUnits: 1,\n  floodOpacity: 1,\n  'flood-opacity': 'floodOpacity',\n  floodColor: 1,\n  'flood-color': 'floodColor',\n  focusable: 0,\n  fontFamily: 1,\n  'font-family': 'fontFamily',\n  fontSize: 1,\n  'font-size': 'fontSize',\n  fontSizeAdjust: 1,\n  'font-size-adjust': 'fontSizeAdjust',\n  fontStretch: 1,\n  'font-stretch': 'fontStretch',\n  fontStyle: 1,\n  'font-style': 'fontStyle',\n  fontVariant: 1,\n  'font-variant': 'fontVariant',\n  fontWeight: 1,\n  'font-weight': 'fontWeight',\n  format: 0,\n  from: 0,\n  fx: 0,\n  fy: 0,\n  g1: 0,\n  g2: 0,\n  glyphName: 1,\n  'glyph-name': 'glyphName',\n  glyphOrientationHorizontal: 1,\n  'glyph-orientation-horizontal': 'glyphOrientationHorizontal',\n  glyphOrientationVertical: 1,\n  'glyph-orientation-vertical': 'glyphOrientationVertical',\n  glyphRef: 1,\n  gradientTransform: 1,\n  gradientUnits: 1,\n  hanging: 0,\n  horizAdvX: 1,\n  'horiz-adv-x': 'horizAdvX',\n  horizOriginX: 1,\n  'horiz-origin-x': 'horizOriginX',\n  ideographic: 0,\n  imageRendering: 1,\n  'image-rendering': 'imageRendering',\n  in2: 0,\n  in: 0,\n  inlist: 0,\n  intercept: 0,\n  k1: 0,\n  k2: 0,\n  k3: 0,\n  k4: 0,\n  k: 0,\n  kernelMatrix: 1,\n  kernelUnitLength: 1,\n  kerning: 0,\n  keyPoints: 1,\n  keySplines: 1,\n  keyTimes: 1,\n  lengthAdjust: 1,\n  letterSpacing: 1,\n  'letter-spacing': 'letterSpacing',\n  lightingColor: 1,\n  'lighting-color': 'lightingColor',\n  limitingConeAngle: 1,\n  local: 0,\n  markerEnd: 1,\n  'marker-end': 'markerEnd',\n  markerHeight: 1,\n  markerMid: 1,\n  'marker-mid': 'markerMid',\n  markerStart: 1,\n  'marker-start': 'markerStart',\n  markerUnits: 1,\n  markerWidth: 1,\n  mask: 0,\n  maskContentUnits: 1,\n  maskUnits: 1,\n  mathematical: 0,\n  mode: 0,\n  numOctaves: 1,\n  offset: 0,\n  opacity: 0,\n  operator: 0,\n  order: 0,\n  orient: 0,\n  orientation: 0,\n  origin: 0,\n  overflow: 0,\n  overlinePosition: 1,\n  'overline-position': 'overlinePosition',\n  overlineThickness: 1,\n  'overline-thickness': 'overlineThickness',\n  paintOrder: 1,\n  'paint-order': 'paintOrder',\n  panose1: 0,\n  'panose-1': 'panose1',\n  pathLength: 1,\n  patternContentUnits: 1,\n  patternTransform: 1,\n  patternUnits: 1,\n  pointerEvents: 1,\n  'pointer-events': 'pointerEvents',\n  points: 0,\n  pointsAtX: 1,\n  pointsAtY: 1,\n  pointsAtZ: 1,\n  prefix: 0,\n  preserveAlpha: 1,\n  preserveAspectRatio: 1,\n  primitiveUnits: 1,\n  property: 0,\n  r: 0,\n  radius: 0,\n  refX: 1,\n  refY: 1,\n  renderingIntent: 1,\n  'rendering-intent': 'renderingIntent',\n  repeatCount: 1,\n  repeatDur: 1,\n  requiredExtensions: 1,\n  requiredFeatures: 1,\n  resource: 0,\n  restart: 0,\n  result: 0,\n  results: 0,\n  rotate: 0,\n  rx: 0,\n  ry: 0,\n  scale: 0,\n  security: 0,\n  seed: 0,\n  shapeRendering: 1,\n  'shape-rendering': 'shapeRendering',\n  slope: 0,\n  spacing: 0,\n  specularConstant: 1,\n  specularExponent: 1,\n  speed: 0,\n  spreadMethod: 1,\n  startOffset: 1,\n  stdDeviation: 1,\n  stemh: 0,\n  stemv: 0,\n  stitchTiles: 1,\n  stopColor: 1,\n  'stop-color': 'stopColor',\n  stopOpacity: 1,\n  'stop-opacity': 'stopOpacity',\n  strikethroughPosition: 1,\n  'strikethrough-position': 'strikethroughPosition',\n  strikethroughThickness: 1,\n  'strikethrough-thickness': 'strikethroughThickness',\n  string: 0,\n  stroke: 0,\n  strokeDasharray: 1,\n  'stroke-dasharray': 'strokeDasharray',\n  strokeDashoffset: 1,\n  'stroke-dashoffset': 'strokeDashoffset',\n  strokeLinecap: 1,\n  'stroke-linecap': 'strokeLinecap',\n  strokeLinejoin: 1,\n  'stroke-linejoin': 'strokeLinejoin',\n  strokeMiterlimit: 1,\n  'stroke-miterlimit': 'strokeMiterlimit',\n  strokeWidth: 1,\n  'stroke-width': 'strokeWidth',\n  strokeOpacity: 1,\n  'stroke-opacity': 'strokeOpacity',\n  suppressContentEditableWarning: 1,\n  suppressHydrationWarning: 1,\n  surfaceScale: 1,\n  systemLanguage: 1,\n  tableValues: 1,\n  targetX: 1,\n  targetY: 1,\n  textAnchor: 1,\n  'text-anchor': 'textAnchor',\n  textDecoration: 1,\n  'text-decoration': 'textDecoration',\n  textLength: 1,\n  textRendering: 1,\n  'text-rendering': 'textRendering',\n  to: 0,\n  transform: 0,\n  typeof: 0,\n  u1: 0,\n  u2: 0,\n  underlinePosition: 1,\n  'underline-position': 'underlinePosition',\n  underlineThickness: 1,\n  'underline-thickness': 'underlineThickness',\n  unicode: 0,\n  unicodeBidi: 1,\n  'unicode-bidi': 'unicodeBidi',\n  unicodeRange: 1,\n  'unicode-range': 'unicodeRange',\n  unitsPerEm: 1,\n  'units-per-em': 'unitsPerEm',\n  unselectable: 0,\n  vAlphabetic: 1,\n  'v-alphabetic': 'vAlphabetic',\n  values: 0,\n  vectorEffect: 1,\n  'vector-effect': 'vectorEffect',\n  version: 0,\n  vertAdvY: 1,\n  'vert-adv-y': 'vertAdvY',\n  vertOriginX: 1,\n  'vert-origin-x': 'vertOriginX',\n  vertOriginY: 1,\n  'vert-origin-y': 'vertOriginY',\n  vHanging: 1,\n  'v-hanging': 'vHanging',\n  vIdeographic: 1,\n  'v-ideographic': 'vIdeographic',\n  viewBox: 1,\n  viewTarget: 1,\n  visibility: 0,\n  vMathematical: 1,\n  'v-mathematical': 'vMathematical',\n  vocab: 0,\n  widths: 0,\n  wordSpacing: 1,\n  'word-spacing': 'wordSpacing',\n  writingMode: 1,\n  'writing-mode': 'writingMode',\n  x1: 0,\n  x2: 0,\n  x: 0,\n  xChannelSelector: 1,\n  xHeight: 1,\n  'x-height': 'xHeight',\n  xlinkActuate: 1,\n  'xlink:actuate': 'xlinkActuate',\n  xlinkArcrole: 1,\n  'xlink:arcrole': 'xlinkArcrole',\n  xlinkHref: 1,\n  'xlink:href': 'xlinkHref',\n  xlinkRole: 1,\n  'xlink:role': 'xlinkRole',\n  xlinkShow: 1,\n  'xlink:show': 'xlinkShow',\n  xlinkTitle: 1,\n  'xlink:title': 'xlinkTitle',\n  xlinkType: 1,\n  'xlink:type': 'xlinkType',\n  xmlBase: 1,\n  'xml:base': 'xmlBase',\n  xmlLang: 1,\n  'xml:lang': 'xmlLang',\n  xmlns: 0,\n  'xml:space': 'xmlSpace',\n  xmlnsXlink: 1,\n  'xmlns:xlink': 'xmlnsXlink',\n  xmlSpace: 1,\n  y1: 0,\n  y2: 0,\n  y: 0,\n  yChannelSelector: 1,\n  z: 0,\n  zoomAndPan: 1\n};\n","/* eslint-disable vars-on-top, no-var, prefer-template */\nvar isRegExp = function (re) { \n  return re instanceof RegExp;\n};\nvar escapeRegExp = function escapeRegExp(string) {\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n    reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  return (string && reHasRegExpChar.test(string))\n    ? string.replace(reRegExpChar, '\\\\$&')\n    : string;\n};\nvar isString = function (value) {\n  return typeof value === 'string';\n};\nvar flatten = function (array) {\n  var newArray = [];\n\n  array.forEach(function (item) {\n    if (Array.isArray(item)) {\n      newArray = newArray.concat(item);\n    } else {\n      newArray.push(item);\n    }\n  });\n\n  return newArray;\n};\n\n/**\n * Given a string, replace every substring that is matched by the `match` regex\n * with the result of calling `fn` on matched substring. The result will be an\n * array with all odd indexed elements containing the replacements. The primary\n * use case is similar to using String.prototype.replace except for React.\n *\n * React will happily render an array as children of a react element, which\n * makes this approach very useful for tasks like surrounding certain text\n * within a string with react elements.\n *\n * Example:\n * matchReplace(\n *   'Emphasize all phone numbers like 884-555-4443.',\n *   /([\\d|-]+)/g,\n *   (number, i) => <strong key={i}>{number}</strong>\n * );\n * // => ['Emphasize all phone numbers like ', <strong>884-555-4443</strong>, '.'\n *\n * @param {string} str\n * @param {RegExp|str} match Must contain a matching group\n * @param {function} fn\n * @return {array}\n */\nfunction replaceString(str, match, fn, count = null) {\n  var curCharStart = 0;\n  var curCharLen = 0;\n\n  if (str === '') {\n    return str;\n  } else if (!str || !isString(str)) {\n    throw new TypeError('First argument to react-string-replace#replaceString must be a string');\n  }\n\n  var re = match;\n\n  if (!isRegExp(re)) {\n    re = new RegExp('(' + escapeRegExp(re) + ')', 'gi');\n  }\n\n  var result = str.split(re);\n\n  // Apply fn to all odd elements\n  for (var i = 1, length = result.length; i < length; i += 2) {\n\n    if (Number.isInteger(count) && (count * 2 < i || count < 1)) {\n      break;\n    }\n    \n    /** @see {@link https://github.com/iansinnott/react-string-replace/issues/74} */\n    if (result[i] === undefined || result[i - 1] === undefined) {\n      console.warn('reactStringReplace: Encountered undefined value during string replacement. Your RegExp may not be working the way you expect.');\n      continue;\n    }\n\n    curCharLen = result[i].length;\n    curCharStart += result[i - 1].length;\n    result[i] = fn(result[i], (i - 1) / 2, curCharStart);\n    curCharStart += curCharLen;\n  }\n\n  return result;\n}\n\nmodule.exports = function reactStringReplace(source, match, fn, count = null) {\n  if (!Array.isArray(source)) source = [source];\n\n  return flatten(\n    source.map(function (x) {\n      var ret;\n      if (isString(x)) {\n        if (Number.isInteger(count) && count > 0) {\n          ret = replaceString(x, match, fn, count);\n          var re = isRegExp(match) ? match : new RegExp('(' + escapeRegExp(match) + ')', 'gi');\n          count -= (x.match(re) || []).length;\n        } else {\n          ret = replaceString(x, match, fn, count);\n        }\n      } else {\n        ret = x;\n      }\n      return ret;\n    }),\n  );\n};","const htmlparser = require('htmlparser2');\nconst escapeStringRegexp = require('escape-string-regexp');\nconst { isPlainObject } = require('is-plain-object');\nconst deepmerge = require('deepmerge');\nconst parseSrcset = require('parse-srcset');\nconst { parse: postcssParse } = require('postcss');\nconst { naughtyHref: launderNaughtyHref } = require('launder');\n// Tags that can conceivably represent stand-alone media.\nconst mediaTags = [\n  'img', 'audio', 'video', 'picture', 'svg',\n  'object', 'map', 'iframe', 'embed'\n];\n// Tags that are inherently vulnerable to being used in XSS attacks.\nconst vulnerableTags = [ 'script', 'style' ];\n\nfunction each(obj, cb) {\n  if (obj) {\n    Object.keys(obj).forEach(function (key) {\n      cb(obj[key], key);\n    });\n  }\n}\n\n// Avoid false positives with .__proto__, .hasOwnProperty, etc.\nfunction has(obj, key) {\n  return ({}).hasOwnProperty.call(obj, key);\n}\n\n// Returns those elements of `a` for which `cb(a)` returns truthy\nfunction filter(a, cb) {\n  const n = [];\n  each(a, function(v) {\n    if (cb(v)) {\n      n.push(v);\n    }\n  });\n  return n;\n}\n\nfunction isEmptyObject(obj) {\n  for (const key in obj) {\n    if (has(obj, key)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction stringifySrcset(parsedSrcset) {\n  return parsedSrcset.map(function(part) {\n    if (!part.url) {\n      throw new Error('URL missing');\n    }\n\n    return (\n      part.url +\n      (part.w ? ` ${part.w}w` : '') +\n      (part.h ? ` ${part.h}h` : '') +\n      (part.d ? ` ${part.d}x` : '')\n    );\n  }).join(', ');\n}\n\nmodule.exports = sanitizeHtml;\n\n// A valid attribute name.\n// We use a tolerant definition based on the set of strings defined by\n// html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state\n// and html.spec.whatwg.org/multipage/parsing.html#attribute-name-state .\n// The characters accepted are ones which can be appended to the attribute\n// name buffer without triggering a parse error:\n//   * unexpected-equals-sign-before-attribute-name\n//   * unexpected-null-character\n//   * unexpected-character-in-attribute-name\n// We exclude the empty string because it's impossible to get to the after\n// attribute name state with an empty attribute name buffer.\nconst VALID_HTML_ATTRIBUTE_NAME = /^[^\\0\\t\\n\\f\\r /<=>]+$/;\n\n// Ignore the _recursing flag; it's there for recursive\n// invocation as a guard against this exploit:\n// https://github.com/fb55/htmlparser2/issues/105\n\nfunction sanitizeHtml(html, options, _recursing) {\n  if (html == null) {\n    return '';\n  }\n  if (typeof html === 'number') {\n    html = html.toString();\n  }\n\n  let result = '';\n  // Used for hot swapping the result variable with an empty string\n  // in order to \"capture\" the text written to it.\n  let tempResult = '';\n\n  function Frame(tag, attribs) {\n    const that = this;\n    this.tag = tag;\n    this.attribs = attribs || {};\n    this.tagPosition = result.length;\n    this.text = ''; // Node inner text\n    this.openingTagLength = 0;\n    this.mediaChildren = [];\n\n    this.updateParentNodeText = function() {\n      if (stack.length) {\n        const parentFrame = stack[stack.length - 1];\n        parentFrame.text += that.text;\n      }\n    };\n\n    this.updateParentNodeMediaChildren = function() {\n      if (stack.length && mediaTags.includes(this.tag)) {\n        const parentFrame = stack[stack.length - 1];\n        parentFrame.mediaChildren.push(this.tag);\n      }\n    };\n  }\n\n  options = Object.assign({}, sanitizeHtml.defaults, options);\n  options.parser = Object.assign({}, htmlParserDefaults, options.parser);\n\n  const tagAllowed = function (name) {\n    return options.allowedTags === false ||\n      (options.allowedTags || []).indexOf(name) > -1;\n  };\n\n  // vulnerableTags\n  vulnerableTags.forEach(function (tag) {\n    if (tagAllowed(tag) && !options.allowVulnerableTags) {\n      console.warn(`\\n\\n⚠️ Your \\`allowedTags\\` option includes, \\`${tag}\\`, which is inherently\\nvulnerable to XSS attacks. Please remove it from \\`allowedTags\\`.\\nOr, to disable this warning, add the \\`allowVulnerableTags\\` option\\nand ensure you are accounting for this risk.\\n\\n`);\n    }\n  });\n\n  // Tags that contain something other than HTML, or where discarding\n  // the text when the tag is disallowed makes sense for other reasons.\n  // If we are not allowing these tags, we should drop their content too.\n  // For other tags you would drop the tag but keep its content.\n  // `xmp` is included because htmlparser2 treats it as a raw-text element,\n  // so markup inside is parsed as text on input but would otherwise be\n  // re-emitted unescaped via the `ontext` branch below, allowing XSS bypass\n  // when `xmp` is disallowed (which is the default).\n  const nonTextTagsArray = options.nonTextTags || [\n    'script',\n    'style',\n    'textarea',\n    'option',\n    'xmp'\n  ];\n  let allowedAttributesMap;\n  let allowedAttributesGlobMap;\n  if (options.allowedAttributes) {\n    allowedAttributesMap = {};\n    allowedAttributesGlobMap = {};\n    each(options.allowedAttributes, function(attributes, tag) {\n      allowedAttributesMap[tag] = [];\n      const globRegex = [];\n      attributes.forEach(function(obj) {\n        if (typeof obj === 'string' && obj.indexOf('*') >= 0) {\n          globRegex.push(escapeStringRegexp(obj).replace(/\\\\\\*/g, '.*'));\n        } else {\n          allowedAttributesMap[tag].push(obj);\n        }\n      });\n      if (globRegex.length) {\n        allowedAttributesGlobMap[tag] = new RegExp('^(' + globRegex.join('|') + ')$');\n      }\n    });\n  }\n  const allowedClassesMap = {};\n  const allowedClassesGlobMap = {};\n  const allowedClassesRegexMap = {};\n  each(options.allowedClasses, function(classes, tag) {\n    // Implicitly allows the class attribute\n    if (allowedAttributesMap) {\n      if (!has(allowedAttributesMap, tag)) {\n        allowedAttributesMap[tag] = [];\n      }\n      allowedAttributesMap[tag].push('class');\n    }\n\n    allowedClassesMap[tag] = classes;\n\n    if (Array.isArray(classes)) {\n      const globRegex = [];\n      allowedClassesMap[tag] = [];\n      allowedClassesRegexMap[tag] = [];\n      classes.forEach(function(obj) {\n        if (typeof obj === 'string' && obj.indexOf('*') >= 0) {\n          globRegex.push(escapeStringRegexp(obj).replace(/\\\\\\*/g, '.*'));\n        } else if (obj instanceof RegExp) {\n          allowedClassesRegexMap[tag].push(obj);\n        } else {\n          allowedClassesMap[tag].push(obj);\n        }\n      });\n      if (globRegex.length) {\n        allowedClassesGlobMap[tag] = new RegExp('^(' + globRegex.join('|') + ')$');\n      }\n    }\n  });\n\n  const transformTagsMap = {};\n  let transformTagsAll;\n  each(options.transformTags, function(transform, tag) {\n    let transFun;\n    if (typeof transform === 'function') {\n      transFun = transform;\n    } else if (typeof transform === 'string') {\n      transFun = sanitizeHtml.simpleTransform(transform);\n    }\n    if (tag === '*') {\n      transformTagsAll = transFun;\n    } else {\n      transformTagsMap[tag] = transFun;\n    }\n  });\n\n  let depth;\n  let stack;\n  let skipMap;\n  let transformMap;\n  let skipText;\n  let skipTextDepth;\n  let addedText = false;\n\n  initializeState();\n\n  const parser = new htmlparser.Parser({\n    onopentag: function(name, attribs) {\n      if (options.onOpenTag) {\n        options.onOpenTag(name, attribs);\n      }\n\n      // If `enforceHtmlBoundary` is `true` and this has found the opening\n      // `html` tag, reset the state.\n      if (options.enforceHtmlBoundary && name === 'html') {\n        initializeState();\n      }\n\n      if (skipText) {\n        skipTextDepth++;\n        return;\n      }\n      const frame = new Frame(name, attribs);\n      stack.push(frame);\n\n      let skip = false;\n      const hasText = !!frame.text;\n      let transformedTag;\n      if (has(transformTagsMap, name)) {\n        transformedTag = transformTagsMap[name](name, attribs);\n\n        frame.attribs = attribs = transformedTag.attribs;\n\n        if (transformedTag.text !== undefined) {\n          frame.innerText = transformedTag.text;\n        }\n\n        if (name !== transformedTag.tagName) {\n          frame.name = name = transformedTag.tagName;\n          transformMap[depth] = transformedTag.tagName;\n        }\n      }\n      if (transformTagsAll) {\n        transformedTag = transformTagsAll(name, attribs);\n\n        frame.attribs = attribs = transformedTag.attribs;\n        if (name !== transformedTag.tagName) {\n          frame.name = name = transformedTag.tagName;\n          transformMap[depth] = transformedTag.tagName;\n        }\n      }\n\n      if (!tagAllowed(name) || (options.disallowedTagsMode === 'recursiveEscape' && !isEmptyObject(skipMap)) || (options.nestingLimit != null && depth >= options.nestingLimit)) {\n        skip = true;\n        skipMap[depth] = true;\n        if (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') {\n          if (nonTextTagsArray.indexOf(name) !== -1) {\n            skipText = true;\n            skipTextDepth = 1;\n          }\n        }\n      }\n      depth++;\n      if (skip) {\n        if (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') {\n          // We want the contents but not this tag\n          if (frame.innerText && !hasText) {\n            const escaped = escapeHtml(frame.innerText);\n            if (options.textFilter) {\n              result += options.textFilter(escaped, name);\n            } else {\n              result += escaped;\n            }\n            addedText = true;\n          }\n          return;\n        }\n        tempResult = result;\n        result = '';\n      }\n      result += '<' + name;\n\n      if (name === 'script') {\n        if (options.allowedScriptHostnames || options.allowedScriptDomains) {\n          frame.innerText = '';\n        }\n      }\n\n      const isBeingEscaped = skip && (options.disallowedTagsMode === 'escape' || options.disallowedTagsMode === 'recursiveEscape');\n      const shouldPreserveEscapedAttributes = isBeingEscaped &&\n        options.preserveEscapedAttributes;\n\n      if (shouldPreserveEscapedAttributes) {\n        each(attribs, function(value, a) {\n          result += ' ' + a + '=\"' + escapeHtml((value || ''), true) + '\"';\n        });\n      } else if (!allowedAttributesMap || has(allowedAttributesMap, name) || allowedAttributesMap['*']) {\n        each(attribs, function(value, a) {\n          if (!VALID_HTML_ATTRIBUTE_NAME.test(a)) {\n            // This prevents part of an attribute name in the output from being\n            // interpreted as the end of an attribute, or end of a tag.\n            delete frame.attribs[a];\n            return;\n          }\n          // If the value is empty, check if the attribute is\n          // in the allowedEmptyAttributes array.\n          // If it is not in the allowedEmptyAttributes array,\n          // and it is a known non-boolean attribute, delete it\n          // List taken from https://html.spec.whatwg.org/multipage/indices.html#attributes-3\n          if (value === '' && (!options.allowedEmptyAttributes.includes(a)) &&\n            (options.nonBooleanAttributes.includes(a) || options.nonBooleanAttributes.includes('*'))) {\n            delete frame.attribs[a];\n            return;\n          }\n          // check allowedAttributesMap for the element and attribute and modify the value\n          // as necessary if there are specific values defined.\n          let passedAllowedAttributesMapCheck = false;\n          if (!allowedAttributesMap ||\n            (has(allowedAttributesMap, name) &&\n              allowedAttributesMap[name].indexOf(a) !== -1) ||\n            (allowedAttributesMap['*'] && allowedAttributesMap['*'].indexOf(a) !== -1) ||\n            (has(allowedAttributesGlobMap, name) &&\n              allowedAttributesGlobMap[name].test(a)) ||\n            (allowedAttributesGlobMap['*'] && allowedAttributesGlobMap['*'].test(a))) {\n            passedAllowedAttributesMapCheck = true;\n          } else if (allowedAttributesMap && allowedAttributesMap[name]) {\n            for (const o of allowedAttributesMap[name]) {\n              if (isPlainObject(o) && o.name && (o.name === a)) {\n                passedAllowedAttributesMapCheck = true;\n                let newValue = '';\n                if (o.multiple === true) {\n                  // verify the values that are allowed\n                  const splitStrArray = value.split(' ');\n                  for (const s of splitStrArray) {\n                    if (o.values.indexOf(s) !== -1) {\n                      if (newValue === '') {\n                        newValue = s;\n                      } else {\n                        newValue += ' ' + s;\n                      }\n                    }\n                  }\n                } else if (o.values.indexOf(value) >= 0) {\n                  // verified an allowed value matches the entire attribute value\n                  newValue = value;\n                }\n                value = newValue;\n              }\n            }\n          }\n          if (passedAllowedAttributesMapCheck) {\n            if (options.allowedSchemesAppliedToAttributes.indexOf(a) !== -1) {\n              if (naughtyHref(name, value)) {\n                delete frame.attribs[a];\n                return;\n              }\n            }\n\n            if (name === 'script' && a === 'src') {\n\n              let allowed = true;\n\n              try {\n                const parsed = parseUrl(value);\n\n                if (options.allowedScriptHostnames || options.allowedScriptDomains) {\n                  const allowedHostname = (options.allowedScriptHostnames || [])\n                    .find(function (hostname) {\n                      return hostname === parsed.url.hostname;\n                    });\n                  const allowedDomain = (options.allowedScriptDomains || [])\n                    .find(function(domain) {\n                      return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);\n                    });\n                  allowed = allowedHostname || allowedDomain;\n                }\n              } catch (e) {\n                allowed = false;\n              }\n\n              if (!allowed) {\n                delete frame.attribs[a];\n                return;\n              }\n            }\n\n            if (name === 'iframe' && a === 'src') {\n              let allowed = true;\n              try {\n                const parsed = parseUrl(value);\n\n                if (parsed.isRelativeUrl) {\n                  // default value of allowIframeRelativeUrls is true\n                  // unless allowedIframeHostnames or allowedIframeDomains specified\n                  allowed = has(options, 'allowIframeRelativeUrls')\n                    ? options.allowIframeRelativeUrls\n                    : (!options.allowedIframeHostnames && !options.allowedIframeDomains);\n                } else if (\n                  options.allowedIframeHostnames ||\n                  options.allowedIframeDomains\n                ) {\n                  const allowedHostname = (options.allowedIframeHostnames || [])\n                    .find(function (hostname) {\n                      return hostname === parsed.url.hostname;\n                    });\n                  const allowedDomain = (options.allowedIframeDomains || [])\n                    .find(function(domain) {\n                      return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);\n                    });\n                  allowed = allowedHostname || allowedDomain;\n                }\n              } catch (e) {\n                // Unparseable iframe src\n                allowed = false;\n              }\n              if (!allowed) {\n                delete frame.attribs[a];\n                return;\n              }\n            }\n            if (a === 'srcset' || a === 'imagesrcset') {\n              try {\n                let parsed = parseSrcset(value);\n                parsed.forEach(function(value) {\n                  if (naughtyHref(a, value.url)) {\n                    value.evil = true;\n                  }\n                });\n                parsed = filter(parsed, function(v) {\n                  return !v.evil;\n                });\n                if (!parsed.length) {\n                  delete frame.attribs[a];\n                  return;\n                } else {\n                  value = stringifySrcset(filter(parsed, function(v) {\n                    return !v.evil;\n                  }));\n                  frame.attribs[a] = value;\n                }\n              } catch (e) {\n                // Unparseable srcset\n                delete frame.attribs[a];\n                return;\n              }\n            }\n            if (a === 'class') {\n              const allowedSpecificClasses = allowedClassesMap[name];\n              const allowedWildcardClasses = allowedClassesMap['*'];\n              const allowedSpecificClassesGlob = allowedClassesGlobMap[name];\n              const allowedSpecificClassesRegex = allowedClassesRegexMap[name];\n              const allowedWildcardClassesRegex = allowedClassesRegexMap['*'];\n              const allowedWildcardClassesGlob = allowedClassesGlobMap['*'];\n              const allowedClassesGlobs = [\n                allowedSpecificClassesGlob,\n                allowedWildcardClassesGlob\n              ]\n                .concat(allowedSpecificClassesRegex, allowedWildcardClassesRegex)\n                .filter(function (t) {\n                  return t;\n                });\n              if (allowedSpecificClasses && allowedWildcardClasses) {\n                value = filterClasses(\n                  value,\n                  deepmerge(allowedSpecificClasses, allowedWildcardClasses),\n                  allowedClassesGlobs\n                );\n              } else {\n                value = filterClasses(\n                  value,\n                  allowedSpecificClasses || allowedWildcardClasses,\n                  allowedClassesGlobs\n                );\n              }\n              if (!value.length) {\n                delete frame.attribs[a];\n                return;\n              }\n            }\n            if (a === 'style') {\n              if (options.parseStyleAttributes) {\n                try {\n                  const abstractSyntaxTree = postcssParse(name + ' {' + value + '}', { map: false });\n                  const filteredAST = filterCss(\n                    abstractSyntaxTree,\n                    options.allowedStyles\n                  );\n\n                  value = stringifyStyleAttributes(filteredAST);\n\n                  if (value.length === 0) {\n                    delete frame.attribs[a];\n                    return;\n                  }\n                } catch (e) {\n                  if (typeof window !== 'undefined') {\n                    console.warn('Failed to parse \"' + name + ' {' + value + '}' + '\", If you\\'re running this in a browser, we recommend to disable style parsing: options.parseStyleAttributes: false, since this only works in a node environment due to a postcss dependency, More info: https://github.com/apostrophecms/sanitize-html/issues/547');\n                  }\n                  delete frame.attribs[a];\n                  return;\n                }\n              } else if (options.allowedStyles) {\n                throw new Error('allowedStyles option cannot be used together with parseStyleAttributes: false.');\n              }\n            }\n            result += ' ' + a;\n            if (value && value.length) {\n              result += '=\"' + escapeHtml(value, true) + '\"';\n            } else if (options.allowedEmptyAttributes.includes(a)) {\n              result += '=\"\"';\n            }\n          } else {\n            delete frame.attribs[a];\n          }\n        });\n      }\n      if (options.selfClosing.indexOf(name) !== -1) {\n        result += ' />';\n      } else {\n        result += '>';\n        if (frame.innerText && !hasText && !options.textFilter) {\n          result += escapeHtml(frame.innerText);\n          addedText = true;\n        }\n      }\n      if (skip) {\n        result = tempResult + escapeHtml(result);\n        tempResult = '';\n      }\n      frame.openingTagLength = result.length - frame.tagPosition;\n    },\n    ontext: function(text) {\n      if (skipText) {\n        return;\n      }\n      const lastFrame = stack[stack.length - 1];\n      let tag;\n\n      if (lastFrame) {\n        tag = lastFrame.tag;\n        // If inner text was set by transform function then let's use it\n        text = lastFrame.innerText !== undefined ? lastFrame.innerText : text;\n      }\n\n      if (options.disallowedTagsMode === 'completelyDiscard' && !tagAllowed(tag)) {\n        text = '';\n      } else if (tag && tagAllowed(tag) && (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') && ((tag === 'script') || (tag === 'style'))) {\n        // htmlparser2 gives us these as-is. Escaping them ruins the content. Allowing\n        // script tags is, by definition, game over for XSS protection, so if that's\n        // your concern, don't allow them. The same is essentially true for style tags\n        // which have their own collection of XSS vectors.\n        result += text;\n      } else if (tag && tagAllowed(tag) && (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') && (tag === 'textarea' || tag === 'xmp')) {\n        // htmlparser2 treats <textarea> and <xmp> as raw text elements and\n        // does NOT decode entities inside them. The text is already properly\n        // encoded, so pass it through without additional escaping to avoid\n        // double-encoding. Other \"nonTextTags\" like <option> are not raw text\n        // elements in htmlparser2, so their contents are decoded and must be\n        // escaped below like any other text (important to prevent XSS via\n        // entity-encoded payloads such as <option>&lt;script&gt;...&lt;/script&gt;</option>).\n        result += text;\n      } else if (!addedText) {\n        const escaped = escapeHtml(text, false);\n        if (options.textFilter) {\n          result += options.textFilter(escaped, tag);\n        } else {\n          result += escaped;\n        }\n      }\n      if (stack.length) {\n        const frame = stack[stack.length - 1];\n        frame.text += text;\n      }\n    },\n    onclosetag: function(name, isImplied) {\n      if (options.onCloseTag) {\n        options.onCloseTag(name, isImplied);\n      }\n\n      if (skipText) {\n        skipTextDepth--;\n        if (!skipTextDepth) {\n          skipText = false;\n        } else {\n          return;\n        }\n      }\n\n      const frame = stack.pop();\n      if (!frame) {\n        // Do not crash on bad markup\n        return;\n      }\n\n      if (frame.tag !== name) {\n        // Another case of bad markup.\n        // Push to stack, so that it will be used in future closing tags.\n        stack.push(frame);\n        return;\n      }\n\n      skipText = options.enforceHtmlBoundary ? name === 'html' : false;\n      depth--;\n      const skip = skipMap[depth];\n      if (skip) {\n        delete skipMap[depth];\n        if (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') {\n          frame.updateParentNodeText();\n          return;\n        }\n        tempResult = result;\n        result = '';\n      }\n\n      if (transformMap[depth]) {\n        name = transformMap[depth];\n        delete transformMap[depth];\n      }\n\n      if (options.exclusiveFilter) {\n        const filterResult = options.exclusiveFilter(frame);\n        if (filterResult === 'excludeTag') {\n          if (skip) {\n            // no longer escaping the tag since it's not added at all\n            result = tempResult;\n            tempResult = '';\n          }\n          // remove the opening tag from the result\n          result = result.substring(0, frame.tagPosition) +\n            result.substring(frame.tagPosition + frame.openingTagLength);\n          return;\n        } else if (filterResult) {\n          result = result.substring(0, frame.tagPosition);\n          return;\n        }\n      }\n\n      frame.updateParentNodeMediaChildren();\n      frame.updateParentNodeText();\n\n      if (\n        // Already output />\n        options.selfClosing.indexOf(name) !== -1 ||\n        // Escaped tag, closing tag is implied\n        (isImplied && !tagAllowed(name) && [ 'escape', 'recursiveEscape' ].indexOf(options.disallowedTagsMode) >= 0)\n      ) {\n        if (skip) {\n          result = tempResult;\n          tempResult = '';\n        }\n        return;\n      }\n\n      result += '</' + name + '>';\n      if (skip) {\n        result = tempResult + escapeHtml(result);\n        tempResult = '';\n      }\n      addedText = false;\n    }\n  }, options.parser);\n  parser.write(html);\n  parser.end();\n\n  if (options.disallowedTagsMode === 'escape' || options.disallowedTagsMode === 'recursiveEscape') {\n    const lastParsedIndex = parser.endIndex;\n    if (lastParsedIndex != null && lastParsedIndex >= 0 &&\n        lastParsedIndex < html.length) {\n      const unparsed = html.substring(lastParsedIndex);\n      result += escapeHtml(unparsed);\n    } else if ((lastParsedIndex == null || lastParsedIndex < 0) && html.length > 0 && result === '') {\n      result = escapeHtml(html);\n    }\n  }\n\n  return result;\n\n  function initializeState() {\n    result = '';\n    depth = 0;\n    stack = [];\n    skipMap = {};\n    transformMap = {};\n    skipText = false;\n    skipTextDepth = 0;\n  }\n\n  function escapeHtml(s, quote) {\n    if (typeof (s) !== 'string') {\n      s = s + '';\n    }\n    if (options.parser.decodeEntities) {\n      s = s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n      if (quote) {\n        s = s.replace(/\"/g, '&quot;');\n      }\n    }\n    // TODO: this is inadequate because it will pass `&0;`. This approach\n    // will not work, each & must be considered with regard to whether it\n    // is followed by a 100% syntactically valid entity or not, and escaped\n    // if it is not. If this bothers you, don't set parser.decodeEntities\n    // to false. (The default is true.)\n    s = s.replace(/&(?![a-zA-Z0-9#]{1,20};)/g, '&amp;') // Match ampersands not part of existing HTML entity\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;');\n    if (quote) {\n      s = s.replace(/\"/g, '&quot;');\n    }\n    return s;\n  }\n\n  function naughtyHref(name, href) {\n    // Resolve the per-tag scheme allowlist if one is configured for\n    // this tag, otherwise fall back to the global allowedSchemes.\n    const allowedSchemes = has(options.allowedSchemesByTag, name)\n      ? options.allowedSchemesByTag[name]\n      : (options.allowedSchemes || []);\n    return launderNaughtyHref(href, {\n      allowedSchemes,\n      allowProtocolRelative: options.allowProtocolRelative\n    });\n  }\n\n  function parseUrl(value) {\n    value = value.replace(/^(\\w+:)?\\s*[\\\\/]\\s*[\\\\/]/, '$1//');\n    if (value.startsWith('relative:')) {\n      // An attempt to exploit our workaround for base URLs being\n      // mandatory for relative URL validation in the WHATWG\n      // URL parser, reject it\n      throw new Error('relative: exploit attempt');\n    }\n    // naughtyHref is in charge of whether protocol relative URLs\n    // are cool. Here we are concerned just with allowed hostnames and\n    // whether to allow relative URLs.\n    //\n    // Build a placeholder \"base URL\" against which any reasonable\n    // relative URL may be parsed successfully\n    let base = 'relative://relative-site';\n    for (let i = 0; (i < 100); i++) {\n      base += `/${i}`;\n    }\n\n    const parsed = new URL(value, base);\n\n    const isRelativeUrl = parsed && parsed.hostname === 'relative-site' && parsed.protocol === 'relative:';\n    return {\n      isRelativeUrl,\n      url: parsed\n    };\n  }\n  /**\n   * Filters user input css properties by allowlisted regex attributes.\n   * Modifies the abstractSyntaxTree object.\n   *\n   * @param {object} abstractSyntaxTree  - Object representation of CSS attributes.\n   * @property {array[Declaration]} abstractSyntaxTree.nodes[0] -\n   * Each object contains prop and value key, i.e { prop: 'color', value: 'red' }.\n   * @param {object} allowedStyles       - Keys are properties (i.e color),\n   * value is list of permitted regex rules (i.e /green/i).\n   * @return {object}                    - The modified tree.\n   */\n  function filterCss(abstractSyntaxTree, allowedStyles) {\n    if (!allowedStyles) {\n      return abstractSyntaxTree;\n    }\n\n    const astRules = abstractSyntaxTree.nodes[0];\n    let selectedRule;\n\n    // Merge global and tag-specific styles into new AST.\n    if (allowedStyles[astRules.selector] && allowedStyles['*']) {\n      selectedRule = deepmerge(\n        allowedStyles[astRules.selector],\n        allowedStyles['*']\n      );\n    } else {\n      selectedRule = allowedStyles[astRules.selector] || allowedStyles['*'];\n    }\n\n    if (selectedRule) {\n      abstractSyntaxTree.nodes[0].nodes = astRules.nodes\n        .reduce(filterDeclarations(selectedRule), []);\n    }\n\n    return abstractSyntaxTree;\n  }\n\n  /**\n   * Extracts the style attributes from an AbstractSyntaxTree and formats those\n   * values in the inline style attribute format.\n   *\n   * @param  {AbstractSyntaxTree} filteredAST\n   * @return {string}             - Example:\n   * \"color:yellow;text-align:center !important;font-family:helvetica;\"\n   */\n  function stringifyStyleAttributes(filteredAST) {\n    return filteredAST.nodes[0].nodes\n      .reduce(function(extractedAttributes, attrObject) {\n        extractedAttributes.push(\n          `${attrObject.prop}:${attrObject.value}${attrObject.important ? ' !important' : ''}`\n        );\n        return extractedAttributes;\n      }, [])\n      .join(';');\n  }\n\n  /**\n    * Filters the existing attributes for the given property. Discards any attributes\n    * which don't match the allowlist.\n    *\n    * @param  {object} selectedRule - Example: { color: red, font-family: helvetica }\n    * @param  {array} allowedDeclarationsList - List of declarations\n    * which pass the allowlist.\n    * @param  {object} attributeObject - Object representing the current css property.\n    * @property {string} attributeObject.type - Typically 'declaration'.\n    * @property {string} attributeObject.prop - The CSS property, i.e 'color'.\n    * @property {string} attributeObject.value - The corresponding value to\n    * the css property, i.e 'red'.\n    * @return {function} - When used in Array.reduce,\n    * will return an array of Declaration objects\n    */\n  function filterDeclarations(selectedRule) {\n    return function (allowedDeclarationsList, attributeObject) {\n      // If this property is allowlisted...\n      if (has(selectedRule, attributeObject.prop)) {\n        const matchesRegex = selectedRule[attributeObject.prop]\n          .some(function(regularExpression) {\n            return regularExpression.test(attributeObject.value);\n          });\n\n        if (matchesRegex) {\n          allowedDeclarationsList.push(attributeObject);\n        }\n      }\n      return allowedDeclarationsList;\n    };\n  }\n\n  function filterClasses(classes, allowed, allowedGlobs) {\n    if (!allowed) {\n      // The class attribute is allowed without filtering on this tag\n      return classes;\n    }\n    classes = classes.split(/\\s+/);\n    return classes.filter(function(clss) {\n      return allowed.indexOf(clss) !== -1 || allowedGlobs.some(function(glob) {\n        return glob.test(clss);\n      });\n    }).join(' ');\n  }\n}\n\n// Defaults are accessible to you so that you can use them as a starting point\n// programmatically if you wish\n\nconst htmlParserDefaults = {\n  decodeEntities: true\n};\nsanitizeHtml.defaults = {\n  allowedTags: [\n    // Sections derived from MDN element categories and limited to the more\n    // benign categories.\n    // https://developer.mozilla.org/en-US/docs/Web/HTML/Element\n    // Content sectioning\n    'address', 'article', 'aside', 'footer', 'header',\n    'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hgroup',\n    'main', 'nav', 'section',\n    // Text content\n    'blockquote', 'dd', 'div', 'dl', 'dt', 'figcaption', 'figure',\n    'hr', 'li', 'menu', 'ol', 'p', 'pre', 'ul',\n    // Inline text semantics\n    'a', 'abbr', 'b', 'bdi', 'bdo', 'br', 'cite', 'code', 'data', 'dfn',\n    'em', 'i', 'kbd', 'mark', 'q',\n    'rb', 'rp', 'rt', 'rtc', 'ruby',\n    's', 'samp', 'small', 'span', 'strong', 'sub', 'sup', 'time', 'u', 'var', 'wbr',\n    // Table content\n    'caption', 'col', 'colgroup', 'table', 'tbody', 'td', 'tfoot', 'th',\n    'thead', 'tr'\n  ],\n  // Tags that cannot be boolean\n  nonBooleanAttributes: [\n    'abbr', 'accept', 'accept-charset', 'accesskey', 'action',\n    'allow', 'alt', 'as', 'autocapitalize', 'autocomplete',\n    'blocking', 'charset', 'cite', 'class', 'color', 'cols',\n    'colspan', 'content', 'contenteditable', 'coords', 'crossorigin',\n    'data', 'datetime', 'decoding', 'dir', 'dirname', 'download',\n    'draggable', 'enctype', 'enterkeyhint', 'fetchpriority', 'for',\n    'form', 'formaction', 'formenctype', 'formmethod', 'formtarget',\n    'headers', 'height', 'hidden', 'high', 'href', 'hreflang',\n    'http-equiv', 'id', 'imagesizes', 'imagesrcset', 'inputmode',\n    'integrity', 'is', 'itemid', 'itemprop', 'itemref', 'itemtype',\n    'kind', 'label', 'lang', 'list', 'loading', 'low', 'max',\n    'maxlength', 'media', 'method', 'min', 'minlength', 'name',\n    'nonce', 'optimum', 'pattern', 'ping', 'placeholder', 'popover',\n    'popovertarget', 'popovertargetaction', 'poster', 'preload',\n    'referrerpolicy', 'rel', 'rows', 'rowspan', 'sandbox', 'scope',\n    'shape', 'size', 'sizes', 'slot', 'span', 'spellcheck', 'src',\n    'srcdoc', 'srclang', 'srcset', 'start', 'step', 'style',\n    'tabindex', 'target', 'title', 'translate', 'type', 'usemap',\n    'value', 'width', 'wrap',\n    // Event handlers\n    'onauxclick', 'onafterprint', 'onbeforematch', 'onbeforeprint',\n    'onbeforeunload', 'onbeforetoggle', 'onblur', 'oncancel',\n    'oncanplay', 'oncanplaythrough', 'onchange', 'onclick', 'onclose',\n    'oncontextlost', 'oncontextmenu', 'oncontextrestored', 'oncopy',\n    'oncuechange', 'oncut', 'ondblclick', 'ondrag', 'ondragend',\n    'ondragenter', 'ondragleave', 'ondragover', 'ondragstart',\n    'ondrop', 'ondurationchange', 'onemptied', 'onended',\n    'onerror', 'onfocus', 'onformdata', 'onhashchange', 'oninput',\n    'oninvalid', 'onkeydown', 'onkeypress', 'onkeyup',\n    'onlanguagechange', 'onload', 'onloadeddata', 'onloadedmetadata',\n    'onloadstart', 'onmessage', 'onmessageerror', 'onmousedown',\n    'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout',\n    'onmouseover', 'onmouseup', 'onoffline', 'ononline', 'onpagehide',\n    'onpageshow', 'onpaste', 'onpause', 'onplay', 'onplaying',\n    'onpopstate', 'onprogress', 'onratechange', 'onreset', 'onresize',\n    'onrejectionhandled', 'onscroll', 'onscrollend',\n    'onsecuritypolicyviolation', 'onseeked', 'onseeking', 'onselect',\n    'onslotchange', 'onstalled', 'onstorage', 'onsubmit', 'onsuspend',\n    'ontimeupdate', 'ontoggle', 'onunhandledrejection', 'onunload',\n    'onvolumechange', 'onwaiting', 'onwheel'\n  ],\n  disallowedTagsMode: 'discard',\n  allowedAttributes: {\n    a: [ 'href', 'name', 'target' ],\n    // We don't currently allow img itself by default, but\n    // these attributes would make sense if we did.\n    img: [ 'src', 'srcset', 'alt', 'title', 'width', 'height', 'loading' ]\n  },\n  allowedEmptyAttributes: [\n    'alt'\n  ],\n  // Lots of these won't come up by default because we don't allow them\n  selfClosing: [ 'img', 'br', 'hr', 'area', 'base', 'basefont', 'input', 'link', 'meta' ],\n  // URL schemes we permit\n  allowedSchemes: [ 'http', 'https', 'ftp', 'mailto', 'tel' ],\n  allowedSchemesByTag: {},\n  allowedSchemesAppliedToAttributes: [\n    'href', 'src', 'cite',\n    'action', 'formaction', 'data', 'xlink:href',\n    'poster', 'background', 'ping',\n    'longdesc', 'usemap', 'codebase', 'classid', 'archive',\n    'profile', 'manifest', 'itemid',\n    'dynsrc', 'lowsrc'\n  ],\n  allowProtocolRelative: true,\n  enforceHtmlBoundary: false,\n  parseStyleAttributes: true,\n  preserveEscapedAttributes: false\n};\n\nsanitizeHtml.simpleTransform = function(newTagName, newAttribs, merge) {\n  merge = (merge === undefined) ? true : merge;\n  newAttribs = newAttribs || {};\n\n  return function(tagName, attribs) {\n    let attrib;\n    if (merge) {\n      for (attrib in newAttribs) {\n        attribs[attrib] = newAttribs[attrib];\n      }\n    } else {\n      attribs = newAttribs;\n    }\n\n    return {\n      tagName: newTagName,\n      attribs\n    };\n  };\n};\n","import StyleToObject from 'style-to-object';\n\nimport { camelCase, CamelCaseOptions } from './utilities';\n\ntype StyleObject = Record<string, string>;\n\ninterface StyleToJSOptions extends CamelCaseOptions {}\n\n/**\n * Parses CSS inline style to JavaScript object (camelCased).\n */\nfunction StyleToJS(style: string, options?: StyleToJSOptions): StyleObject {\n  const output: StyleObject = {};\n\n  if (!style || typeof style !== 'string') {\n    return output;\n  }\n\n  StyleToObject(style, (property, value) => {\n    // skip CSS comment\n    if (property && value) {\n      output[camelCase(property, options)] = value;\n    }\n  });\n\n  return output;\n}\n\nStyleToJS.default = StyleToJS;\n\nexport = StyleToJS;\n","const CUSTOM_PROPERTY_REGEX = /^--[a-zA-Z0-9_-]+$/;\nconst HYPHEN_REGEX = /-([a-z])/g;\nconst NO_HYPHEN_REGEX = /^[^-]+$/;\nconst VENDOR_PREFIX_REGEX = /^-(webkit|moz|ms|o|khtml)-/;\nconst MS_VENDOR_PREFIX_REGEX = /^-(ms)-/;\n\n/**\n * Checks whether to skip camelCase.\n */\nconst skipCamelCase = (property: string) =>\n  !property ||\n  NO_HYPHEN_REGEX.test(property) ||\n  CUSTOM_PROPERTY_REGEX.test(property);\n\n/**\n * Replacer that capitalizes first character.\n */\nconst capitalize = (match: string, character: string) =>\n  character.toUpperCase();\n\n/**\n * Replacer that removes beginning hyphen of vendor prefix property.\n */\nconst trimHyphen = (match: string, prefix: string) => `${prefix}-`;\n\n/**\n * CamelCase options.\n */\nexport interface CamelCaseOptions {\n  reactCompat?: boolean;\n}\n\n/**\n * CamelCases a CSS property.\n */\nexport const camelCase = (property: string, options: CamelCaseOptions = {}) => {\n  if (skipCamelCase(property)) {\n    return property;\n  }\n\n  property = property.toLowerCase();\n\n  if (options.reactCompat) {\n    // `-ms` vendor prefix should not be capitalized\n    property = property.replace(MS_VENDOR_PREFIX_REGEX, trimHyphen);\n  } else {\n    // for non-React, remove first hyphen so vendor prefix is not capitalized\n    property = property.replace(VENDOR_PREFIX_REGEX, trimHyphen);\n  }\n\n  return property.replace(HYPHEN_REGEX, capitalize);\n};\n","import type { Declaration } from 'inline-style-parser';\nimport parse from 'inline-style-parser';\n\nexport { Declaration };\n\nexport interface StyleObject {\n  [name: string]: string;\n}\n\ntype Iterator = (\n  property: string,\n  value: string,\n  declaration: Declaration,\n) => void;\n\n/**\n * Parses inline style to object.\n *\n * @param style - Inline style.\n * @param iterator - Iterator.\n * @returns - Style object or null.\n *\n * @example Parsing inline style to object:\n *\n * ```js\n * import parse from 'style-to-object';\n * parse('line-height: 42;'); // { 'line-height': '42' }\n * ```\n */\nexport default function StyleToObject(\n  style: string,\n  iterator?: Iterator,\n): StyleObject | null {\n  let styleObject: StyleObject | null = null;\n\n  if (!style || typeof style !== 'string') {\n    return styleObject;\n  }\n\n  const declarations = parse(style);\n  const hasIterator = typeof iterator === 'function';\n\n  declarations.forEach((declaration) => {\n    if (declaration.type !== 'declaration') {\n      return;\n    }\n\n    const { property, value } = declaration;\n\n    if (hasIterator) {\n      iterator(property, value, declaration);\n    } else if (value) {\n      styleObject = styleObject || {};\n      styleObject[property] = value;\n    }\n  });\n\n  return styleObject;\n}\n","// This alphabet uses `A-Za-z0-9_-` symbols.\n// The order of characters is optimized for better gzip and brotli compression.\n// References to the same file (works both for gzip and brotli):\n// `'use`, `andom`, and `rict'`\n// References to the brotli default dictionary:\n// `-26T`, `1983`, `40px`, `75px`, `bush`, `jack`, `mind`, `very`, and `wolf`\nlet urlAlphabet =\n  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n\nlet customAlphabet = (alphabet, defaultSize = 21) => {\n  return (size = defaultSize) => {\n    let id = ''\n    // A compact alternative for `for (var i = 0; i < step; i++)`.\n    let i = size | 0\n    while (i--) {\n      // `| 0` is more compact and faster than `Math.floor()`.\n      id += alphabet[(Math.random() * alphabet.length) | 0]\n    }\n    return id\n  }\n}\n\nlet nanoid = (size = 21) => {\n  let id = ''\n  // A compact alternative for `for (var i = 0; i < step; i++)`.\n  let i = size | 0\n  while (i--) {\n    // `| 0` is more compact and faster than `Math.floor()`.\n    id += urlAlphabet[(Math.random() * 64) | 0]\n  }\n  return id\n}\n\nmodule.exports = { nanoid, customAlphabet }\n","// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\n\nconst decodeMap = new Map([\n    [0, 65_533],\n    // C1 Unicode control character reference replacements\n    [128, 8364],\n    [130, 8218],\n    [131, 402],\n    [132, 8222],\n    [133, 8230],\n    [134, 8224],\n    [135, 8225],\n    [136, 710],\n    [137, 8240],\n    [138, 352],\n    [139, 8249],\n    [140, 338],\n    [142, 381],\n    [145, 8216],\n    [146, 8217],\n    [147, 8220],\n    [148, 8221],\n    [149, 8226],\n    [150, 8211],\n    [151, 8212],\n    [152, 732],\n    [153, 8482],\n    [154, 353],\n    [155, 8250],\n    [156, 339],\n    [158, 382],\n    [159, 376],\n]);\n\n/**\n * Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point.\n */\nexport const fromCodePoint: (...codePoints: number[]) => string =\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, n/no-unsupported-features/es-builtins\n    String.fromCodePoint ??\n    ((codePoint: number): string => {\n        let output = \"\";\n\n        if (codePoint > 0xff_ff) {\n            codePoint -= 0x1_00_00;\n            output += String.fromCharCode(\n                ((codePoint >>> 10) & 0x3_ff) | 0xd8_00,\n            );\n            codePoint = 0xdc_00 | (codePoint & 0x3_ff);\n        }\n\n        output += String.fromCharCode(codePoint);\n        return output;\n    });\n\n/**\n * Replace the given code point with a replacement character if it is a\n * surrogate or is outside the valid range. Otherwise return the code\n * point unchanged.\n */\nexport function replaceCodePoint(codePoint: number): number {\n    if (\n        (codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) ||\n        codePoint > 0x10_ff_ff\n    ) {\n        return 0xff_fd;\n    }\n\n    return decodeMap.get(codePoint) ?? codePoint;\n}\n\n/**\n * Replace the code point if relevant, then convert it to a string.\n *\n * @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead.\n * @param codePoint The code point to decode.\n * @returns The decoded code point.\n */\nexport function decodeCodePoint(codePoint: number): string {\n    return fromCodePoint(replaceCodePoint(codePoint));\n}\n","import { fromCodePoint, replaceCodePoint } from \"./decode-codepoint.js\";\nimport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nimport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\nimport { BinTrieFlags } from \"./internal/bin-trie-flags.js\";\n\nconst enum CharCodes {\n    NUM = 35, // \"#\"\n    SEMI = 59, // \";\"\n    EQUALS = 61, // \"=\"\n    ZERO = 48, // \"0\"\n    NINE = 57, // \"9\"\n    LOWER_A = 97, // \"a\"\n    LOWER_F = 102, // \"f\"\n    LOWER_X = 120, // \"x\"\n    LOWER_Z = 122, // \"z\"\n    UPPER_A = 65, // \"A\"\n    UPPER_F = 70, // \"F\"\n    UPPER_Z = 90, // \"Z\"\n}\n\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b10_0000;\n\nfunction isNumber(code: number): boolean {\n    return code >= CharCodes.ZERO && code <= CharCodes.NINE;\n}\n\nfunction isHexadecimalCharacter(code: number): boolean {\n    return (\n        (code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) ||\n        (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F)\n    );\n}\n\nfunction isAsciiAlphaNumeric(code: number): boolean {\n    return (\n        (code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) ||\n        (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) ||\n        isNumber(code)\n    );\n}\n\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n */\nfunction isEntityInAttributeInvalidEnd(code: number): boolean {\n    return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);\n}\n\nconst enum EntityDecoderState {\n    EntityStart,\n    NumericStart,\n    NumericDecimal,\n    NumericHex,\n    NamedEntity,\n}\n\nexport enum DecodingMode {\n    /** Entities in text nodes that can end with any character. */\n    Legacy = 0,\n    /** Only allow entities terminated with a semicolon. */\n    Strict = 1,\n    /** Entities in attributes have limitations on ending characters. */\n    Attribute = 2,\n}\n\n/**\n * Producers for character reference errors as defined in the HTML spec.\n */\nexport interface EntityErrorProducer {\n    missingSemicolonAfterCharacterReference(): void;\n    absenceOfDigitsInNumericCharacterReference(\n        consumedCharacters: number,\n    ): void;\n    validateNumericCharacterReference(code: number): void;\n}\n\n/**\n * Token decoder with support of writing partial entities.\n */\nexport class EntityDecoder {\n    constructor(\n        /** The tree used to decode entities. */\n        // biome-ignore lint/correctness/noUnusedPrivateClassMembers: False positive\n        private readonly decodeTree: Uint16Array,\n        /**\n         * The function that is called when a codepoint is decoded.\n         *\n         * For multi-byte named entities, this will be called multiple times,\n         * with the second codepoint, and the same `consumed` value.\n         *\n         * @param codepoint The decoded codepoint.\n         * @param consumed The number of bytes consumed by the decoder.\n         */\n        private readonly emitCodePoint: (cp: number, consumed: number) => void,\n        /** An object that is used to produce errors. */\n        private readonly errors?: EntityErrorProducer | undefined,\n    ) {}\n\n    /** The current state of the decoder. */\n    private state = EntityDecoderState.EntityStart;\n    /** Characters that were consumed while parsing an entity. */\n    private consumed = 1;\n    /**\n     * The result of the entity.\n     *\n     * Either the result index of a numeric entity, or the codepoint of a\n     * numeric entity.\n     */\n    private result = 0;\n\n    /** The current index in the decode tree. */\n    private treeIndex = 0;\n    /** The number of characters that were consumed in excess. */\n    private excess = 1;\n    /** The mode in which the decoder is operating. */\n    private decodeMode = DecodingMode.Strict;\n    /** The number of characters that have been consumed in the current run. */\n    private runConsumed = 0;\n\n    /** Resets the instance to make it reusable. */\n    startEntity(decodeMode: DecodingMode): void {\n        this.decodeMode = decodeMode;\n        this.state = EntityDecoderState.EntityStart;\n        this.result = 0;\n        this.treeIndex = 0;\n        this.excess = 1;\n        this.consumed = 1;\n        this.runConsumed = 0;\n    }\n\n    /**\n     * Write an entity to the decoder. This can be called multiple times with partial entities.\n     * If the entity is incomplete, the decoder will return -1.\n     *\n     * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the\n     * entity is incomplete, and resume when the next string is written.\n     *\n     * @param input The string containing the entity (or a continuation of the entity).\n     * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    write(input: string, offset: number): number {\n        switch (this.state) {\n            case EntityDecoderState.EntityStart: {\n                if (input.charCodeAt(offset) === CharCodes.NUM) {\n                    this.state = EntityDecoderState.NumericStart;\n                    this.consumed += 1;\n                    return this.stateNumericStart(input, offset + 1);\n                }\n                this.state = EntityDecoderState.NamedEntity;\n                return this.stateNamedEntity(input, offset);\n            }\n\n            case EntityDecoderState.NumericStart: {\n                return this.stateNumericStart(input, offset);\n            }\n\n            case EntityDecoderState.NumericDecimal: {\n                return this.stateNumericDecimal(input, offset);\n            }\n\n            case EntityDecoderState.NumericHex: {\n                return this.stateNumericHex(input, offset);\n            }\n\n            case EntityDecoderState.NamedEntity: {\n                return this.stateNamedEntity(input, offset);\n            }\n        }\n    }\n\n    /**\n     * Switches between the numeric decimal and hexadecimal states.\n     *\n     * Equivalent to the `Numeric character reference state` in the HTML spec.\n     *\n     * @param input The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    private stateNumericStart(input: string, offset: number): number {\n        if (offset >= input.length) {\n            return -1;\n        }\n\n        if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n            this.state = EntityDecoderState.NumericHex;\n            this.consumed += 1;\n            return this.stateNumericHex(input, offset + 1);\n        }\n\n        this.state = EntityDecoderState.NumericDecimal;\n        return this.stateNumericDecimal(input, offset);\n    }\n\n    /**\n     * Parses a hexadecimal numeric entity.\n     *\n     * Equivalent to the `Hexademical character reference state` in the HTML spec.\n     *\n     * @param input The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    private stateNumericHex(input: string, offset: number): number {\n        while (offset < input.length) {\n            const char = input.charCodeAt(offset);\n            if (isNumber(char) || isHexadecimalCharacter(char)) {\n                // Convert hex digit to value (0-15); 'a'/'A' -> 10.\n                const digit =\n                    char <= CharCodes.NINE\n                        ? char - CharCodes.ZERO\n                        : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;\n                this.result = this.result * 16 + digit;\n                this.consumed++;\n                offset++;\n            } else {\n                return this.emitNumericEntity(char, 3);\n            }\n        }\n        return -1; // Incomplete entity\n    }\n\n    /**\n     * Parses a decimal numeric entity.\n     *\n     * Equivalent to the `Decimal character reference state` in the HTML spec.\n     *\n     * @param input The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    private stateNumericDecimal(input: string, offset: number): number {\n        while (offset < input.length) {\n            const char = input.charCodeAt(offset);\n            if (isNumber(char)) {\n                this.result = this.result * 10 + (char - CharCodes.ZERO);\n                this.consumed++;\n                offset++;\n            } else {\n                return this.emitNumericEntity(char, 2);\n            }\n        }\n        return -1; // Incomplete entity\n    }\n\n    /**\n     * Validate and emit a numeric entity.\n     *\n     * Implements the logic from the `Hexademical character reference start\n     * state` and `Numeric character reference end state` in the HTML spec.\n     *\n     * @param lastCp The last code point of the entity. Used to see if the\n     *               entity was terminated with a semicolon.\n     * @param expectedLength The minimum number of characters that should be\n     *                       consumed. Used to validate that at least one digit\n     *                       was consumed.\n     * @returns The number of characters that were consumed.\n     */\n    private emitNumericEntity(lastCp: number, expectedLength: number): number {\n        // Ensure we consumed at least one digit.\n        if (this.consumed <= expectedLength) {\n            this.errors?.absenceOfDigitsInNumericCharacterReference(\n                this.consumed,\n            );\n            return 0;\n        }\n\n        // Figure out if this is a legit end of the entity\n        if (lastCp === CharCodes.SEMI) {\n            this.consumed += 1;\n        } else if (this.decodeMode === DecodingMode.Strict) {\n            return 0;\n        }\n\n        this.emitCodePoint(replaceCodePoint(this.result), this.consumed);\n\n        if (this.errors) {\n            if (lastCp !== CharCodes.SEMI) {\n                this.errors.missingSemicolonAfterCharacterReference();\n            }\n\n            this.errors.validateNumericCharacterReference(this.result);\n        }\n\n        return this.consumed;\n    }\n\n    /**\n     * Parses a named entity.\n     *\n     * Equivalent to the `Named character reference state` in the HTML spec.\n     *\n     * @param input The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    private stateNamedEntity(input: string, offset: number): number {\n        const { decodeTree } = this;\n        let current = decodeTree[this.treeIndex];\n        // The length is the number of bytes of the value, including the current byte.\n        let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n\n        while (offset < input.length) {\n            // Handle compact runs (possibly inline): valueLength == 0 and SEMI_REQUIRED bit set.\n            if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {\n                const runLength =\n                    (current & BinTrieFlags.BRANCH_LENGTH) >> 7; /* 2..63 */\n\n                // If we are starting a run, check the first char.\n                if (this.runConsumed === 0) {\n                    const firstChar = current & BinTrieFlags.JUMP_TABLE;\n                    if (input.charCodeAt(offset) !== firstChar) {\n                        return this.result === 0\n                            ? 0\n                            : this.emitNotTerminatedNamedEntity();\n                    }\n                    offset++;\n                    this.excess++;\n                    this.runConsumed++;\n                }\n\n                // Check remaining characters in the run.\n                while (this.runConsumed < runLength) {\n                    if (offset >= input.length) {\n                        return -1;\n                    }\n\n                    const charIndexInPacked = this.runConsumed - 1;\n                    const packedWord =\n                        decodeTree[\n                            this.treeIndex + 1 + (charIndexInPacked >> 1)\n                        ];\n                    const expectedChar =\n                        charIndexInPacked % 2 === 0\n                            ? packedWord & 0xff\n                            : (packedWord >> 8) & 0xff;\n\n                    if (input.charCodeAt(offset) !== expectedChar) {\n                        this.runConsumed = 0;\n                        return this.result === 0\n                            ? 0\n                            : this.emitNotTerminatedNamedEntity();\n                    }\n                    offset++;\n                    this.excess++;\n                    this.runConsumed++;\n                }\n\n                this.runConsumed = 0;\n                this.treeIndex += 1 + (runLength >> 1);\n                current = decodeTree[this.treeIndex];\n                valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n            }\n\n            if (offset >= input.length) break;\n\n            const char = input.charCodeAt(offset);\n\n            /*\n             * Implicit semicolon handling for nodes that require a semicolon but\n             * don't have an explicit ';' branch stored in the trie. If we have\n             * a value on the current node, it requires a semicolon, and the\n             * current input character is a semicolon, emit the entity using the\n             * current node (without descending further).\n             */\n            if (\n                char === CharCodes.SEMI &&\n                valueLength !== 0 &&\n                (current & BinTrieFlags.FLAG13) !== 0\n            ) {\n                return this.emitNamedEntityData(\n                    this.treeIndex,\n                    valueLength,\n                    this.consumed + this.excess,\n                );\n            }\n\n            this.treeIndex = determineBranch(\n                decodeTree,\n                current,\n                this.treeIndex + Math.max(1, valueLength),\n                char,\n            );\n\n            if (this.treeIndex < 0) {\n                return this.result === 0 ||\n                    // If we are parsing an attribute\n                    (this.decodeMode === DecodingMode.Attribute &&\n                        // We shouldn't have consumed any characters after the entity,\n                        (valueLength === 0 ||\n                            // And there should be no invalid characters.\n                            isEntityInAttributeInvalidEnd(char)))\n                    ? 0\n                    : this.emitNotTerminatedNamedEntity();\n            }\n\n            current = decodeTree[this.treeIndex];\n            valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n\n            // If the branch is a value, store it and continue\n            if (valueLength !== 0) {\n                // If the entity is terminated by a semicolon, we are done.\n                if (char === CharCodes.SEMI) {\n                    return this.emitNamedEntityData(\n                        this.treeIndex,\n                        valueLength,\n                        this.consumed + this.excess,\n                    );\n                }\n\n                // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it.\n                if (\n                    this.decodeMode !== DecodingMode.Strict &&\n                    (current & BinTrieFlags.FLAG13) === 0\n                ) {\n                    this.result = this.treeIndex;\n                    this.consumed += this.excess;\n                    this.excess = 0;\n                }\n            }\n            // Increment offset & excess for next iteration\n            offset++;\n            this.excess++;\n        }\n\n        return -1;\n    }\n\n    /**\n     * Emit a named entity that was not terminated with a semicolon.\n     *\n     * @returns The number of characters consumed.\n     */\n    private emitNotTerminatedNamedEntity(): number {\n        const { result, decodeTree } = this;\n\n        const valueLength =\n            (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;\n\n        this.emitNamedEntityData(result, valueLength, this.consumed);\n        this.errors?.missingSemicolonAfterCharacterReference();\n\n        return this.consumed;\n    }\n\n    /**\n     * Emit a named entity.\n     *\n     * @param result The index of the entity in the decode tree.\n     * @param valueLength The number of bytes in the entity.\n     * @param consumed The number of characters consumed.\n     *\n     * @returns The number of characters consumed.\n     */\n    private emitNamedEntityData(\n        result: number,\n        valueLength: number,\n        consumed: number,\n    ): number {\n        const { decodeTree } = this;\n\n        this.emitCodePoint(\n            valueLength === 1\n                ? decodeTree[result] &\n                      ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)\n                : decodeTree[result + 1],\n            consumed,\n        );\n        if (valueLength === 3) {\n            // For multi-byte values, we need to emit the second byte.\n            this.emitCodePoint(decodeTree[result + 2], consumed);\n        }\n\n        return consumed;\n    }\n\n    /**\n     * Signal to the parser that the end of the input was reached.\n     *\n     * Remaining data will be emitted and relevant errors will be produced.\n     *\n     * @returns The number of characters consumed.\n     */\n    end(): number {\n        switch (this.state) {\n            case EntityDecoderState.NamedEntity: {\n                // Emit a named entity if we have one.\n                return this.result !== 0 &&\n                    (this.decodeMode !== DecodingMode.Attribute ||\n                        this.result === this.treeIndex)\n                    ? this.emitNotTerminatedNamedEntity()\n                    : 0;\n            }\n            // Otherwise, emit a numeric entity if we have one.\n            case EntityDecoderState.NumericDecimal: {\n                return this.emitNumericEntity(0, 2);\n            }\n            case EntityDecoderState.NumericHex: {\n                return this.emitNumericEntity(0, 3);\n            }\n            case EntityDecoderState.NumericStart: {\n                this.errors?.absenceOfDigitsInNumericCharacterReference(\n                    this.consumed,\n                );\n                return 0;\n            }\n            case EntityDecoderState.EntityStart: {\n                // Return 0 if we have no entity.\n                return 0;\n            }\n        }\n    }\n}\n\n/**\n * Creates a function that decodes entities in a string.\n *\n * @param decodeTree The decode tree.\n * @returns A function that decodes entities in a string.\n */\nfunction getDecoder(decodeTree: Uint16Array) {\n    let returnValue = \"\";\n    const decoder = new EntityDecoder(\n        decodeTree,\n        (data) => (returnValue += fromCodePoint(data)),\n    );\n\n    return function decodeWithTrie(\n        input: string,\n        decodeMode: DecodingMode,\n    ): string {\n        let lastIndex = 0;\n        let offset = 0;\n\n        while ((offset = input.indexOf(\"&\", offset)) >= 0) {\n            returnValue += input.slice(lastIndex, offset);\n\n            decoder.startEntity(decodeMode);\n\n            const length = decoder.write(\n                input,\n                // Skip the \"&\"\n                offset + 1,\n            );\n\n            if (length < 0) {\n                lastIndex = offset + decoder.end();\n                break;\n            }\n\n            lastIndex = offset + length;\n            // If `length` is 0, skip the current `&` and continue.\n            offset = length === 0 ? lastIndex + 1 : lastIndex;\n        }\n\n        const result = returnValue + input.slice(lastIndex);\n\n        // Make sure we don't keep a reference to the final string.\n        returnValue = \"\";\n\n        return result;\n    };\n}\n\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n *\n * @param decodeTree The trie.\n * @param current The current node.\n * @param nodeIdx The index right after the current node and its value.\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nexport function determineBranch(\n    decodeTree: Uint16Array,\n    current: number,\n    nodeIndex: number,\n    char: number,\n): number {\n    const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n    const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n\n    // Case 1: Single branch encoded in jump offset\n    if (branchCount === 0) {\n        return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;\n    }\n\n    // Case 2: Multiple branches encoded in jump table\n    if (jumpOffset) {\n        const value = char - jumpOffset;\n\n        return value < 0 || value >= branchCount\n            ? -1\n            : decodeTree[nodeIndex + value] - 1;\n    }\n\n    // Case 3: Multiple branches encoded in packed dictionary (two keys per uint16)\n    const packedKeySlots = (branchCount + 1) >> 1;\n\n    /*\n     * Treat packed keys as a virtual sorted array of length `branchCount`.\n     * Key(i) = low byte for even i, high byte for odd i in slot i>>1.\n     */\n    let lo = 0;\n    let hi = branchCount - 1;\n\n    while (lo <= hi) {\n        const mid = (lo + hi) >>> 1;\n        const slot = mid >> 1;\n        const packed = decodeTree[nodeIndex + slot];\n        const midKey = (packed >> ((mid & 1) * 8)) & 0xff;\n\n        if (midKey < char) {\n            lo = mid + 1;\n        } else if (midKey > char) {\n            hi = mid - 1;\n        } else {\n            return decodeTree[nodeIndex + packedKeySlots + mid];\n        }\n    }\n\n    return -1;\n}\n\nconst htmlDecoder = /* #__PURE__ */ getDecoder(htmlDecodeTree);\nconst xmlDecoder = /* #__PURE__ */ getDecoder(xmlDecodeTree);\n\n/**\n * Decodes an HTML string.\n *\n * @param htmlString The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nexport function decodeHTML(\n    htmlString: string,\n    mode: DecodingMode = DecodingMode.Legacy,\n): string {\n    return htmlDecoder(htmlString, mode);\n}\n\n/**\n * Decodes an HTML string in an attribute.\n *\n * @param htmlAttribute The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLAttribute(htmlAttribute: string): string {\n    return htmlDecoder(htmlAttribute, DecodingMode.Attribute);\n}\n\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n *\n * @param htmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLStrict(htmlString: string): string {\n    return htmlDecoder(htmlString, DecodingMode.Strict);\n}\n\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n *\n * @param xmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeXML(xmlString: string): string {\n    return xmlDecoder(xmlString, DecodingMode.Strict);\n}\n\nexport {\n    decodeCodePoint,\n    fromCodePoint,\n    replaceCodePoint,\n} from \"./decode-codepoint.js\";\n// Re-export for use by eg. htmlparser2\nexport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nexport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\n","// Generated using scripts/write-decode-map.ts\n\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\nexport const htmlDecodeTree: Uint16Array = /* #__PURE__ */ decodeBase64(\n    \"QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWlsN2E6ZHIAAOA12CjdciJlZW4AOGFjAHkARWRjAHkAXGRwAGYAAOA12FzdYwByAADgNdjA3IALQUJFSGFiY2RlZmdoamxtbm9wcnN0dXYAXhxtHHEcdRx5HN8cBx0dHTwd3B3tHfEdAR4EHh0eLB5FHrwewx7hHgkfPR9LH4ABYXJ0AGQcZxxpHHIA8gBvB/IAxQLhIWlsAKAbKeEhcnIAoA4pZ6BmIgCgiyphAHIAAKBiKWMJjRwAAJAcAACVHAAAAAAAAAAAAACZHJwcAACmHKgcrRwAANIc9SF0ZTph7SJwdHl2AKC0KXIAYQDuAFoG4iFkYbtjZwAAoegnZGyhHKMcAKCRKeUAiwYAoIUqdQBvADuAqwCrQHIAgKOQIWJmaGxwc3QAuhy/HMIcxBzHHMoczhxmoOQhcwAAoB8pcwAAoB0p6wCyGnAAAKCrIWwAAKA5KWkAbQAAoHMpbAAAoKIhAKGrKmFl1hzaHGkAbAAAoBkpc6CtKgDgrSoA/oABYWJyAOUc6RztHHIAcgAAoAwpcgBrAACgcicAAWFr8Rz4HGMAAAFla/Yc9xx7YFtgAAFlc/wc/hwAoIspbAAAAWR1Ax0FHQCgjykAoI0pAAJhZXV5Dh0RHRodHB3yIW9uPmEAAWRpFR0YHWkAbAA8YewAowbiAPccO2QAAmNxcnMkHScdLB05HWEAAKA2KXUAbwDyoBwgqhEAAWR1MB00HeghYXIAoGcpcyJoYXIAAKBLKWgAAKCyIQCiZCJmZ3FzRB1FB5Qdnh10AIACYWhscnQATh1WHWUdbB2NHXIicm93AHSgkCFhAOkAzxxhI3Jwb29uAAABZHVeHWId7yF3bgCgvSFwAACgvCHlJGZ0YXJyb3dzAKDHIWkiZ2h0AIABYWhzAHUdex2DHXIicm93APOglCGdBmEAcgBwAG8AbwBuAPMAzgtxAHUAaQBnAGEAcgByAG8A9wBlGugkcmVldGltZXMAoMsi8aFkIk0HAACaHWwAYQBuAPQAXgcAon0qY2Rnc6YdqR2xHbcdYwAAoKgqbwB0AG+gfypyoIEqAKCDKmXg2iIA/nMAAKCTKoACYWRlZ3MAwB3GHcod1h3ZHXAAcAByAG8A+ACmHG8AdAAAoNYicQAAAWdxzx3SHXQA8gBGB2cAdADyAHQcdADyAFMHaQDtAGMHgAFpbHIA4h3mHeod8yFodACgfClvAG8A8gDKBgDgNdgp3UWgdiIAoJEqYQH1Hf4dcgAAAWR1YB35HWygvCEAoGopbABrAACghCVjAHkAWWQAomoiYWNodAweDx4VHhkecgDyAGsdbwByAG4AZQDyAGAW4SFyZACgaylyAGkAAKD6JQABaW8hHiQe5CFvdEBh9SFzdGGgsCPjIWhlAKCwIwACRWFlczMeNR48HkEeAKBoInAAcKCJKvIhb3gAoIkqcaCHKvGghyo0HmkAbQAAoOYiAARhYm5vcHR3elIeXB5fHoUelh6mHqsetB4AAW5yVh5ZHmcAAKDsJ3IAAKD9IXIA6wCwBmcAgAFsbXIAZh52Hnse5SFmdAABYXKIB2weaQBnAGgAdABhAHIAcgBvAPcAkwfhInBzdG8AoPwnaQBnAGgAdABhAHIAcgBvAPcAmgdwI2Fycm93AAABbHKNHpEeZQBmAPQAxhxpImdodAAAoKwhgAFhZmwAnB6fHqIecgAAoIUpAOA12F3ddQBzAACgLSppIm1lcwAAoDQqYQGvHrMecwB0AACgFyLhAIoOZaHKJbkeRhLuIWdlAKDKJWEAcgBsoCgAdAAAoJMpgAJhY2htdADMHs8e1R7bHt0ecgDyAJ0GbwByAG4AZQDyANYWYQByAGSgyyEAoG0pAKAOIHIAaQAAoL8iAANhY2hpcXTrHu8e1QfzHv0eBh/xIXVvAKA5IHIAAOA12MHcbQDloXIi+h4AAPweAKCNKgCgjyoAAWJ19xwBH28AcqAYIACgGiDyIW9rQmEAhDwAO2NkaGlscXJCBhcfxh0gHyQfKB8sHzEfAAFjaRsfHR8AoKYqcgAAoHkqcgBlAOUAkx3tIWVzAKDJIuEhcnIAoHYpdSJlc3QAAKB7KgABUGk1HzkfYQByAACglillocMlAgdfEnIAAAFkdUIfRx9zImhhcgAAoEop6CFhcgCgZikAAWVuTx9WH3IjdG5lcXEAAOBoIgD+xQBUHwAHRGFjZGVmaGlsbm9wc3VuH3Ifoh+rH68ftx+7H74f5h/uH/MfBwj/HwsgxCFvdACgOiIAAmNscHJ5H30fiR+eH3IAO4CvAK9AAAFldIEfgx8AoEImZaAgJ3MAZQAAoCAnc6CmIXQAbwCAoaYhZGx1AJQfmB+cH28AdwDuAHkDZQBmAPQA6gbwAOkO6yFlcgCgriUAAW95ph+qH+0hbWEAoCkqPGThIXNoAKAUIOElc3VyZWRhbmdsZQCgISJyAADgNdgq3W8AAKAnIYABY2RuAMQfyR/bH3IAbwA7gLUAtUBhoiMi0B8AANMf1x9zAPQAKxFpAHIAAKDwKm8AdAA7gLcAt0B1AHMA4qESIh4TAADjH3WgOCIAoCoqYwHqH+0fcAAAoNsq8gB+GnAAbAB1APMACAgAAWRw9x/7H+UhbHMAoKciZgAA4DXYXt0AAWN0AyAHIHIAAOA12MLc8CFvcwCgPiJsobwDECAVIPQiaW1hcACguCJhAPAAEyAADEdMUlZhYmNkZWZnaGlqbG1vcHJzdHV2dzwgRyBmIG0geSCqILgg2iDeIBEhFSEyIUMhTSFQIZwhnyHSIQAiIyKLIrEivyIUIwABZ3RAIEMgAODZIjgD9uBrItIgBwmAAWVsdABNIF8gYiBmAHQAAAFhclMgWCByInJvdwAAoM0h6SRnaHRhcnJvdwCgziEA4NgiOAP24Goi0iBfCekkZ2h0YXJyb3cAoM8hAAFEZHEgdSDhIXNoAKCvIuEhc2gAoK4igAJiY25wdACCIIYgiSCNIKIgbABhAACgByL1IXRlRGFnAADgICLSIACiSSJFaW9wlSCYIJwgniAA4HAqOANkAADgSyI4A3MASWFyAG8A+AAyCnUAcgBhoG4mbADzoG4mmwjzAa8gAACzIHAAO4CgAKBAbQBwAOXgTiI4AyoJgAJhZW91eQDBIMogzSDWINkg8AHGIAAAyCAAoEMqbwBuAEhh5CFpbEZhbgBnAGSgRyJvAHQAAOBtKjgDcAAAoEIqPWThIXNoAKATIACjYCJBYWRxc3jpIO0g+SD+IAIhDCFyAHIAAKDXIXIAAAFocvIg9SBrAACgJClvoJch9wAGD28AdAAA4FAiOAN1AGkA9gC7CAABZWkGIQohYQByAACgKCntAN8I6SFzdPOgBCLlCHIAAOA12CvdAAJFZXN0/wgcISshLiHxoXEiIiEAABMJ8aFxIgAJAAAnIWwAYQBuAPQAEwlpAO0AGQlyoG8iAKBvIoABQWFwADghOyE/IXIA8gBeIHIAcgAAoK4hYQByAACg8ipzogsiSiEAAAAAxwtkoPwiAKD6ImMAeQBaZIADQUVhZGVzdABcIV8hYiFmIWkhkyGWIXIA8gBXIADgZiI4A3IAcgAAoJohcgAAoCUggKFwImZxcwBwIYQhjiF0AAABYXJ1IXohcgByAG8A9wBlIWkAZwBoAHQAYQByAHIAbwD3AD4h8aFwImAhAACKIWwAYQBuAPQAZwlz4H0qOAMAoG4iaQDtAG0JcqBuImkA5aDqIkUJaQDkADoKAAFwdKMhpyFmAADgNdhf3YCBrAA7aW4AriGvIcchrEBuAIChCSJFZHYAtyG6Ib8hAOD5IjgDbwB0AADg9SI4A+EB1gjEIcYhAKD3IgCg9iJpAHagDCLhAagJzyHRIQCg/iIAoP0igAFhb3IA2CHsIfEhcgCAoSYiYXN0AOAh5SHpIWwAbABlAOwAywhsAADg/SrlIADgAiI4A2wiaW50AACgFCrjoYAi9yEAAPohdQDlAJsJY+CvKjgDZaCAIvEAkwkAAkFhaXQHIgoiFyIeInIA8gBsIHIAcgAAoZshY3cRIhQiAOAzKTgDAOCdITgDZyRodGFycm93AACgmyFyAGkA5aDrIr4JgANjaGltcHF1AC8iPCJHIpwhTSJQIloigKGBImNlcgA2Iv0JOSJ1AOUABgoA4DXYw9zvIXJ0bQKdIQAAAABEImEAcgDhAOEhbQBloEEi8aBEIiYKYQDyAMsIcwB1AAABYnBWIlgi5QDUCeUA3wmAAWJjcABgInMieCKAoYQiRWVzAGci7glqIgDgxSo4A2UAdABl4IIi0iBxAPGgiCJoImMAZaCBIvEA/gmAoYUiRWVzAH8iFgqCIgDgxio4A2UAdABl4IMi0iBxAPGgiSKAIgACZ2lscpIilCKaIpwi7AAMCWwAZABlADuA8QDxQOcAWwlpI2FuZ2xlAAABbHKkIqoi5SFmdGWg6iLxAEUJaSJnaHQAZaDrIvEAvgltoL0DAKEjAGVzuCK8InIAbwAAoBYhcAAAoAcggARESGFkZ2lscnMAziLSItYi2iLeIugi7SICIw8j4SFzaACgrSLhIXJyAKAEKXAAAOBNItIg4SFzaACgrCIAAWV04iLlIgDgZSLSIADgPgDSIG4iZmluAACg3imAAUFldADzIvci+iJyAHIAAKACKQDgZCLSIHLgPADSIGkAZQAA4LQi0iAAAUF0BiMKI3IAcgAAoAMp8iFpZQDgtSLSIGkAbQAA4Dwi0iCAAUFhbgAaIx4jKiNyAHIAAKDWIXIAAAFociMjJiNrAACgIylvoJYh9wD/DuUhYXIAoCcpUxJqFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVCMAAF4jaSN/I4IjjSOeI8AUAAAAAKYjwCMAANoj3yMAAO8jHiQvJD8kRCQAAWNzVyNsFHUAdABlADuA8wDzQAABaXlhI2cjcgBjoJoiO4D0APRAPmSAAmFiaW9zAHEjdCN3I3EBeiNzAOgAdhTsIWFjUWF2AACgOCrvIWxkAKC8KewhaWdTYQABY3KFI4kjaQByAACgvykA4DXYLN1vA5QjAAAAAJYjAACcI24A22JhAHYAZQA7gPIA8kAAoMEpAAFibaEjjAphAHIAAKC1KQACYWNpdKwjryO6I70jcgDyAFkUAAFpcrMjtiNyAACgvinvIXNzAKC7KW4A5QDZCgCgwCmAAWFlaQDFI8gjyyNjAHIATWFnAGEAyWOAAWNkbgDRI9Qj1iPyIW9uv2MAoLYpdQDzAHgBcABmAADgNdhg3YABYWVsAOQj5yPrI3IAAKC3KXIAcAAAoLkpdQDzAHwBAKMoImFkaW9zdvkj/CMPJBMkFiQbJHIA8gBeFIChXSplZm0AAyQJJAwkcgBvoDQhZgAAoDQhO4CqAKpAO4C6ALpA5yFvZgCgtiJyAACgVipsIm9wZQAAoFcqAKBbKoABY2xvACMkJSQrJPIACCRhAHMAaAA7gPgA+EBsAACgmCJpAGwBMyQ4JGQAZQA7gPUA9UBlAHMAYaCXInMAAKA2Km0AbAA7gPYA9kDiIWFyAKA9I+EKXiQAAHokAAB8JJQkAACYJKkkAAAAALUkEQsAAPAkAAAAAAQleiUAAIMlcgCAoSUiYXN0AGUkbyQBCwCBtgA7bGokayS2QGwAZQDsABgDaQJ1JAAAAAB4JG0AAKDzKgCg/Sp5AD9kcgCAAmNpbXB0AIUkiCSLJJkSjyRuAHQAJWBvAGQALmBpAGwAAKAwIOUhbmsAoDEgcgAA4DXYLd2AAWltbwCdJKAkpCR2oMYD1WNtAGEA9AD+B24AZQAAoA4m9KHAA64kAAC0JGMjaGZvcmsAAKDUItZjAAFhdbgkxCRuAAABY2u9JMIkawBooA8hAKAOIfYAaRpzAACkKwBhYmNkZW1zdNMkIRPXJNsk4STjJOck6yTjIWlyAKAjKmkAcgAAoCIqAAFvdYsW3yQAoCUqAKByKm4AO4CxALFAaQBtAACgJip3AG8AAKAnKoABaXB1APUk+iT+JO4idGludACgFSpmAADgNdhh3W4AZAA7gKMAo0CApHoiRWFjZWlub3N1ABMlFSUYJRslTCVRJVklSSV1JQCgsypwAACgtyp1AOUAPwtjoK8qgKJ6ImFjZW5zACclLSU0JTYlSSVwAHAAcgBvAPgAFyV1AHIAbAB5AGUA8QA/C/EAOAuAAWFlcwA8JUElRSXwInByb3gAoLkqcQBxAACgtSppAG0AAKDoImkA7QBEC20AZQDzoDIgIguAAUVhcwBDJVclRSXwAEAlgAFkZnAATwtfJXElgAFhbHMAZSVpJW0l7CFhcgCgLiPpIW5lAKASI/UhcmYAoBMjdKAdIu8AWQvyIWVsAKCwIgABY2l9JYElcgAA4DXYxdzIY24iY3NwAACgCCAAA2Zpb3BzdZElKxuVJZolnyWkJXIAAOA12C7dcABmAADgNdhi3XIiaW1lAACgVyBjAHIAAOA12MbcgAFhZW8AqiW6JcAldAAAAWVpryW2JXIAbgBpAG8AbgDzABkFbgB0AACgFipzAHQAZaA/APEACRj0AG0LgApBQkhhYmNkZWZoaWxtbm9wcnN0dXgA4yXyJfYl+iVpJpAmpia9JtUm5ib4JlonaCdxJ3UnnietJ7EnyCfiJ+cngAFhcnQA6SXsJe4lcgDyAJkM8gD6AuEhaWwAoBwpYQByAPIA3BVhAHIAAKBkKYADY2RlbnFydAAGJhAmEyYYJiYmKyZaJgABZXUKJg0mAOA9IjEDdABlAFVhaQDjACAN7SJwdHl2AKCzKWcAgKHpJ2RlbAAgJiImJCYAoJIpAKClKeUA9wt1AG8AO4C7ALtAcgAApZIhYWJjZmhscHN0dz0mQCZFJkcmSiZMJk4mUSZVJlgmcAAAoHUpZqDlIXMAAKAgKQCgMylzAACgHinrALka8ACVHmwAAKBFKWkAbQAAoHQpbAAAoKMhAKCdIQABYWleJmImaQBsAACgGilvAG6gNiJhAGwA8wB2C4ABYWJyAG8mciZ2JnIA8gAvEnIAawAAoHMnAAFha3omgSZjAAABZWt/JoAmfWBdYAABZXOFJocmAKCMKWwAAAFkdYwmjiYAoI4pAKCQKQACYWV1eZcmmiajJqUm8iFvbllhAAFkaZ4moSZpAGwAV2HsAA8M4gCAJkBkAAJjbHFzrSawJrUmuiZhAACgNylkImhhcgAAoGkpdQBvAPKgHSCjAWgAAKCzIYABYWNnAMMm0iaUC2wAgKEcIWlwcwDLJs4migxuAOUAoAxhAHIA9ADaC3QAAKCtJYABaWxyANsm3ybjJvMhaHQAoH0pbwBvAPIANgwA4DXYL90AAWFv6ib1JnIAAAFkde8m8SYAoMEhbKDAIQCgbCl2oMED8WOAAWducwD+Jk4nUCdoAHQAAANhaGxyc3QKJxInISc1Jz0nRydyInJvdwB0oJIhYQDpAFYmYSNycG9vbgAAAWR1GiceJ28AdwDuAPAmcAAAoMAh5SFmdAABYWgnJy0ncgByAG8AdwDzAAkMYQByAHAAbwBvAG4A8wATBGklZ2h0YXJyb3dzAACgySFxAHUAaQBnAGEAcgByAG8A9wBZJugkcmVldGltZXMAoMwiZwDaYmkAbgBnAGQAbwB0AHMAZQDxABwYgAFhaG0AYCdjJ2YncgDyAAkMYQDyABMEAKAPIG8idXN0AGGgsSPjIWhlAKCxI+0haWQAoO4qAAJhYnB0fCeGJ4knmScAAW5ygCeDJ2cAAKDtJ3IAAKD+IXIA6wAcDIABYWZsAI8nkieVJ3IAAKCGKQDgNdhj3XUAcwAAoC4qaSJtZXMAAKA1KgABYXCiJ6gncgBnoCkAdAAAoJQp7yJsaW50AKASKmEAcgDyADwnAAJhY2hxuCe8J6EMwCfxIXVvAKA6IHIAAOA12MfcAAFidYAmxCdvAPKgGSCoAYABaGlyAM4n0ifWJ3IAZQDlAE0n7SFlcwCgyiJpAIChuSVlZmwAXAxjEt4n9CFyaQCgzinsInVoYXIAoGgpAKAeIWENBSgJKA0oSyhVKIYoAACLKLAoAAAAAOMo5ygAABApJCkxKW0pcSmHKaYpAACYKgAAAACxKmMidXRlAFthcQB1AO8ABR+ApHsiRWFjZWlucHN5ABwoHignKCooLygyKEEoRihJKACgtCrwASMoAAAlKACguCpvAG4AYWF1AOUAgw1koLAqaQBsAF9hcgBjAF1hgAFFYXMAOCg6KD0oAKC2KnAAAKC6KmkAbQAAoOki7yJsaW50AKATKmkA7QCIDUFkbwB0AGKixSKRFgAAAABTKACgZiqAA0FhY21zdHgAYChkKG8ocyh1KHkogihyAHIAAKDYIXIAAAFocmkoayjrAJAab6CYIfcAzAd0ADuApwCnQGkAO2D3IWFyAKApKW0AAAFpbn4ozQBuAHUA8wDOAHQAAKA2J3IA7+A12DDdIxkAAmFjb3mRKJUonSisKHIAcAAAoG8mAAFoeZkonChjAHkASWRIZHIAdABtAqUoAAAAAKgoaQDkAFsPYQByAGEA7ABsJDuArQCtQAABZ22zKLsobQBhAAChwwNmdroouijCY4CjPCJkZWdsbnByAMgozCjPKNMo1yjaKN4obwB0AACgairxoEMiCw5FoJ4qAKCgKkWgnSoAoJ8qZQAAoEYi7CF1cwCgJCrhIXJyAKByKWEAcgDyAPwMAAJhZWl07Sj8KAEpCCkAAWxz8Sj4KGwAcwBlAHQAbQDpAH8oaABwAACgMyrwImFyc2wAoOQpAAFkbFoPBSllAACgIyNloKoqc6CsKgDgrCoA/oABZmxwABUpGCkfKfQhY3lMZGKgLwBhoMQpcgAAoD8jZgAA4DXYZN1hAAABZHIoKRcDZQBzAHWgYCZpAHQAAKBgJoABY3N1ADYpRilhKQABYXU6KUApcABzoJMiAOCTIgD+cABzoJQiAOCUIgD+dQAAAWJwSylWKQChjyJlcz4NUCllAHQAZaCPIvEAPw0AoZAiZXNIDVspZQB0AGWgkCLxAEkNAKGhJWFmZilbBHIAZQFrKVwEAKChJWEAcgDyAAMNAAJjZW10dyl7KX8pgilyAADgNdjI3HQAbQDuAM4AaQDsAAYpYQByAOYAVw0AAWFyiimOKXIA5qAGJhESAAFhbpIpoylpImdodAAAAWVwmSmgKXAAcwBpAGwAbwDuANkXaADpAKAkcwCvYIACYmNtbnAArin8KY4NJSooKgCkgiJFZGVtbnByc7wpvinCKcgpzCnUKdgp3CkAoMUqbwB0AACgvSpkoIYibwB0AACgwyr1IWx0AKDBKgABRWXQKdIpAKDLKgCgiiLsIXVzAKC/KuEhcnIAoHkpgAFlaXUA4inxKfQpdAAAoYIiZW7oKewpcQDxoIYivSllAHEA8aCKItEpbQAAoMcqAAFicPgp+ikAoNUqAKDTKmMAgKJ7ImFjZW5zAAcqDSoUKhYqRihwAHAAcgBvAPgAIyh1AHIAbAB5AGUA8QCDDfEAfA2AAWFlcwAcKiIqPShwAHAAcgBvAPgAPChxAPEAOShnAACgaiYApoMiMTIzRWRlaGxtbnBzPCo/KkIqRSpHKlIqWCpjKmcqaypzKncqO4C5ALlAO4CyALJAO4CzALNAAKDGKgABb3NLKk4qdAAAoL4qdQBiAACg2CpkoIcibwB0AACgxCpzAAABb3VdKmAqbAAAoMknYgAAoNcq4SFycgCgeyn1IWx0AKDCKgABRWVvKnEqAKDMKgCgiyLsIXVzAKDAKoABZWl1AH0qjCqPKnQAAKGDImVugyqHKnEA8aCHIkYqZQBxAPGgiyJwKm0AAKDIKgABYnCTKpUqAKDUKgCg1iqAAUFhbgCdKqEqrCpyAHIAAKDZIXIAAAFocqYqqCrrAJUab6CZIfcAxQf3IWFyAKAqKWwAaQBnADuA3wDfQOELzyrZKtwq6SrsKvEqAAD1KjQrAAAAAAAAAAAAAEwrbCsAAHErvSsAAAAAAADRK3IC1CoAAAAA2CrnIWV0AKAWI8RjcgDrAOUKgAFhZXkA4SrkKucq8iFvbmVh5CFpbGNhQmRvAPQAIg5sInJlYwAAoBUjcgAA4DXYMd0AAmVpa2/7KhIrKCsuK/IBACsAAAkrZQAAATRm6g0EK28AcgDlAOsNYQBzorgDECsAAAAAEit5AG0A0WMAAWNuFislK2sAAAFhcxsrIStwAHAAcgBvAPgAFw5pAG0AAKA8InMA8AD9DQABYXMsKyEr8AAXDnIAbgA7gP4A/kDsATgrOyswG2QA5QBnAmUAcwCAgdcAO2JkAEMrRCtJK9dAYaCgInIAAKAxKgCgMCqAAWVwcwBRK1MraSvhAAkh4qKkIlsrXysAAAAAYytvAHQAAKA2I2kAcgAAoPEqb+A12GXdcgBrAACg2irhAHgociJpbWUAAKA0IIABYWlwAHYreSu3K2QA5QC+DYADYWRlbXBzdACFK6MrmiunK6wrsCuzK24iZ2xlAACitSVkbHFykCuUK5ornCvvIXduAKC/JeUhZnRloMMl8QACBwCgXCJpImdodABloLkl8QBdDG8AdAAAoOwlaSJudXMAAKA6KuwhdXMAoDkqYgAAoM0p6SFtZQCgOyrlInppdW0AoOIjgAFjaHQAwivKK80rAAFyecYrySsA4DXYydxGZGMAeQBbZPIhb2tnYQABaW/UK9creAD0ANERaCJlYWQAAAFsct4r5ytlAGYAdABhAHIAcgBvAPcAXQbpJGdodGFycm93AKCgIQAJQUhhYmNkZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg\",\n);\n","// Generated using scripts/write-decode-map.ts\n\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\nexport const xmlDecodeTree: Uint16Array = /* #__PURE__ */ decodeBase64(\n    \"AAJhZ2xxBwARABMAFQBtAg0AAAAAAA8AcAAmYG8AcwAnYHQAPmB0ADxg9SFvdCJg\",\n);\n","/**\n * Bit flags & masks for the binary trie encoding used for entity decoding.\n *\n * Bit layout (16 bits total):\n * 15..14 VALUE_LENGTH   (+1 encoding; 0 => no value)\n * 13     FLAG13.        If valueLength>0: semicolon required flag (implicit ';').\n *                       If valueLength==0: compact run flag.\n * 12..7  BRANCH_LENGTH  Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)\n * 6..0   JUMP_TABLE     Jump offset (jump table) OR single-branch char code OR first run char\n */\nexport enum BinTrieFlags {\n    VALUE_LENGTH = 0b1100_0000_0000_0000,\n    FLAG13 = 0b0010_0000_0000_0000,\n    BRANCH_LENGTH = 0b0001_1111_1000_0000,\n    JUMP_TABLE = 0b0000_0000_0111_1111,\n}\n","/*\n * Shared base64 decode helper for generated decode data.\n * Assumes global atob is available.\n */\nexport function decodeBase64(input: string): Uint16Array {\n    const binary: string =\n        // eslint-disable-next-line n/no-unsupported-features/node-builtins\n        typeof atob === \"function\"\n            ? // Browser (and Node >=16)\n              // eslint-disable-next-line n/no-unsupported-features/node-builtins\n              atob(input)\n            : // Older Node versions (<16)\n              // eslint-disable-next-line n/no-unsupported-features/node-builtins\n              typeof Buffer.from === \"function\"\n              ? // eslint-disable-next-line n/no-unsupported-features/node-builtins\n                Buffer.from(input, \"base64\").toString(\"binary\")\n              : // eslint-disable-next-line unicorn/no-new-buffer, n/no-deprecated-api\n                new Buffer(input, \"base64\").toString(\"binary\");\n\n    const evenLength = binary.length & ~1; // Round down to even length\n    const out = new Uint16Array(evenLength / 2);\n\n    for (let index = 0, outIndex = 0; index < evenLength; index += 2) {\n        const lo = binary.charCodeAt(index);\n        const hi = binary.charCodeAt(index + 1);\n        out[outIndex++] = lo | (hi << 8);\n    }\n\n    return out;\n}\n","import Tokenizer, { type Callbacks, QuoteType } from \"./Tokenizer.js\";\nimport { fromCodePoint } from \"entities/decode\";\n\nconst formTags = new Set([\n    \"input\",\n    \"option\",\n    \"optgroup\",\n    \"select\",\n    \"button\",\n    \"datalist\",\n    \"textarea\",\n]);\nconst pTag = new Set([\"p\"]);\nconst tableSectionTags = new Set([\"thead\", \"tbody\"]);\nconst ddtTags = new Set([\"dd\", \"dt\"]);\nconst rtpTags = new Set([\"rt\", \"rp\"]);\n\nconst openImpliesClose = new Map<string, Set<string>>([\n    [\"tr\", new Set([\"tr\", \"th\", \"td\"])],\n    [\"th\", new Set([\"th\"])],\n    [\"td\", new Set([\"thead\", \"th\", \"td\"])],\n    [\"body\", new Set([\"head\", \"link\", \"script\"])],\n    [\"li\", new Set([\"li\"])],\n    [\"p\", pTag],\n    [\"h1\", pTag],\n    [\"h2\", pTag],\n    [\"h3\", pTag],\n    [\"h4\", pTag],\n    [\"h5\", pTag],\n    [\"h6\", pTag],\n    [\"select\", formTags],\n    [\"input\", formTags],\n    [\"output\", formTags],\n    [\"button\", formTags],\n    [\"datalist\", formTags],\n    [\"textarea\", formTags],\n    [\"option\", new Set([\"option\"])],\n    [\"optgroup\", new Set([\"optgroup\", \"option\"])],\n    [\"dd\", ddtTags],\n    [\"dt\", ddtTags],\n    [\"address\", pTag],\n    [\"article\", pTag],\n    [\"aside\", pTag],\n    [\"blockquote\", pTag],\n    [\"details\", pTag],\n    [\"div\", pTag],\n    [\"dl\", pTag],\n    [\"fieldset\", pTag],\n    [\"figcaption\", pTag],\n    [\"figure\", pTag],\n    [\"footer\", pTag],\n    [\"form\", pTag],\n    [\"header\", pTag],\n    [\"hr\", pTag],\n    [\"main\", pTag],\n    [\"nav\", pTag],\n    [\"ol\", pTag],\n    [\"pre\", pTag],\n    [\"section\", pTag],\n    [\"table\", pTag],\n    [\"ul\", pTag],\n    [\"rt\", rtpTags],\n    [\"rp\", rtpTags],\n    [\"tbody\", tableSectionTags],\n    [\"tfoot\", tableSectionTags],\n]);\n\nconst voidElements = new Set([\n    \"area\",\n    \"base\",\n    \"basefont\",\n    \"br\",\n    \"col\",\n    \"command\",\n    \"embed\",\n    \"frame\",\n    \"hr\",\n    \"img\",\n    \"input\",\n    \"isindex\",\n    \"keygen\",\n    \"link\",\n    \"meta\",\n    \"param\",\n    \"source\",\n    \"track\",\n    \"wbr\",\n]);\n\nconst foreignContextElements = new Set([\"math\", \"svg\"]);\n\nconst htmlIntegrationElements = new Set([\n    \"mi\",\n    \"mo\",\n    \"mn\",\n    \"ms\",\n    \"mtext\",\n    \"annotation-xml\",\n    \"foreignobject\",\n    \"desc\",\n    \"title\",\n]);\n\nexport interface ParserOptions {\n    /**\n     * Indicates whether special tags (`<script>`, `<style>`, and `<title>`) should get special treatment\n     * and if \"empty\" tags (eg. `<br>`) can have children.  If `false`, the content of special tags\n     * will be text only. For feeds and other XML content (documents that don't consist of HTML),\n     * set this to `true`.\n     *\n     * @default false\n     */\n    xmlMode?: boolean;\n\n    /**\n     * Decode entities within the document.\n     *\n     * @default true\n     */\n    decodeEntities?: boolean;\n\n    /**\n     * If set to true, all tags will be lowercased.\n     *\n     * @default !xmlMode\n     */\n    lowerCaseTags?: boolean;\n\n    /**\n     * If set to `true`, all attribute names will be lowercased. This has noticeable impact on speed.\n     *\n     * @default !xmlMode\n     */\n    lowerCaseAttributeNames?: boolean;\n\n    /**\n     * If set to true, CDATA sections will be recognized as text even if the xmlMode option is not enabled.\n     * NOTE: If xmlMode is set to `true` then CDATA sections will always be recognized as text.\n     *\n     * @default xmlMode\n     */\n    recognizeCDATA?: boolean;\n\n    /**\n     * If set to `true`, self-closing tags will trigger the onclosetag event even if xmlMode is not set to `true`.\n     * NOTE: If xmlMode is set to `true` then self-closing tags will always be recognized.\n     *\n     * @default xmlMode\n     */\n    recognizeSelfClosing?: boolean;\n\n    /**\n     * Allows the default tokenizer to be overwritten.\n     */\n    Tokenizer?: typeof Tokenizer;\n}\n\nexport interface Handler {\n    onparserinit(parser: Parser): void;\n\n    /**\n     * Resets the handler back to starting state\n     */\n    onreset(): void;\n\n    /**\n     * Signals the handler that parsing is done\n     */\n    onend(): void;\n    onerror(error: Error): void;\n    onclosetag(name: string, isImplied: boolean): void;\n    onopentagname(name: string): void;\n    /**\n     *\n     * @param name Name of the attribute\n     * @param value Value of the attribute.\n     * @param quote Quotes used around the attribute. `null` if the attribute has no quotes around the value, `undefined` if the attribute has no value.\n     */\n    onattribute(\n        name: string,\n        value: string,\n        quote?: string | undefined | null,\n    ): void;\n    onopentag(\n        name: string,\n        attribs: { [s: string]: string },\n        isImplied: boolean,\n    ): void;\n    ontext(data: string): void;\n    oncomment(data: string): void;\n    oncdatastart(): void;\n    oncdataend(): void;\n    oncommentend(): void;\n    onprocessinginstruction(name: string, data: string): void;\n}\n\nconst reNameEnd = /\\s|\\//;\n\nexport class Parser implements Callbacks {\n    /** The start index of the last event. */\n    public startIndex = 0;\n    /** The end index of the last event. */\n    public endIndex = 0;\n    /**\n     * Store the start index of the current open tag,\n     * so we can update the start index for attributes.\n     */\n    private openTagStart = 0;\n\n    private tagname = \"\";\n    private attribname = \"\";\n    private attribvalue = \"\";\n    private attribs: null | { [key: string]: string } = null;\n    private readonly stack: string[] = [];\n    /** Determines whether self-closing tags are recognized. */\n    private readonly foreignContext: boolean[];\n    private readonly cbs: Partial<Handler>;\n    private readonly lowerCaseTagNames: boolean;\n    private readonly lowerCaseAttributeNames: boolean;\n    private readonly recognizeSelfClosing: boolean;\n    /** We are parsing HTML. Inverse of the `xmlMode` option. */\n    private readonly htmlMode: boolean;\n    private readonly tokenizer: Tokenizer;\n\n    private readonly buffers: string[] = [];\n    private bufferOffset = 0;\n    /** The index of the last written buffer. Used when resuming after a `pause()`. */\n    private writeIndex = 0;\n    /** Indicates whether the parser has finished running / `.end` has been called. */\n    private ended = false;\n\n    constructor(\n        cbs?: Partial<Handler> | null,\n        private readonly options: ParserOptions = {},\n    ) {\n        this.cbs = cbs ?? {};\n        this.htmlMode = !this.options.xmlMode;\n        this.lowerCaseTagNames = options.lowerCaseTags ?? this.htmlMode;\n        this.lowerCaseAttributeNames =\n            options.lowerCaseAttributeNames ?? this.htmlMode;\n        this.recognizeSelfClosing =\n            options.recognizeSelfClosing ?? !this.htmlMode;\n        this.tokenizer = new (options.Tokenizer ?? Tokenizer)(\n            this.options,\n            this,\n        );\n        this.foreignContext = [!this.htmlMode];\n        this.cbs.onparserinit?.(this);\n    }\n\n    // Tokenizer event handlers\n\n    /** @internal */\n    ontext(start: number, endIndex: number): void {\n        const data = this.getSlice(start, endIndex);\n        this.endIndex = endIndex - 1;\n        this.cbs.ontext?.(data);\n        this.startIndex = endIndex;\n    }\n\n    /** @internal */\n    ontextentity(cp: number, endIndex: number): void {\n        this.endIndex = endIndex - 1;\n        this.cbs.ontext?.(fromCodePoint(cp));\n        this.startIndex = endIndex;\n    }\n\n    /**\n     * Checks if the current tag is a void element. Override this if you want\n     * to specify your own additional void elements.\n     */\n    protected isVoidElement(name: string): boolean {\n        return this.htmlMode && voidElements.has(name);\n    }\n\n    /** @internal */\n    onopentagname(start: number, endIndex: number): void {\n        this.endIndex = endIndex;\n\n        let name = this.getSlice(start, endIndex);\n\n        if (this.lowerCaseTagNames) {\n            name = name.toLowerCase();\n        }\n\n        this.emitOpenTag(name);\n    }\n\n    private emitOpenTag(name: string) {\n        this.openTagStart = this.startIndex;\n        this.tagname = name;\n\n        const impliesClose = this.htmlMode && openImpliesClose.get(name);\n\n        if (impliesClose) {\n            while (this.stack.length > 0 && impliesClose.has(this.stack[0])) {\n                const element = this.stack.shift()!;\n                this.cbs.onclosetag?.(element, true);\n            }\n        }\n        if (!this.isVoidElement(name)) {\n            this.stack.unshift(name);\n\n            if (this.htmlMode) {\n                if (foreignContextElements.has(name)) {\n                    this.foreignContext.unshift(true);\n                } else if (htmlIntegrationElements.has(name)) {\n                    this.foreignContext.unshift(false);\n                }\n            }\n        }\n        this.cbs.onopentagname?.(name);\n        if (this.cbs.onopentag) this.attribs = {};\n    }\n\n    private endOpenTag(isImplied: boolean) {\n        this.startIndex = this.openTagStart;\n\n        if (this.attribs) {\n            this.cbs.onopentag?.(this.tagname, this.attribs, isImplied);\n            this.attribs = null;\n        }\n        if (this.cbs.onclosetag && this.isVoidElement(this.tagname)) {\n            this.cbs.onclosetag(this.tagname, true);\n        }\n\n        this.tagname = \"\";\n    }\n\n    /** @internal */\n    onopentagend(endIndex: number): void {\n        this.endIndex = endIndex;\n        this.endOpenTag(false);\n\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n\n    /** @internal */\n    onclosetag(start: number, endIndex: number): void {\n        this.endIndex = endIndex;\n\n        let name = this.getSlice(start, endIndex);\n\n        if (this.lowerCaseTagNames) {\n            name = name.toLowerCase();\n        }\n\n        if (\n            this.htmlMode &&\n            (foreignContextElements.has(name) ||\n                htmlIntegrationElements.has(name))\n        ) {\n            this.foreignContext.shift();\n        }\n\n        if (!this.isVoidElement(name)) {\n            const pos = this.stack.indexOf(name);\n            if (pos !== -1) {\n                for (let index = 0; index <= pos; index++) {\n                    const element = this.stack.shift()!;\n                    // We know the stack has sufficient elements.\n                    this.cbs.onclosetag?.(element, index !== pos);\n                }\n            } else if (this.htmlMode && name === \"p\") {\n                // Implicit open before close\n                this.emitOpenTag(\"p\");\n                this.closeCurrentTag(true);\n            }\n        } else if (this.htmlMode && name === \"br\") {\n            // We can't use `emitOpenTag` for implicit open, as `br` would be implicitly closed.\n            this.cbs.onopentagname?.(\"br\");\n            this.cbs.onopentag?.(\"br\", {}, true);\n            this.cbs.onclosetag?.(\"br\", false);\n        }\n\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n\n    /** @internal */\n    onselfclosingtag(endIndex: number): void {\n        this.endIndex = endIndex;\n        if (this.recognizeSelfClosing || this.foreignContext[0]) {\n            this.closeCurrentTag(false);\n\n            // Set `startIndex` for next node\n            this.startIndex = endIndex + 1;\n        } else {\n            // Ignore the fact that the tag is self-closing.\n            this.onopentagend(endIndex);\n        }\n    }\n\n    private closeCurrentTag(isOpenImplied: boolean) {\n        const name = this.tagname;\n        this.endOpenTag(isOpenImplied);\n\n        // Self-closing tags will be on the top of the stack\n        if (this.stack[0] === name) {\n            // If the opening tag isn't implied, the closing tag has to be implied.\n            this.cbs.onclosetag?.(name, !isOpenImplied);\n            this.stack.shift();\n        }\n    }\n\n    /** @internal */\n    onattribname(start: number, endIndex: number): void {\n        this.startIndex = start;\n        const name = this.getSlice(start, endIndex);\n\n        this.attribname = this.lowerCaseAttributeNames\n            ? name.toLowerCase()\n            : name;\n    }\n\n    /** @internal */\n    onattribdata(start: number, endIndex: number): void {\n        this.attribvalue += this.getSlice(start, endIndex);\n    }\n\n    /** @internal */\n    onattribentity(cp: number): void {\n        this.attribvalue += fromCodePoint(cp);\n    }\n\n    /** @internal */\n    onattribend(quote: QuoteType, endIndex: number): void {\n        this.endIndex = endIndex;\n\n        this.cbs.onattribute?.(\n            this.attribname,\n            this.attribvalue,\n            quote === QuoteType.Double\n                ? '\"'\n                : quote === QuoteType.Single\n                  ? \"'\"\n                  : quote === QuoteType.NoValue\n                    ? undefined\n                    : null,\n        );\n\n        if (\n            this.attribs &&\n            !Object.prototype.hasOwnProperty.call(this.attribs, this.attribname)\n        ) {\n            this.attribs[this.attribname] = this.attribvalue;\n        }\n        this.attribvalue = \"\";\n    }\n\n    private getInstructionName(value: string) {\n        const index = value.search(reNameEnd);\n        let name = index < 0 ? value : value.substr(0, index);\n\n        if (this.lowerCaseTagNames) {\n            name = name.toLowerCase();\n        }\n\n        return name;\n    }\n\n    /** @internal */\n    ondeclaration(start: number, endIndex: number): void {\n        this.endIndex = endIndex;\n        const value = this.getSlice(start, endIndex);\n\n        if (this.cbs.onprocessinginstruction) {\n            const name = this.getInstructionName(value);\n            this.cbs.onprocessinginstruction(`!${name}`, `!${value}`);\n        }\n\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n\n    /** @internal */\n    onprocessinginstruction(start: number, endIndex: number): void {\n        this.endIndex = endIndex;\n        const value = this.getSlice(start, endIndex);\n\n        if (this.cbs.onprocessinginstruction) {\n            const name = this.getInstructionName(value);\n            this.cbs.onprocessinginstruction(`?${name}`, `?${value}`);\n        }\n\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n\n    /** @internal */\n    oncomment(start: number, endIndex: number, offset: number): void {\n        this.endIndex = endIndex;\n\n        this.cbs.oncomment?.(this.getSlice(start, endIndex - offset));\n        this.cbs.oncommentend?.();\n\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n\n    /** @internal */\n    oncdata(start: number, endIndex: number, offset: number): void {\n        this.endIndex = endIndex;\n        const value = this.getSlice(start, endIndex - offset);\n\n        if (!this.htmlMode || this.options.recognizeCDATA) {\n            this.cbs.oncdatastart?.();\n            this.cbs.ontext?.(value);\n            this.cbs.oncdataend?.();\n        } else {\n            this.cbs.oncomment?.(`[CDATA[${value}]]`);\n            this.cbs.oncommentend?.();\n        }\n\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n\n    /** @internal */\n    onend(): void {\n        if (this.cbs.onclosetag) {\n            // Set the end index for all remaining tags\n            this.endIndex = this.startIndex;\n            for (let index = 0; index < this.stack.length; index++) {\n                this.cbs.onclosetag(this.stack[index], true);\n            }\n        }\n        this.cbs.onend?.();\n    }\n\n    /**\n     * Resets the parser to a blank state, ready to parse a new HTML document\n     */\n    public reset(): void {\n        this.cbs.onreset?.();\n        this.tokenizer.reset();\n        this.tagname = \"\";\n        this.attribname = \"\";\n        this.attribs = null;\n        this.stack.length = 0;\n        this.startIndex = 0;\n        this.endIndex = 0;\n        this.cbs.onparserinit?.(this);\n        this.buffers.length = 0;\n        this.foreignContext.length = 0;\n        this.foreignContext.unshift(!this.htmlMode);\n        this.bufferOffset = 0;\n        this.writeIndex = 0;\n        this.ended = false;\n    }\n\n    /**\n     * Resets the parser, then parses a complete document and\n     * pushes it to the handler.\n     *\n     * @param data Document to parse.\n     */\n    public parseComplete(data: string): void {\n        this.reset();\n        this.end(data);\n    }\n\n    private getSlice(start: number, end: number) {\n        while (start - this.bufferOffset >= this.buffers[0].length) {\n            this.shiftBuffer();\n        }\n\n        let slice = this.buffers[0].slice(\n            start - this.bufferOffset,\n            end - this.bufferOffset,\n        );\n\n        while (end - this.bufferOffset > this.buffers[0].length) {\n            this.shiftBuffer();\n            slice += this.buffers[0].slice(0, end - this.bufferOffset);\n        }\n\n        return slice;\n    }\n\n    private shiftBuffer(): void {\n        this.bufferOffset += this.buffers[0].length;\n        this.writeIndex--;\n        this.buffers.shift();\n    }\n\n    /**\n     * Parses a chunk of data and calls the corresponding callbacks.\n     *\n     * @param chunk Chunk to parse.\n     */\n    public write(chunk: string): void {\n        if (this.ended) {\n            this.cbs.onerror?.(new Error(\".write() after done!\"));\n            return;\n        }\n\n        this.buffers.push(chunk);\n        if (this.tokenizer.running) {\n            this.tokenizer.write(chunk);\n            this.writeIndex++;\n        }\n    }\n\n    /**\n     * Parses the end of the buffer and clears the stack, calls onend.\n     *\n     * @param chunk Optional final chunk to parse.\n     */\n    public end(chunk?: string): void {\n        if (this.ended) {\n            this.cbs.onerror?.(new Error(\".end() after done!\"));\n            return;\n        }\n\n        if (chunk) this.write(chunk);\n        this.ended = true;\n        this.tokenizer.end();\n    }\n\n    /**\n     * Pauses parsing. The parser won't emit events until `resume` is called.\n     */\n    public pause(): void {\n        this.tokenizer.pause();\n    }\n\n    /**\n     * Resumes parsing after `pause` was called.\n     */\n    public resume(): void {\n        this.tokenizer.resume();\n\n        while (\n            this.tokenizer.running &&\n            this.writeIndex < this.buffers.length\n        ) {\n            this.tokenizer.write(this.buffers[this.writeIndex++]);\n        }\n\n        if (this.ended) this.tokenizer.end();\n    }\n\n    /**\n     * Alias of `write`, for backwards compatibility.\n     *\n     * @param chunk Chunk to parse.\n     * @deprecated\n     */\n    public parseChunk(chunk: string): void {\n        this.write(chunk);\n    }\n    /**\n     * Alias of `end`, for backwards compatibility.\n     *\n     * @param chunk Optional final chunk to parse.\n     * @deprecated\n     */\n    public done(chunk?: string): void {\n        this.end(chunk);\n    }\n}\n","import {\n    EntityDecoder,\n    DecodingMode,\n    htmlDecodeTree,\n    xmlDecodeTree,\n} from \"entities/decode\";\n\nconst enum CharCodes {\n    Tab = 0x9, // \"\\t\"\n    NewLine = 0xa, // \"\\n\"\n    FormFeed = 0xc, // \"\\f\"\n    CarriageReturn = 0xd, // \"\\r\"\n    Space = 0x20, // \" \"\n    ExclamationMark = 0x21, // \"!\"\n    Number = 0x23, // \"#\"\n    Amp = 0x26, // \"&\"\n    SingleQuote = 0x27, // \"'\"\n    DoubleQuote = 0x22, // '\"'\n    Dash = 0x2d, // \"-\"\n    Slash = 0x2f, // \"/\"\n    Zero = 0x30, // \"0\"\n    Nine = 0x39, // \"9\"\n    Semi = 0x3b, // \";\"\n    Lt = 0x3c, // \"<\"\n    Eq = 0x3d, // \"=\"\n    Gt = 0x3e, // \">\"\n    Questionmark = 0x3f, // \"?\"\n    UpperA = 0x41, // \"A\"\n    LowerA = 0x61, // \"a\"\n    UpperF = 0x46, // \"F\"\n    LowerF = 0x66, // \"f\"\n    UpperZ = 0x5a, // \"Z\"\n    LowerZ = 0x7a, // \"z\"\n    LowerX = 0x78, // \"x\"\n    OpeningSquareBracket = 0x5b, // \"[\"\n}\n\n/** All the states the tokenizer can be in. */\nconst enum State {\n    Text = 1,\n    BeforeTagName, // After <\n    InTagName,\n    InSelfClosingTag,\n    BeforeClosingTagName,\n    InClosingTagName,\n    AfterClosingTagName,\n\n    // Attributes\n    BeforeAttributeName,\n    InAttributeName,\n    AfterAttributeName,\n    BeforeAttributeValue,\n    InAttributeValueDq, // \"\n    InAttributeValueSq, // '\n    InAttributeValueNq,\n\n    // Declarations\n    BeforeDeclaration, // !\n    InDeclaration,\n\n    // Processing instructions\n    InProcessingInstruction, // ?\n\n    // Comments & CDATA\n    BeforeComment,\n    CDATASequence,\n    InSpecialComment,\n    InCommentLike,\n\n    // Special tags\n    BeforeSpecialS, // Decide if we deal with `<script` or `<style`\n    BeforeSpecialT, // Decide if we deal with `<title` or `<textarea`\n    SpecialStartSequence,\n    InSpecialTag,\n\n    InEntity,\n}\n\nfunction isWhitespace(c: number): boolean {\n    return (\n        c === CharCodes.Space ||\n        c === CharCodes.NewLine ||\n        c === CharCodes.Tab ||\n        c === CharCodes.FormFeed ||\n        c === CharCodes.CarriageReturn\n    );\n}\n\nfunction isEndOfTagSection(c: number): boolean {\n    return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);\n}\n\nfunction isASCIIAlpha(c: number): boolean {\n    return (\n        (c >= CharCodes.LowerA && c <= CharCodes.LowerZ) ||\n        (c >= CharCodes.UpperA && c <= CharCodes.UpperZ)\n    );\n}\n\nexport enum QuoteType {\n    NoValue = 0,\n    Unquoted = 1,\n    Single = 2,\n    Double = 3,\n}\n\nexport interface Callbacks {\n    onattribdata(start: number, endIndex: number): void;\n    onattribentity(codepoint: number): void;\n    onattribend(quote: QuoteType, endIndex: number): void;\n    onattribname(start: number, endIndex: number): void;\n    oncdata(start: number, endIndex: number, endOffset: number): void;\n    onclosetag(start: number, endIndex: number): void;\n    oncomment(start: number, endIndex: number, endOffset: number): void;\n    ondeclaration(start: number, endIndex: number): void;\n    onend(): void;\n    onopentagend(endIndex: number): void;\n    onopentagname(start: number, endIndex: number): void;\n    onprocessinginstruction(start: number, endIndex: number): void;\n    onselfclosingtag(endIndex: number): void;\n    ontext(start: number, endIndex: number): void;\n    ontextentity(codepoint: number, endIndex: number): void;\n}\n\n/**\n * Sequences used to match longer strings.\n *\n * We don't have `Script`, `Style`, or `Title` here. Instead, we re-use the *End\n * sequences with an increased offset.\n */\nconst Sequences = {\n    Cdata: new Uint8Array([0x43, 0x44, 0x41, 0x54, 0x41, 0x5b]), // CDATA[\n    CdataEnd: new Uint8Array([0x5d, 0x5d, 0x3e]), // ]]>\n    CommentEnd: new Uint8Array([0x2d, 0x2d, 0x3e]), // `-->`\n    ScriptEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74]), // `</script`\n    StyleEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65]), // `</style`\n    TitleEnd: new Uint8Array([0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65]), // `</title`\n    TextareaEnd: new Uint8Array([\n        0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61,\n    ]), // `</textarea`\n    XmpEnd: new Uint8Array([0x3c, 0x2f, 0x78, 0x6d, 0x70]), // `</xmp`\n};\n\nexport default class Tokenizer {\n    /** The current state the tokenizer is in. */\n    private state = State.Text;\n    /** The read buffer. */\n    private buffer = \"\";\n    /** The beginning of the section that is currently being read. */\n    private sectionStart = 0;\n    /** The index within the buffer that we are currently looking at. */\n    private index = 0;\n    /** The start of the last entity. */\n    private entityStart = 0;\n    /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */\n    private baseState = State.Text;\n    /** For special parsing behavior inside of script and style tags. */\n    private isSpecial = false;\n    /** Indicates whether the tokenizer has been paused. */\n    public running = true;\n    /** The offset of the current buffer. */\n    private offset = 0;\n\n    private readonly xmlMode: boolean;\n    private readonly decodeEntities: boolean;\n    private readonly entityDecoder: EntityDecoder;\n\n    constructor(\n        {\n            xmlMode = false,\n            decodeEntities = true,\n        }: { xmlMode?: boolean; decodeEntities?: boolean },\n        private readonly cbs: Callbacks,\n    ) {\n        this.xmlMode = xmlMode;\n        this.decodeEntities = decodeEntities;\n        this.entityDecoder = new EntityDecoder(\n            xmlMode ? xmlDecodeTree : htmlDecodeTree,\n            (cp, consumed) => this.emitCodePoint(cp, consumed),\n        );\n    }\n\n    public reset(): void {\n        this.state = State.Text;\n        this.buffer = \"\";\n        this.sectionStart = 0;\n        this.index = 0;\n        this.baseState = State.Text;\n        this.currentSequence = undefined!;\n        this.running = true;\n        this.offset = 0;\n    }\n\n    public write(chunk: string): void {\n        this.offset += this.buffer.length;\n        this.buffer = chunk;\n        this.parse();\n    }\n\n    public end(): void {\n        if (this.running) this.finish();\n    }\n\n    public pause(): void {\n        this.running = false;\n    }\n\n    public resume(): void {\n        this.running = true;\n        if (this.index < this.buffer.length + this.offset) {\n            this.parse();\n        }\n    }\n\n    private stateText(c: number): void {\n        if (\n            c === CharCodes.Lt ||\n            (!this.decodeEntities && this.fastForwardTo(CharCodes.Lt))\n        ) {\n            if (this.index > this.sectionStart) {\n                this.cbs.ontext(this.sectionStart, this.index);\n            }\n            this.state = State.BeforeTagName;\n            this.sectionStart = this.index;\n        } else if (this.decodeEntities && c === CharCodes.Amp) {\n            this.startEntity();\n        }\n    }\n\n    private currentSequence: Uint8Array = undefined!;\n    private sequenceIndex = 0;\n    private stateSpecialStartSequence(c: number): void {\n        const isEnd = this.sequenceIndex === this.currentSequence.length;\n        const isMatch = isEnd\n            ? // If we are at the end of the sequence, make sure the tag name has ended\n              isEndOfTagSection(c)\n            : // Otherwise, do a case-insensitive comparison\n              (c | 0x20) === this.currentSequence[this.sequenceIndex];\n\n        if (!isMatch) {\n            this.isSpecial = false;\n        } else if (!isEnd) {\n            this.sequenceIndex++;\n            return;\n        }\n\n        this.sequenceIndex = 0;\n        this.state = State.InTagName;\n        this.stateInTagName(c);\n    }\n\n    /** Look for an end tag. For <title> tags, also decode entities. */\n    private stateInSpecialTag(c: number): void {\n        if (this.sequenceIndex === this.currentSequence.length) {\n            if (c === CharCodes.Gt || isWhitespace(c)) {\n                const endOfText = this.index - this.currentSequence.length;\n\n                if (this.sectionStart < endOfText) {\n                    // Spoof the index so that reported locations match up.\n                    const actualIndex = this.index;\n                    this.index = endOfText;\n                    this.cbs.ontext(this.sectionStart, endOfText);\n                    this.index = actualIndex;\n                }\n\n                this.isSpecial = false;\n                this.sectionStart = endOfText + 2; // Skip over the `</`\n                this.stateInClosingTagName(c);\n                return; // We are done; skip the rest of the function.\n            }\n\n            this.sequenceIndex = 0;\n        }\n\n        if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n            this.sequenceIndex += 1;\n        } else if (this.sequenceIndex === 0) {\n            if (this.currentSequence === Sequences.TitleEnd) {\n                // We have to parse entities in <title> tags.\n                if (this.decodeEntities && c === CharCodes.Amp) {\n                    this.startEntity();\n                }\n            } else if (this.fastForwardTo(CharCodes.Lt)) {\n                // Outside of <title> tags, we can fast-forward.\n                this.sequenceIndex = 1;\n            }\n        } else {\n            // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`.\n            this.sequenceIndex = Number(c === CharCodes.Lt);\n        }\n    }\n\n    private stateCDATASequence(c: number): void {\n        if (c === Sequences.Cdata[this.sequenceIndex]) {\n            if (++this.sequenceIndex === Sequences.Cdata.length) {\n                this.state = State.InCommentLike;\n                this.currentSequence = Sequences.CdataEnd;\n                this.sequenceIndex = 0;\n                this.sectionStart = this.index + 1;\n            }\n        } else {\n            this.sequenceIndex = 0;\n            this.state = State.InDeclaration;\n            this.stateInDeclaration(c); // Reconsume the character\n        }\n    }\n\n    /**\n     * When we wait for one specific character, we can speed things up\n     * by skipping through the buffer until we find it.\n     *\n     * @returns Whether the character was found.\n     */\n    private fastForwardTo(c: number): boolean {\n        while (++this.index < this.buffer.length + this.offset) {\n            if (this.buffer.charCodeAt(this.index - this.offset) === c) {\n                return true;\n            }\n        }\n\n        /*\n         * We increment the index at the end of the `parse` loop,\n         * so set it to `buffer.length - 1` here.\n         *\n         * TODO: Refactor `parse` to increment index before calling states.\n         */\n        this.index = this.buffer.length + this.offset - 1;\n\n        return false;\n    }\n\n    /**\n     * Comments and CDATA end with `-->` and `]]>`.\n     *\n     * Their common qualities are:\n     * - Their end sequences have a distinct character they start with.\n     * - That character is then repeated, so we have to check multiple repeats.\n     * - All characters but the start character of the sequence can be skipped.\n     */\n    private stateInCommentLike(c: number): void {\n        if (c === this.currentSequence[this.sequenceIndex]) {\n            if (++this.sequenceIndex === this.currentSequence.length) {\n                if (this.currentSequence === Sequences.CdataEnd) {\n                    this.cbs.oncdata(this.sectionStart, this.index, 2);\n                } else {\n                    this.cbs.oncomment(this.sectionStart, this.index, 2);\n                }\n\n                this.sequenceIndex = 0;\n                this.sectionStart = this.index + 1;\n                this.state = State.Text;\n            }\n        } else if (this.sequenceIndex === 0) {\n            // Fast-forward to the first character of the sequence\n            if (this.fastForwardTo(this.currentSequence[0])) {\n                this.sequenceIndex = 1;\n            }\n        } else if (c !== this.currentSequence[this.sequenceIndex - 1]) {\n            // Allow long sequences, eg. --->, ]]]>\n            this.sequenceIndex = 0;\n        }\n    }\n\n    /**\n     * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.\n     *\n     * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar).\n     * We allow anything that wouldn't end the tag.\n     */\n    private isTagStartChar(c: number) {\n        return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c);\n    }\n\n    private startSpecial(sequence: Uint8Array, offset: number) {\n        this.isSpecial = true;\n        this.currentSequence = sequence;\n        this.sequenceIndex = offset;\n        this.state = State.SpecialStartSequence;\n    }\n\n    private stateBeforeTagName(c: number): void {\n        if (c === CharCodes.ExclamationMark) {\n            this.state = State.BeforeDeclaration;\n            this.sectionStart = this.index + 1;\n        } else if (c === CharCodes.Questionmark) {\n            this.state = State.InProcessingInstruction;\n            this.sectionStart = this.index + 1;\n        } else if (this.isTagStartChar(c)) {\n            const lower = c | 0x20;\n            this.sectionStart = this.index;\n            if (this.xmlMode) {\n                this.state = State.InTagName;\n            } else if (lower === Sequences.ScriptEnd[2]) {\n                this.state = State.BeforeSpecialS;\n            } else if (\n                lower === Sequences.TitleEnd[2] ||\n                lower === Sequences.XmpEnd[2]\n            ) {\n                this.state = State.BeforeSpecialT;\n            } else {\n                this.state = State.InTagName;\n            }\n        } else if (c === CharCodes.Slash) {\n            this.state = State.BeforeClosingTagName;\n        } else {\n            this.state = State.Text;\n            this.stateText(c);\n        }\n    }\n    private stateInTagName(c: number): void {\n        if (isEndOfTagSection(c)) {\n            this.cbs.onopentagname(this.sectionStart, this.index);\n            this.sectionStart = -1;\n            this.state = State.BeforeAttributeName;\n            this.stateBeforeAttributeName(c);\n        }\n    }\n    private stateBeforeClosingTagName(c: number): void {\n        if (isWhitespace(c)) {\n            // Ignore\n        } else if (c === CharCodes.Gt) {\n            this.state = State.Text;\n        } else {\n            this.state = this.isTagStartChar(c)\n                ? State.InClosingTagName\n                : State.InSpecialComment;\n            this.sectionStart = this.index;\n        }\n    }\n    private stateInClosingTagName(c: number): void {\n        if (c === CharCodes.Gt || isWhitespace(c)) {\n            this.cbs.onclosetag(this.sectionStart, this.index);\n            this.sectionStart = -1;\n            this.state = State.AfterClosingTagName;\n            this.stateAfterClosingTagName(c);\n        }\n    }\n    private stateAfterClosingTagName(c: number): void {\n        // Skip everything until \">\"\n        if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n    }\n    private stateBeforeAttributeName(c: number): void {\n        if (c === CharCodes.Gt) {\n            this.cbs.onopentagend(this.index);\n            if (this.isSpecial) {\n                this.state = State.InSpecialTag;\n                this.sequenceIndex = 0;\n            } else {\n                this.state = State.Text;\n            }\n            this.sectionStart = this.index + 1;\n        } else if (c === CharCodes.Slash) {\n            this.state = State.InSelfClosingTag;\n        } else if (!isWhitespace(c)) {\n            this.state = State.InAttributeName;\n            this.sectionStart = this.index;\n        }\n    }\n    private stateInSelfClosingTag(c: number): void {\n        if (c === CharCodes.Gt) {\n            this.cbs.onselfclosingtag(this.index);\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n            this.isSpecial = false; // Reset special state, in case of self-closing special tags\n        } else if (!isWhitespace(c)) {\n            this.state = State.BeforeAttributeName;\n            this.stateBeforeAttributeName(c);\n        }\n    }\n    private stateInAttributeName(c: number): void {\n        if (c === CharCodes.Eq || isEndOfTagSection(c)) {\n            this.cbs.onattribname(this.sectionStart, this.index);\n            this.sectionStart = this.index;\n            this.state = State.AfterAttributeName;\n            this.stateAfterAttributeName(c);\n        }\n    }\n    private stateAfterAttributeName(c: number): void {\n        if (c === CharCodes.Eq) {\n            this.state = State.BeforeAttributeValue;\n        } else if (c === CharCodes.Slash || c === CharCodes.Gt) {\n            this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n            this.sectionStart = -1;\n            this.state = State.BeforeAttributeName;\n            this.stateBeforeAttributeName(c);\n        } else if (!isWhitespace(c)) {\n            this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n            this.state = State.InAttributeName;\n            this.sectionStart = this.index;\n        }\n    }\n    private stateBeforeAttributeValue(c: number): void {\n        if (c === CharCodes.DoubleQuote) {\n            this.state = State.InAttributeValueDq;\n            this.sectionStart = this.index + 1;\n        } else if (c === CharCodes.SingleQuote) {\n            this.state = State.InAttributeValueSq;\n            this.sectionStart = this.index + 1;\n        } else if (!isWhitespace(c)) {\n            this.sectionStart = this.index;\n            this.state = State.InAttributeValueNq;\n            this.stateInAttributeValueNoQuotes(c); // Reconsume token\n        }\n    }\n    private handleInAttributeValue(c: number, quote: number) {\n        if (\n            c === quote ||\n            (!this.decodeEntities && this.fastForwardTo(quote))\n        ) {\n            this.cbs.onattribdata(this.sectionStart, this.index);\n            this.sectionStart = -1;\n            this.cbs.onattribend(\n                quote === CharCodes.DoubleQuote\n                    ? QuoteType.Double\n                    : QuoteType.Single,\n                this.index + 1,\n            );\n            this.state = State.BeforeAttributeName;\n        } else if (this.decodeEntities && c === CharCodes.Amp) {\n            this.startEntity();\n        }\n    }\n    private stateInAttributeValueDoubleQuotes(c: number): void {\n        this.handleInAttributeValue(c, CharCodes.DoubleQuote);\n    }\n    private stateInAttributeValueSingleQuotes(c: number): void {\n        this.handleInAttributeValue(c, CharCodes.SingleQuote);\n    }\n    private stateInAttributeValueNoQuotes(c: number): void {\n        if (isWhitespace(c) || c === CharCodes.Gt) {\n            this.cbs.onattribdata(this.sectionStart, this.index);\n            this.sectionStart = -1;\n            this.cbs.onattribend(QuoteType.Unquoted, this.index);\n            this.state = State.BeforeAttributeName;\n            this.stateBeforeAttributeName(c);\n        } else if (this.decodeEntities && c === CharCodes.Amp) {\n            this.startEntity();\n        }\n    }\n    private stateBeforeDeclaration(c: number): void {\n        if (c === CharCodes.OpeningSquareBracket) {\n            this.state = State.CDATASequence;\n            this.sequenceIndex = 0;\n        } else {\n            this.state =\n                c === CharCodes.Dash\n                    ? State.BeforeComment\n                    : State.InDeclaration;\n        }\n    }\n    private stateInDeclaration(c: number): void {\n        if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n            this.cbs.ondeclaration(this.sectionStart, this.index);\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n    }\n    private stateInProcessingInstruction(c: number): void {\n        if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n            this.cbs.onprocessinginstruction(this.sectionStart, this.index);\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n    }\n    private stateBeforeComment(c: number): void {\n        if (c === CharCodes.Dash) {\n            this.state = State.InCommentLike;\n            this.currentSequence = Sequences.CommentEnd;\n            // Allow short comments (eg. <!-->)\n            this.sequenceIndex = 2;\n            this.sectionStart = this.index + 1;\n        } else {\n            this.state = State.InDeclaration;\n        }\n    }\n    private stateInSpecialComment(c: number): void {\n        if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n            this.cbs.oncomment(this.sectionStart, this.index, 0);\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n    }\n    private stateBeforeSpecialS(c: number): void {\n        const lower = c | 0x20;\n        if (lower === Sequences.ScriptEnd[3]) {\n            this.startSpecial(Sequences.ScriptEnd, 4);\n        } else if (lower === Sequences.StyleEnd[3]) {\n            this.startSpecial(Sequences.StyleEnd, 4);\n        } else {\n            this.state = State.InTagName;\n            this.stateInTagName(c); // Consume the token again\n        }\n    }\n\n    private stateBeforeSpecialT(c: number): void {\n        const lower = c | 0x20;\n        switch (lower) {\n            case Sequences.TitleEnd[3]: {\n                this.startSpecial(Sequences.TitleEnd, 4);\n\n                break;\n            }\n            case Sequences.TextareaEnd[3]: {\n                this.startSpecial(Sequences.TextareaEnd, 4);\n\n                break;\n            }\n            case Sequences.XmpEnd[3]: {\n                this.startSpecial(Sequences.XmpEnd, 4);\n\n                break;\n            }\n            default: {\n                this.state = State.InTagName;\n                this.stateInTagName(c); // Consume the token again\n            }\n        }\n    }\n\n    private startEntity() {\n        this.baseState = this.state;\n        this.state = State.InEntity;\n        this.entityStart = this.index;\n        this.entityDecoder.startEntity(\n            this.xmlMode\n                ? DecodingMode.Strict\n                : this.baseState === State.Text ||\n                    this.baseState === State.InSpecialTag\n                  ? DecodingMode.Legacy\n                  : DecodingMode.Attribute,\n        );\n    }\n\n    private stateInEntity(): void {\n        const indexInBuffer = this.index - this.offset;\n        const length = this.entityDecoder.write(this.buffer, indexInBuffer);\n\n        // If `length` is positive, we are done with the entity.\n        if (length >= 0) {\n            this.state = this.baseState;\n\n            if (length === 0) {\n                this.index -= 1;\n            }\n        } else {\n            if (\n                indexInBuffer < this.buffer.length &&\n                this.buffer.charCodeAt(indexInBuffer) === CharCodes.Amp\n            ) {\n                this.state = this.baseState;\n                this.index -= 1;\n                return;\n            }\n\n            // Mark buffer as consumed.\n            this.index = this.offset + this.buffer.length - 1;\n        }\n    }\n\n    /**\n     * Remove data that has already been consumed from the buffer.\n     */\n    private cleanup() {\n        // If we are inside of text or attributes, emit what we already have.\n        if (this.running && this.sectionStart !== this.index) {\n            if (\n                this.state === State.Text ||\n                (this.state === State.InSpecialTag && this.sequenceIndex === 0)\n            ) {\n                this.cbs.ontext(this.sectionStart, this.index);\n                this.sectionStart = this.index;\n            } else if (\n                this.state === State.InAttributeValueDq ||\n                this.state === State.InAttributeValueSq ||\n                this.state === State.InAttributeValueNq\n            ) {\n                this.cbs.onattribdata(this.sectionStart, this.index);\n                this.sectionStart = this.index;\n            }\n        }\n    }\n\n    private shouldContinue() {\n        return this.index < this.buffer.length + this.offset && this.running;\n    }\n\n    /**\n     * Iterates through the buffer, calling the function corresponding to the current state.\n     *\n     * States that are more likely to be hit are higher up, as a performance improvement.\n     */\n    private parse() {\n        while (this.shouldContinue()) {\n            const c = this.buffer.charCodeAt(this.index - this.offset);\n            switch (this.state) {\n                case State.Text: {\n                    this.stateText(c);\n                    break;\n                }\n                case State.SpecialStartSequence: {\n                    this.stateSpecialStartSequence(c);\n                    break;\n                }\n                case State.InSpecialTag: {\n                    this.stateInSpecialTag(c);\n                    break;\n                }\n                case State.CDATASequence: {\n                    this.stateCDATASequence(c);\n                    break;\n                }\n                case State.InAttributeValueDq: {\n                    this.stateInAttributeValueDoubleQuotes(c);\n                    break;\n                }\n                case State.InAttributeName: {\n                    this.stateInAttributeName(c);\n                    break;\n                }\n                case State.InCommentLike: {\n                    this.stateInCommentLike(c);\n                    break;\n                }\n                case State.InSpecialComment: {\n                    this.stateInSpecialComment(c);\n                    break;\n                }\n                case State.BeforeAttributeName: {\n                    this.stateBeforeAttributeName(c);\n                    break;\n                }\n                case State.InTagName: {\n                    this.stateInTagName(c);\n                    break;\n                }\n                case State.InClosingTagName: {\n                    this.stateInClosingTagName(c);\n                    break;\n                }\n                case State.BeforeTagName: {\n                    this.stateBeforeTagName(c);\n                    break;\n                }\n                case State.AfterAttributeName: {\n                    this.stateAfterAttributeName(c);\n                    break;\n                }\n                case State.InAttributeValueSq: {\n                    this.stateInAttributeValueSingleQuotes(c);\n                    break;\n                }\n                case State.BeforeAttributeValue: {\n                    this.stateBeforeAttributeValue(c);\n                    break;\n                }\n                case State.BeforeClosingTagName: {\n                    this.stateBeforeClosingTagName(c);\n                    break;\n                }\n                case State.AfterClosingTagName: {\n                    this.stateAfterClosingTagName(c);\n                    break;\n                }\n                case State.BeforeSpecialS: {\n                    this.stateBeforeSpecialS(c);\n                    break;\n                }\n                case State.BeforeSpecialT: {\n                    this.stateBeforeSpecialT(c);\n                    break;\n                }\n                case State.InAttributeValueNq: {\n                    this.stateInAttributeValueNoQuotes(c);\n                    break;\n                }\n                case State.InSelfClosingTag: {\n                    this.stateInSelfClosingTag(c);\n                    break;\n                }\n                case State.InDeclaration: {\n                    this.stateInDeclaration(c);\n                    break;\n                }\n                case State.BeforeDeclaration: {\n                    this.stateBeforeDeclaration(c);\n                    break;\n                }\n                case State.BeforeComment: {\n                    this.stateBeforeComment(c);\n                    break;\n                }\n                case State.InProcessingInstruction: {\n                    this.stateInProcessingInstruction(c);\n                    break;\n                }\n                case State.InEntity: {\n                    this.stateInEntity();\n                    break;\n                }\n            }\n            this.index++;\n        }\n        this.cleanup();\n    }\n\n    private finish() {\n        if (this.state === State.InEntity) {\n            this.entityDecoder.end();\n            this.state = this.baseState;\n        }\n\n        this.handleTrailingData();\n\n        this.cbs.onend();\n    }\n\n    /** Handle any trailing data. */\n    private handleTrailingData() {\n        const endIndex = this.buffer.length + this.offset;\n\n        // If there is no remaining data, we are done.\n        if (this.sectionStart >= endIndex) {\n            return;\n        }\n\n        if (this.state === State.InCommentLike) {\n            if (this.currentSequence === Sequences.CdataEnd) {\n                this.cbs.oncdata(this.sectionStart, endIndex, 0);\n            } else {\n                this.cbs.oncomment(this.sectionStart, endIndex, 0);\n            }\n        } else if (\n            this.state === State.InTagName ||\n            this.state === State.BeforeAttributeName ||\n            this.state === State.BeforeAttributeValue ||\n            this.state === State.AfterAttributeName ||\n            this.state === State.InAttributeName ||\n            this.state === State.InAttributeValueSq ||\n            this.state === State.InAttributeValueDq ||\n            this.state === State.InAttributeValueNq ||\n            this.state === State.InClosingTagName\n        ) {\n            /*\n             * If we are currently in an opening or closing tag, us not calling the\n             * respective callback signals that the tag should be ignored.\n             */\n        } else {\n            this.cbs.ontext(this.sectionStart, endIndex);\n        }\n    }\n\n    private emitCodePoint(cp: number, consumed: number): void {\n        if (\n            this.baseState !== State.Text &&\n            this.baseState !== State.InSpecialTag\n        ) {\n            if (this.sectionStart < this.entityStart) {\n                this.cbs.onattribdata(this.sectionStart, this.entityStart);\n            }\n            this.sectionStart = this.entityStart + consumed;\n            this.index = this.sectionStart - 1;\n\n            this.cbs.onattribentity(cp);\n        } else {\n            if (this.sectionStart < this.entityStart) {\n                this.cbs.ontext(this.sectionStart, this.entityStart);\n            }\n            this.sectionStart = this.entityStart + consumed;\n            this.index = this.sectionStart - 1;\n\n            this.cbs.ontextentity(cp, this.sectionStart);\n        }\n    }\n}\n","import { Parser, type ParserOptions } from \"./Parser.js\";\nexport type { Handler, ParserOptions } from \"./Parser.js\";\nexport { Parser } from \"./Parser.js\";\n\nimport {\n    DomHandler,\n    type DomHandlerOptions,\n    type ChildNode,\n    type Element,\n    type Document,\n} from \"domhandler\";\n\nexport {\n    DomHandler,\n    // Old name for DomHandler\n    DomHandler as DefaultHandler,\n    type DomHandlerOptions,\n} from \"domhandler\";\n\nexport type Options = ParserOptions & DomHandlerOptions;\n\n// Helper methods\n\n/**\n * Parses the data, returns the resulting document.\n *\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM handler.\n */\nexport function parseDocument(data: string, options?: Options): Document {\n    const handler = new DomHandler(undefined, options);\n    new Parser(handler, options).end(data);\n    return handler.root;\n}\n/**\n * Parses data, returns an array of the root nodes.\n *\n * Note that the root nodes still have a `Document` node as their parent.\n * Use `parseDocument` to get the `Document` node instead.\n *\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM handler.\n * @deprecated Use `parseDocument` instead.\n */\nexport function parseDOM(data: string, options?: Options): ChildNode[] {\n    return parseDocument(data, options).children;\n}\n/**\n * Creates a parser instance, with an attached DOM handler.\n *\n * @param callback A callback that will be called once parsing has been completed, with the resulting document.\n * @param options Optional options for the parser and DOM handler.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n */\nexport function createDocumentStream(\n    callback: (error: Error | null, document: Document) => void,\n    options?: Options,\n    elementCallback?: (element: Element) => void,\n): Parser {\n    const handler: DomHandler = new DomHandler(\n        (error: Error | null) => callback(error, handler.root),\n        options,\n        elementCallback,\n    );\n    return new Parser(handler, options);\n}\n/**\n * Creates a parser instance, with an attached DOM handler.\n *\n * @param callback A callback that will be called once parsing has been completed, with an array of root nodes.\n * @param options Optional options for the parser and DOM handler.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n * @deprecated Use `createDocumentStream` instead.\n */\nexport function createDomStream(\n    callback: (error: Error | null, dom: ChildNode[]) => void,\n    options?: Options,\n    elementCallback?: (element: Element) => void,\n): Parser {\n    const handler = new DomHandler(callback, options, elementCallback);\n    return new Parser(handler, options);\n}\n\nexport {\n    default as Tokenizer,\n    type Callbacks as TokenizerCallbacks,\n    QuoteType,\n} from \"./Tokenizer.js\";\n\n/*\n * All of the following exports exist for backwards-compatibility.\n * They should probably be removed eventually.\n */\nexport * as ElementType from \"domelementtype\";\n\nimport { getFeed, type Feed } from \"domutils\";\n\nexport { getFeed, type Feed } from \"domutils\";\n\nconst parseFeedDefaultOptions = { xmlMode: true };\n\n/**\n * Parse a feed.\n *\n * @param feed The feed that should be parsed, as a string.\n * @param options Optionally, options for parsing. When using this, you should set `xmlMode` to `true`.\n */\nexport function parseFeed(\n    feed: string,\n    options: Options = parseFeedDefaultOptions,\n): Feed | null {\n    return getFeed(parseDOM(feed, options));\n}\n\nexport * as DomUtils from \"domutils\";\n","/*\nCopyright 2023 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport classNames from \"classnames\";\nimport React, { type PropsWithChildren, useCallback } from \"react\";\n\nimport CheckCircleIcon from \"@vector-im/compound-design-tokens/assets/web/icons/check-circle\";\nimport ErrorIcon from \"@vector-im/compound-design-tokens/assets/web/icons/error-solid\";\nimport InfoIcon from \"@vector-im/compound-design-tokens/assets/web/icons/info\";\nimport CloseIcon from \"@vector-im/compound-design-tokens/assets/web/icons/close\";\n\nimport styles from \"./Alert.module.css\";\nimport { Text } from \"../Typography/Text\";\nimport { IconButton } from \"../Button\";\n\ntype AlertProps = {\n  /**\n   * The type of alert\n   */\n  type: \"success\" | \"critical\" | \"info\";\n  /**\n   * The headline of the alert.\n   */\n  title: string;\n  /**\n   * The CSS class name.\n   */\n  className?: string;\n  /**\n   * Actions that will be displayed to the right of the content\n   * Wraps and stacks actions under content when alert's size is <=600px\n   * eg\n   * ```\n   * <Alert\n   *  title='Title'\n   *  actions={<Button onClick={doSomething}>Yes</Button>}\n   * />\n   * ```\n   */\n  actions?: React.ReactNode;\n  /**\n   * Event callback when dismissing the alert. Determines the display of the\n   * \"close\" button at the top right of the alert.\n   * @param e the event parameters\n   */\n  onClose?: (e: React.MouseEvent) => void;\n};\n\n/**\n * An alert component component that is dismissable when passing an `onClose`\n * property.\n */\nexport const Alert: React.FC<PropsWithChildren<AlertProps>> = ({\n  type,\n  title,\n  children,\n  className,\n  actions,\n  onClose,\n  ...props\n}: PropsWithChildren<AlertProps>) => {\n  const classes = classNames(styles.alert, className);\n\n  const renderIcon = useCallback(\n    (props: React.ComponentProps<typeof ErrorIcon>) => {\n      switch (type) {\n        case \"critical\":\n          return <ErrorIcon {...props} />;\n        case \"info\":\n          return <InfoIcon {...props} />;\n        case \"success\":\n          return <CheckCircleIcon {...props} />;\n      }\n    },\n    [type],\n  );\n\n  return (\n    <div {...props} className={classes} data-type={type}>\n      {renderIcon({\n        width: 24,\n        height: 24,\n        className: styles.icon,\n        \"aria-hidden\": true,\n      })}\n      <div className={styles.content}>\n        <div className={styles[\"text-content\"]}>\n          <Text size=\"md\" weight=\"semibold\">\n            {title}\n          </Text>\n          <Text size=\"sm\" weight=\"regular\">\n            {children}\n          </Text>\n        </div>\n        {actions && <div className={styles.actions}>{actions}</div>}\n      </div>\n      {/* TODO: Setup an i18n function for the aria label below */}\n      {onClose && (\n        <IconButton\n          onClick={onClose}\n          aria-label=\"Close\"\n          role=\"button\"\n          className={styles.close}\n        >\n          <CloseIcon />\n        </IconButton>\n      )}\n    </div>\n  );\n};\n","/*\nCopyright 2023 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport classnames from \"classnames\";\nimport React, {\n  forwardRef,\n  type ComponentRef,\n  type ComponentProps,\n  useId,\n} from \"react\";\nimport styles from \"./Action.module.css\";\nimport { TextInput } from \"../Text\";\n\nimport { Control } from \"@radix-ui/react-form\";\nimport { Tooltip } from \"../../../Tooltip/Tooltip\";\n\ntype Props = {\n  /**\n   * The CSS class name.\n   */\n  className?: string;\n  /**\n   * The React component to display on the right hand side of the icon.\n   */\n  Icon: React.FunctionComponent<React.SVGAttributes<SVGElement>>;\n  /**\n   * On click callback for the icon on the right hand side\n   */\n  onActionClick: (e: React.MouseEvent) => void;\n  /**\n   * The name of the action to perform (e.g. \"Copy to clipboard\")\n   */\n  actionLabel: string;\n} & React.ComponentProps<typeof TextInput>;\n\n/**\n * A generic input with an action icon on the right hand side.\n * You should rarely use it directly,\n * but it is powering the likes of \"copy to clipboard input\", \"password reveal\", ...\n */\nexport const ActionInput = forwardRef<HTMLInputElement, Props>(\n  function ActionControl(\n    { Icon, className, actionLabel, onActionClick, ...props },\n    ref,\n  ) {\n    const id = useId();\n    const classes = classnames(styles.container, className);\n    return (\n      <div className={classes} id={id}>\n        <TextInput ref={ref} {...props} className={styles.control} />\n\n        <Tooltip label={actionLabel}>\n          <button\n            type=\"button\"\n            className={styles.action}\n            onClick={onActionClick}\n            aria-controls={id}\n          >\n            <Icon aria-hidden />\n          </button>\n        </Tooltip>\n      </div>\n    );\n  },\n);\n\n/**\n * A styled text input wrapped in a `Control` component, for use in Radix forms.\n */\nexport const ActionControl = forwardRef<\n  ComponentRef<typeof ActionInput>,\n  ComponentProps<typeof ActionInput>\n>(function ActionControl(props, ref) {\n  return (\n    <Control asChild>\n      <ActionInput ref={ref} {...props} />\n    </Control>\n  );\n});\n","/*\nCopyright 2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, {\n  forwardRef,\n  useCallback,\n  useRef,\n  useState,\n  useEffect,\n  useReducer,\n} from \"react\";\nimport { Submit, ValidityState } from \"@radix-ui/react-form\";\nimport CheckIcon from \"@vector-im/compound-design-tokens/assets/web/icons/check\";\nimport CancelIcon from \"@vector-im/compound-design-tokens/assets/web/icons/close\";\n\nimport styles from \"./EditInPlace.module.css\";\n\nimport {\n  Field,\n  HelpMessage,\n  Label,\n  LoadingMessage,\n  Root,\n  SuccessMessage,\n  TextControl,\n} from \"../..\";\nimport { Button, Tooltip } from \"../../../..\";\n\ntype Props = {\n  /**\n   * The label for the control\n   */\n  label: string;\n\n  /**\n   * The CSS class name.\n   */\n  className?: string;\n\n  /**\n   * Callback for when the user confirms the change\n   */\n  onSave?: (e: React.FormEvent<HTMLFormElement>) => Promise<void> | void;\n\n  /**\n   * Callback for when the user wishes to cancel the change\n   */\n  onCancel?: (e: React.FormEvent<HTMLFormElement>) => void;\n\n  /**\n   * onInput event handler on the text control\n   */\n  onInput?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n\n  /**\n   * Callback for when the server validation errors should be cleared.\n   */\n  onClearServerErrors?: () => void;\n\n  /**\n   * Whether the field is in an error state according to the server validation.\n   *\n   * For validation messages, use native validations properties directly, or add custom error messages as children.\n   */\n  serverInvalid?: boolean;\n\n  /**\n   * Label to be displayed by the green check at the bottom. Will only be displayed\n   * for 2 seconds after the onSave callback promise resolves successfully.\n   */\n  savedLabel?: string;\n\n  /**\n   * The label for the save button\n   */\n  saveButtonLabel: string;\n\n  /**\n   * The label for the 'in progress' saving caption\n   */\n  savingLabel: string;\n\n  /**\n   * The label for the cancel button\n   */\n  cancelButtonLabel: string;\n\n  /**\n   * Label to be displayed under the input as a help text\n   */\n  helpLabel?: string;\n\n  /**\n   * If true, disabled the entire component to disallow editing.\n   */\n  disabled?: boolean;\n} & React.ComponentProps<typeof TextControl>;\n\nenum State {\n  /** No changes on the input has been made */\n  Initial,\n\n  /** The input has been changed */\n  Dirty,\n\n  /** The input is being saved */\n  Saving,\n\n  /** The input has been saved */\n  Saved,\n}\n\nenum Event {\n  Touch, // The user 'touched' the control\n  Save, // The user has clicked the save button\n  Saved, // The onSave callback finished successfully\n  SaveError, // The onSave callback finished with an error\n  Cancel, // The user has clicked the cancel button\n  SavedTimeout, // The user has clicked the save button and the saved label has been shown for 2 seconds\n}\n\nfunction reducer(state: State, action: Event): State {\n  switch (action) {\n    case Event.Touch:\n      if (state === State.Initial || state === State.Saved) return State.Dirty;\n      else return state;\n\n    case Event.Save:\n      return State.Saving;\n\n    case Event.Cancel:\n      return State.Initial;\n\n    case Event.Saved:\n      if (state === State.Saving) return State.Saved;\n      else return state;\n\n    case Event.SaveError:\n      if (state === State.Saving) return State.Initial;\n      else return state;\n\n    case Event.SavedTimeout:\n      if (state === State.Saved) return State.Initial;\n      else return state;\n  }\n\n  assertNever(action);\n}\n\nfunction assertNever(value: never): never {\n  throw new Error(`Unreachable value: ${value}`);\n}\n\n/**\n * A text box with save/cancel buttons that appear when the field is active.\n * Since thios control has its own 'save' button, it should *not* appear as part\n * of a larger form: it exists as its own form that submits separately.\n */\nexport const EditInPlace = forwardRef<HTMLInputElement, Props>(\n  function EditInPlace(\n    {\n      className,\n      label,\n      onSave,\n      onCancel,\n      onInput,\n      onClearServerErrors,\n      serverInvalid,\n      saveButtonLabel,\n      cancelButtonLabel,\n      savedLabel,\n      savingLabel,\n      helpLabel,\n      disabled,\n      children,\n      ...props\n    },\n    ref,\n  ) {\n    const [state, dispatch] = useReducer(reducer, State.Initial);\n\n    // Tracks the focus state of the form\n    // This uses a `ref` to make sure the onFocus/onBlur callback don't trigger unnecessary re-renders\n    // and a state to track the focus state and hide the buttons when the form is not focused\n    const isFocusWithinRef = useRef(false);\n    const [isFocusWithin, setFocusWithin] = useState(false);\n\n    const shouldShowSaveButton =\n      state === State.Dirty || state === State.Saving || isFocusWithin;\n\n    const hideTimer = useRef<ReturnType<typeof setTimeout> | undefined>(\n      undefined,\n    );\n\n    useEffect(() => {\n      // Start a timer when we switch to the saved state\n      if (state === State.Saved) {\n        hideTimer.current = setTimeout(() => {\n          dispatch(Event.SavedTimeout);\n          hideTimer.current = undefined;\n        }, 2000);\n      }\n\n      return () => {\n        // Clear any timers that may have been set\n        if (hideTimer.current) clearTimeout(hideTimer.current);\n        hideTimer.current = undefined;\n      };\n    }, [state]);\n\n    const formRef = useRef<HTMLFormElement>(null);\n    const saveButtonRef = useRef<HTMLButtonElement>(null);\n    const cancelButtonRef = useRef<HTMLButtonElement>(null);\n\n    const onFocus = useCallback(() => {\n      if (isFocusWithinRef.current) return;\n      isFocusWithinRef.current = true;\n      setFocusWithin(true);\n    }, [isFocusWithin, setFocusWithin]);\n\n    const onBlur = useCallback(\n      (e: React.FocusEvent) => {\n        if (!isFocusWithinRef.current) return;\n        // If the user switched to another element within the form\n        // consider that we're still focused within the form\n        if (e.currentTarget.contains(e.relatedTarget)) return;\n\n        isFocusWithinRef.current = false;\n        setFocusWithin(false);\n      },\n      [isFocusWithin, setFocusWithin],\n    );\n\n    const onInputHandler = useCallback(\n      (e: React.InputEvent<HTMLInputElement>) => {\n        dispatch(Event.Touch);\n        onInput?.(e);\n      },\n      [dispatch, onInput],\n    );\n\n    const onFormSubmit = useCallback(\n      async (e: React.FormEvent<HTMLFormElement>) => {\n        e.preventDefault();\n\n        // Prevent submitting the form if the user has not yet entered any text\n        if (state === State.Initial) {\n          return;\n        }\n\n        try {\n          dispatch(Event.Save);\n          saveButtonRef.current?.blur();\n          await onSave?.(e);\n          dispatch(Event.Saved);\n        } catch {\n          // We don't really need to do anything here, we just don't want to display the\n          // 'saved' label, obviously. The user of the component can update the error to\n          // show what failed.\n          dispatch(Event.SaveError);\n        }\n      },\n      [onSave, state, hideTimer],\n    );\n\n    const onFormReset = useCallback(\n      (e: React.FormEvent<HTMLFormElement>) => {\n        cancelButtonRef.current?.blur();\n        onCancel?.(e);\n        dispatch(Event.Cancel);\n      },\n      [cancelButtonRef, onCancel],\n    );\n\n    return (\n      <Root\n        className={className}\n        onSubmit={onFormSubmit}\n        onReset={onFormReset}\n        onFocus={onFocus}\n        onBlur={onBlur}\n        onClearServerErrors={onClearServerErrors}\n        ref={formRef}\n      >\n        <Field name=\"input\" serverInvalid={serverInvalid}>\n          <Label>{label}</Label>\n          <div className={styles.controls}>\n            <TextControl\n              ref={ref}\n              {...props}\n              onInput={onInputHandler}\n              disabled={disabled || state === State.Saving}\n            />\n\n            {shouldShowSaveButton && (\n              <div className={styles[\"button-group\"]}>\n                <Tooltip label={saveButtonLabel}>\n                  <Submit asChild>\n                    <Button\n                      type=\"submit\"\n                      kind=\"primary\"\n                      size=\"md\"\n                      ref={saveButtonRef}\n                      disabled={state !== State.Dirty}\n                      iconOnly\n                      Icon={CheckIcon}\n                    />\n                  </Submit>\n                </Tooltip>\n\n                <Tooltip label={cancelButtonLabel}>\n                  <Button\n                    type=\"reset\"\n                    kind=\"secondary\"\n                    size=\"md\"\n                    ref={cancelButtonRef}\n                    className={styles.button}\n                    disabled={state === State.Saving}\n                    iconOnly\n                    Icon={CancelIcon}\n                  />\n                </Tooltip>\n              </div>\n            )}\n          </div>\n\n          {/*\n            During the loading saving state, we only show the saving message.\n            Else, we show whatever children were passed on, as they will have other validation messages\n          */}\n          {state === State.Saving ? (\n            <LoadingMessage>{savingLabel}</LoadingMessage>\n          ) : (\n            children\n          )}\n\n          {savedLabel && state === State.Saved && (\n            <SuccessMessage>{savedLabel}</SuccessMessage>\n          )}\n\n          {/*\n            We show the help message only if:\n              - the helpLabel is set\n              - the form hasn't been validated yet\n              - the 'serverInvalid' prop is not set\n              - we're in the initial or dirty state\n            */}\n          {helpLabel && (state === State.Initial || state === State.Dirty) && (\n            <ValidityState>\n              {(validity) =>\n                (validity === undefined || validity.valid) &&\n                !serverInvalid && <HelpMessage>{helpLabel}</HelpMessage>\n              }\n            </ValidityState>\n          )}\n        </Field>\n      </Root>\n    );\n  },\n);\n","/*\nCopyright 2025 New Vector Ltd.\nCopyright 2023 The Matrix.org Foundation C.I.C.\nCopyright 2023 New Vector Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, {\n  type ComponentProps,\n  type ComponentRef,\n  forwardRef,\n  type PropsWithoutRef,\n} from \"react\";\n\nimport styles from \"./MFA.module.css\";\nimport classNames from \"classnames\";\nimport { Control } from \"@radix-ui/react-form\";\n\ntype DigitProps = {\n  filled: boolean;\n  selected: boolean;\n};\n\nconst Digit: React.FC<DigitProps> = ({ filled, selected }) => (\n  <div\n    className={styles.digit}\n    aria-hidden=\"true\"\n    data-filled={filled ? \"\" : undefined}\n    data-selected={selected ? \"\" : undefined}\n  />\n);\n\ntype MFAProps = {\n  className?: string;\n  length?: number;\n  disabled?: boolean;\n} & Omit<\n  React.ComponentProps<\"input\">,\n  \"type\" | \"inputMode\" | \"pattern\" | \"autoComplete\"\n>;\n\nexport const MFAInput = forwardRef(function MFAInput(\n  { className, length = 6, ...props }: PropsWithoutRef<MFAProps>,\n  ref: React.ForwardedRef<HTMLInputElement>,\n) {\n  const classes = classNames(styles.container, className);\n  const [currentLength, setCurrentLength] = React.useState(0);\n  const [selection, setSelection] = React.useState<null | [number, number]>(\n    null,\n  );\n\n  const update = (event: React.SyntheticEvent<HTMLInputElement>) => {\n    const input = event.currentTarget;\n    setCurrentLength(input.value?.length);\n\n    if (\n      document.activeElement !== input ||\n      input.selectionStart === null ||\n      input.selectionEnd === null\n    ) {\n      setSelection(null);\n    } else {\n      setSelection([input.selectionStart, input.selectionEnd]);\n    }\n  };\n\n  return (\n    <div className={classes}>\n      <input\n        {...props}\n        inputMode=\"numeric\"\n        // Showing digits on mobile browsers. Using numbers is not really suited\n        // as it often adds a way to increment or decrement the current value\n        // which is not interesting for this use case\n        type=\"text\"\n        minLength={0}\n        maxLength={length}\n        className={styles.control}\n        pattern={`\\\\d{${length}}`}\n        autoComplete=\"one-time-code\"\n        onSelect={update}\n        onFocus={update}\n        onBlur={update}\n        onMouseDown={update}\n        onMouseMove={update}\n        onMouseUp={update}\n        onChange={update}\n        ref={ref}\n      />\n      {Array.from(Array(length).keys()).map((index) => (\n        <Digit\n          key={index}\n          filled={index < currentLength}\n          selected={\n            !!selection && index >= selection[0] && index < selection[1]\n          }\n        />\n      ))}\n    </div>\n  );\n});\n\nexport const MFAControl = forwardRef<\n  ComponentRef<typeof MFAInput>,\n  ComponentProps<typeof MFAInput>\n>(function ActionControl(props, ref) {\n  return (\n    <Control asChild>\n      <MFAInput ref={ref} {...props} />\n    </Control>\n  );\n});\n","/*\nCopyright 2023 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\nimport React, {\n  type ComponentRef,\n  forwardRef,\n  type ComponentProps,\n  useReducer,\n} from \"react\";\nimport { Control } from \"@radix-ui/react-form\";\n\nimport { ActionInput } from \"../Action\";\n\nimport VisibilityOn from \"@vector-im/compound-design-tokens/assets/web/icons/visibility-on\";\nimport VisibilityOff from \"@vector-im/compound-design-tokens/assets/web/icons/visibility-off\";\n\nconst showState = {\n  isHidden: true,\n  icon: VisibilityOff,\n  label: \"Show\",\n  type: \"password\",\n};\n\nconst hideState = {\n  isHidden: false,\n  icon: VisibilityOn,\n  label: \"Hide\",\n  type: \"text\",\n};\n\ntype Props = Omit<\n  ComponentProps<typeof ActionInput>,\n  \"type\" | \"actionLabel\" | \"onActionClick\" | \"Icon\"\n>;\n\n/**\n * A password input with a toggle to show/hide the password.\n *\n * Standalone input to be used outside of Radix forms.\n */\nexport const PasswordInput = forwardRef<\n  ComponentRef<typeof ActionInput>,\n  Props\n>(function PasswordControl(props, ref) {\n  const [{ icon, label, type }, togglePasswordVisibility] = useReducer(\n    (state) => (!state.isHidden ? showState : hideState),\n    showState,\n  );\n\n  return (\n    <ActionInput\n      ref={ref}\n      {...props}\n      Icon={icon}\n      // TODO: Replace with a function that deal with i18n of those values\n      actionLabel={label}\n      onActionClick={() => togglePasswordVisibility()}\n      type={type}\n    />\n  );\n});\n\n/**\n * A password input with a toggle to show/hide the password.\n *\n * Control to be used in a Radix form.\n */\nexport const PasswordControl = forwardRef<\n  ComponentRef<typeof PasswordInput>,\n  ComponentProps<typeof PasswordInput>\n>(function PasswordControl(props, ref) {\n  return (\n    <Control asChild>\n      <PasswordInput ref={ref} {...props} />\n    </Control>\n  );\n});\n","/*\nCopyright 2025 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n  type ComponentProps,\n  type ComponentRef,\n  forwardRef,\n  type PropsWithChildren,\n  useId,\n} from \"react\";\nimport { ToggleInput } from \"../Toggle\";\nimport { Label } from \"../../Label\";\nimport { HelpMessage } from \"../../Message\";\nimport { InlineField } from \"../../InlineField\";\nimport React from \"react\";\nimport { Control } from \"@radix-ui/react-form\";\n\ntype SettingsToggleProps = {\n  /**\n   * The CSS class name for the containing field.\n   */\n  className?: string;\n  /**\n   * The field name.\n   */\n  name: string;\n  label: string;\n  /**\n   * Optional help text to display below the setting.\n   */\n  helpMessage?: string;\n  /**\n   * Optional help text to display below the setting.\n   */\n  disabledMessage?: string;\n} & Omit<ComponentProps<typeof ToggleInput>, \"type\">;\n\n/**\n * A toggle component.\n */\nexport const SettingsToggleInput = forwardRef<\n  HTMLInputElement,\n  PropsWithChildren<SettingsToggleProps>\n>(function Toggle(\n  { className, label, helpMessage, disabledMessage, name, ...props },\n  ref,\n) {\n  const generatedId = useId();\n  const id = props.id ?? generatedId;\n  const content = (\n    <InlineField\n      className={className}\n      name={name}\n      control={<ToggleInput id={id} ref={ref} {...props} />}\n    >\n      <Label htmlFor={id}>{label}</Label>\n      {helpMessage && <HelpMessage>{helpMessage}</HelpMessage>}\n      {disabledMessage && props.disabled && (\n        <HelpMessage>{disabledMessage}</HelpMessage>\n      )}\n    </InlineField>\n  );\n  return content;\n});\n\n/**\n * A styled checkbox input wrapped in a `Control` component, for use in Radix forms.\n */\nexport const SettingsToggleControl = forwardRef<\n  ComponentRef<typeof SettingsToggleInput>,\n  ComponentProps<typeof SettingsToggleInput>\n>(function ToggleControl(props, ref) {\n  return (\n    <Control asChild>\n      <SettingsToggleInput ref={ref} {...props} />\n    </Control>\n  );\n});\n","/*\nCopyright 2023 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { forwardRef, type ReactElement } from \"react\";\nimport { Field } from \"@radix-ui/react-form\";\n\nimport styles from \"./form.module.css\";\nimport classNames from \"classnames\";\n\ntype Props = {\n  /**\n   * The CSS class name.\n   */\n  className?: string;\n\n  /**\n   * The checkbox/radio control to render alongside the rest of the field.\n   */\n  control: ReactElement;\n} & React.ComponentProps<typeof Field>;\n\nexport const InlineField = forwardRef<HTMLDivElement, Props>(\n  function InlineField({ className, control, children, ...props }, ref) {\n    const classes = classNames(styles[\"inline-field\"], className);\n    return (\n      <Field ref={ref} {...props} className={classes}>\n        <div className={styles[\"inline-field-control\"]}>{control}</div>\n        <div className={styles[\"inline-field-body\"]}>{children}</div>\n      </Field>\n    );\n  },\n);\n","/*\nCopyright 2023 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type PropsWithChildren, forwardRef } from \"react\";\nimport { Label as RadixLabel } from \"@radix-ui/react-form\";\n\nimport styles from \"./form.module.css\";\nimport classNames from \"classnames\";\n\ntype LabelProps = {\n  /**\n   * The CSS class name.\n   */\n  className?: string;\n} & React.ComponentProps<typeof RadixLabel>;\n\n/**\n * Thin wrapper around Radix UI Label component\n * https://www.radix-ui.com/docs/primitives/components/form#label\n */\nexport const Label = forwardRef<\n  HTMLLabelElement,\n  PropsWithChildren<LabelProps>\n>(function Label({ children, ...props }, ref) {\n  const classes = classNames(styles.label, props.className);\n  return (\n    <RadixLabel ref={ref} {...props} className={classes}>\n      {children}\n    </RadixLabel>\n  );\n});\n","/*\nCopyright 2023 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { forwardRef, type PropsWithChildren } from \"react\";\nimport { Message } from \"@radix-ui/react-form\";\nimport CheckCircleSolidIcon from \"@vector-im/compound-design-tokens/assets/web/icons/check-circle-solid\";\nimport ErrorIcon from \"@vector-im/compound-design-tokens/assets/web/icons/error-solid\";\n\nimport styles from \"./form.module.css\";\nimport classNames from \"classnames\";\nimport { InlineSpinner } from \"../InlineSpinner\";\n\ntype MessageProps = {\n  /**\n   * The CSS class name.\n   */\n  className?: string;\n} & React.ComponentProps<typeof Message>;\n\n/**\n * An error message to display below a form control.\n */\nexport const ErrorMessage = forwardRef<\n  HTMLSpanElement,\n  PropsWithChildren<MessageProps>\n>(function ErrorMessage({ children, className, ...props }, ref) {\n  const classes = classNames(\n    styles.message,\n    styles[\"error-message\"],\n    className,\n  );\n  return (\n    <Message ref={ref} {...props} className={classes}>\n      <ErrorIcon />\n      {children}\n    </Message>\n  );\n});\n\n/**\n * A success message to display below a form control.\n */\nexport const SuccessMessage = forwardRef<\n  HTMLSpanElement,\n  PropsWithChildren<MessageProps>\n>(function SuccessMessage({ children, className, ...props }, ref) {\n  const classes = classNames(\n    styles.message,\n    styles[\"success-message\"],\n    className,\n  );\n  return (\n    <Message ref={ref} {...props} className={classes}>\n      <CheckCircleSolidIcon />\n      {children}\n    </Message>\n  );\n});\n\n/**\n * A message showing a loading state\n */\nexport const LoadingMessage = forwardRef<\n  HTMLSpanElement,\n  PropsWithChildren<MessageProps>\n>(function LoadingMessage({ children, className, ...props }, ref) {\n  const classes = classNames(styles.message, className);\n  return (\n    <Message ref={ref} {...props} className={classes}>\n      <InlineSpinner />\n      {children}\n    </Message>\n  );\n});\n\n/**\n * A help message to display below a form control.\n */\nexport const HelpMessage = forwardRef<\n  HTMLSpanElement,\n  PropsWithChildren<MessageProps>\n>(function HelpMessage({ children, className, ...props }, ref) {\n  const classes = classNames(styles.message, styles[\"help-message\"], className);\n  return (\n    <Message ref={ref} {...props} className={classes}>\n      {children}\n    </Message>\n  );\n});\n","//#region \\0rolldown/runtime.js\nvar __defProp = Object.defineProperty;\nvar __exportAll = (all, no_symbols) => {\n\tlet target = {};\n\tfor (var name in all) __defProp(target, name, {\n\t\tget: all[name],\n\t\tenumerable: true\n\t});\n\tif (!no_symbols) __defProp(target, Symbol.toStringTag, { value: \"Module\" });\n\treturn target;\n};\n//#endregion\nexport { __exportAll };\n","/*\nCopyright 2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, type PropsWithChildren } from \"react\";\nimport styles from \"./BigIcon.module.css\";\nimport classNames from \"classnames\";\nimport type { Size } from \"../../../utils/size\";\n\ninterface BigIconProps {\n  /**\n   * The CSS class name.\n   */\n  className?: string;\n  /**\n   * The t-shirt size of the icon.\n   * @default \"lg\"\n   */\n  size?: Size & (\"sm\" | \"md\" | \"lg\");\n  /**\n   * The color variant of the icon.\n   * @default \"primary\"\n   */\n  kind?: \"primary\" | \"critical\" | \"success\";\n}\n\nexport function BigIcon({\n  className,\n  size = \"lg\",\n  kind = \"primary\",\n  children,\n}: PropsWithChildren<BigIconProps>): JSX.Element {\n  return (\n    <div\n      className={classNames(styles[\"big-icon\"], className)}\n      data-size={size}\n      data-kind={kind}\n    >\n      {React.Children.only(children)}\n    </div>\n  );\n}\n","const isActualPromise = (p: unknown) =>\n  p instanceof Promise && !(p as unknown as ChainedPromiseLike<unknown>)[kChainedCopy];\n\ntype ChainedPromiseLike<T> = PromiseLike<T> & {\n  [kChainedCopy]: true;\n};\nconst kChainedCopy = Symbol('chained PromiseLike');\n\n/**\n * Copy the properties from a decorated promiselike object onto its chained\n * actual promise.\n */\nexport const chainAndCopyPromiseLike = <V, T extends PromiseLike<V>>(\n  original: T,\n  onSuccess: (value: V) => void,\n  onError: (e: unknown) => void,\n): T => {\n  const chained = original.then(\n    value => {\n      onSuccess(value);\n      return value;\n    },\n    err => {\n      onError(err);\n      throw err;\n    },\n  ) as T;\n\n  // if we're just dealing with \"normal\" Promise objects, return the chain\n  return isActualPromise(chained) && isActualPromise(original) ? chained : copyProps(original, chained);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst copyProps = <T extends Record<string, any>>(original: T, chained: T): T => {\n  if (!chained) return original;\n  let mutated = false;\n  //oxlint-disable-next-line guard-for-in\n  for (const key in original) {\n    if (key in chained) continue;\n    mutated = true;\n    const value = original[key];\n    if (typeof value === 'function') {\n      Object.defineProperty(chained, key, {\n        value: (...args: unknown[]) => value.apply(original, args),\n        enumerable: true,\n        configurable: true,\n        writable: true,\n      });\n    } else {\n      (chained as Record<string, unknown>)[key] = value;\n    }\n  }\n\n  if (mutated) Object.assign(chained, { [kChainedCopy]: true });\n  return chained;\n};\n","import type { Client } from '../client';\nimport { getDefaultCurrentScope, getDefaultIsolationScope } from '../defaultScopes';\nimport { Scope } from '../scope';\nimport { chainAndCopyPromiseLike } from '../utils/chain-and-copy-promiselike';\nimport { isThenable } from '../utils/is';\nimport { getMainCarrier, getSentryCarrier } from './../carrier';\nimport type { AsyncContextStrategy } from './types';\n\ninterface Layer {\n  client?: Client;\n  scope: Scope;\n}\n\n/**\n * This is an object that holds a stack of scopes.\n */\nexport class AsyncContextStack {\n  private readonly _stack: [Layer, ...Layer[]];\n  private _isolationScope: Scope;\n\n  public constructor(scope?: Scope, isolationScope?: Scope) {\n    let assignedScope;\n    if (!scope) {\n      assignedScope = new Scope();\n    } else {\n      assignedScope = scope;\n    }\n\n    let assignedIsolationScope;\n    if (!isolationScope) {\n      assignedIsolationScope = new Scope();\n    } else {\n      assignedIsolationScope = isolationScope;\n    }\n\n    // scope stack for domains or the process\n    this._stack = [{ scope: assignedScope }];\n    this._isolationScope = assignedIsolationScope;\n  }\n\n  /**\n   * Fork a scope for the stack.\n   */\n  public withScope<T>(callback: (scope: Scope) => T): T {\n    const scope = this._pushScope();\n\n    let maybePromiseResult: T;\n    try {\n      maybePromiseResult = callback(scope);\n    } catch (e) {\n      this._popScope();\n      throw e;\n    }\n\n    if (isThenable(maybePromiseResult)) {\n      return chainAndCopyPromiseLike(\n        maybePromiseResult as PromiseLike<Awaited<typeof maybePromiseResult>> & Record<string, unknown>,\n        () => this._popScope(),\n        () => this._popScope(),\n      ) as T;\n    }\n\n    this._popScope();\n    return maybePromiseResult;\n  }\n\n  /**\n   * Get the client of the stack.\n   */\n  public getClient<C extends Client>(): C | undefined {\n    return this.getStackTop().client as C;\n  }\n\n  /**\n   * Returns the scope of the top stack.\n   */\n  public getScope(): Scope {\n    return this.getStackTop().scope;\n  }\n\n  /**\n   * Get the isolation scope for the stack.\n   */\n  public getIsolationScope(): Scope {\n    return this._isolationScope;\n  }\n\n  /**\n   * Returns the topmost scope layer in the order domain > local > process.\n   */\n  public getStackTop(): Layer {\n    return this._stack[this._stack.length - 1] as Layer;\n  }\n\n  /**\n   * Push a scope to the stack.\n   */\n  private _pushScope(): Scope {\n    // We want to clone the content of prev scope\n    const scope = this.getScope().clone();\n    this._stack.push({\n      client: this.getClient(),\n      scope,\n    });\n    return scope;\n  }\n\n  /**\n   * Pop a scope from the stack.\n   */\n  private _popScope(): boolean {\n    if (this._stack.length <= 1) return false;\n    return !!this._stack.pop();\n  }\n}\n\n/**\n * Get the global async context stack.\n * This will be removed during the v8 cycle and is only here to make migration easier.\n */\nfunction getAsyncContextStack(): AsyncContextStack {\n  const registry = getMainCarrier();\n  const sentry = getSentryCarrier(registry);\n\n  return (sentry.stack = sentry.stack || new AsyncContextStack(getDefaultCurrentScope(), getDefaultIsolationScope()));\n}\n\nfunction withScope<T>(callback: (scope: Scope) => T): T {\n  return getAsyncContextStack().withScope(callback);\n}\n\nfunction withSetScope<T>(scope: Scope, callback: (scope: Scope) => T): T {\n  const stack = getAsyncContextStack();\n  return stack.withScope(() => {\n    stack.getStackTop().scope = scope;\n    return callback(scope);\n  });\n}\n\nfunction withIsolationScope<T>(callback: (isolationScope: Scope) => T): T {\n  return getAsyncContextStack().withScope(() => {\n    return callback(getAsyncContextStack().getIsolationScope());\n  });\n}\n\n/**\n * Get the stack-based async context strategy.\n */\nexport function getStackAsyncContextStrategy(): AsyncContextStrategy {\n  return {\n    withIsolationScope,\n    withScope,\n    withSetScope,\n    withSetIsolationScope: <T>(_isolationScope: Scope, callback: (isolationScope: Scope) => T) => {\n      return withIsolationScope(callback);\n    },\n    getCurrentScope: () => getAsyncContextStack().getScope(),\n    getIsolationScope: () => getAsyncContextStack().getIsolationScope(),\n  };\n}\n","import { getGlobalSingleton } from './carrier';\nimport { Scope } from './scope';\n\n/** Get the default current scope. */\nexport function getDefaultCurrentScope(): Scope {\n  return getGlobalSingleton('defaultCurrentScope', () => new Scope());\n}\n\n/** Get the default isolation scope. */\nexport function getDefaultIsolationScope(): Scope {\n  return getGlobalSingleton('defaultIsolationScope', () => new Scope());\n}\n","import type { Carrier } from './../carrier';\nimport { getMainCarrier, getSentryCarrier } from './../carrier';\nimport { getStackAsyncContextStrategy } from './stackStrategy';\nimport type { AsyncContextStrategy } from './types';\n\n/**\n * @private Private API with no semver guarantees!\n *\n * Sets the global async context strategy\n */\nexport function setAsyncContextStrategy(strategy: AsyncContextStrategy | undefined): void {\n  // Get main carrier (global for every environment)\n  const registry = getMainCarrier();\n  const sentry = getSentryCarrier(registry);\n  sentry.acs = strategy;\n}\n\n/**\n * Get the current async context strategy.\n * If none has been setup, the default will be used.\n */\nexport function getAsyncContextStrategy(carrier: Carrier): AsyncContextStrategy {\n  const sentry = getSentryCarrier(carrier);\n\n  if (sentry.acs) {\n    return sentry.acs;\n  }\n\n  // Otherwise, use the default one (stack)\n  return getStackAsyncContextStrategy();\n}\n","import type { DurationUnit, FractionUnit, InformationUnit } from './types/measurement';\nimport type { Primitive } from './types/misc';\nimport { isPrimitive } from './utils/is';\n\nexport type RawAttributes<T> = T & ValidatedAttributes<T>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type RawAttribute<T> = T extends { value: any } | { unit: any } ? AttributeObject : T;\n\nexport type Attributes = Record<string, TypedAttributeValue>;\n\nexport type AttributeValueType = string | number | boolean | Array<string> | Array<number> | Array<boolean>;\n\ntype AttributeTypeMap = {\n  string: string;\n  integer: number;\n  double: number;\n  boolean: boolean;\n  array: Array<string> | Array<number> | Array<boolean>;\n};\n\n/* Generates a type from the AttributeTypeMap like:\n  | { value: string; type: 'string' }\n  | { value: number; type: 'integer' }\n  | { value: number; type: 'double' }\n */\ntype AttributeUnion = {\n  [K in keyof AttributeTypeMap]: {\n    value: AttributeTypeMap[K];\n    type: K;\n  };\n}[keyof AttributeTypeMap];\n\nexport type TypedAttributeValue = AttributeUnion & { unit?: AttributeUnit };\n\nexport type AttributeObject = {\n  value: unknown;\n  unit?: AttributeUnit;\n};\n\n// Unfortunately, we loose type safety if we did something like Exclude<MeasurementUnit, string>\n// so therefore we unionize between the three supported unit categories.\ntype AttributeUnit = DurationUnit | InformationUnit | FractionUnit;\n\n/* If an attribute has either a 'value' or 'unit' property, we use the ValidAttributeObject type. */\nexport type ValidatedAttributes<T> = {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  [K in keyof T]: T[K] extends { value: any } | { unit: any } ? AttributeObject : unknown;\n};\n\n/**\n * Type-guard: The attribute object has the shape the official attribute object (value, type, unit).\n * https://develop.sentry.dev/sdk/telemetry/scopes/#setting-attributes\n */\nexport function isAttributeObject(maybeObj: unknown): maybeObj is AttributeObject {\n  return (\n    typeof maybeObj === 'object' &&\n    maybeObj != null &&\n    !Array.isArray(maybeObj) &&\n    Object.keys(maybeObj).includes('value')\n  );\n}\n\n/**\n * Converts an attribute value to a typed attribute value.\n *\n * For now, we support primitive values and arrays, either raw or inside attribute objects.\n * If @param useFallback is true, we stringify other non-primitive values to a string attribute\n * value. Otherwise we return `undefined` for unsupported values.\n *\n * @param value - The value of the passed attribute.\n * @param useFallback - If true, unsupported values will be stringified to a string attribute value.\n *                      Defaults to false. In this case, `undefined` is returned for unsupported values.\n * @returns The typed attribute.\n */\nexport function attributeValueToTypedAttributeValue(\n  rawValue: unknown,\n  useFallback?: boolean | 'skip-undefined',\n): TypedAttributeValue | void {\n  const { value, unit } = isAttributeObject(rawValue) ? rawValue : { value: rawValue, unit: undefined };\n  const attributeValue = getTypedAttributeValue(value);\n  const checkedUnit = unit && typeof unit === 'string' ? { unit } : {};\n  if (attributeValue) {\n    return { ...attributeValue, ...checkedUnit };\n  }\n\n  if (!useFallback || (useFallback === 'skip-undefined' && value === undefined)) {\n    return;\n  }\n\n  // Fallback: stringify the value\n  // TODO(v11): be smarter here and use String constructor if stringify fails\n  // (this is a breaking change for already existing attribute values)\n  let stringValue = '';\n  try {\n    stringValue = JSON.stringify(value) ?? '';\n  } catch {\n    // Do nothing\n  }\n  return {\n    value: stringValue,\n    type: 'string',\n    ...checkedUnit,\n  };\n}\n\n/**\n * Serializes raw attributes to typed attributes as expected in our envelopes.\n *\n * @param attributes The raw attributes to serialize.\n * @param fallback   If true, unsupported values will be stringified to a string attribute value.\n *                   Defaults to false. In this case, `undefined` is returned for unsupported values.\n *\n * @returns The serialized attributes.\n */\nexport function serializeAttributes<T>(\n  attributes: RawAttributes<T> | undefined,\n  fallback: boolean | 'skip-undefined' = false,\n): Attributes {\n  const serializedAttributes: Attributes = {};\n  for (const [key, value] of Object.entries(attributes ?? {})) {\n    const typedValue = attributeValueToTypedAttributeValue(value, fallback);\n    if (typedValue) {\n      serializedAttributes[key] = typedValue;\n    }\n  }\n  return serializedAttributes;\n}\n\n/**\n * Estimates the serialized byte size of {@link Attributes},\n * with a couple of heuristics for performance.\n */\nexport function estimateTypedAttributesSizeInBytes(attributes: Attributes | undefined): number {\n  if (!attributes) {\n    return 0;\n  }\n  let weight = 0;\n  for (const [key, attr] of Object.entries(attributes)) {\n    weight += key.length * 2;\n    weight += attr.type.length * 2;\n    weight += (attr.unit?.length ?? 0) * 2;\n    const val = attr.value;\n\n    if (Array.isArray(val)) {\n      // Assumption: Individual array items have the same type and roughly the same size\n      // probably not always true but allows us to cut down on runtime\n      weight += estimatePrimitiveSizeInBytes(val[0]) * val.length;\n    } else if (isPrimitive(val)) {\n      weight += estimatePrimitiveSizeInBytes(val);\n    } else {\n      // default fallback for anything else (objects)\n      weight += 100;\n    }\n  }\n  return weight;\n}\n\nfunction estimatePrimitiveSizeInBytes(value: Primitive): number {\n  if (typeof value === 'string') {\n    return value.length * 2;\n  } else if (typeof value === 'boolean') {\n    return 4;\n  } else if (typeof value === 'number') {\n    return 8;\n  }\n  return 0;\n}\n\n/**\n * NOTE: We return typed attributes for primitives and arrays:\n *  - Relay currently only supports arrays consisting of primitive values. Attributes with non-conforming arrays are dropped by Relay, so runtime type validation in the SDK is unnecessary.\n *  - Objects are not supported yet and product support is still TBD.\n */\nfunction getTypedAttributeValue(value: unknown): TypedAttributeValue | void {\n  if (Array.isArray(value)) {\n    return { value, type: 'array' };\n  }\n\n  const primitiveType =\n    typeof value === 'string'\n      ? 'string'\n      : typeof value === 'boolean'\n        ? 'boolean'\n        : typeof value === 'number' && !Number.isNaN(value)\n          ? Number.isInteger(value)\n            ? 'integer'\n            : 'double'\n          : null;\n  if (primitiveType) {\n    // @ts-expect-error - TS complains because {@link TypedAttributeValue} is strictly typed to\n    // avoid setting the wrong `type` on the attribute value.\n    // In this case, getPrimitiveType already does the check but TS doesn't know that.\n    // The \"clean\" alternative is to return an object per `typeof value` case\n    // but that would require more bundle size\n    // Therefore, we ignore it.\n    return { value, type: primitiveType };\n  }\n}\n","import type { AsyncContextStack } from './asyncContext/stackStrategy';\nimport type { AsyncContextStrategy } from './asyncContext/types';\nimport type { Client } from './client';\nimport type { Scope } from './scope';\nimport type { SerializedLog } from './types/log';\nimport type { SerializedMetric } from './types/metric';\nimport { SDK_VERSION } from './utils/version';\nimport { GLOBAL_OBJ } from './utils/worldwide';\n\n/**\n * An object that contains globally accessible properties and maintains a scope stack.\n * @hidden\n */\nexport interface Carrier {\n  __SENTRY__?: VersionedCarrier;\n}\n\ntype VersionedCarrier = {\n  version?: string;\n} & Record<Exclude<string, 'version'>, SentryCarrier>;\n\nexport interface SentryCarrier {\n  acs?: AsyncContextStrategy;\n  stack?: AsyncContextStack;\n\n  globalScope?: Scope;\n  defaultIsolationScope?: Scope;\n  defaultCurrentScope?: Scope;\n  loggerSettings?: { enabled: boolean };\n  /**\n   * A map of Sentry clients to their log buffers.\n   * This is used to store logs that are sent to Sentry.\n   */\n  clientToLogBufferMap?: WeakMap<Client, Array<SerializedLog>>;\n\n  /**\n   * A map of Sentry clients to their metric buffers.\n   * This is used to store metrics that are sent to Sentry.\n   */\n  clientToMetricBufferMap?: WeakMap<Client, Array<SerializedMetric>>;\n\n  /** Overwrites TextEncoder used in `@sentry/core`, need for `react-native@0.73` and older */\n  encodePolyfill?: (input: string) => Uint8Array;\n  /** Overwrites TextDecoder used in `@sentry/core`, need for `react-native@0.73` and older */\n  decodePolyfill?: (input: Uint8Array) => string;\n}\n\n/**\n * Returns the global shim registry.\n *\n * FIXME: This function is problematic, because despite always returning a valid Carrier,\n * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check\n * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.\n **/\nexport function getMainCarrier(): Carrier {\n  // This ensures a Sentry carrier exists\n  getSentryCarrier(GLOBAL_OBJ);\n  return GLOBAL_OBJ;\n}\n\n/** Will either get the existing sentry carrier, or create a new one. */\nexport function getSentryCarrier(carrier: Carrier): SentryCarrier {\n  const __SENTRY__ = (carrier.__SENTRY__ = carrier.__SENTRY__ || {});\n\n  // For now: First SDK that sets the .version property wins\n  __SENTRY__.version = __SENTRY__.version || SDK_VERSION;\n\n  // Intentionally populating and returning the version of \"this\" SDK instance\n  // rather than what's set in .version so that \"this\" SDK always gets its carrier\n  return (__SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {});\n}\n\n/**\n * Returns a global singleton contained in the global `__SENTRY__[]` object.\n *\n * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory\n * function and added to the `__SENTRY__` object.\n *\n * @param name name of the global singleton on __SENTRY__\n * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__`\n * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `GLOBAL_OBJ`'s return value\n * @returns the singleton\n */\nexport function getGlobalSingleton<Prop extends keyof SentryCarrier>(\n  name: Prop,\n  creator: () => NonNullable<SentryCarrier[Prop]>,\n  obj = GLOBAL_OBJ,\n): NonNullable<SentryCarrier[Prop]> {\n  const __SENTRY__ = (obj.__SENTRY__ = obj.__SENTRY__ || {});\n  const carrier = (__SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {});\n  // Note: We do not want to set `carrier.version` here, as this may be called before any `init` is called, e.g. for the default scopes\n  return carrier[name] || (carrier[name] = creator());\n}\n","export const DEFAULT_ENVIRONMENT = 'production';\nexport const DEV_ENVIRONMENT = 'development';\n","import { getAsyncContextStrategy } from './asyncContext';\nimport { getGlobalSingleton, getMainCarrier } from './carrier';\nimport type { Client } from './client';\nimport { Scope } from './scope';\nimport type { TraceContext } from './types/context';\nimport { generateSpanId } from './utils/propagationContext';\n\nlet _externalPropagationContextProvider: (() => { traceId: string; spanId: string } | undefined) | undefined;\n\n/**\n * Register an external propagation context provider function.\n * When registered, trace context will be read from the external source (e.g. OpenTelemetry)\n * instead of from the Sentry scope's propagation context.\n */\nexport function registerExternalPropagationContext(fn: () => { traceId: string; spanId: string } | undefined): void {\n  _externalPropagationContextProvider = fn;\n}\n\n/**\n * Get the external propagation context, if a provider has been registered.\n */\nexport function getExternalPropagationContext(): { traceId: string; spanId: string } | undefined {\n  return _externalPropagationContextProvider?.();\n}\n\n/**\n * Check if an external propagation context provider has been registered.\n */\nexport function hasExternalPropagationContext(): boolean {\n  return _externalPropagationContextProvider !== undefined;\n}\n\n/**\n * Get the currently active scope.\n */\nexport function getCurrentScope(): Scope {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  return acs.getCurrentScope();\n}\n\n/**\n * Get the currently active isolation scope.\n * The isolation scope is active for the current execution context.\n */\nexport function getIsolationScope(): Scope {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  return acs.getIsolationScope();\n}\n\n/**\n * Get the global scope.\n * This scope is applied to _all_ events.\n */\nexport function getGlobalScope(): Scope {\n  return getGlobalSingleton('globalScope', () => new Scope());\n}\n\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n */\nexport function withScope<T>(callback: (scope: Scope) => T): T;\n/**\n * Set the given scope as the active scope in the callback.\n */\nexport function withScope<T>(scope: Scope | undefined, callback: (scope: Scope) => T): T;\n/**\n * Either creates a new active scope, or sets the given scope as active scope in the given callback.\n */\nexport function withScope<T>(\n  ...rest: [callback: (scope: Scope) => T] | [scope: Scope | undefined, callback: (scope: Scope) => T]\n): T {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n\n  // If a scope is defined, we want to make this the active scope instead of the default one\n  if (rest.length === 2) {\n    const [scope, callback] = rest;\n\n    if (!scope) {\n      return acs.withScope(callback);\n    }\n\n    return acs.withSetScope(scope, callback);\n  }\n\n  return acs.withScope(rest[0]);\n}\n\n/**\n * Attempts to fork the current isolation scope and the current scope based on the current async context strategy. If no\n * async context strategy is set, the isolation scope and the current scope will not be forked (this is currently the\n * case, for example, in the browser).\n *\n * Usage of this function in environments without async context strategy is discouraged and may lead to unexpected behaviour.\n *\n * This function is intended for Sentry SDK and SDK integration development. It is not recommended to be used in \"normal\"\n * applications directly because it comes with pitfalls. Use at your own risk!\n */\nexport function withIsolationScope<T>(callback: (isolationScope: Scope) => T): T;\n/**\n * Set the provided isolation scope as active in the given callback. If no\n * async context strategy is set, the isolation scope and the current scope will not be forked (this is currently the\n * case, for example, in the browser).\n *\n * Usage of this function in environments without async context strategy is discouraged and may lead to unexpected behaviour.\n *\n * This function is intended for Sentry SDK and SDK integration development. It is not recommended to be used in \"normal\"\n * applications directly because it comes with pitfalls. Use at your own risk!\n *\n * If you pass in `undefined` as a scope, it will fork a new isolation scope, the same as if no scope is passed.\n */\nexport function withIsolationScope<T>(isolationScope: Scope | undefined, callback: (isolationScope: Scope) => T): T;\n/**\n * Either creates a new active isolation scope, or sets the given isolation scope as active scope in the given callback.\n */\nexport function withIsolationScope<T>(\n  ...rest:\n    | [callback: (isolationScope: Scope) => T]\n    | [isolationScope: Scope | undefined, callback: (isolationScope: Scope) => T]\n): T {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n\n  // If a scope is defined, we want to make this the active scope instead of the default one\n  if (rest.length === 2) {\n    const [isolationScope, callback] = rest;\n\n    if (!isolationScope) {\n      return acs.withIsolationScope(callback);\n    }\n\n    return acs.withSetIsolationScope(isolationScope, callback);\n  }\n\n  return acs.withIsolationScope(rest[0]);\n}\n\n/**\n * Get the currently active client.\n */\nexport function getClient<C extends Client>(): C | undefined {\n  return getCurrentScope().getClient<C>();\n}\n\n/**\n * Get a trace context for the given scope.\n */\nexport function getTraceContextFromScope(scope: Scope): TraceContext {\n  const externalContext = getExternalPropagationContext();\n  if (externalContext) {\n    return { trace_id: externalContext.traceId, span_id: externalContext.spanId };\n  }\n\n  const propagationContext = scope.getPropagationContext();\n\n  const { traceId, parentSpanId, propagationSpanId } = propagationContext;\n\n  const traceContext: TraceContext = {\n    trace_id: traceId,\n    span_id: propagationSpanId || generateSpanId(),\n  };\n\n  if (parentSpanId) {\n    traceContext.parent_span_id = parentSpanId;\n  }\n\n  return traceContext;\n}\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","const SEQUENCE_ATTR_KEY = 'sentry.timestamp.sequence';\n\nlet _sequenceNumber = 0;\nlet _previousTimestampMs: number | undefined;\n\n/**\n * Returns the `sentry.timestamp.sequence` attribute entry for a serialized telemetry item.\n *\n * The sequence number starts at 0 and increments by 1 for each item captured.\n * It resets to 0 when the current item's integer millisecond timestamp differs\n * from the previous item's integer millisecond timestamp.\n *\n * @param timestampInSeconds - The timestamp of the telemetry item in seconds.\n */\nexport function getSequenceAttribute(timestampInSeconds: number): {\n  key: string;\n  value: { value: number; type: 'integer' };\n} {\n  const nowMs = Math.floor(timestampInSeconds * 1000);\n\n  if (_previousTimestampMs !== undefined && nowMs !== _previousTimestampMs) {\n    _sequenceNumber = 0;\n  }\n\n  const value = _sequenceNumber;\n  _sequenceNumber++;\n  _previousTimestampMs = nowMs;\n\n  return {\n    key: SEQUENCE_ATTR_KEY,\n    value: { value, type: 'integer' },\n  };\n}\n\n/**\n * Resets the sequence number state. Only exported for testing purposes.\n */\nexport function _INTERNAL_resetSequenceNumber(): void {\n  _sequenceNumber = 0;\n  _previousTimestampMs = undefined;\n}\n","import type { LogSeverityLevel } from '../types/log';\n\n/**\n * Maps a log severity level to a log severity number.\n *\n * @see LogSeverityLevel\n */\nexport const SEVERITY_TEXT_TO_SEVERITY_NUMBER: Partial<Record<LogSeverityLevel, number>> = {\n  trace: 1,\n  debug: 5,\n  info: 9,\n  warn: 13,\n  error: 17,\n  fatal: 21,\n};\n","import type { DsnComponents } from '../types/dsn';\nimport type { LogContainerItem, LogEnvelope } from '../types/envelope';\nimport type { SerializedLog } from '../types/log';\nimport type { SdkMetadata } from '../types/sdkmetadata';\nimport { dsnToString } from '../utils/dsn';\nimport { createEnvelope } from '../utils/envelope';\nimport { isBrowser } from '../utils/isBrowser';\n\n/**\n * Creates a log container envelope item for a list of logs.\n *\n * @param items - The logs to include in the envelope.\n * @param inferUserData - If true, tells Relay to infer the end-user IP and User-Agent from the incoming request.\n *                        Only emitted as `ingest_settings` in browser environments.\n * @returns The created log container envelope item.\n */\nexport function createLogContainerEnvelopeItem(items: Array<SerializedLog>, inferUserData?: boolean): LogContainerItem {\n  const inferSetting = inferUserData ? 'auto' : 'never';\n  return [\n    {\n      type: 'log',\n      item_count: items.length,\n      content_type: 'application/vnd.sentry.items.log+json',\n    },\n    {\n      version: 2,\n      ...(isBrowser() && {\n        ingest_settings: { infer_ip: inferSetting, infer_user_agent: inferSetting },\n      }),\n      items,\n    },\n  ];\n}\n\n/**\n * Creates an envelope for a list of logs.\n *\n * Logs from multiple traces can be included in the same envelope.\n *\n * @param logs - The logs to include in the envelope.\n * @param metadata - The metadata to include in the envelope.\n * @param tunnel - The tunnel to include in the envelope.\n * @param dsn - The DSN to include in the envelope.\n * @param inferUserData - If true, tells Relay to infer the end-user IP and User-Agent from the incoming request.\n * @returns The created envelope.\n */\nexport function createLogEnvelope(\n  logs: Array<SerializedLog>,\n  metadata?: SdkMetadata,\n  tunnel?: string,\n  dsn?: DsnComponents,\n  inferUserData?: boolean,\n): LogEnvelope {\n  const headers: LogEnvelope[0] = {};\n\n  if (metadata?.sdk) {\n    headers.sdk = {\n      name: metadata.sdk.name,\n      version: metadata.sdk.version,\n    };\n  }\n\n  if (!!tunnel && !!dsn) {\n    headers.dsn = dsnToString(dsn);\n  }\n\n  return createEnvelope<LogEnvelope>(headers, [createLogContainerEnvelopeItem(logs, inferUserData)]);\n}\n","import type { Attributes } from '../attributes';\nimport { serializeAttributes } from '../attributes';\nimport { getGlobalSingleton } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Integration } from '../types/integration';\nimport type { Log, SerializedLog } from '../types/log';\nimport { consoleSandbox, debug } from '../utils/debug-logger';\nimport { isParameterizedString } from '../utils/is';\nimport { getCombinedScopeData } from '../utils/scopeData';\nimport { _getSpanForScope } from '../utils/spanOnScope';\nimport { timestampInSeconds } from '../utils/time';\nimport { getSequenceAttribute } from '../utils/timestampSequence';\nimport { _getTraceInfoFromScope } from '../utils/trace-info';\nimport { SEVERITY_TEXT_TO_SEVERITY_NUMBER } from './constants';\nimport { createLogEnvelope } from './envelope';\n\nconst MAX_LOG_BUFFER_SIZE = 100;\n\n/**\n * Sets a log attribute if the value exists and the attribute key is not already present.\n *\n * @param logAttributes - The log attributes object to modify.\n * @param key - The attribute key to set.\n * @param value - The value to set (only sets if truthy and key not present).\n * @param setEvenIfPresent - Whether to set the attribute if it is present. Defaults to true.\n */\nfunction setLogAttribute(\n  logAttributes: Record<string, unknown>,\n  key: string,\n  value: unknown,\n  setEvenIfPresent = true,\n): void {\n  if (value && (!logAttributes[key] || setEvenIfPresent)) {\n    logAttributes[key] = value;\n  }\n}\n\n/**\n * Captures a serialized log event and adds it to the log buffer for the given client.\n *\n * @param client - A client. Uses the current client if not provided.\n * @param serializedLog - The serialized log event to capture.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureSerializedLog(client: Client, serializedLog: SerializedLog): void {\n  const bufferMap = _getBufferMap();\n  const logBuffer = _INTERNAL_getLogBuffer(client);\n\n  if (logBuffer === undefined) {\n    bufferMap.set(client, [serializedLog]);\n  } else {\n    if (logBuffer.length >= MAX_LOG_BUFFER_SIZE) {\n      _INTERNAL_flushLogsBuffer(client, logBuffer);\n      bufferMap.set(client, [serializedLog]);\n    } else {\n      bufferMap.set(client, [...logBuffer, serializedLog]);\n    }\n  }\n}\n\n/**\n * Captures a log event and sends it to Sentry.\n *\n * @param log - The log event to capture.\n * @param scope - A scope. Uses the current scope if not provided.\n * @param client - A client. Uses the current client if not provided.\n * @param captureSerializedLog - A function to capture the serialized log.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureLog(\n  beforeLog: Log,\n  currentScope = getCurrentScope(),\n  captureSerializedLog: (client: Client, log: SerializedLog) => void = _INTERNAL_captureSerializedLog,\n): void {\n  const client = currentScope?.getClient() ?? getClient();\n  if (!client) {\n    DEBUG_BUILD && debug.warn('No client available to capture log.');\n    return;\n  }\n\n  const { release, environment, enableLogs = false, beforeSendLog } = client.getOptions();\n  if (!enableLogs) {\n    DEBUG_BUILD && debug.warn('logging option not enabled, log will not be captured.');\n    return;\n  }\n\n  const [, traceContext] = _getTraceInfoFromScope(client, currentScope);\n\n  const processedLogAttributes = {\n    ...beforeLog.attributes,\n  };\n\n  const {\n    user: { id, email, username },\n    attributes: scopeAttributes = {},\n  } = getCombinedScopeData(getIsolationScope(), currentScope);\n\n  setLogAttribute(processedLogAttributes, 'user.id', id, false);\n  setLogAttribute(processedLogAttributes, 'user.email', email, false);\n  setLogAttribute(processedLogAttributes, 'user.name', username, false);\n\n  setLogAttribute(processedLogAttributes, 'sentry.release', release);\n  setLogAttribute(processedLogAttributes, 'sentry.environment', environment);\n\n  const { name, version } = client.getSdkMetadata()?.sdk ?? {};\n  setLogAttribute(processedLogAttributes, 'sentry.sdk.name', name);\n  setLogAttribute(processedLogAttributes, 'sentry.sdk.version', version);\n\n  const replay = client.getIntegrationByName<\n    Integration & {\n      getReplayId: (onlyIfSampled?: boolean) => string;\n      getRecordingMode: () => 'session' | 'buffer' | undefined;\n    }\n  >('Replay');\n\n  const replayId = replay?.getReplayId(true);\n  setLogAttribute(processedLogAttributes, 'sentry.replay_id', replayId);\n\n  if (replayId && replay?.getRecordingMode() === 'buffer') {\n    // We send this so we can identify cases where the replayId is attached but the replay itself might not have been sent to Sentry\n    setLogAttribute(processedLogAttributes, 'sentry._internal.replay_is_buffering', true);\n  }\n\n  const beforeLogMessage = beforeLog.message;\n  if (isParameterizedString(beforeLogMessage)) {\n    const { __sentry_template_string__, __sentry_template_values__ = [] } = beforeLogMessage;\n    if (__sentry_template_values__?.length) {\n      processedLogAttributes['sentry.message.template'] = __sentry_template_string__;\n    }\n    __sentry_template_values__.forEach((param, index) => {\n      processedLogAttributes[`sentry.message.parameter.${index}`] = param;\n    });\n  }\n\n  const span = _getSpanForScope(currentScope);\n  // Add the parent span ID to the log attributes for trace context\n  setLogAttribute(processedLogAttributes, 'sentry.trace.parent_span_id', span?.spanContext().spanId);\n\n  const processedLog = { ...beforeLog, attributes: processedLogAttributes };\n\n  client.emit('beforeCaptureLog', processedLog);\n\n  // We need to wrap this in `consoleSandbox` to avoid recursive calls to `beforeSendLog`\n  const log = beforeSendLog ? consoleSandbox(() => beforeSendLog(processedLog)) : processedLog;\n  if (!log) {\n    client.recordDroppedEvent('before_send', 'log_item', 1);\n    DEBUG_BUILD && debug.warn('beforeSendLog returned null, log will not be captured.');\n    return;\n  }\n\n  const { level, message, attributes: logAttributes = {}, severityNumber } = log;\n\n  const timestamp = timestampInSeconds();\n  const sequenceAttr = getSequenceAttribute(timestamp);\n\n  const serializedLog: SerializedLog = {\n    timestamp,\n    level,\n    body: _removeLoneSurrogates(String(message)),\n    trace_id: traceContext?.trace_id,\n    severity_number: severityNumber ?? SEVERITY_TEXT_TO_SEVERITY_NUMBER[level],\n    attributes: sanitizeLogAttributes({\n      ...serializeAttributes(scopeAttributes),\n      ...serializeAttributes(logAttributes, true),\n      [sequenceAttr.key]: sequenceAttr.value,\n    }),\n  };\n\n  captureSerializedLog(client, serializedLog);\n\n  client.emit('afterCaptureLog', log);\n}\n\n/**\n * Flushes the logs buffer to Sentry.\n *\n * @param client - A client.\n * @param maybeLogBuffer - A log buffer. Uses the log buffer for the given client if not provided.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_flushLogsBuffer(client: Client, maybeLogBuffer?: Array<SerializedLog>): void {\n  const logBuffer = maybeLogBuffer ?? _INTERNAL_getLogBuffer(client) ?? [];\n  if (logBuffer.length === 0) {\n    return;\n  }\n\n  const clientOptions = client.getOptions();\n  const envelope = createLogEnvelope(\n    logBuffer,\n    clientOptions._metadata,\n    clientOptions.tunnel,\n    client.getDsn(),\n    client.getDataCollectionOptions().userInfo,\n  );\n\n  // Clear the log buffer after envelopes have been constructed.\n  _getBufferMap().set(client, []);\n\n  client.emit('flushLogs');\n\n  // sendEnvelope should not throw\n  // eslint-disable-next-line @typescript-eslint/no-floating-promises\n  client.sendEnvelope(envelope);\n}\n\n/**\n * Returns the log buffer for a given client.\n *\n * Exported for testing purposes.\n *\n * @param client - The client to get the log buffer for.\n * @returns The log buffer for the given client.\n */\nexport function _INTERNAL_getLogBuffer(client: Client): Array<SerializedLog> | undefined {\n  return _getBufferMap().get(client);\n}\n\nfunction _getBufferMap(): WeakMap<Client, Array<SerializedLog>> {\n  // The reference to the Client <> LogBuffer map is stored on the carrier to ensure it's always the same\n  return getGlobalSingleton('clientToLogBufferMap', () => new WeakMap<Client, Array<SerializedLog>>());\n}\n\n/**\n * Sanitizes serialized log attributes by replacing lone surrogates in both\n * keys and string values with U+FFFD.\n */\nfunction sanitizeLogAttributes(attributes: Attributes): Attributes {\n  const sanitized: Attributes = {};\n  for (const [key, attr] of Object.entries(attributes)) {\n    const sanitizedKey = _removeLoneSurrogates(key);\n    if (attr.type === 'string') {\n      sanitized[sanitizedKey] = { ...attr, value: _removeLoneSurrogates(attr.value) };\n    } else {\n      sanitized[sanitizedKey] = attr;\n    }\n  }\n  return sanitized;\n}\n\n/**\n * Replaces unpaired UTF-16 surrogates with U+FFFD (replacement character).\n *\n * Lone surrogates (U+D800–U+DFFF not part of a valid pair) cause `serde_json`\n * on the server to reject the entire log batch when they appear in\n * JSON-escaped form (e.g. `\\uD800`). Replacing them at the SDK level ensures\n * only the offending characters are lost instead of the whole payload.\n *\n * Uses the native `String.prototype.toWellFormed()` when available\n * (Node 20+, Chrome 111+, Safari 15.4+, Firefox 119+, Hermes).\n * On older runtimes without native support, returns the string as-is.\n *\n * Exported for testing\n */\nexport function _removeLoneSurrogates(str: string): string {\n  // isWellFormed/toWellFormed are ES2024 (not in our TS lib target), so we feature-detect via Object().\n  const strObj: Record<string, Function> = Object(str);\n  const isWellFormed = strObj['isWellFormed'];\n  const toWellFormed = strObj['toWellFormed'];\n  if (typeof isWellFormed === 'function' && typeof toWellFormed === 'function') {\n    return isWellFormed.call(str) ? str : toWellFormed.call(str);\n  }\n  return str;\n}\n","import type { Client } from '../client';\nimport { getTraceContextFromScope, withScope } from '../currentScopes';\nimport type { Scope } from '../scope';\nimport {\n  getDynamicSamplingContextFromScope,\n  getDynamicSamplingContextFromSpan,\n} from '../tracing/dynamicSamplingContext';\nimport type { TraceContext } from '../types/context';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport { getActiveSpan, spanToTraceContext } from './spanUtils';\n\n/** Extract trace information from scope */\nexport function _getTraceInfoFromScope(\n  client: Client,\n  scope: Scope | undefined,\n): [dynamicSamplingContext: Partial<DynamicSamplingContext> | undefined, traceContext: TraceContext | undefined] {\n  if (!scope) {\n    return [undefined, undefined];\n  }\n\n  return withScope(scope, () => {\n    const span = getActiveSpan();\n    const traceContext = span ? spanToTraceContext(span) : getTraceContextFromScope(scope);\n    const dynamicSamplingContext = span\n      ? getDynamicSamplingContextFromSpan(span)\n      : getDynamicSamplingContextFromScope(client, scope);\n    return [dynamicSamplingContext, traceContext];\n  });\n}\n","import type { Scope } from '../scope';\nimport type { Log, LogSeverityLevel } from '../types/log';\nimport type { ParameterizedString } from '../types/parameterize';\nimport { _INTERNAL_captureLog } from './internal';\n\n/**\n * Capture a log with the given level.\n *\n * @param level - The level of the log.\n * @param message - The message to log.\n * @param attributes - Arbitrary structured data that stores information about the log - e.g., userId: 100.\n * @param scope - The scope to capture the log with.\n * @param severityNumber - The severity number of the log.\n */\nfunction captureLog(\n  level: LogSeverityLevel,\n  message: ParameterizedString,\n  attributes?: Log['attributes'],\n  scope?: Scope,\n  severityNumber?: Log['severityNumber'],\n): void {\n  _INTERNAL_captureLog({ level, message, attributes, severityNumber }, scope);\n}\n\n/**\n * Additional metadata to capture the log with.\n */\ninterface CaptureLogMetadata {\n  scope?: Scope;\n}\n\n/**\n * @summary Capture a log with the `trace` level. Requires the `enableLogs` option to be enabled.\n *\n * @param message - The message to log.\n * @param attributes - Arbitrary structured data that stores information about the log - e.g., { userId: 100, route: '/dashboard' }.\n * @param metadata - additional metadata to capture the log with.\n *\n * @example\n *\n * ```\n * Sentry.logger.trace('User clicked submit button', {\n *   buttonId: 'submit-form',\n *   formId: 'user-profile',\n *   timestamp: Date.now()\n * });\n * ```\n *\n * @example With template strings\n *\n * ```\n * Sentry.logger.trace(Sentry.logger.fmt`User ${user} navigated to ${page}`, {\n *   userId: '123',\n *   sessionId: 'abc-xyz'\n * });\n * ```\n */\nexport function trace(\n  message: ParameterizedString,\n  attributes?: Log['attributes'],\n  { scope }: CaptureLogMetadata = {},\n): void {\n  captureLog('trace', message, attributes, scope);\n}\n\n/**\n * @summary Capture a log with the `debug` level. Requires the `enableLogs` option to be enabled.\n *\n * @param message - The message to log.\n * @param attributes - Arbitrary structured data that stores information about the log - e.g., { component: 'Header', state: 'loading' }.\n * @param metadata - additional metadata to capture the log with.\n *\n * @example\n *\n * ```\n * Sentry.logger.debug('Component mounted', {\n *   component: 'UserProfile',\n *   props: { userId: 123 },\n *   renderTime: 150\n * });\n * ```\n *\n * @example With template strings\n *\n * ```\n * Sentry.logger.debug(Sentry.logger.fmt`API request to ${endpoint} failed`, {\n *   statusCode: 404,\n *   requestId: 'req-123',\n *   duration: 250\n * });\n * ```\n */\nexport function debug(\n  message: ParameterizedString,\n  attributes?: Log['attributes'],\n  { scope }: CaptureLogMetadata = {},\n): void {\n  captureLog('debug', message, attributes, scope);\n}\n\n/**\n * @summary Capture a log with the `info` level. Requires the `enableLogs` option to be enabled.\n *\n * @param message - The message to log.\n * @param attributes - Arbitrary structured data that stores information about the log - e.g., { feature: 'checkout', status: 'completed' }.\n * @param metadata - additional metadata to capture the log with.\n *\n * @example\n *\n * ```\n * Sentry.logger.info('User completed checkout', {\n *   orderId: 'order-123',\n *   amount: 99.99,\n *   paymentMethod: 'credit_card'\n * });\n * ```\n *\n * @example With template strings\n *\n * ```\n * Sentry.logger.info(Sentry.logger.fmt`User ${user} updated profile picture`, {\n *   userId: 'user-123',\n *   imageSize: '2.5MB',\n *   timestamp: Date.now()\n * });\n * ```\n */\nexport function info(\n  message: ParameterizedString,\n  attributes?: Log['attributes'],\n  { scope }: CaptureLogMetadata = {},\n): void {\n  captureLog('info', message, attributes, scope);\n}\n\n/**\n * @summary Capture a log with the `warn` level. Requires the `enableLogs` option to be enabled.\n *\n * @param message - The message to log.\n * @param attributes - Arbitrary structured data that stores information about the log - e.g., { browser: 'Chrome', version: '91.0' }.\n * @param metadata - additional metadata to capture the log with.\n *\n * @example\n *\n * ```\n * Sentry.logger.warn('Browser compatibility issue detected', {\n *   browser: 'Safari',\n *   version: '14.0',\n *   feature: 'WebRTC',\n *   fallback: 'enabled'\n * });\n * ```\n *\n * @example With template strings\n *\n * ```\n * Sentry.logger.warn(Sentry.logger.fmt`API endpoint ${endpoint} is deprecated`, {\n *   recommendedEndpoint: '/api/v2/users',\n *   sunsetDate: '2024-12-31',\n *   clientVersion: '1.2.3'\n * });\n * ```\n */\nexport function warn(\n  message: ParameterizedString,\n  attributes?: Log['attributes'],\n  { scope }: CaptureLogMetadata = {},\n): void {\n  captureLog('warn', message, attributes, scope);\n}\n\n/**\n * @summary Capture a log with the `error` level. Requires the `enableLogs` option to be enabled.\n *\n * @param message - The message to log.\n * @param attributes - Arbitrary structured data that stores information about the log - e.g., { error: 'NetworkError', url: '/api/data' }.\n * @param metadata - additional metadata to capture the log with.\n *\n * @example\n *\n * ```\n * Sentry.logger.error('Failed to load user data', {\n *   error: 'NetworkError',\n *   url: '/api/users/123',\n *   statusCode: 500,\n *   retryCount: 3\n * });\n * ```\n *\n * @example With template strings\n *\n * ```\n * Sentry.logger.error(Sentry.logger.fmt`Payment processing failed for order ${orderId}`, {\n *   error: 'InsufficientFunds',\n *   amount: 100.00,\n *   currency: 'USD',\n *   userId: 'user-456'\n * });\n * ```\n */\nexport function error(\n  message: ParameterizedString,\n  attributes?: Log['attributes'],\n  { scope }: CaptureLogMetadata = {},\n): void {\n  captureLog('error', message, attributes, scope);\n}\n\n/**\n * @summary Capture a log with the `fatal` level. Requires the `enableLogs` option to be enabled.\n *\n * @param message - The message to log.\n * @param attributes - Arbitrary structured data that stores information about the log - e.g., { appState: 'corrupted', sessionId: 'abc-123' }.\n * @param metadata - additional metadata to capture the log with.\n *\n * @example\n *\n * ```\n * Sentry.logger.fatal('Application state corrupted', {\n *   lastKnownState: 'authenticated',\n *   sessionId: 'session-123',\n *   timestamp: Date.now(),\n *   recoveryAttempted: true\n * });\n * ```\n *\n * @example With template strings\n *\n * ```\n * Sentry.logger.fatal(Sentry.logger.fmt`Critical system failure in ${service}`, {\n *   service: 'payment-processor',\n *   errorCode: 'CRITICAL_FAILURE',\n *   affectedUsers: 150,\n *   timestamp: Date.now()\n * });\n * ```\n */\nexport function fatal(\n  message: ParameterizedString,\n  attributes?: Log['attributes'],\n  { scope }: CaptureLogMetadata = {},\n): void {\n  captureLog('fatal', message, attributes, scope);\n}\n\nexport { fmt } from '../utils/parameterize';\n","/* eslint-disable max-lines */\nimport type { AttributeObject, RawAttribute, RawAttributes } from './attributes';\nimport type { Client } from './client';\nimport { DEBUG_BUILD } from './debug-build';\nimport { updateSession } from './session';\nimport type { Attachment } from './types/attachment';\nimport type { Breadcrumb } from './types/breadcrumb';\nimport type { Context, Contexts } from './types/context';\nimport type { DynamicSamplingContext } from './types/envelope';\nimport type { Event, EventHint } from './types/event';\nimport type { EventProcessor } from './types/eventprocessor';\nimport type { Extra, Extras } from './types/extra';\nimport type { Primitive } from './types/misc';\nimport type { RequestEventData } from './types/request';\nimport type { Session } from './types/session';\nimport type { SeverityLevel } from './types/severity';\nimport type { Span } from './types/span';\nimport type { PropagationContext } from './types/tracing';\nimport type { User } from './types/user';\nimport { debug } from './utils/debug-logger';\nimport { isPlainObject } from './utils/is';\nimport { merge } from './utils/merge';\nimport { uuid4 } from './utils/misc';\nimport { generateTraceId } from './utils/propagationContext';\nimport { safeMathRandom } from './utils/randomSafeContext';\nimport { _getSpanForScope, _setSpanForScope } from './utils/spanOnScope';\nimport { truncate } from './utils/string';\nimport { dateTimestampInSeconds } from './utils/time';\n\n/**\n * Default value for maximum number of breadcrumbs added to an event.\n */\nconst DEFAULT_MAX_BREADCRUMBS = 100;\n\n/**\n * A context to be used for capturing an event.\n * This can either be a Scope, or a partial ScopeContext,\n * or a callback that receives the current scope and returns a new scope to use.\n */\nexport type CaptureContext = Scope | Partial<ScopeContext> | ((scope: Scope) => Scope);\n\n/**\n * Data that can be converted to a Scope.\n */\nexport interface ScopeContext {\n  user: User;\n  level: SeverityLevel;\n  extra: Extras;\n  contexts: Contexts;\n  tags: { [key: string]: Primitive };\n  attributes?: RawAttributes<Record<string, unknown>>;\n  fingerprint: string[];\n  propagationContext: PropagationContext;\n  conversationId?: string;\n}\n\nexport interface SdkProcessingMetadata {\n  [key: string]: unknown;\n  requestSession?: {\n    status: 'ok' | 'errored' | 'crashed';\n  };\n  normalizedRequest?: RequestEventData;\n  dynamicSamplingContext?: Partial<DynamicSamplingContext>;\n  capturedSpanScope?: Scope;\n  capturedSpanIsolationScope?: Scope;\n  spanCountBeforeProcessing?: number;\n  ipAddress?: string;\n}\n\n/**\n * Normalized data of the Scope, ready to be used.\n */\nexport interface ScopeData {\n  eventProcessors: EventProcessor[];\n  breadcrumbs: Breadcrumb[];\n  user: User;\n  tags: { [key: string]: Primitive };\n  // TODO(v11): Make this a required field (could be subtly breaking if we did it today)\n  attributes?: RawAttributes<Record<string, unknown>>;\n  extra: Extras;\n  contexts: Contexts;\n  attachments: Attachment[];\n  propagationContext: PropagationContext;\n  sdkProcessingMetadata: SdkProcessingMetadata;\n  fingerprint: string[];\n  level?: SeverityLevel;\n  transactionName?: string;\n  span?: Span;\n  conversationId?: string;\n}\n\n/**\n * Holds additional event information.\n */\nexport class Scope {\n  /** Flag if notifying is happening. */\n  protected _notifyingListeners: boolean;\n\n  /** Callback for client to receive scope changes. */\n  protected _scopeListeners: Array<(scope: Scope) => void>;\n\n  /** Callback list that will be called during event processing. */\n  protected _eventProcessors: EventProcessor[];\n\n  /** Array of breadcrumbs. */\n  protected _breadcrumbs: Breadcrumb[];\n\n  /** User */\n  protected _user: User;\n\n  /** Tags */\n  protected _tags: { [key: string]: Primitive };\n\n  /** Attributes */\n  protected _attributes: RawAttributes<Record<string, unknown>>;\n\n  /** Extra */\n  protected _extra: Extras;\n\n  /** Contexts */\n  protected _contexts: Contexts;\n\n  /** Attachments */\n  protected _attachments: Attachment[];\n\n  /** Propagation Context for distributed tracing */\n  protected _propagationContext: PropagationContext;\n\n  /**\n   * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get\n   * sent to Sentry\n   */\n  protected _sdkProcessingMetadata: SdkProcessingMetadata;\n\n  /** Fingerprint */\n  protected _fingerprint?: string[];\n\n  /** Severity */\n  protected _level?: SeverityLevel;\n\n  /**\n   * Transaction Name\n   *\n   * IMPORTANT: The transaction name on the scope has nothing to do with root spans/transaction objects.\n   * It's purpose is to assign a transaction to the scope that's added to non-transaction events.\n   */\n  protected _transactionName?: string;\n\n  /** Session */\n  protected _session?: Session;\n\n  /** The client on this scope */\n  protected _client?: Client;\n\n  /** Contains the last event id of a captured event.  */\n  protected _lastEventId?: string;\n\n  /** Conversation ID */\n  protected _conversationId?: string;\n\n  // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n\n  public constructor() {\n    this._notifyingListeners = false;\n    this._scopeListeners = [];\n    this._eventProcessors = [];\n    this._breadcrumbs = [];\n    this._attachments = [];\n    this._user = {};\n    this._tags = {};\n    this._attributes = {};\n    this._extra = {};\n    this._contexts = {};\n    this._sdkProcessingMetadata = {};\n    this._propagationContext = {\n      traceId: generateTraceId(),\n      sampleRand: safeMathRandom(),\n    };\n  }\n\n  /**\n   * Clone all data from this scope into a new scope.\n   */\n  public clone(): Scope {\n    const newScope = new Scope();\n    newScope._breadcrumbs = [...this._breadcrumbs];\n    newScope._tags = { ...this._tags };\n    newScope._attributes = { ...this._attributes };\n    newScope._extra = { ...this._extra };\n    newScope._contexts = { ...this._contexts };\n    if (this._contexts.flags) {\n      // We need to copy the `values` array so insertions on a cloned scope\n      // won't affect the original array.\n      newScope._contexts.flags = {\n        values: [...this._contexts.flags.values],\n      };\n    }\n\n    newScope._user = this._user;\n    newScope._level = this._level;\n    newScope._session = this._session;\n    newScope._transactionName = this._transactionName;\n    newScope._fingerprint = this._fingerprint;\n    newScope._eventProcessors = [...this._eventProcessors];\n    newScope._attachments = [...this._attachments];\n    newScope._sdkProcessingMetadata = { ...this._sdkProcessingMetadata };\n    newScope._propagationContext = { ...this._propagationContext };\n    newScope._client = this._client;\n    newScope._lastEventId = this._lastEventId;\n    newScope._conversationId = this._conversationId;\n\n    _setSpanForScope(newScope, _getSpanForScope(this));\n\n    return newScope;\n  }\n\n  /**\n   * Update the client assigned to this scope.\n   * Note that not every scope will have a client assigned - isolation scopes & the global scope will generally not have a client,\n   * as well as manually created scopes.\n   */\n  public setClient(client: Client | undefined): void {\n    this._client = client;\n  }\n\n  /**\n   * Set the ID of the last captured error event.\n   * This is generally only captured on the isolation scope.\n   */\n  public setLastEventId(lastEventId: string | undefined): void {\n    this._lastEventId = lastEventId;\n  }\n\n  /**\n   * Get the client assigned to this scope.\n   */\n  public getClient<C extends Client>(): C | undefined {\n    return this._client as C | undefined;\n  }\n\n  /**\n   * Get the ID of the last captured error event.\n   * This is generally only available on the isolation scope.\n   */\n  public lastEventId(): string | undefined {\n    return this._lastEventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public addScopeListener(callback: (scope: Scope) => void): void {\n    this._scopeListeners.push(callback);\n  }\n\n  /**\n   * Add an event processor that will be called before an event is sent.\n   */\n  public addEventProcessor(callback: EventProcessor): this {\n    this._eventProcessors.push(callback);\n    return this;\n  }\n\n  /**\n   * Set the user for this scope.\n   * Set to `null` to unset the user.\n   */\n  public setUser(user: User | null): this {\n    // If null is passed we want to unset everything, but still define keys,\n    // so that later down in the pipeline any existing values are cleared.\n    this._user = user || {\n      email: undefined,\n      id: undefined,\n      ip_address: undefined,\n      username: undefined,\n    };\n\n    if (this._session) {\n      updateSession(this._session, { user });\n    }\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Get the user from this scope.\n   */\n  public getUser(): User | undefined {\n    return this._user;\n  }\n\n  /**\n   * Set the conversation ID for this scope.\n   * Set to `null` to unset the conversation ID.\n   */\n  public setConversationId(conversationId: string | null | undefined): this {\n    this._conversationId = conversationId || undefined;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Set an object that will be merged into existing tags on the scope,\n   * and will be sent as tags data with the event.\n   */\n  public setTags(tags: { [key: string]: Primitive }): this {\n    this._tags = {\n      ...this._tags,\n      ...tags,\n    };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Set a single tag that will be sent as tags data with the event.\n   */\n  public setTag(key: string, value: Primitive): this {\n    return this.setTags({ [key]: value });\n  }\n\n  /**\n   * Sets attributes onto the scope.\n   *\n   * These attributes are applied to logs, metrics and streamed spans.\n   *\n   * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n   *\n   * @param newAttributes - The attributes to set on the scope, as key-value pairs.\n   *\n   * @example\n   * ```typescript\n   * scope.setAttributes({\n   *   is_admin: true,\n   *   payment_selection: 'credit_card',\n   *   render_duration: 150,\n   * });\n   * ```\n   */\n  public setAttributes<T extends Record<string, unknown>>(newAttributes: RawAttributes<T>): this {\n    this._attributes = {\n      ...this._attributes,\n      ...newAttributes,\n    };\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Sets an attribute onto the scope.\n   *\n   * These attributes are applied to logs, metrics and streamed spans.\n   *\n   * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n   *\n   * @param key - The attribute key.\n   * @param value - The attribute value.\n   *\n   * @example\n   * ```typescript\n   * scope.setAttribute('is_admin', true);\n   * scope.setAttribute('render_duration', 150);\n   * ```\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public setAttribute<T extends RawAttribute<T> extends { value: any } | { unit: any } ? AttributeObject : unknown>(\n    key: string,\n    value: RawAttribute<T>,\n  ): this {\n    return this.setAttributes({ [key]: value });\n  }\n\n  /**\n   * Removes the attribute with the given key from the scope.\n   *\n   * @param key - The attribute key.\n   *\n   * @example\n   * ```typescript\n   * scope.removeAttribute('is_admin');\n   * ```\n   */\n  public removeAttribute(key: string): this {\n    if (key in this._attributes) {\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete this._attributes[key];\n      this._notifyScopeListeners();\n    }\n    return this;\n  }\n\n  /**\n   * Set an object that will be merged into existing extra on the scope,\n   * and will be sent as extra data with the event.\n   */\n  public setExtras(extras: Extras): this {\n    this._extra = {\n      ...this._extra,\n      ...extras,\n    };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Set a single key:value extra entry that will be sent as extra data with the event.\n   */\n  public setExtra(key: string, extra: Extra): this {\n    this._extra = { ...this._extra, [key]: extra };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Sets the fingerprint on the scope to send with the events.\n   * @param {string[]} fingerprint Fingerprint to group events in Sentry.\n   */\n  public setFingerprint(fingerprint: string[]): this {\n    this._fingerprint = fingerprint;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Sets the level on the scope for future events.\n   */\n  public setLevel(level: SeverityLevel): this {\n    this._level = level;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Sets the transaction name on the scope so that the name of e.g. taken server route or\n   * the page location is attached to future events.\n   *\n   * IMPORTANT: Calling this function does NOT change the name of the currently active\n   * root span. If you want to change the name of the active root span, use\n   * `Sentry.updateSpanName(rootSpan, 'new name')` instead.\n   *\n   * By default, the SDK updates the scope's transaction name automatically on sensible\n   * occasions, such as a page navigation or when handling a new request on the server.\n   */\n  public setTransactionName(name?: string): this {\n    this._transactionName = name;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Sets context data with the given name.\n   * Data passed as context will be normalized. You can also pass `null` to unset the context.\n   * Note that context data will not be merged - calling `setContext` will overwrite an existing context with the same key.\n   */\n  public setContext(key: string, context: Context | null): this {\n    if (context === null) {\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete this._contexts[key];\n    } else {\n      this._contexts[key] = context;\n    }\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Set the session for the scope.\n   */\n  public setSession(session?: Session): this {\n    if (!session) {\n      delete this._session;\n    } else {\n      this._session = session;\n    }\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Get the session from the scope.\n   */\n  public getSession(): Session | undefined {\n    return this._session;\n  }\n\n  /**\n   * Updates the scope with provided data. Can work in three variations:\n   * - plain object containing updatable attributes\n   * - Scope instance that'll extract the attributes from\n   * - callback function that'll receive the current scope as an argument and allow for modifications\n   */\n  public update(captureContext?: CaptureContext): this {\n    if (!captureContext) {\n      return this;\n    }\n\n    const scopeToMerge = typeof captureContext === 'function' ? captureContext(this) : captureContext;\n\n    const scopeInstance =\n      scopeToMerge instanceof Scope\n        ? scopeToMerge.getScopeData()\n        : isPlainObject(scopeToMerge)\n          ? (captureContext as ScopeContext)\n          : undefined;\n\n    const {\n      tags,\n      attributes,\n      extra,\n      user,\n      contexts,\n      level,\n      fingerprint = [],\n      propagationContext,\n      conversationId,\n    } = scopeInstance || {};\n\n    this._tags = { ...this._tags, ...tags };\n    this._attributes = { ...this._attributes, ...attributes };\n    this._extra = { ...this._extra, ...extra };\n    this._contexts = { ...this._contexts, ...contexts };\n\n    if (user && Object.keys(user).length) {\n      this._user = user;\n    }\n\n    if (level) {\n      this._level = level;\n    }\n\n    if (fingerprint.length) {\n      this._fingerprint = fingerprint;\n    }\n\n    if (propagationContext) {\n      this._propagationContext = propagationContext;\n    }\n\n    if (conversationId) {\n      this._conversationId = conversationId;\n    }\n\n    return this;\n  }\n\n  /**\n   * Clears the current scope and resets its properties.\n   * Note: The client will not be cleared.\n   */\n  public clear(): this {\n    // client is not cleared here on purpose!\n    this._breadcrumbs = [];\n    this._tags = {};\n    this._attributes = {};\n    this._extra = {};\n    this._user = {};\n    this._contexts = {};\n    this._level = undefined;\n    this._transactionName = undefined;\n    this._fingerprint = undefined;\n    this._session = undefined;\n    this._conversationId = undefined;\n    _setSpanForScope(this, undefined);\n    this._attachments = [];\n    this.setPropagationContext({\n      traceId: generateTraceId(),\n      sampleRand: safeMathRandom(),\n    });\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Adds a breadcrumb to the scope.\n   * By default, the last 100 breadcrumbs are kept.\n   */\n  public addBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs?: number): this {\n    const maxCrumbs = typeof maxBreadcrumbs === 'number' ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n\n    // No data has been changed, so don't notify scope listeners\n    if (maxCrumbs <= 0) {\n      return this;\n    }\n\n    const mergedBreadcrumb: Breadcrumb = {\n      timestamp: dateTimestampInSeconds(),\n      ...breadcrumb,\n      // Breadcrumb messages can theoretically be infinitely large and they're held in memory so we truncate them not to leak (too much) memory\n      message: breadcrumb.message ? truncate(breadcrumb.message, 2048) : breadcrumb.message,\n    };\n\n    this._breadcrumbs.push(mergedBreadcrumb);\n    if (this._breadcrumbs.length > maxCrumbs) {\n      this._breadcrumbs = this._breadcrumbs.slice(-maxCrumbs);\n      this._client?.recordDroppedEvent('buffer_overflow', 'log_item');\n    }\n\n    this._notifyScopeListeners();\n\n    return this;\n  }\n\n  /**\n   * Get the last breadcrumb of the scope.\n   */\n  public getLastBreadcrumb(): Breadcrumb | undefined {\n    return this._breadcrumbs[this._breadcrumbs.length - 1];\n  }\n\n  /**\n   * Clear all breadcrumbs from the scope.\n   */\n  public clearBreadcrumbs(): this {\n    this._breadcrumbs = [];\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Add an attachment to the scope.\n   */\n  public addAttachment(attachment: Attachment): this {\n    this._attachments.push(attachment);\n    return this;\n  }\n\n  /**\n   * Clear all attachments from the scope.\n   */\n  public clearAttachments(): this {\n    this._attachments = [];\n    return this;\n  }\n\n  /**\n   * Get the data of this scope, which should be applied to an event during processing.\n   */\n  public getScopeData(): ScopeData {\n    return {\n      breadcrumbs: this._breadcrumbs,\n      attachments: this._attachments,\n      contexts: this._contexts,\n      tags: this._tags,\n      attributes: this._attributes,\n      extra: this._extra,\n      user: this._user,\n      level: this._level,\n      fingerprint: this._fingerprint || [],\n      eventProcessors: this._eventProcessors,\n      propagationContext: this._propagationContext,\n      sdkProcessingMetadata: this._sdkProcessingMetadata,\n      transactionName: this._transactionName,\n      span: _getSpanForScope(this),\n      conversationId: this._conversationId,\n    };\n  }\n\n  /**\n   * Add data which will be accessible during event processing but won't get sent to Sentry.\n   */\n  public setSDKProcessingMetadata(newData: SdkProcessingMetadata): this {\n    this._sdkProcessingMetadata = merge(this._sdkProcessingMetadata, newData, 2);\n    return this;\n  }\n\n  /**\n   * Add propagation context to the scope, used for distributed tracing\n   */\n  public setPropagationContext(context: PropagationContext): this {\n    this._propagationContext = context;\n    return this;\n  }\n\n  /**\n   * Get propagation context from the scope, used for distributed tracing\n   */\n  public getPropagationContext(): PropagationContext {\n    return this._propagationContext;\n  }\n\n  /**\n   * Capture an exception for this scope.\n   *\n   * @returns {string} The id of the captured Sentry event.\n   */\n  public captureException(exception: unknown, hint?: EventHint): string {\n    const eventId = hint?.event_id || uuid4();\n\n    if (!this._client) {\n      DEBUG_BUILD && debug.warn('No client configured on scope - will not capture exception!');\n      return eventId;\n    }\n\n    const syntheticException = new Error('Sentry syntheticException');\n\n    this._client.captureException(\n      exception,\n      {\n        originalException: exception,\n        syntheticException,\n        ...hint,\n        event_id: eventId,\n      },\n      this,\n    );\n\n    return eventId;\n  }\n\n  /**\n   * Capture a message for this scope.\n   *\n   * @returns {string} The id of the captured message.\n   */\n  public captureMessage(message: string, level?: SeverityLevel, hint?: EventHint): string {\n    const eventId = hint?.event_id || uuid4();\n\n    if (!this._client) {\n      DEBUG_BUILD && debug.warn('No client configured on scope - will not capture message!');\n      return eventId;\n    }\n\n    const syntheticException = hint?.syntheticException ?? new Error(message);\n\n    this._client.captureMessage(\n      message,\n      level,\n      {\n        originalException: message,\n        syntheticException,\n        ...hint,\n        event_id: eventId,\n      },\n      this,\n    );\n\n    return eventId;\n  }\n\n  /**\n   * Capture a Sentry event for this scope.\n   *\n   * @returns {string} The id of the captured event.\n   */\n  public captureEvent(event: Event, hint?: EventHint): string {\n    const eventId = event.event_id || hint?.event_id || uuid4();\n\n    if (!this._client) {\n      DEBUG_BUILD && debug.warn('No client configured on scope - will not capture event!');\n      return eventId;\n    }\n\n    this._client.captureEvent(event, { ...hint, event_id: eventId }, this);\n\n    return eventId;\n  }\n\n  /**\n   * This will be called on every set call.\n   */\n  protected _notifyScopeListeners(): void {\n    // We need this check for this._notifyingListeners to be able to work on scope during updates\n    // If this check is not here we'll produce endless recursion when something is done with the scope\n    // during the callback.\n    if (!this._notifyingListeners) {\n      this._notifyingListeners = true;\n      this._scopeListeners.forEach(callback => {\n        callback(this);\n      });\n      this._notifyingListeners = false;\n    }\n  }\n}\n","/**\n * Use this attribute to represent the source of a span name.\n * Must be one of: custom, url, route, view, component, task\n * TODO(v11): rename this to sentry.span.source'\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SOURCE = 'sentry.source';\n\n/**\n * Attributes that holds the sample rate that was locally applied to a span.\n * If this attribute is not defined, it means that the span inherited a sampling decision.\n *\n * NOTE: Is only defined on root spans.\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE = 'sentry.sample_rate';\n\n/**\n * Attribute holding the sample rate of the previous trace.\n * This is used to sample consistently across subsequent traces in the browser SDK.\n *\n * Note: Only defined on root spans, if opted into consistent sampling\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE = 'sentry.previous_trace_sample_rate';\n\n/**\n * Use this attribute to represent the operation of a span.\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_OP = 'sentry.op';\n\n/**\n * Use this attribute to represent the origin of a span.\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = 'sentry.origin';\n\n/**\n * Holds the human-readable span status message (e.g. set via\n * `span.setStatus({ code, message })`).\n *\n * Streamed (v2) span statuses are reduced to `ok`/`error`, so we preserve the\n * message as an attribute instead of dropping it. This mirrors the attribute\n * Sentry's OTLP ingestion uses for the same purpose.\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_STATUS_MESSAGE = 'sentry.status.message';\n\n/** The reason why an idle span finished. */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON = 'sentry.idle_span_finish_reason';\n\n/** The unit of a measurement, which may be stored as a TimedEvent. */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT = 'sentry.measurement_unit';\n\n/** The value of a measurement, which may be stored as a TimedEvent. */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE = 'sentry.measurement_value';\n\n/** The release version of the application */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_RELEASE = 'sentry.release';\n/** The environment name (e.g., \"production\", \"staging\", \"development\") */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT = 'sentry.environment';\n/** The segment name (e.g., \"GET /users\") */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME = 'sentry.segment.name';\n/** The id of the segment that this span belongs to. */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID = 'sentry.segment.id';\n/** The name of the Sentry SDK (e.g., \"sentry.php\", \"sentry.javascript\") */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME = 'sentry.sdk.name';\n/** The version of the Sentry SDK */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION = 'sentry.sdk.version';\n/** The list of integrations enabled in the Sentry SDK (e.g., [\"InboundFilters\", \"BrowserTracing\"]) */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS = 'sentry.sdk.integrations';\n\n/** The user ID */\nexport const SEMANTIC_ATTRIBUTE_USER_ID = 'user.id';\n/** The user email */\nexport const SEMANTIC_ATTRIBUTE_USER_EMAIL = 'user.email';\n/** The user IP address */\nexport const SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS = 'user.ip_address';\n/** The user username */\nexport const SEMANTIC_ATTRIBUTE_USER_USERNAME = 'user.name';\n\n/**\n * A custom span name set by users guaranteed to be taken over any automatically\n * inferred name. This attribute is removed before the span is sent.\n *\n * @internal only meant for internal SDK usage\n * @hidden\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME = 'sentry.custom_span_name';\n\n/**\n * The id of the profile that this span occurred in.\n */\nexport const SEMANTIC_ATTRIBUTE_PROFILE_ID = 'sentry.profile_id';\n\nexport const SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME = 'sentry.exclusive_time';\n\nexport const SEMANTIC_ATTRIBUTE_CACHE_HIT = 'cache.hit';\n\nexport const SEMANTIC_ATTRIBUTE_CACHE_KEY = 'cache.key';\n\nexport const SEMANTIC_ATTRIBUTE_CACHE_ITEM_SIZE = 'cache.item_size';\n\n/** TODO: Remove these once we update to latest semantic conventions */\nexport const SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD = 'http.request.method';\nexport const SEMANTIC_ATTRIBUTE_URL_FULL = 'url.full';\n\n/**\n * A span link attribute to mark the link as a special span link.\n *\n * Known values:\n * - `previous_trace`: The span links to the frontend root span of the previous trace.\n * - `next_trace`: The span links to the frontend root span of the next trace. (Not set by the SDK)\n *\n * Other values may be set as appropriate.\n * @see https://develop.sentry.dev/sdk/telemetry/traces/span-links/#link-types\n */\nexport const SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE = 'sentry.link.type';\n\n/**\n * =============================================================================\n * GEN AI ATTRIBUTES\n * Based on OpenTelemetry Semantic Conventions for Generative AI\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/\n * =============================================================================\n */\n\n/**\n * The conversation ID for linking messages across API calls.\n * For OpenAI Assistants API: thread_id\n * For LangGraph: configurable.thread_id\n */\nexport const GEN_AI_CONVERSATION_ID_ATTRIBUTE = 'gen_ai.conversation.id';\n","import type { SerializedSession, Session, SessionContext, SessionStatus } from './types/session';\nimport { uuid4 } from './utils/misc';\nimport { timestampInSeconds } from './utils/time';\n\n/**\n * Creates a new `Session` object by setting certain default parameters. If optional @param context\n * is passed, the passed properties are applied to the session object.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns a new `Session` object\n */\nexport function makeSession(context?: Omit<SessionContext, 'started' | 'status'>): Session {\n  // Both timestamp and started are in seconds since the UNIX epoch.\n  const startingTime = timestampInSeconds();\n\n  const session: Session = {\n    sid: uuid4(),\n    init: true,\n    timestamp: startingTime,\n    started: startingTime,\n    duration: 0,\n    status: 'ok',\n    errors: 0,\n    ignoreDuration: false,\n    toJSON: () => sessionToJSON(session),\n  };\n\n  if (context) {\n    updateSession(session, context);\n  }\n\n  return session;\n}\n\n/**\n * Updates a session object with the properties passed in the context.\n *\n * Note that this function mutates the passed object and returns void.\n * (Had to do this instead of returning a new and updated session because closing and sending a session\n * makes an update to the session after it was passed to the sending logic.\n * @see Client.captureSession )\n *\n * @param session the `Session` to update\n * @param context the `SessionContext` holding the properties that should be updated in @param session\n */\n// eslint-disable-next-line complexity\nexport function updateSession(session: Session, context: SessionContext = {}): void {\n  if (context.user) {\n    if (!session.ipAddress && context.user.ip_address) {\n      session.ipAddress = context.user.ip_address;\n    }\n\n    if (!session.did && !context.did) {\n      session.did = context.user.id || context.user.email || context.user.username;\n    }\n  }\n\n  session.timestamp = context.timestamp || timestampInSeconds();\n\n  if (context.abnormal_mechanism) {\n    session.abnormal_mechanism = context.abnormal_mechanism;\n  }\n\n  if (context.ignoreDuration) {\n    session.ignoreDuration = context.ignoreDuration;\n  }\n  if (context.sid) {\n    // Good enough uuid validation. — Kamil\n    session.sid = context.sid.length === 32 ? context.sid : uuid4();\n  }\n  if (context.init !== undefined) {\n    session.init = context.init;\n  }\n  if (!session.did && context.did) {\n    session.did = `${context.did}`;\n  }\n  if (typeof context.started === 'number') {\n    session.started = context.started;\n  }\n  if (session.ignoreDuration) {\n    session.duration = undefined;\n  } else if (typeof context.duration === 'number') {\n    session.duration = context.duration;\n  } else {\n    const duration = session.timestamp - session.started;\n    session.duration = duration >= 0 ? duration : 0;\n  }\n  if (context.release) {\n    session.release = context.release;\n  }\n  if (context.environment) {\n    session.environment = context.environment;\n  }\n  if (!session.ipAddress && context.ipAddress) {\n    session.ipAddress = context.ipAddress;\n  }\n  if (!session.userAgent && context.userAgent) {\n    session.userAgent = context.userAgent;\n  }\n  if (typeof context.errors === 'number') {\n    session.errors = context.errors;\n  }\n  if (context.status) {\n    session.status = context.status;\n  }\n}\n\n/**\n * Closes a session by setting its status and updating the session object with it.\n * Internally calls `updateSession` to update the passed session object.\n *\n * Note that this function mutates the passed session (@see updateSession for explanation).\n *\n * @param session the `Session` object to be closed\n * @param status the `SessionStatus` with which the session was closed. If you don't pass a status,\n *               this function will keep the previously set status, unless it was `'ok'` in which case\n *               it is changed to `'exited'`.\n */\nexport function closeSession(session: Session, status?: Exclude<SessionStatus, 'ok'>): void {\n  let context = {};\n  if (status) {\n    context = { status };\n  } else if (session.status === 'ok') {\n    context = { status: 'exited' };\n  }\n\n  updateSession(session, context);\n}\n\n/**\n * Serializes a passed session object to a JSON object with a slightly different structure.\n * This is necessary because the Sentry backend requires a slightly different schema of a session\n * than the one the JS SDKs use internally.\n *\n * @param session the session to be converted\n *\n * @returns a JSON object of the passed session\n */\nfunction sessionToJSON(session: Session): SerializedSession {\n  return {\n    sid: `${session.sid}`,\n    init: session.init,\n    // Make sure that sec is converted to ms for date constructor\n    started: new Date(session.started * 1000).toISOString(),\n    timestamp: new Date(session.timestamp * 1000).toISOString(),\n    status: session.status,\n    errors: session.errors,\n    did: typeof session.did === 'number' || typeof session.did === 'string' ? `${session.did}` : undefined,\n    duration: session.duration,\n    abnormal_mechanism: session.abnormal_mechanism,\n    attrs: {\n      release: session.release,\n      environment: session.environment,\n      ip_address: session.ipAddress,\n      user_agent: session.userAgent,\n    },\n  };\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport { debug } from './debug-logger';\nimport { isString } from './is';\n\nexport const SENTRY_BAGGAGE_KEY_PREFIX = 'sentry-';\n\nexport const SENTRY_BAGGAGE_KEY_PREFIX_REGEX = /^sentry-/;\n\n/**\n * Max length of a serialized baggage string\n *\n * https://www.w3.org/TR/baggage/#limits\n */\nexport const MAX_BAGGAGE_STRING_LENGTH = 8192;\n\n/**\n * Takes a baggage header and turns it into Dynamic Sampling Context, by extracting all the \"sentry-\" prefixed values\n * from it.\n *\n * @param baggageHeader A very bread definition of a baggage header as it might appear in various frameworks.\n * @returns The Dynamic Sampling Context that was found on `baggageHeader`, if there was any, `undefined` otherwise.\n */\nexport function baggageHeaderToDynamicSamplingContext(\n  // Very liberal definition of what any incoming header might look like\n  baggageHeader: string | string[] | number | null | undefined | boolean,\n): Partial<DynamicSamplingContext> | undefined {\n  const baggageObject = parseBaggageHeader(baggageHeader);\n\n  if (!baggageObject) {\n    return undefined;\n  }\n\n  // Read all \"sentry-\" prefixed values out of the baggage object and put it onto a dynamic sampling context object.\n  const dynamicSamplingContext = Object.entries(baggageObject).reduce<Record<string, string>>((acc, [key, value]) => {\n    if (key.startsWith(SENTRY_BAGGAGE_KEY_PREFIX)) {\n      const nonPrefixedKey = key.slice(SENTRY_BAGGAGE_KEY_PREFIX.length);\n      acc[nonPrefixedKey] = value;\n    }\n    return acc;\n  }, {});\n\n  // Only return a dynamic sampling context object if there are keys in it.\n  // A keyless object means there were no sentry values on the header, which means that there is no DSC.\n  if (Object.keys(dynamicSamplingContext).length > 0) {\n    return dynamicSamplingContext as Partial<DynamicSamplingContext>;\n  } else {\n    return undefined;\n  }\n}\n\n/**\n * Turns a Dynamic Sampling Object into a baggage header by prefixing all the keys on the object with \"sentry-\".\n *\n * @param dynamicSamplingContext The Dynamic Sampling Context to turn into a header. For convenience and compatibility\n * with the `getDynamicSamplingContext` method on the Transaction class ,this argument can also be `undefined`. If it is\n * `undefined` the function will return `undefined`.\n * @returns a baggage header, created from `dynamicSamplingContext`, or `undefined` either if `dynamicSamplingContext`\n * was `undefined`, or if `dynamicSamplingContext` didn't contain any values.\n */\nexport function dynamicSamplingContextToSentryBaggageHeader(\n  // this also takes undefined for convenience and bundle size in other places\n  dynamicSamplingContext?: Partial<DynamicSamplingContext>,\n): string | undefined {\n  if (!dynamicSamplingContext) {\n    return undefined;\n  }\n\n  // Prefix all DSC keys with \"sentry-\" and put them into a new object\n  const sentryPrefixedDSC = Object.entries(dynamicSamplingContext).reduce<Record<string, string>>(\n    (acc, [dscKey, dscValue]) => {\n      if (dscValue) {\n        acc[`${SENTRY_BAGGAGE_KEY_PREFIX}${dscKey}`] = dscValue;\n      }\n      return acc;\n    },\n    {},\n  );\n\n  return objectToBaggageHeader(sentryPrefixedDSC);\n}\n\n/**\n * Take a baggage header and parse it into an object.\n */\nexport function parseBaggageHeader(\n  baggageHeader: string | string[] | number | null | undefined | boolean,\n): Record<string, string> | undefined {\n  if (!baggageHeader || (!isString(baggageHeader) && !Array.isArray(baggageHeader))) {\n    return undefined;\n  }\n\n  if (Array.isArray(baggageHeader)) {\n    // Combine all baggage headers into one object containing the baggage values so we can later read the Sentry-DSC-values from it\n    return baggageHeader.reduce<Record<string, string>>((acc, curr) => {\n      const currBaggageObject = baggageHeaderToObject(curr);\n      Object.entries(currBaggageObject).forEach(([key, value]) => {\n        acc[key] = value;\n      });\n      return acc;\n    }, {});\n  }\n\n  return baggageHeaderToObject(baggageHeader);\n}\n\n/**\n * Will parse a baggage header, which is a simple key-value map, into a flat object.\n *\n * @param baggageHeader The baggage header to parse.\n * @returns a flat object containing all the key-value pairs from `baggageHeader`.\n */\nfunction baggageHeaderToObject(baggageHeader: string): Record<string, string> {\n  return baggageHeader\n    .split(',')\n    .map(baggageEntry => {\n      const eqIdx = baggageEntry.indexOf('=');\n      if (eqIdx === -1) {\n        // Likely an invalid entry\n        return [];\n      }\n      const key = baggageEntry.slice(0, eqIdx);\n      const value = baggageEntry.slice(eqIdx + 1);\n      return [key, value].map(keyOrValue => {\n        try {\n          return decodeURIComponent(keyOrValue.trim());\n        } catch {\n          // We ignore errors here, e.g. if the value cannot be URL decoded.\n          // This will then be skipped in the next step\n          return;\n        }\n      });\n    })\n    .reduce<Record<string, string>>((acc, [key, value]) => {\n      if (key && value) {\n        acc[key] = value;\n      }\n      return acc;\n    }, {});\n}\n\n/**\n * Turns a flat object (key-value pairs) into a baggage header, which is also just key-value pairs.\n *\n * @param object The object to turn into a baggage header.\n * @returns a baggage header string, or `undefined` if the object didn't have any values, since an empty baggage header\n * is not spec compliant.\n */\nexport function objectToBaggageHeader(object: Record<string, string>): string | undefined {\n  if (Object.keys(object).length === 0) {\n    // An empty baggage header is not spec compliant: We return undefined.\n    return undefined;\n  }\n\n  return Object.entries(object).reduce((baggageHeader, [objectKey, objectValue], currentIndex) => {\n    const baggageEntry = `${encodeURIComponent(objectKey)}=${encodeURIComponent(objectValue)}`;\n    const newBaggageHeader = currentIndex === 0 ? baggageEntry : `${baggageHeader},${baggageEntry}`;\n    if (newBaggageHeader.length > MAX_BAGGAGE_STRING_LENGTH) {\n      DEBUG_BUILD &&\n        debug.warn(\n          `Not adding key: ${objectKey} with val: ${objectValue} to baggage header due to exceeding baggage size limits.`,\n        );\n      return baggageHeader;\n    } else {\n      return newBaggageHeader;\n    }\n  }, '');\n}\n\n/**\n * Merge two baggage headers into one.\n * - Sentry-specific entries (keys starting with \"sentry-\") from the new\n *   baggage take precedence\n * - Non-Sentry entries from existing baggage take precedence\n *\n * The order of the existing baggage will be preserved, and new entries will\n * be added to the end.\n *\n * This matches the behavior of OTEL's propagation.inject() which uses\n * `baggage.setEntry()`  to overwrite existing entries with the same key.\n */\nexport function mergeBaggageHeaders<Existing extends string | string[] | number | undefined>(\n  existing: Existing,\n  incoming: string,\n): string | undefined | Existing {\n  if (!existing) {\n    return incoming;\n  }\n\n  const existingEntries = parseBaggageHeader(existing);\n  const incomingEntries = parseBaggageHeader(incoming);\n\n  if (!incomingEntries) {\n    return existing;\n  }\n\n  // 1. All non-sentry entries from existing are kept\n  // 2. All sentry- entries from the new baggage are retained\n  // 3. If sentry- entries present in new, ignore from old, else keep from old.\n  // 4. Non-sentry entries from new are only kept if not in existing.\n\n  const merged: Record<string, string> = {};\n\n  // partition incoming entries into sentry and non-sentry prefixed\n  let hasNewSentryEntries = false;\n  const newSentryEntries: Record<string, string> = {};\n  const newNonSentryEntries: Record<string, string> = {};\n  for (const [key, value] of Object.entries(incomingEntries)) {\n    if (key.startsWith(SENTRY_BAGGAGE_KEY_PREFIX)) {\n      newSentryEntries[key] = value;\n      hasNewSentryEntries = true;\n    } else {\n      newNonSentryEntries[key] = value;\n    }\n  }\n\n  // If new baggage contains at least one sentry- value, we remove all old\n  // sentry- values otherwise, we keep old sentry- values. If we don't remove\n  // old sentry- values, we end up with an inconsistent dynamic sampling\n  // context propagation.\n  if (existingEntries) {\n    for (const [key, value] of Object.entries(existingEntries)) {\n      if (!hasNewSentryEntries || !key.startsWith(SENTRY_BAGGAGE_KEY_PREFIX)) {\n        merged[key] = value;\n      }\n    }\n  }\n\n  // Assign new sentry fields.\n  if (hasNewSentryEntries) {\n    Object.assign(merged, newSentryEntries);\n  }\n\n  // assign new non-sentry fields not found on existing object.\n  for (const [key, value] of Object.entries(newNonSentryEntries)) {\n    merged[key] ??= value;\n  }\n\n  return objectToBaggageHeader(merged);\n}\n","import { getClient } from '../currentScopes';\nimport type { CoreOptions } from '../types/options';\n\n// Treeshakable guard to remove all code related to tracing\ndeclare const __SENTRY_TRACING__: boolean | undefined;\n\n/**\n * Determines if span recording is currently enabled.\n *\n * Spans are recorded when at least one of `tracesSampleRate` and `tracesSampler`\n * is defined in the SDK config. This function does not make any assumption about\n * sampling decisions, it only checks if the SDK is configured to record spans.\n *\n * Important: This function only determines if span recording is enabled. Trace\n * continuation and propagation is separately controlled and not covered by this function.\n * If this function returns `false`, traces can still be propagated (which is what\n * we refer to by \"Tracing without Performance\")\n * @see https://develop.sentry.dev/sdk/telemetry/traces/tracing-without-performance/\n *\n * @param maybeOptions An SDK options object to be passed to this function.\n * If this option is not provided, the function will use the current client's options.\n */\nexport function hasSpansEnabled(\n  maybeOptions?: Pick<CoreOptions, 'tracesSampleRate' | 'tracesSampler'> | undefined,\n): boolean {\n  if (typeof __SENTRY_TRACING__ === 'boolean' && !__SENTRY_TRACING__) {\n    return false;\n  }\n\n  const options = maybeOptions || getClient()?.getOptions();\n  return (\n    !!options &&\n    // Note: This check is `!= null`, meaning \"nullish\". `0` is not \"nullish\", `undefined` and `null` are. (This comment was brought to you by 15 minutes of questioning life)\n    (options.tracesSampleRate != null || !!options.tracesSampler)\n  );\n}\n","import type { EventDropReason } from '../types/clientreport';\nimport type {\n  SentrySpanArguments,\n  Span,\n  SpanAttributes,\n  SpanAttributeValue,\n  SpanContextData,\n  SpanTimeInput,\n} from '../types/span';\nimport type { SpanStatus } from '../types/spanStatus';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { generateSpanId, generateTraceId } from '../utils/propagationContext';\nimport { TRACE_FLAG_NONE } from '../utils/spanUtils';\n\ninterface SentryNonRecordingSpanArguments extends SentrySpanArguments {\n  dropReason?: EventDropReason;\n}\n\n// Brand used to detect non-recording spans via {@link spanIsNonRecordingSpan} without `instanceof`,\n// which is brittle when `@sentry/core` is duplicated across packages. We use `Symbol.for` so the key\n// is shared across copies of the module, and so user payloads (e.g. JSON) cannot spoof the marker.\nconst NON_RECORDING_SPAN_FIELD = Symbol.for('sentry.nonRecordingSpan');\n\n/**\n * A Sentry Span that is non-recording, meaning it will not be sent to Sentry.\n */\nexport class SentryNonRecordingSpan implements Span {\n  private _traceId: string;\n  private _spanId: string;\n\n  /**\n   * Reason why this span was dropped, if applicable ('ignored' or 'sample_rate').\n   * Used to propagate the correct client report outcome to descendant spans\n   * when span streaming is enabled.\n   */\n  public dropReason?: EventDropReason;\n\n  public constructor(spanContext: SentryNonRecordingSpanArguments = {}) {\n    this._traceId = spanContext.traceId || generateTraceId();\n    this._spanId = spanContext.spanId || generateSpanId();\n    this.dropReason = spanContext.dropReason;\n    addNonEnumerableProperty(this, NON_RECORDING_SPAN_FIELD, true);\n  }\n\n  /** @inheritdoc */\n  public spanContext(): SpanContextData {\n    return {\n      spanId: this._spanId,\n      traceId: this._traceId,\n      traceFlags: TRACE_FLAG_NONE,\n    };\n  }\n\n  /** @inheritdoc */\n  public end(_timestamp?: SpanTimeInput): void {}\n\n  /** @inheritdoc */\n  public setAttribute(_key: string, _value: SpanAttributeValue | undefined): this {\n    return this;\n  }\n\n  /** @inheritdoc */\n  public setAttributes(_values: SpanAttributes): this {\n    return this;\n  }\n\n  /** @inheritdoc */\n  public setStatus(_status: SpanStatus): this {\n    return this;\n  }\n\n  /** @inheritdoc */\n  public updateName(_name: string): this {\n    return this;\n  }\n\n  /** @inheritdoc */\n  public isRecording(): boolean {\n    return false;\n  }\n\n  /** @inheritdoc */\n  public addEvent(\n    _name: string,\n    _attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n    _startTime?: SpanTimeInput,\n  ): this {\n    return this;\n  }\n\n  /** @inheritDoc */\n  public addLink(_link: unknown): this {\n    return this;\n  }\n\n  /** @inheritDoc */\n  public addLinks(_links: unknown[]): this {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but we need it for being compliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n  public recordException(_exception: unknown, _time?: SpanTimeInput | undefined): void {\n    // noop\n  }\n}\n\n/**\n * Whether the given span is a {@link SentryNonRecordingSpan}.\n */\nexport function spanIsNonRecordingSpan(span: Span | undefined): span is SentryNonRecordingSpan {\n  return !!span && (span as { [NON_RECORDING_SPAN_FIELD]?: boolean })[NON_RECORDING_SPAN_FIELD] === true;\n}\n","import type { Client } from '../client';\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getClient } from '../currentScopes';\nimport type { Scope } from '../scope';\nimport {\n  SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE,\n  SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n  SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport type { Span } from '../types/span';\nimport { baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader } from '../utils/baggage';\nimport { extractOrgIdFromClient } from '../utils/dsn';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\nimport { spanIsNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { getCapturedScopesOnSpan } from './utils';\n\n/**\n * If you change this value, also update the terser plugin config to\n * avoid minification of the object property!\n */\nconst FROZEN_DSC_FIELD = '_frozenDsc';\n\ntype SpanWithMaybeDsc = Span & {\n  [FROZEN_DSC_FIELD]?: Partial<DynamicSamplingContext> | undefined;\n};\n\n/**\n * Freeze the given DSC on the given span.\n */\nexport function freezeDscOnSpan(span: Span, dsc: Partial<DynamicSamplingContext>): void {\n  const spanWithMaybeDsc = span as SpanWithMaybeDsc;\n  addNonEnumerableProperty(spanWithMaybeDsc, FROZEN_DSC_FIELD, dsc);\n}\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nexport function getDynamicSamplingContextFromClient(trace_id: string, client: Client): DynamicSamplingContext {\n  const options = client.getOptions();\n\n  const { publicKey: public_key } = client.getDsn() || {};\n\n  // Instead of conditionally adding non-undefined values, we add them and then remove them if needed\n  // otherwise, the order of baggage entries changes, which \"breaks\" a bunch of tests etc.\n  const dsc: DynamicSamplingContext = {\n    environment: options.environment || DEFAULT_ENVIRONMENT,\n    release: options.release,\n    public_key,\n    trace_id,\n    org_id: extractOrgIdFromClient(client),\n  };\n\n  client.emit('createDsc', dsc);\n\n  return dsc;\n}\n\n/**\n * Get the dynamic sampling context for the currently active scopes.\n */\nexport function getDynamicSamplingContextFromScope(client: Client, scope: Scope): Partial<DynamicSamplingContext> {\n  const propagationContext = scope.getPropagationContext();\n  return propagationContext.dsc || getDynamicSamplingContextFromClient(propagationContext.traceId, client);\n}\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nexport function getDynamicSamplingContextFromSpan(span: Span): Readonly<Partial<DynamicSamplingContext>> {\n  const client = getClient();\n  if (!client) {\n    return {};\n  }\n\n  const rootSpan = getRootSpan(span);\n  const rootSpanJson = spanToJSON(rootSpan);\n  const rootSpanAttributes = rootSpanJson.data;\n  const traceState = rootSpan.spanContext().traceState;\n\n  // The span sample rate that was locally applied to the root span should also always be applied to the DSC, even if the DSC is frozen.\n  // This is so that the downstream traces/services can use parentSampleRate in their `tracesSampler` to make consistent sampling decisions across the entire trace.\n  const rootSpanSampleRate =\n    traceState?.get('sentry.sample_rate') ??\n    rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE] ??\n    rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE];\n\n  function applyLocalSampleRateToDsc(dsc: Partial<DynamicSamplingContext>): Partial<DynamicSamplingContext> {\n    if (typeof rootSpanSampleRate === 'number' || typeof rootSpanSampleRate === 'string') {\n      dsc.sample_rate = `${rootSpanSampleRate}`;\n    }\n    return dsc;\n  }\n\n  // For core implementation, we freeze the DSC onto the span as a non-enumerable property\n  const frozenDsc = (rootSpan as SpanWithMaybeDsc)[FROZEN_DSC_FIELD];\n  if (frozenDsc) {\n    return applyLocalSampleRateToDsc(frozenDsc);\n  }\n\n  // For a non-recording placeholder in Tracing without Performance (TwP) mode, the DSC is not\n  // carried on the span; the scope is the source of truth. Resolve it from the span's captured\n  // scope: continued traces keep the incoming DSC, new traces derive it from the client.\n  //\n  // We gate this on `!hasSpansEnabled()` so it mirrors the `sentry-trace` source in `getTraceData`:\n  // with tracing enabled, a non-recording span (e.g. an `onlyIfParent` placeholder) keeps deriving\n  // its DSC from the span/client so the baggage agrees with the `-0` decision that `spanToTraceHeader`\n  // encodes for `sentry-trace`. Without this guard the two headers can disagree.\n  //\n  // We spread into a new object so applying the local sample rate can't mutate the scope's DSC.\n  if (spanIsNonRecordingSpan(rootSpan) && !hasSpansEnabled(client.getOptions())) {\n    const capturedScope = getCapturedScopesOnSpan(rootSpan).scope;\n    if (capturedScope) {\n      return applyLocalSampleRateToDsc({ ...getDynamicSamplingContextFromScope(client, capturedScope) });\n    }\n  }\n\n  // For OpenTelemetry, we freeze the DSC on the trace state\n  const traceStateDsc = traceState?.get('sentry.dsc');\n\n  // If the span has a DSC, we want it to take precedence\n  const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);\n\n  if (dscOnTraceState) {\n    return applyLocalSampleRateToDsc(dscOnTraceState);\n  }\n\n  // Else, we generate it from the span\n  const dsc = getDynamicSamplingContextFromClient(span.spanContext().traceId, client);\n\n  // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n  // TODO(v11): Only read `SEMANTIC_ATTRIBUTE_SENTRY_SOURCE` again, once we renamed it to `sentry.span.source`\n  const source = rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] ?? rootSpanAttributes['sentry.span.source'];\n\n  // after JSON conversion, txn.name becomes jsonSpan.description\n  const name = rootSpanJson.description;\n  if (source !== 'url' && name) {\n    dsc.transaction = name;\n  }\n\n  // How can we even land here with hasSpansEnabled() returning false?\n  // Otel creates a Non-recording span in Tracing Without Performance mode when handling incoming requests\n  // So we end up with an active span that is not sampled (neither positively nor negatively)\n  if (hasSpansEnabled()) {\n    dsc.sampled = String(spanIsSampled(rootSpan));\n    dsc.sample_rand =\n      // In OTEL we store the sample rand on the trace state because we cannot access scopes for NonRecordingSpans\n      // The Sentry OTEL SpanSampler takes care of writing the sample rand on the root span\n      traceState?.get('sentry.sample_rand') ??\n      // On all other platforms we can actually get the scopes from a root span (we use this as a fallback)\n      getCapturedScopesOnSpan(rootSpan).scope?.getPropagationContext().sampleRand.toString();\n  }\n\n  applyLocalSampleRateToDsc(dsc);\n\n  client.emit('createDsc', dsc, rootSpan);\n\n  return dsc;\n}\n\n/**\n * Convert a Span to a baggage header.\n */\nexport function spanToBaggageHeader(span: Span): string | undefined {\n  const dsc = getDynamicSamplingContextFromSpan(span);\n  return dynamicSamplingContextToSentryBaggageHeader(dsc);\n}\n","import type { Scope } from '../scope';\nimport type { Span } from '../types/span';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { derefWeakRef, makeWeakRef, type MaybeWeakRef } from '../utils/weakRef';\n\nconst SCOPE_ON_START_SPAN_FIELD = '_sentryScope';\nconst ISOLATION_SCOPE_ON_START_SPAN_FIELD = '_sentryIsolationScope';\n\n// Brand marking a span whose `sentry.source` should be inferred OTel-style at span end (by\n// `applyOtelSpanData`) rather than pinned. `SentryTraceProvider` sets it on the spans it creates\n// so they behave like OTel SDK spans, which carry no Sentry source concept. We use `Symbol.for`\n// so the key is shared across duplicated copies of `@sentry/core`.\nconst OTEL_SOURCE_INFERENCE_SPAN_FIELD = Symbol.for('sentry.otelSourceInference');\n\ntype SpanWithScopes = Span & {\n  [SCOPE_ON_START_SPAN_FIELD]?: Scope;\n  [ISOLATION_SCOPE_ON_START_SPAN_FIELD]?: MaybeWeakRef<Scope>;\n};\n\ntype SpanWithOtelSourceInference = Span & {\n  [OTEL_SOURCE_INFERENCE_SPAN_FIELD]?: boolean;\n};\n\n/** Store the scope & isolation scope for a span, which can the be used when it is finished. */\nexport function setCapturedScopesOnSpan(span: Span | undefined, scope: Scope, isolationScope: Scope): void {\n  if (span) {\n    addNonEnumerableProperty(span, ISOLATION_SCOPE_ON_START_SPAN_FIELD, makeWeakRef(isolationScope));\n    // We don't wrap the scope with a WeakRef here because webkit aggressively garbage collects\n    // and scopes are not held in memory for long periods of time.\n    addNonEnumerableProperty(span, SCOPE_ON_START_SPAN_FIELD, scope);\n  }\n}\n\n/**\n * Grabs the scope and isolation scope off a span that were active when the span was started.\n * If WeakRef was used and scopes have been garbage collected, returns undefined for those scopes.\n */\nexport function getCapturedScopesOnSpan(span: Span): { scope?: Scope; isolationScope?: Scope } {\n  const spanWithScopes = span as SpanWithScopes;\n\n  return {\n    scope: spanWithScopes[SCOPE_ON_START_SPAN_FIELD],\n    isolationScope: derefWeakRef(spanWithScopes[ISOLATION_SCOPE_ON_START_SPAN_FIELD]),\n  };\n}\n\n/**\n * Mark a span as eligible for OTel-style `sentry.source` inference at span end.\n * Set by `SentryTraceProvider` on the spans it creates; read by `SentrySpan.updateName()` and\n * `applyOtelSpanData()`.\n */\nexport function markSpanForOtelSourceInference(span: Span): void {\n  addNonEnumerableProperty(span, OTEL_SOURCE_INFERENCE_SPAN_FIELD, true);\n}\n\n/** Whether a span is marked for OTel-style `sentry.source` inference (see {@link markSpanForOtelSourceInference}). */\nexport function spanShouldInferOtelSource(span: Span): boolean {\n  return (span as SpanWithOtelSourceInference)[OTEL_SOURCE_INFERENCE_SPAN_FIELD] === true;\n}\n","import { getGlobalSingleton } from '../carrier';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { ConsoleLevel } from '../types/instrument';\nimport { GLOBAL_OBJ } from './worldwide';\n\nexport interface SentryDebugLogger {\n  disable(): void;\n  enable(): void;\n  isEnabled(): boolean;\n  log(...args: Parameters<typeof console.log>): void;\n  warn(...args: Parameters<typeof console.warn>): void;\n  error(...args: Parameters<typeof console.error>): void;\n}\n\nexport const CONSOLE_LEVELS: readonly ConsoleLevel[] = [\n  'debug',\n  'info',\n  'warn',\n  'error',\n  'log',\n  'assert',\n  'trace',\n] as const;\n\n/** Prefix for logging strings */\nconst PREFIX = 'Sentry Logger ';\n\n/** This may be mutated by the console instrumentation. */\nexport const originalConsoleMethods: Partial<{\n  log(...args: Parameters<typeof console.log>): void;\n  info(...args: Parameters<typeof console.info>): void;\n  warn(...args: Parameters<typeof console.warn>): void;\n  error(...args: Parameters<typeof console.error>): void;\n  debug(...args: Parameters<typeof console.debug>): void;\n  assert(...args: Parameters<typeof console.assert>): void;\n  trace(...args: Parameters<typeof console.trace>): void;\n}> = {};\n\n/**\n * Temporarily disable sentry console instrumentations.\n *\n * @param callback The function to run against the original `console` messages\n * @returns The results of the callback\n */\nexport function consoleSandbox<T>(callback: () => T): T {\n  if (!('console' in GLOBAL_OBJ)) {\n    return callback();\n  }\n\n  const console = GLOBAL_OBJ.console;\n  const wrappedFuncs: Partial<Record<ConsoleLevel, (...args: unknown[]) => void>> = {};\n\n  const wrappedLevels = Object.keys(originalConsoleMethods) as ConsoleLevel[];\n\n  // Restore all wrapped console methods\n  wrappedLevels.forEach(level => {\n    const originalConsoleMethod = originalConsoleMethods[level];\n    wrappedFuncs[level] = console[level] as (...args: unknown[]) => void;\n    console[level] = originalConsoleMethod as (...args: unknown[]) => void;\n  });\n\n  try {\n    return callback();\n  } finally {\n    // Revert restoration to wrapped state\n    wrappedLevels.forEach(level => {\n      console[level] = wrappedFuncs[level] as (...args: unknown[]) => void;\n    });\n  }\n}\n\nfunction enable(): void {\n  _getLoggerSettings().enabled = true;\n}\n\nfunction disable(): void {\n  _getLoggerSettings().enabled = false;\n}\n\nfunction isEnabled(): boolean {\n  return _getLoggerSettings().enabled;\n}\n\nfunction log(...args: Parameters<typeof console.log>): void {\n  _maybeLog('log', ...args);\n}\n\nfunction warn(...args: Parameters<typeof console.warn>): void {\n  _maybeLog('warn', ...args);\n}\n\nfunction error(...args: Parameters<typeof console.error>): void {\n  _maybeLog('error', ...args);\n}\n\nfunction _maybeLog(level: ConsoleLevel, ...args: Parameters<(typeof console)[typeof level]>): void {\n  if (!DEBUG_BUILD) {\n    return;\n  }\n\n  if (isEnabled()) {\n    consoleSandbox(() => {\n      GLOBAL_OBJ.console[level](`${PREFIX}[${level}]:`, ...args);\n    });\n  }\n}\n\nfunction _getLoggerSettings(): { enabled: boolean } {\n  if (!DEBUG_BUILD) {\n    return { enabled: false };\n  }\n\n  return getGlobalSingleton('loggerSettings', () => ({ enabled: false }));\n}\n\n/**\n * This is a logger singleton which either logs things or no-ops if logging is not enabled.\n */\nexport const debug = {\n  /** Enable logging. */\n  enable,\n  /** Disable logging. */\n  disable,\n  /** Check if logging is enabled. */\n  isEnabled,\n  /** Log a message. */\n  log,\n  /** Log a warning. */\n  warn,\n  /** Log an error. */\n  error,\n} satisfies SentryDebugLogger;\n","import type { Client } from '../client';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { DsnComponents, DsnLike, DsnProtocol } from '../types/dsn';\nimport { consoleSandbox, debug } from './debug-logger';\n\n/** Regular expression used to extract org ID from a DSN host. */\nconst ORG_ID_REGEX = /^o(\\d+)\\./;\n\n/** Regular expression used to parse a Dsn. */\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+)?)?@)((?:\\[[:.%\\w]+\\]|[\\w.-]+))(?::(\\d+))?\\/(.+)/;\n\nfunction isValidProtocol(protocol?: string): protocol is DsnProtocol {\n  return protocol === 'http' || protocol === 'https';\n}\n\n/**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\nexport function dsnToString(dsn: DsnComponents, withPassword: boolean = false): string {\n  const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n  return (\n    `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : ''}` +\n    `@${host}${port ? `:${port}` : ''}/${path ? `${path}/` : path}${projectId}`\n  );\n}\n\n/**\n * Parses a Dsn from a given string.\n *\n * @param str A Dsn as string\n * @returns Dsn as DsnComponents or undefined if @param str is not a valid DSN string\n */\nexport function dsnFromString(str: string): DsnComponents | undefined {\n  const match = DSN_REGEX.exec(str);\n\n  if (!match) {\n    // This should be logged to the console\n    consoleSandbox(() => {\n      // eslint-disable-next-line no-console\n      console.error(`Invalid Sentry Dsn: ${str}`);\n    });\n    return undefined;\n  }\n\n  const [protocol, publicKey, pass = '', host = '', port = '', lastPath = ''] = match.slice(1);\n  let path = '';\n  let projectId = lastPath;\n\n  const split = projectId.split('/');\n  if (split.length > 1) {\n    path = split.slice(0, -1).join('/');\n    projectId = split.pop() as string;\n  }\n\n  if (projectId) {\n    const projectMatch = projectId.match(/^\\d+/);\n    if (projectMatch) {\n      projectId = projectMatch[0];\n    }\n  }\n\n  return dsnFromComponents({ host, pass, path, projectId, port, protocol: protocol as DsnProtocol, publicKey });\n}\n\nfunction dsnFromComponents(components: DsnComponents): DsnComponents {\n  return {\n    protocol: components.protocol,\n    publicKey: components.publicKey || '',\n    pass: components.pass || '',\n    host: components.host,\n    port: components.port || '',\n    path: components.path || '',\n    projectId: components.projectId,\n  };\n}\n\nfunction validateDsn(dsn: DsnComponents): boolean {\n  if (!DEBUG_BUILD) {\n    return true;\n  }\n\n  const { port, projectId, protocol } = dsn;\n\n  const requiredComponents: ReadonlyArray<keyof DsnComponents> = ['protocol', 'publicKey', 'host', 'projectId'];\n  const hasMissingRequiredComponent = requiredComponents.find(component => {\n    if (!dsn[component]) {\n      debug.error(`Invalid Sentry Dsn: ${component} missing`);\n      return true;\n    }\n    return false;\n  });\n\n  if (hasMissingRequiredComponent) {\n    return false;\n  }\n\n  if (!projectId.match(/^\\d+$/)) {\n    debug.error(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n    return false;\n  }\n\n  if (!isValidProtocol(protocol)) {\n    debug.error(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n    return false;\n  }\n\n  if (port && isNaN(parseInt(port, 10))) {\n    debug.error(`Invalid Sentry Dsn: Invalid port ${port}`);\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Extract the org ID from a DSN host.\n *\n * @param host The host from a DSN\n * @returns The org ID if found, undefined otherwise\n */\nexport function extractOrgIdFromDsnHost(host: string): string | undefined {\n  const match = host.match(ORG_ID_REGEX);\n\n  return match?.[1];\n}\n\n/**\n *  Returns the organization ID of the client.\n *\n *  The organization ID is extracted from the DSN. If the client options include a `orgId`, this will always take precedence.\n */\nexport function extractOrgIdFromClient(client: Client): string | undefined {\n  const options = client.getOptions();\n\n  const { host } = client.getDsn() || {};\n\n  let org_id: string | undefined;\n\n  if (options.orgId) {\n    org_id = String(options.orgId);\n  } else if (host) {\n    org_id = extractOrgIdFromDsnHost(host);\n  }\n\n  return org_id;\n}\n\n/**\n * Creates a valid Sentry Dsn object, identifying a Sentry instance and project.\n * @returns a valid DsnComponents object or `undefined` if @param from is an invalid DSN source\n */\nexport function makeDsn(from: DsnLike): DsnComponents | undefined {\n  const components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from);\n  if (!components || !validateDsn(components)) {\n    return undefined;\n  }\n  return components;\n}\n","/*\n * This module exists for optimizations in the build process through rollup and terser.  We define some global\n * constants, which can be overridden during build. By guarding certain pieces of code with functions that return these\n * constants, we can control whether or not they appear in the final bundle. (Any code guarded by a false condition will\n * never run, and will hence be dropped during treeshaking.) The two primary uses for this are stripping out calls to\n * `debug` and preventing node-related code from appearing in browser bundles.\n *\n * Attention:\n * This file should not be used to define constants/flags that are intended to be used for tree-shaking conducted by\n * users. These flags should live in their respective packages, as we identified user tooling (specifically webpack)\n * having issues tree-shaking these constants across package boundaries.\n * An example for this is the __SENTRY_DEBUG__ constant. It is declared in each package individually because we want\n * users to be able to shake away expressions that it guards.\n */\n\ndeclare const __SENTRY_BROWSER_BUNDLE__: boolean | undefined;\n\nexport type SdkSource = 'npm' | 'cdn' | 'loader' | 'aws-lambda-layer';\n\n/**\n * Figures out if we're building a browser bundle.\n *\n * @returns true if this is a browser bundle build.\n */\nexport function isBrowserBundle(): boolean {\n  return typeof __SENTRY_BROWSER_BUNDLE__ !== 'undefined' && !!__SENTRY_BROWSER_BUNDLE__;\n}\n\n/**\n * Get source of SDK.\n */\nexport function getSDKSource(): SdkSource {\n  // The `/*! ... */` marker is replaced by our CDN bundle build step with `return 'cdn';`.\n  // It uses the `/*!` legal-comment syntax specifically so it survives esbuild's transpile\n  // (which strips ordinary `/* ... */` block comments).\n  /*! __SENTRY_SDK_SOURCE__ */ return 'npm';\n}\n","import { getSentryCarrier } from '../carrier';\nimport type { Attachment } from '../types/attachment';\nimport type { DataCategory } from '../types/datacategory';\nimport type { DsnComponents } from '../types/dsn';\nimport type {\n  AttachmentItem,\n  BaseEnvelopeHeaders,\n  BaseEnvelopeItemHeaders,\n  Envelope,\n  EnvelopeItemType,\n  EventEnvelopeHeaders,\n  SpanItem,\n} from '../types/envelope';\nimport type { Event } from '../types/event';\nimport type { SdkInfo } from '../types/sdkinfo';\nimport type { SdkMetadata } from '../types/sdkmetadata';\nimport type { SpanJSON } from '../types/span';\nimport { dsnToString } from './dsn';\nimport { normalize } from './normalize';\nimport { safeDateNow } from './randomSafeContext';\nimport { GLOBAL_OBJ } from './worldwide';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function createEnvelope<E extends Envelope>(headers: E[0], items: E[1] = []): E {\n  return [headers, items] as E;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function addItemToEnvelope<E extends Envelope>(envelope: E, newItem: E[1][number]): E {\n  const [headers, items] = envelope;\n  return [headers, [...items, newItem]] as unknown as E;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n *\n * If the callback returns true, the rest of the items will be skipped.\n */\nexport function forEachEnvelopeItem<E extends Envelope>(\n  envelope: Envelope,\n  callback: (envelopeItem: E[1][number], envelopeItemType: E[1][number][0]['type']) => boolean | void,\n): boolean {\n  const envelopeItems = envelope[1];\n\n  for (const envelopeItem of envelopeItems) {\n    const envelopeItemType = envelopeItem[0].type;\n    const result = callback(envelopeItem, envelopeItemType);\n\n    if (result) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Returns true if the envelope contains any of the given envelope item types\n */\nexport function envelopeContainsItemType(envelope: Envelope, types: EnvelopeItemType[]): boolean {\n  return forEachEnvelopeItem(envelope, (_, type) => types.includes(type));\n}\n\n/**\n * Encode a string to UTF8 array.\n */\nfunction encodeUTF8(input: string): Uint8Array {\n  const carrier = getSentryCarrier(GLOBAL_OBJ);\n  return carrier.encodePolyfill ? carrier.encodePolyfill(input) : new TextEncoder().encode(input);\n}\n\n/**\n * Decode a UTF8 array to string.\n */\nfunction decodeUTF8(input: Uint8Array): string {\n  const carrier = getSentryCarrier(GLOBAL_OBJ);\n  return carrier.decodePolyfill ? carrier.decodePolyfill(input) : new TextDecoder().decode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nexport function serializeEnvelope(envelope: Envelope): string | Uint8Array {\n  const [envHeaders, items] = envelope;\n  // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n  let parts: string | Uint8Array[] = JSON.stringify(envHeaders);\n\n  function append(next: string | Uint8Array): void {\n    if (typeof parts === 'string') {\n      parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts), next];\n    } else {\n      parts.push(typeof next === 'string' ? encodeUTF8(next) : next);\n    }\n  }\n\n  for (const item of items) {\n    const [itemHeaders, payload] = item;\n\n    append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n\n    if (typeof payload === 'string' || payload instanceof Uint8Array) {\n      append(payload);\n    } else {\n      let stringifiedPayload: string;\n      try {\n        stringifiedPayload = JSON.stringify(payload);\n      } catch {\n        // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.stringify()` still\n        // fails, we try again after normalizing it again with infinite normalization depth. This of course has a\n        // performance impact but in this case a performance hit is better than throwing.\n        stringifiedPayload = JSON.stringify(normalize(payload));\n      }\n      append(stringifiedPayload);\n    }\n  }\n\n  return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers: Uint8Array[]): Uint8Array {\n  const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n  const merged = new Uint8Array(totalLength);\n  let offset = 0;\n  for (const buffer of buffers) {\n    merged.set(buffer, offset);\n    offset += buffer.length;\n  }\n\n  return merged;\n}\n\n/**\n * Parses an envelope\n */\nexport function parseEnvelope(env: string | Uint8Array): Envelope {\n  let buffer = typeof env === 'string' ? encodeUTF8(env) : env;\n\n  function readBinary(length: number): Uint8Array {\n    const bin = buffer.subarray(0, length);\n    // Replace the buffer with the remaining data excluding trailing newline\n    buffer = buffer.subarray(length + 1);\n    return bin;\n  }\n\n  function readJson<T>(): T {\n    let i = buffer.indexOf(0xa);\n    // If we couldn't find a newline, we must have found the end of the buffer\n    if (i < 0) {\n      i = buffer.length;\n    }\n\n    return JSON.parse(decodeUTF8(readBinary(i))) as T;\n  }\n\n  const envelopeHeader = readJson<BaseEnvelopeHeaders>();\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const items: [any, any][] = [];\n\n  while (buffer.length) {\n    const itemHeader = readJson<BaseEnvelopeItemHeaders>();\n    const binaryLength = typeof itemHeader.length === 'number' ? itemHeader.length : undefined;\n\n    items.push([itemHeader, binaryLength ? readBinary(binaryLength) : readJson()]);\n  }\n\n  return [envelopeHeader, items];\n}\n\n/**\n * Creates envelope item for a single span\n */\nexport function createSpanEnvelopeItem(spanJson: Partial<SpanJSON>): SpanItem {\n  const spanHeaders: SpanItem[0] = {\n    type: 'span',\n  };\n\n  return [spanHeaders, spanJson];\n}\n\n/**\n * Creates attachment envelope items\n */\nexport function createAttachmentEnvelopeItem(attachment: Attachment): AttachmentItem {\n  const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data) : attachment.data;\n\n  return [\n    {\n      type: 'attachment',\n      length: buffer.length,\n      filename: attachment.filename,\n      content_type: attachment.contentType,\n      attachment_type: attachment.attachmentType,\n    },\n    buffer,\n  ];\n}\n\ntype OverriddenItemType = Exclude<EnvelopeItemType, DataCategory>;\n\n// Map of envelope item types to data categories where the category differs from the type.\n// Types that map to themselves (session, attachment, transaction, profile, feedback, span, metric) fall through.\nconst DATA_CATEGORY_OVERRIDES: Record<OverriddenItemType, DataCategory> = {\n  sessions: 'session',\n  event: 'error',\n  client_report: 'internal',\n  user_report: 'default',\n  profile_chunk: 'profile',\n  replay_event: 'replay',\n  replay_recording: 'replay',\n  check_in: 'monitor',\n  raw_security: 'security',\n  log: 'log_item',\n  trace_metric: 'metric',\n};\n\nfunction _isOverriddenType(type: EnvelopeItemType): type is OverriddenItemType {\n  return type in DATA_CATEGORY_OVERRIDES;\n}\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nexport function envelopeItemTypeToDataCategory(type: EnvelopeItemType): DataCategory {\n  return _isOverriddenType(type) ? DATA_CATEGORY_OVERRIDES[type] : type;\n}\n\n/** Extracts the minimal SDK info from the metadata or an events */\nexport function getSdkMetadataForEnvelopeHeader(metadataOrEvent?: SdkMetadata | Event): SdkInfo | undefined {\n  if (!metadataOrEvent?.sdk) {\n    return;\n  }\n  const { name, version } = metadataOrEvent.sdk;\n  return { name, version };\n}\n\n/**\n * Creates event envelope headers, based on event, sdk info and tunnel\n * Note: This function was extracted from the core package to make it available in Replay\n */\nexport function createEventEnvelopeHeaders(\n  event: Event,\n  sdkInfo: SdkInfo | undefined,\n  tunnel: string | undefined,\n  dsn?: DsnComponents,\n): EventEnvelopeHeaders {\n  const dynamicSamplingContext = event.sdkProcessingMetadata?.dynamicSamplingContext;\n  return {\n    event_id: event.event_id as string,\n    sent_at: new Date(safeDateNow()).toISOString(),\n    ...(sdkInfo && { sdk: sdkInfo }),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n    ...(dynamicSamplingContext && {\n      trace: dynamicSamplingContext,\n    }),\n  };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { Primitive } from '../types/misc';\nimport type { ParameterizedString } from '../types/parameterize';\nimport type { PolymorphicEvent } from '../types/polymorphics';\nimport type { VNode, VueViewModel } from '../types/vue';\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst objectToString = Object.prototype.toString;\n\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isError(wat: unknown): wat is Error {\n  switch (objectToString.call(wat)) {\n    case '[object Error]':\n    case '[object Exception]':\n    case '[object DOMException]':\n    case '[object WebAssembly.Exception]':\n      return true;\n    default:\n      return isInstanceOf(wat, Error);\n  }\n}\n/**\n * Checks whether given value is an instance of the given built-in class.\n *\n * @param wat The value to be checked\n * @param className\n * @returns A boolean representing the result.\n */\nfunction isBuiltin(wat: unknown, className: string): boolean {\n  return objectToString.call(wat) === `[object ${className}]`;\n}\n\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isErrorEvent(wat: unknown): boolean {\n  return isBuiltin(wat, 'ErrorEvent');\n}\n\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMError(wat: unknown): boolean {\n  return isBuiltin(wat, 'DOMError');\n}\n\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMException(wat: unknown): boolean {\n  return isBuiltin(wat, 'DOMException');\n}\n\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isString(wat: unknown): wat is string {\n  return isBuiltin(wat, 'String');\n}\n\n/**\n * Checks whether given string is parameterized\n * {@link isParameterizedString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isParameterizedString(wat: unknown): wat is ParameterizedString {\n  return (\n    typeof wat === 'object' &&\n    wat !== null &&\n    '__sentry_template_string__' in wat &&\n    '__sentry_template_values__' in wat\n  );\n}\n\n/**\n * Checks whether given value is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat: unknown): wat is Primitive {\n  return wat === null || isParameterizedString(wat) || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n\n/**\n * Checks whether given value's type is an object literal, or a class instance.\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPlainObject(wat: unknown): wat is Record<string, unknown> {\n  return isBuiltin(wat, 'Object');\n}\n\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isEvent(wat: unknown): wat is PolymorphicEvent {\n  return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n * @deprecated This is browser-specific and will be removed from `@sentry/core` in a future major version.\n * Import `isElement` from `@sentry/browser-utils` instead.\n */\nexport function isElement(wat: unknown): boolean {\n  return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isRegExp(wat: unknown): wat is RegExp {\n  return isBuiltin(wat, 'RegExp');\n}\n\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nexport function isThenable(wat: any): wat is PromiseLike<any> {\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  return Boolean(wat?.then && typeof wat.then === 'function');\n}\n\n/**\n * Checks whether given value's type is a React SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n * @deprecated This is React-specific and will be removed from `@sentry/core` in a future major version.\n * Use the equivalent helper that ships with `@sentry/react` instead.\n */\nexport function isSyntheticEvent(wat: unknown): boolean {\n  return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\n// TODO: fix in v11, convert any to unknown\n// export function isInstanceOf<T>(wat: unknown, base: { new (...args: any[]): T }): wat is T {\nexport function isInstanceOf<T>(wat: any, base: any): wat is T {\n  try {\n    return wat instanceof base;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Checks whether given value's type is a Vue ViewModel or a VNode.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n * @deprecated This is Vue-specific and will be removed from `@sentry/core` in a future major version.\n * Use the equivalent helper that ships with `@sentry/vue` instead.\n */\nexport function isVueViewModel(wat: unknown): wat is VueViewModel | VNode {\n  // Not using Object.prototype.toString because in Vue 3 it would read the instance's Symbol(Symbol.toStringTag) property.\n  // We also need to check for __v_isVNode because Vue 3 component render instances have an internal __v_isVNode property.\n  return !!(\n    typeof wat === 'object' &&\n    wat !== null &&\n    ((wat as VueViewModel).__isVue || (wat as VueViewModel)._isVue || (wat as { __v_isVNode?: boolean }).__v_isVNode)\n  );\n}\n\n/**\n * Checks whether the given parameter is a Standard Web API Request instance.\n *\n * Returns false if Request is not available in the current runtime.\n */\nexport function isRequest(request: unknown): request is Request {\n  return typeof Request !== 'undefined' && isInstanceOf(request, Request);\n}\n","import { isNodeEnv } from './node';\nimport { GLOBAL_OBJ } from './worldwide';\n\n/**\n * Returns true if we are in the browser.\n */\nexport function isBrowser(): boolean {\n  // eslint-disable-next-line no-restricted-globals\n  return typeof window !== 'undefined' && (!isNodeEnv() || isElectronNodeRenderer());\n}\n\ntype ElectronProcess = { type?: string };\n\n// Electron renderers with nodeIntegration enabled are detected as Node.js so we specifically test for them\nfunction isElectronNodeRenderer(): boolean {\n  const process = (GLOBAL_OBJ as typeof GLOBAL_OBJ & { process?: ElectronProcess }).process;\n  return process?.type === 'renderer';\n}\n","/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the `debug` singleton, or b) put your function elsewhere.\n */\n\nimport { isBrowserBundle } from './env';\n\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nexport function isNodeEnv(): boolean {\n  // explicitly check for browser bundles as those can be optimized statically\n  // by terser/rollup.\n  return (\n    !isBrowserBundle() &&\n    Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'\n  );\n}\n\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction dynamicRequire(mod: any, request: string): any {\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  return mod.require(request);\n}\n\n/**\n * Helper for dynamically loading module that should work with linked dependencies.\n * The problem is that we _should_ be using `require(require.resolve(moduleName, { paths: [cwd()] }))`\n * However it's _not possible_ to do that with Webpack, as it has to know all the dependencies during\n * build time. `require.resolve` is also not available in any other way, so we cannot create,\n * a fake helper like we do with `dynamicRequire`.\n *\n * We always prefer to use local package, thus the value is not returned early from each `try/catch` block.\n * That is to mimic the behavior of `require.resolve` exactly.\n *\n * @param moduleName module name to require\n * @param existingModule module to use for requiring\n * @returns possibly required module\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function loadModule<T>(moduleName: string, existingModule: any = module): T | undefined {\n  let mod: T | undefined;\n\n  try {\n    mod = dynamicRequire(existingModule, moduleName);\n  } catch {\n    // no-empty\n  }\n\n  if (!mod) {\n    try {\n      const { cwd } = dynamicRequire(existingModule, 'process');\n      mod = dynamicRequire(existingModule, `${cwd()}/node_modules/${moduleName}`) as T;\n    } catch {\n      // no-empty\n    }\n  }\n\n  return mod;\n}\n","/**\n * Shallow merge two objects.\n * Does not mutate the passed in objects.\n * Undefined/empty values in the merge object will overwrite existing values.\n *\n * By default, this merges 2 levels deep.\n */\nexport function merge<T>(initialObj: T, mergeObj: T, levels = 2): T {\n  // If the merge value is not an object, or we have no merge levels left,\n  // we just set the value to the merge value\n  if (!mergeObj || typeof mergeObj !== 'object' || levels <= 0) {\n    return mergeObj;\n  }\n\n  // If the merge object is an empty object, and the initial object is not undefined, we return the initial object\n  if (initialObj && Object.keys(mergeObj).length === 0) {\n    return initialObj;\n  }\n\n  // Clone object\n  const output = { ...initialObj };\n\n  // Merge values into output, resursively\n  for (const key in mergeObj) {\n    if (Object.prototype.hasOwnProperty.call(mergeObj, key)) {\n      output[key] = merge(output[key], mergeObj[key], levels - 1);\n    }\n  }\n\n  return output;\n}\n","import type { Event } from '../types/event';\nimport type { Exception } from '../types/exception';\nimport type { Mechanism } from '../types/mechanism';\nimport type { StackFrame } from '../types/stackframe';\nimport { addNonEnumerableProperty } from './object';\nimport { safeMathRandom, withRandomSafeContext } from './randomSafeContext';\nimport { snipLine } from './string';\nimport { GLOBAL_OBJ } from './worldwide';\n\ninterface CryptoInternal {\n  randomUUID?(): string;\n}\n\n/** An interface for common properties on global */\ninterface CryptoGlobal {\n  msCrypto?: CryptoInternal;\n  crypto?: CryptoInternal;\n}\n\nfunction getCrypto(): CryptoInternal | undefined {\n  const gbl = GLOBAL_OBJ as typeof GLOBAL_OBJ & CryptoGlobal;\n  return gbl.crypto || gbl.msCrypto;\n}\n\nlet emptyUuid: string | undefined;\n\nfunction getRandomByte(): number {\n  return safeMathRandom() * 16;\n}\n\n/**\n * UUID4 generator\n * @param crypto Object that provides the crypto API.\n * @returns string Generated UUID4.\n */\nexport function uuid4(crypto = getCrypto()): string {\n  try {\n    if (crypto?.randomUUID) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      return withRandomSafeContext(() => crypto.randomUUID!()).replace(/-/g, '');\n    }\n  } catch {\n    // some runtimes can crash invoking crypto\n    // https://github.com/getsentry/sentry-javascript/issues/8935\n  }\n\n  if (!emptyUuid) {\n    // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n    // Concatenating the following numbers as strings results in '10000000100040008000100000000000'\n    emptyUuid = ([1e7] as unknown as string) + 1e3 + 4e3 + 8e3 + 1e11;\n  }\n\n  return emptyUuid.replace(/[018]/g, c =>\n    // eslint-disable-next-line no-bitwise\n    ((c as unknown as number) ^ ((getRandomByte() & 15) >> ((c as unknown as number) / 4))).toString(16),\n  );\n}\n\nfunction getFirstException(event: Event): Exception | undefined {\n  return event.exception?.values?.[0];\n}\n\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nexport function getEventDescription(event: Event): string {\n  const { message, event_id: eventId } = event;\n  if (message) {\n    return message;\n  }\n\n  const firstException = getFirstException(event);\n  if (firstException) {\n    if (firstException.type && firstException.value) {\n      return `${firstException.type}: ${firstException.value}`;\n    }\n    return firstException.type || firstException.value || eventId || '<unknown>';\n  }\n  return eventId || '<unknown>';\n}\n\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nexport function addExceptionTypeValue(event: Event, value?: string, type?: string): void {\n  const exception = (event.exception = event.exception || {});\n  const values = (exception.values = exception.values || []);\n  const firstException = (values[0] = values[0] || {});\n  if (!firstException.value) {\n    firstException.value = value || '';\n  }\n  if (!firstException.type) {\n    firstException.type = type || 'Error';\n  }\n}\n\n/**\n * Adds exception mechanism data to a given event. Uses defaults if the second parameter is not passed.\n *\n * @param event The event to modify.\n * @param newMechanism Mechanism data to add to the event.\n * @hidden\n */\nexport function addExceptionMechanism(event: Event, newMechanism?: Partial<Mechanism>): void {\n  const firstException = getFirstException(event);\n  if (!firstException) {\n    return;\n  }\n\n  const defaultMechanism = { type: 'generic', handled: true };\n  const currentMechanism = firstException.mechanism;\n  firstException.mechanism = { ...defaultMechanism, ...currentMechanism, ...newMechanism };\n\n  if (newMechanism && 'data' in newMechanism) {\n    const mergedData = { ...currentMechanism?.data, ...newMechanism.data };\n    firstException.mechanism.data = mergedData;\n  }\n}\n\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nconst SEMVER_REGEXP =\n  /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\n/**\n * Represents Semantic Versioning object\n */\ninterface SemVer {\n  major?: number;\n  minor?: number;\n  patch?: number;\n  prerelease?: string;\n  buildmetadata?: string;\n}\n\nfunction _parseInt(input: string | undefined): number {\n  return parseInt(input || '', 10);\n}\n\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nexport function parseSemver(input: string): SemVer {\n  const match = input.match(SEMVER_REGEXP) || [];\n  const major = _parseInt(match[1]);\n  const minor = _parseInt(match[2]);\n  const patch = _parseInt(match[3]);\n  return {\n    buildmetadata: match[5],\n    major: isNaN(major) ? undefined : major,\n    minor: isNaN(minor) ? undefined : minor,\n    patch: isNaN(patch) ? undefined : patch,\n    prerelease: match[4],\n  };\n}\n\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nexport function addContextToFrame(lines: string[], frame: StackFrame, linesOfContext: number = 5): void {\n  // When there is no line number in the frame, attaching context is nonsensical and will even break grouping\n  if (frame.lineno === undefined) {\n    return;\n  }\n\n  const maxLines = lines.length;\n  const sourceLine = Math.max(Math.min(maxLines - 1, frame.lineno - 1), 0);\n\n  frame.pre_context = lines\n    .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n    .map((line: string) => snipLine(line, 0));\n\n  // We guard here to ensure this is not larger than the existing number of lines\n  const lineIndex = Math.min(maxLines - 1, sourceLine);\n\n  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n  frame.context_line = snipLine(lines[lineIndex]!, frame.colno || 0);\n\n  frame.post_context = lines\n    .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n    .map((line: string) => snipLine(line, 0));\n}\n\n/**\n * Checks whether or not we've already captured the given exception (note: not an identical exception - the very object\n * in question), and marks it captured if not.\n *\n * This is useful because it's possible for an error to get captured by more than one mechanism. After we intercept and\n * record an error, we rethrow it (assuming we've intercepted it before it's reached the top-level global handlers), so\n * that we don't interfere with whatever effects the error might have had were the SDK not there. At that point, because\n * the error has been rethrown, it's possible for it to bubble up to some other code we've instrumented. If it's not\n * caught after that, it will bubble all the way up to the global handlers (which of course we also instrument). This\n * function helps us ensure that even if we encounter the same error more than once, we only record it the first time we\n * see it.\n *\n * Note: It will ignore primitives (always return `false` and not mark them as seen), as properties can't be set on\n * them. {@link: Object.objectify} can be used on exceptions to convert any that are primitives into their equivalent\n * object wrapper forms so that this check will always work. However, because we need to flag the exact object which\n * will get rethrown, and because that rethrowing happens outside of the event processing pipeline, the objectification\n * must be done before the exception captured.\n *\n * @param A thrown exception to check or flag as having been seen\n * @returns `true` if the exception has already been captured, `false` if not (with the side effect of marking it seen)\n */\nexport function checkOrSetAlreadyCaught(exception: unknown): boolean {\n  if (isAlreadyCaptured(exception)) {\n    return true;\n  }\n\n  try {\n    // set it this way rather than by assignment so that it's not ennumerable and therefore isn't recorded by the\n    // `ExtraErrorData` integration\n    addNonEnumerableProperty(exception as { [key: string]: unknown }, '__sentry_captured__', true);\n  } catch {\n    // `exception` is a primitive, so we can't mark it seen\n  }\n\n  return false;\n}\n\n/**\n * Checks whether we've already captured the given exception (note: not an identical exception - the very object).\n * It is considered already captured if it has the `__sentry_captured__` property set to `true`.\n *\n * @internal Only considered for internal usage\n */\nexport function isAlreadyCaptured(exception: unknown): boolean | void {\n  try {\n    return (exception as { __sentry_captured__?: boolean }).__sentry_captured__;\n  } catch {} // eslint-disable-line no-empty\n}\n","import { addNonEnumerableProperty } from './object';\n\n/**\n * Internal symbols for normalization behavior. JSON and other structured user payloads cannot\n * carry these keys, so they cannot spoof SDK-only normalization hints.\n * We use Symbol.for to ensure that the symbols are the same across different modules/files.\n */\nconst SENTRY_SKIP_NORMALIZATION = Symbol.for('sentry.skipNormalization');\nconst SENTRY_OVERRIDE_NORMALIZATION_DEPTH = Symbol.for('sentry.overrideNormalizationDepth');\n\n/** Marks an object so `normalize` returns it unchanged (already-normalized SDK data). */\nexport function setSkipNormalizationHint(obj: object): void {\n  addNonEnumerableProperty(obj, SENTRY_SKIP_NORMALIZATION, true);\n}\n\n/** Overrides remaining normalization depth from this object downward (e.g. Redux / Pinia state). */\nexport function setNormalizationDepthOverrideHint(obj: object, depth: number): void {\n  addNonEnumerableProperty(obj, SENTRY_OVERRIDE_NORMALIZATION_DEPTH, depth);\n}\n\n/** @internal */\nexport function hasSkipNormalizationHint(value: object) {\n  return Boolean((value as Record<symbol, unknown>)[SENTRY_SKIP_NORMALIZATION]);\n}\n\n/** @internal */\nexport function getNormalizationDepthOverrideHint(value: object): number | undefined {\n  const v = (value as Record<symbol, unknown>)[SENTRY_OVERRIDE_NORMALIZATION_DEPTH];\n  return typeof v === 'number' ? v : undefined;\n}\n","import type { Primitive } from '../types/misc';\nimport { getNormalizationDepthOverrideHint, hasSkipNormalizationHint } from './normalizationHints';\nimport { convertToPlainObject } from './object';\nimport { getFunctionName } from './stacktrace';\n\ntype Stringifier = (value: Exclude<unknown, string | number | boolean | null>) => string | undefined;\n\n// We store a custom stringifier in module scope, which is not bullet proof\n// however, we currently only really use this for browser-specific values, where this should work just fine, generally.\nlet stringifier: Stringifier | undefined;\n\n/**\n * Set a custom stringifier for the normalize function.\n * If this returns a non-empty string, it will be used instead of the default stringification.\n * Return undefined to fall back to the generic behavior.\n */\nexport function setNormalizeStringifier(newStringifier: Stringifier | undefined): void {\n  stringifier = newStringifier;\n}\n\ntype Prototype = { constructor?: (...args: unknown[]) => unknown };\n// This is a hack to placate TS, relying on the fact that technically, arrays are objects with integer keys. Normally we\n// think of those keys as actual numbers, but `arr['0']` turns out to work just as well as `arr[0]`, and doing it this\n// way lets us use a single type in the places where behave as if we are only dealing with objects, even if some of them\n// might be arrays.\ntype ObjOrArray<T> = { [key: string]: T };\n\ntype MemoFunc = [\n  // memoize\n  (obj: object) => boolean,\n  // unmemoize\n  (obj: object) => void,\n];\n\n/**\n * Recursively normalizes the given object.\n *\n * - Creates a copy to prevent original input mutation\n * - Skips non-enumerable properties\n * - When stringifying, calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializable values (`undefined`/`NaN`/functions) to serializable format\n * - Translates known global objects/classes to a string representations\n * - Takes care of `Error` object serialization\n * - Optionally limits depth of final output\n * - Optionally limits number of properties/elements included in any single object/array\n *\n * @param input The object to be normalized.\n * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.)\n * @param maxProperties The max number of elements or properties to be included in any single array or\n * object in the normalized output.\n * @returns A normalized version of the object, or `\"**non-serializable**\"` if any errors are thrown during normalization.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function normalize(input: unknown, depth: number = 100, maxProperties: number = +Infinity): any {\n  try {\n    // since we're at the outermost level, we don't provide a key\n    return visit('', input, depth, maxProperties);\n  } catch (err) {\n    return { ERROR: `**non-serializable** (${err})` };\n  }\n}\n\n/** JSDoc */\nexport function normalizeToSize<T>(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  object: { [key: string]: any },\n  // Default Node.js REPL depth\n  depth: number = 3,\n  // 100kB, as 200kB is max payload size, so half sounds reasonable\n  maxSize: number = 100 * 1024,\n): T {\n  const normalized = normalize(object, depth);\n\n  if (jsonSize(normalized) > maxSize) {\n    return normalizeToSize(object, depth - 1, maxSize);\n  }\n\n  return normalized as T;\n}\n\n/**\n * Visits a node to perform normalization on it\n *\n * @param key The key corresponding to the given node\n * @param value The node to be visited\n * @param depth Optional number indicating the maximum recursion depth\n * @param maxProperties Optional maximum number of properties/elements included in any single object/array\n * @param memo Optional Memo class handling decycling\n */\nfunction visit(\n  key: string,\n  value: unknown,\n  depth: number = +Infinity,\n  maxProperties: number = +Infinity,\n  memo = memoBuilder(),\n): Primitive | ObjOrArray<unknown> {\n  const [memoize, unmemoize] = memo;\n\n  // Get the simple cases out of the way first\n  if (\n    value == null || // this matches null and undefined -> eqeq not eqeqeq\n    ['boolean', 'string'].includes(typeof value) ||\n    (typeof value === 'number' && Number.isFinite(value))\n  ) {\n    return value as Primitive;\n  }\n\n  const stringified = stringifyValue(key, value);\n\n  // Anything we could potentially dig into more (objects or arrays) will have come back as `\"[object XXXX]\"`.\n  // Everything else will have already been serialized, so if we don't see that pattern, we're done.\n  if (!stringified.startsWith('[object ')) {\n    return stringified;\n  }\n\n  // From here on, we can assert that `value` is either an object or an array.\n\n  // Do not normalize objects that we know have already been normalized. Hints use internal symbols\n  // (see normalizationHints.ts) so user-controlled JSON cannot spoof them.\n  if (hasSkipNormalizationHint(value)) {\n    return value as ObjOrArray<unknown>;\n  }\n\n  // Override remaining depth from this node (e.g. Redux / Pinia state). Set via setNormalizationDepthOverrideHint.\n  const overrideDepth = getNormalizationDepthOverrideHint(value);\n  const remainingDepth = overrideDepth !== undefined ? overrideDepth : depth;\n\n  // We're also done if we've reached the max depth\n  if (remainingDepth === 0) {\n    // At this point we know `serialized` is a string of the form `\"[object XXXX]\"`. Clean it up so it's just `\"[XXXX]\"`.\n    return stringified.replace('object ', '');\n  }\n\n  // If we've already visited this branch, bail out, as it's circular reference. If not, note that we're seeing it now.\n  if (memoize(value)) {\n    return '[Circular ~]';\n  }\n\n  // If the value has a `toJSON` method, we call it to extract more information\n  const valueWithToJSON = value as unknown & { toJSON?: () => unknown };\n  if (valueWithToJSON && typeof valueWithToJSON.toJSON === 'function') {\n    try {\n      const jsonValue = valueWithToJSON.toJSON();\n      // We need to normalize the return value of `.toJSON()` in case it has circular references\n      return visit('', jsonValue, remainingDepth - 1, maxProperties, memo);\n    } catch {\n      // pass (The built-in `toJSON` failed, but we can still try to do it ourselves)\n    }\n  }\n\n  // At this point we know we either have an object or an array, we haven't seen it before, and we're going to recurse\n  // because we haven't yet reached the max depth. Create an accumulator to hold the results of visiting each\n  // property/entry, and keep track of the number of items we add to it.\n  const normalized = (Array.isArray(value) ? [] : {}) as ObjOrArray<unknown>;\n  let numAdded = 0;\n\n  // Before we begin, convert`Error` and`Event` instances into plain objects, since some of each of their relevant\n  // properties are non-enumerable and otherwise would get missed.\n  const visitable = convertToPlainObject(value as ObjOrArray<unknown>);\n\n  for (const visitKey in visitable) {\n    // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n    if (!Object.prototype.hasOwnProperty.call(visitable, visitKey)) {\n      continue;\n    }\n\n    if (numAdded >= maxProperties) {\n      normalized[visitKey] = '[MaxProperties ~]';\n      break;\n    }\n\n    // Recursively visit all the child nodes\n    const visitValue = visitable[visitKey];\n    normalized[visitKey] = visit(visitKey, visitValue, remainingDepth - 1, maxProperties, memo);\n\n    numAdded++;\n  }\n\n  // Once we've visited all the branches, remove the parent from memo storage\n  unmemoize(value);\n\n  // Return accumulated values\n  return normalized;\n}\n\n/* eslint-disable complexity */\n/**\n * Stringify the given value. Handles various known special values and types.\n *\n * Not meant to be used on simple primitives which already have a string representation, as it will, for example, turn\n * the number 1231 into \"[Object Number]\", nor on `null`, as it will throw.\n *\n * @param value The value to stringify\n * @returns A stringified representation of the given value\n */\nexport function stringifyValue(\n  key: unknown,\n  // this type is a tiny bit of a cheat, since this function does handle NaN (which is technically a number), but for\n  // our internal use, it'll do\n  value: Exclude<unknown, string | number | boolean | null>,\n): string {\n  try {\n    // Runtime-specific stringifications (browser, framework integrations) are registered on the\n    // async-context strategy. Consult them before the universal fallbacks below.\n    if (stringifier) {\n      const stringified = stringifier(value);\n      // Safe to ignore empty strings here as well, we wont stringify to this\n      if (stringified) {\n        return stringified;\n      }\n    }\n\n    if (typeof global !== 'undefined' && value === global) {\n      return '[Global]';\n    }\n\n    if (typeof value === 'number' && !Number.isFinite(value)) {\n      return `[${value}]`;\n    }\n\n    if (typeof value === 'function') {\n      return `[Function: ${getFunctionName(value)}]`;\n    }\n\n    if (typeof value === 'symbol') {\n      return `[${String(value)}]`;\n    }\n\n    // stringified BigInts are indistinguishable from regular numbers, so we need to label them to avoid confusion\n    if (typeof value === 'bigint') {\n      return `[BigInt: ${String(value)}]`;\n    }\n\n    // Now that we've knocked out all the special cases and the primitives, all we have left are objects. Simply casting\n    // them to strings means that instances of classes which haven't defined their `toStringTag` will just come out as\n    // `\"[object Object]\"`. If we instead look at the constructor's name (which is the same as the name of the class),\n    // we can make sure that only plain objects come out that way.\n    const objName = getConstructorName(value);\n\n    return `[object ${objName}]`;\n  } catch (err) {\n    return `**non-serializable** (${err})`;\n  }\n}\n/* eslint-enable complexity */\n\nfunction getConstructorName(value: unknown): string {\n  const prototype: Prototype | null = Object.getPrototypeOf(value);\n\n  return prototype?.constructor ? prototype.constructor.name : 'null prototype';\n}\n\n/** Calculates bytes size of input string */\nfunction utf8Length(value: string): number {\n  // eslint-disable-next-line no-bitwise\n  return ~-encodeURI(value).split(/%..|./).length;\n}\n\n/** Calculates bytes size of input object */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction jsonSize(value: any): number {\n  return utf8Length(JSON.stringify(value));\n}\n\n/**\n * Normalizes URLs in exceptions and stacktraces to a base path so Sentry can fingerprint\n * across platforms and working directory.\n *\n * @param url The URL to be normalized.\n * @param basePath The application base path.\n * @returns The normalized URL.\n */\nexport function normalizeUrlToBase(url: string, basePath: string): string {\n  const escapedBase = basePath\n    // Backslash to forward\n    .replace(/\\\\/g, '/')\n    // Escape RegExp special characters\n    .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n\n  let newUrl = url;\n  try {\n    newUrl = decodeURI(url);\n  } catch {\n    // Sometime this breaks\n  }\n  return (\n    newUrl\n      .replace(/\\\\/g, '/')\n      .replace(/webpack:\\/?/g, '') // Remove intermediate base path\n      // oxlint-disable-next-line sdk/no-regexp-constructor\n      .replace(new RegExp(`(file://)?/*${escapedBase}/*`, 'ig'), 'app:///')\n  );\n}\n\n/**\n * Helper to decycle json objects\n */\nfunction memoBuilder(): MemoFunc {\n  const inner = new WeakSet<object>();\n  function memoize(obj: object): boolean {\n    if (inner.has(obj)) {\n      return true;\n    }\n    inner.add(obj);\n    return false;\n  }\n\n  function unmemoize(obj: object): void {\n    inner.delete(obj);\n  }\n  return [memoize, unmemoize];\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { WrappedFunction } from '../types/wrappedfunction';\nimport { debug } from './debug-logger';\nimport { isError, isEvent, isPrimitive } from './is';\n\n/**\n * Replace a method in an object with a wrapped version of itself.\n *\n * If the method on the passed object is not a function, the wrapper will not be applied.\n *\n * @param source An object that contains a method to be wrapped.\n * @param name The name of the method to be wrapped.\n * @param replacementFactory A higher-order function that takes the original version of the given method and returns a\n * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to\n * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, <other\n * args>)` or `origMethod.apply(this, [<other args>])` (rather than being called directly), again to preserve `this`.\n * @returns void\n */\n\nexport function fill(source: { [key: string]: any }, name: string, replacementFactory: (...args: any[]) => any): void {\n  if (!(name in source)) {\n    return;\n  }\n\n  // explicitly casting to unknown because we don't know the type of the method initially at all\n  const original = source[name] as unknown;\n\n  if (typeof original !== 'function') {\n    return;\n  }\n\n  const wrapped = replacementFactory(original) as WrappedFunction;\n\n  // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n  // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n  if (typeof wrapped === 'function') {\n    markFunctionWrapped(wrapped, original);\n  }\n\n  try {\n    source[name] = wrapped;\n  } catch {\n    DEBUG_BUILD && debug.log(`Failed to replace method \"${name}\" in object`, source);\n  }\n}\n\n/**\n * Defines a non-enumerable property on the given object.\n *\n * @param obj The object on which to set the property\n * @param name The name of the property to be set\n * @param value The value to which to set the property\n */\nexport function addNonEnumerableProperty(obj: object, name: string | symbol, value: unknown): void {\n  try {\n    Object.defineProperty(obj, name, {\n      // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n      value,\n      writable: true,\n      configurable: true,\n    });\n  } catch {\n    DEBUG_BUILD && debug.log(`Failed to add non-enumerable property \"${String(name)}\" to object`, obj);\n  }\n}\n\n/**\n * Remembers the original function on the wrapped function and\n * patches up the prototype.\n *\n * @param wrapped the wrapper function\n * @param original the original function that gets wrapped\n */\nexport function markFunctionWrapped(wrapped: WrappedFunction, original: WrappedFunction): void {\n  try {\n    const proto = original.prototype || {};\n    wrapped.prototype = original.prototype = proto;\n    addNonEnumerableProperty(wrapped, '__sentry_original__', original);\n  } catch {} // eslint-disable-line no-empty\n}\n\n/**\n * Wrap a method on an object by name, only if it is not already wrapped.\n *\n * Note: to set the wrapped method as a non-enumerable property, pass\n * false as the `enumerable` argument. This could be detected, but only\n * by either walking up the prototype chain, or iterating over all fields\n * in a `for(in)` loop. Neither are an acceptable performance impact for\n * the rare case where we might patch a non-enumerable method.\n */\nexport function wrapMethod<O extends {}, T extends string & keyof O>(\n  obj: O,\n  field: T,\n  wrapped: WrappedFunction,\n  enumerable: boolean = true,\n): void {\n  const original = obj[field];\n  if (typeof original !== 'function') {\n    throw new Error(`Cannot wrap method: ${field} is not a function`);\n  }\n  if (getOriginalFunction(original)) {\n    throw new Error(`Attempting to wrap method ${field} multiple times`);\n  }\n  markFunctionWrapped(wrapped, original);\n  Object.defineProperty(obj, field, {\n    writable: true,\n    configurable: true,\n    enumerable,\n    value: wrapped,\n  });\n}\n\n/**\n * This extracts the original function if available.  See\n * `markFunctionWrapped` for more information.\n *\n * @param func the function to unwrap\n * @returns the unwrapped version of the function if available.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function getOriginalFunction<T extends Function>(func: WrappedFunction<T>): T | undefined {\n  return func.__sentry_original__;\n}\n\n/**\n * Transforms any `Error` or `Event` into a plain object with all of their enumerable properties, and some of their\n * non-enumerable properties attached.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n * @returns An Event or Error turned into an object - or the value argument itself, when value is neither an Event nor\n *  an Error.\n */\nexport function convertToPlainObject<V>(value: V): Record<string, unknown> | V {\n  if (isError(value)) {\n    return {\n      message: value.message,\n      name: value.name,\n      stack: value.stack,\n      ...getOwnProperties(value),\n    };\n  }\n\n  // This handles browser events specifically, where certain properties are non-enumerable and need to be unpacked.\n  if (isEvent(value)) {\n    const { type, target, currentTarget, detail } = value;\n    return {\n      type,\n      target,\n      currentTarget,\n      ...(detail ? { detail } : {}),\n      ...getOwnProperties(value),\n    };\n  }\n\n  return value;\n}\n\n/** Filters out all but an object's own properties */\nfunction getOwnProperties(obj: unknown): { [key: string]: unknown } {\n  if (typeof obj === 'object' && obj !== null) {\n    return Object.fromEntries(Object.entries(obj));\n  }\n  return {};\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nexport function extractExceptionKeysForMessage(exception: Record<string, unknown>): string {\n  const keys = Object.keys(convertToPlainObject(exception));\n  keys.sort();\n\n  return !keys[0] ? '[object has no keys]' : keys.join(', ');\n}\n\n/**\n * Given any object, return a new object having removed all fields whose value was `undefined`.\n * Works recursively on objects and arrays.\n *\n * Attention: This function keeps circular references in the returned object.\n *\n * @deprecated This function is no longer used by the SDK and will be removed in a future major version.\n */\nexport function dropUndefinedKeys<T>(inputValue: T): T {\n  // This map keeps track of what already visited nodes map to.\n  // Our Set - based memoBuilder doesn't work here because we want to the output object to have the same circular\n  // references as the input object.\n  const memoizationMap = new Map<unknown, unknown>();\n\n  // This function just proxies `_dropUndefinedKeys` to keep the `memoBuilder` out of this function's API\n  return _dropUndefinedKeys(inputValue, memoizationMap);\n}\n\nfunction _dropUndefinedKeys<T>(inputValue: T, memoizationMap: Map<unknown, unknown>): T {\n  // Early return for primitive values\n  if (inputValue === null || typeof inputValue !== 'object') {\n    return inputValue;\n  }\n\n  // Check memo map first for all object types\n  const memoVal = memoizationMap.get(inputValue);\n  if (memoVal !== undefined) {\n    return memoVal as T;\n  }\n\n  // handle arrays\n  if (Array.isArray(inputValue)) {\n    const returnValue: unknown[] = [];\n    // Store mapping to handle circular references\n    memoizationMap.set(inputValue, returnValue);\n\n    inputValue.forEach(value => {\n      returnValue.push(_dropUndefinedKeys(value, memoizationMap));\n    });\n\n    return returnValue as unknown as T;\n  }\n\n  if (isPojo(inputValue)) {\n    const returnValue: { [key: string]: unknown } = {};\n    // Store mapping to handle circular references\n    memoizationMap.set(inputValue, returnValue);\n\n    const keys = Object.keys(inputValue);\n\n    keys.forEach(key => {\n      const val = inputValue[key];\n      if (val !== undefined) {\n        returnValue[key] = _dropUndefinedKeys(val, memoizationMap);\n      }\n    });\n\n    return returnValue as T;\n  }\n\n  // For other object types, return as is\n  return inputValue;\n}\n\nfunction isPojo(input: unknown): input is Record<string, unknown> {\n  // Plain objects have Object as constructor or no constructor\n  const constructor = (input as object).constructor;\n  return constructor === Object || constructor === undefined;\n}\n\n/**\n * Ensure that something is an object.\n *\n * Turns `undefined` and `null` into `String`s and all other primitives into instances of their respective wrapper\n * classes (String, Boolean, Number, etc.). Acts as the identity function on non-primitives.\n *\n * @param wat The subject of the objectification\n * @returns A version of `wat` which can safely be used with `Object` class methods\n */\nexport function objectify(wat: unknown): typeof Object {\n  let objectified;\n  switch (true) {\n    // this will catch both undefined and null\n    case wat == undefined:\n      objectified = new String(wat);\n      break;\n\n    // Though symbols and bigints do have wrapper classes (`Symbol` and `BigInt`, respectively), for whatever reason\n    // those classes don't have constructors which can be used with the `new` keyword. We therefore need to cast each as\n    // an object in order to wrap it.\n    case typeof wat === 'symbol' || typeof wat === 'bigint':\n      objectified = Object(wat);\n      break;\n\n    // this will catch the remaining primitives: `String`, `Number`, and `Boolean`\n    case isPrimitive(wat):\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n      objectified = new (wat as any).constructor(wat);\n      break;\n\n    // by process of elimination, at this point we know that `wat` must already be an object\n    default:\n      objectified = wat;\n      break;\n  }\n  return objectified;\n}\n","import { uuid4 } from './misc';\n\n/**\n * Generate a random, valid trace ID.\n */\nexport function generateTraceId(): string {\n  return uuid4();\n}\n\n/**\n * Generate a random, valid span ID.\n */\nexport function generateSpanId(): string {\n  return uuid4().substring(16);\n}\n","import { GLOBAL_OBJ } from './worldwide';\n\nexport type RandomSafeContextRunner = <T>(callback: () => T) => T;\n\n// undefined = not yet resolved, null = no runner found, function = runner found\nlet RESOLVED_RUNNER: RandomSafeContextRunner | null | undefined;\n\n/**\n * Simple wrapper that allows SDKs to *secretly* set context wrapper to generate safe random IDs in cache components contexts\n */\nexport function withRandomSafeContext<T>(cb: () => T): T {\n  // Skips future symbol lookups if we've already resolved (or attempted to resolve) the runner once\n  if (RESOLVED_RUNNER !== undefined) {\n    return RESOLVED_RUNNER ? RESOLVED_RUNNER(cb) : cb();\n  }\n\n  const sym = Symbol.for('__SENTRY_SAFE_RANDOM_ID_WRAPPER__');\n  const globalWithSymbol: typeof GLOBAL_OBJ & { [sym]?: RandomSafeContextRunner } = GLOBAL_OBJ;\n\n  if (sym in globalWithSymbol && typeof globalWithSymbol[sym] === 'function') {\n    RESOLVED_RUNNER = globalWithSymbol[sym];\n    return RESOLVED_RUNNER(cb);\n  }\n\n  RESOLVED_RUNNER = null;\n  return cb();\n}\n\n/**\n * Identical to Math.random() but wrapped in withRandomSafeContext\n * to ensure safe random number generation in certain contexts (e.g., Next.js Cache Components).\n */\nexport function safeMathRandom(): number {\n  return withRandomSafeContext(() => Math.random());\n}\n\n/**\n * Identical to Date.now() but wrapped in withRandomSafeContext\n * to ensure safe time value generation in certain contexts (e.g., Next.js Cache Components).\n */\nexport function safeDateNow(): number {\n  return withRandomSafeContext(() => Date.now());\n}\n","import { getGlobalScope } from '../currentScopes';\nimport type { Scope, ScopeData } from '../scope';\nimport { getDynamicSamplingContextFromSpan } from '../tracing/dynamicSamplingContext';\nimport type { Breadcrumb } from '../types/breadcrumb';\nimport type { Event } from '../types/event';\nimport type { Span } from '../types/span';\nimport { merge } from './merge';\nimport { getRootSpan, spanToJSON, spanToTraceContext } from './spanUtils';\n\n/**\n * Applies data from the scope to the event and runs all event processors on it.\n */\nexport function applyScopeDataToEvent(event: Event, data: ScopeData): void {\n  const { fingerprint, span, breadcrumbs, sdkProcessingMetadata } = data;\n\n  // Apply general data\n  applyDataToEvent(event, data);\n\n  // We want to set the trace context for normal events only if there isn't already\n  // a trace context on the event. There is a product feature in place where we link\n  // errors with transaction and it relies on that.\n  if (span) {\n    applySpanToEvent(event, span);\n  }\n\n  applyFingerprintToEvent(event, fingerprint);\n  applyBreadcrumbsToEvent(event, breadcrumbs);\n  applySdkMetadataToEvent(event, sdkProcessingMetadata);\n}\n\n/** Merge data of two scopes together. */\nexport function mergeScopeData(data: ScopeData, mergeData: ScopeData): void {\n  const {\n    extra,\n    tags,\n    attributes,\n    user,\n    contexts,\n    level,\n    sdkProcessingMetadata,\n    breadcrumbs,\n    fingerprint,\n    eventProcessors,\n    attachments,\n    propagationContext,\n    transactionName,\n    span,\n  } = mergeData;\n\n  mergeAndOverwriteScopeData(data, 'extra', extra);\n  mergeAndOverwriteScopeData(data, 'tags', tags);\n  mergeAndOverwriteScopeData(data, 'attributes', attributes);\n  mergeAndOverwriteScopeData(data, 'user', user);\n  mergeAndOverwriteScopeData(data, 'contexts', contexts);\n\n  data.sdkProcessingMetadata = merge(data.sdkProcessingMetadata, sdkProcessingMetadata, 2);\n\n  if (level) {\n    data.level = level;\n  }\n\n  if (transactionName) {\n    data.transactionName = transactionName;\n  }\n\n  if (span) {\n    data.span = span;\n  }\n\n  if (breadcrumbs.length) {\n    data.breadcrumbs = [...data.breadcrumbs, ...breadcrumbs];\n  }\n\n  if (fingerprint.length) {\n    data.fingerprint = [...data.fingerprint, ...fingerprint];\n  }\n\n  if (eventProcessors.length) {\n    data.eventProcessors = [...data.eventProcessors, ...eventProcessors];\n  }\n\n  if (attachments.length) {\n    data.attachments = [...data.attachments, ...attachments];\n  }\n\n  data.propagationContext = { ...data.propagationContext, ...propagationContext };\n}\n\n/**\n * Merges certain scope data. Undefined values will overwrite any existing values.\n * Exported only for tests.\n */\nexport function mergeAndOverwriteScopeData<\n  Prop extends 'extra' | 'tags' | 'attributes' | 'user' | 'contexts' | 'sdkProcessingMetadata',\n  Data extends ScopeData,\n>(data: Data, prop: Prop, mergeVal: Data[Prop]): void {\n  data[prop] = merge(data[prop], mergeVal, 1);\n}\n\n/** Exported only for tests */\nexport function mergeArray<Prop extends 'breadcrumbs' | 'fingerprint'>(\n  event: Event,\n  prop: Prop,\n  mergeVal: ScopeData[Prop],\n): void {\n  const prevVal = event[prop];\n  // If we are not merging any new values,\n  // we only need to proceed if there was an empty array before (as we want to replace it with undefined)\n  if (!mergeVal.length && (!prevVal || prevVal.length)) {\n    return;\n  }\n\n  const merged = [...(prevVal || []), ...mergeVal] as ScopeData[Prop];\n  event[prop] = merged.length ? merged : undefined;\n}\n\n/**\n * Get the scope data for the current scope after merging with the\n * global scope and isolation scope.\n *\n * @param currentScope - The current scope.\n * @returns The scope data.\n */\nexport function getCombinedScopeData(isolationScope: Scope | undefined, currentScope: Scope | undefined): ScopeData {\n  const scopeData = getGlobalScope().getScopeData();\n  isolationScope && mergeScopeData(scopeData, isolationScope.getScopeData());\n  currentScope && mergeScopeData(scopeData, currentScope.getScopeData());\n  return scopeData;\n}\n\nfunction applyDataToEvent(event: Event, data: ScopeData): void {\n  const { extra, tags, user, contexts, level, transactionName } = data;\n\n  if (Object.keys(extra).length) {\n    event.extra = { ...extra, ...event.extra };\n  }\n\n  if (Object.keys(tags).length) {\n    event.tags = { ...tags, ...event.tags };\n  }\n\n  if (Object.keys(user).length) {\n    event.user = { ...user, ...event.user };\n  }\n\n  if (Object.keys(contexts).length) {\n    event.contexts = { ...contexts, ...event.contexts };\n  }\n\n  if (level) {\n    event.level = level;\n  }\n\n  // transaction events get their `transaction` from the root span name\n  if (transactionName && event.type !== 'transaction') {\n    event.transaction = transactionName;\n  }\n}\n\nfunction applyBreadcrumbsToEvent(event: Event, breadcrumbs: Breadcrumb[]): void {\n  const mergedBreadcrumbs = [...(event.breadcrumbs || []), ...breadcrumbs];\n  event.breadcrumbs = mergedBreadcrumbs.length ? mergedBreadcrumbs : undefined;\n}\n\nfunction applySdkMetadataToEvent(event: Event, sdkProcessingMetadata: ScopeData['sdkProcessingMetadata']): void {\n  event.sdkProcessingMetadata = {\n    ...event.sdkProcessingMetadata,\n    ...sdkProcessingMetadata,\n  };\n}\n\nfunction applySpanToEvent(event: Event, span: Span): void {\n  event.contexts = {\n    trace: spanToTraceContext(span),\n    ...event.contexts,\n  };\n\n  event.sdkProcessingMetadata = {\n    dynamicSamplingContext: getDynamicSamplingContextFromSpan(span),\n    ...event.sdkProcessingMetadata,\n  };\n\n  const rootSpan = getRootSpan(span);\n  const transactionName = spanToJSON(rootSpan).description;\n  if (transactionName && !event.transaction && event.type === 'transaction') {\n    event.transaction = transactionName;\n  }\n}\n\n/**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\nfunction applyFingerprintToEvent(event: Event, fingerprint: ScopeData['fingerprint'] | undefined): void {\n  // Make sure it's an array first and we actually have something in place\n  event.fingerprint = event.fingerprint\n    ? Array.isArray(event.fingerprint)\n      ? event.fingerprint\n      : [event.fingerprint]\n    : [];\n\n  // If we have something on the scope, then merge it with event\n  if (fingerprint) {\n    event.fingerprint = event.fingerprint.concat(fingerprint);\n  }\n\n  // If we have no data at all, remove empty array default\n  if (!event.fingerprint.length) {\n    delete event.fingerprint;\n  }\n}\n","import type { Scope } from '../scope';\nimport type { Span } from '../types/span';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { derefWeakRef, makeWeakRef, type MaybeWeakRef } from './weakRef';\n\nconst SCOPE_SPAN_FIELD = '_sentrySpan';\n\ntype ScopeWithMaybeSpan = Scope & {\n  [SCOPE_SPAN_FIELD]?: MaybeWeakRef<Span>;\n};\n\n/**\n * Set the active span for a given scope.\n * NOTE: This should NOT be used directly, but is only used internally by the trace methods.\n */\nexport function _setSpanForScope(scope: Scope, span: Span | undefined): void {\n  if (span) {\n    // Use WeakRef to avoid circular reference with span holding scope\n    addNonEnumerableProperty(scope as ScopeWithMaybeSpan, SCOPE_SPAN_FIELD, makeWeakRef(span));\n  } else {\n    // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n    delete (scope as ScopeWithMaybeSpan)[SCOPE_SPAN_FIELD];\n  }\n}\n\n/**\n * Get the active span for a given scope.\n * NOTE: This should NOT be used directly, but is only used internally by the trace methods.\n */\nexport function _getSpanForScope(scope: ScopeWithMaybeSpan): Span | undefined {\n  return derefWeakRef(scope[SCOPE_SPAN_FIELD]);\n}\n","// oxlint-disable max-lines\nimport { getAsyncContextStrategy } from '../asyncContext';\nimport type { RawAttributes } from '../attributes';\nimport { serializeAttributes } from '../attributes';\nimport { getMainCarrier } from '../carrier';\nimport { getCurrentScope } from '../currentScopes';\nimport {\n  SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n  SEMANTIC_ATTRIBUTE_SENTRY_OP,\n  SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n  SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n  SEMANTIC_ATTRIBUTE_SENTRY_STATUS_MESSAGE,\n} from '../semanticAttributes';\nimport type { SentrySpan } from '../tracing/sentrySpan';\nimport { SPAN_STATUS_OK, SPAN_STATUS_UNSET } from '../tracing/spanstatus';\nimport { getCapturedScopesOnSpan } from '../tracing/utils';\nimport type { TraceContext } from '../types/context';\nimport type { SpanLink, SpanLinkJSON } from '../types/link';\nimport type {\n  SerializedStreamedSpan,\n  Span,\n  SpanAttributes,\n  SpanJSON,\n  SpanOrigin,\n  SpanTimeInput,\n  StreamedSpanJSON,\n} from '../types/span';\nimport type { SpanStatus } from '../types/spanStatus';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { generateSpanId } from '../utils/propagationContext';\nimport { timestampInSeconds } from '../utils/time';\nimport { generateSentryTraceHeader, generateTraceparentHeader } from '../utils/tracing';\nimport { consoleSandbox } from './debug-logger';\nimport { _getSpanForScope } from './spanOnScope';\n\n// These are aligned with OpenTelemetry trace flags\nexport const TRACE_FLAG_NONE = 0x0;\nexport const TRACE_FLAG_SAMPLED = 0x1;\n\nlet hasShownSpanDropWarning = false;\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in an event.\n * By default, this will only include trace_id, span_id & parent_span_id.\n * If `includeAllData` is true, it will also include data, op, status & origin.\n */\nexport function spanToTransactionTraceContext(span: Span): TraceContext {\n  const { spanId: span_id, traceId: trace_id } = span.spanContext();\n  const { data, op, parent_span_id, status, origin, links } = spanToJSON(span);\n\n  return {\n    parent_span_id,\n    span_id,\n    trace_id,\n    data,\n    op,\n    status,\n    origin,\n    links,\n  };\n}\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in a non-transaction event.\n */\nexport function spanToTraceContext(span: Span): TraceContext {\n  const { spanId, traceId: trace_id, isRemote } = span.spanContext();\n\n  // If the span is remote, we use a random/virtual span as span_id to the trace context,\n  // and the remote span as parent_span_id\n  const parent_span_id = isRemote ? spanId : spanToJSON(span).parent_span_id;\n  const scope = getCapturedScopesOnSpan(span).scope;\n\n  const span_id = isRemote ? scope?.getPropagationContext().propagationSpanId || generateSpanId() : spanId;\n\n  return {\n    parent_span_id,\n    span_id,\n    trace_id,\n  };\n}\n\n/**\n * Convert a Span to a Sentry trace header.\n */\nexport function spanToTraceHeader(span: Span): string {\n  const { traceId, spanId } = span.spanContext();\n  const sampled = spanIsSampled(span);\n  return generateSentryTraceHeader(traceId, spanId, sampled);\n}\n\n/**\n * Convert a Span to a W3C traceparent header.\n */\nexport function spanToTraceparentHeader(span: Span): string {\n  const { traceId, spanId } = span.spanContext();\n  const sampled = spanIsSampled(span);\n  return generateTraceparentHeader(traceId, spanId, sampled);\n}\n\n/**\n *  Converts the span links array to a flattened version to be sent within an envelope.\n *\n *  If the links array is empty, it returns `undefined` so the empty value can be dropped before it's sent.\n */\nexport function convertSpanLinksForEnvelope(links?: SpanLink[]): SpanLinkJSON[] | undefined {\n  if (links && links.length > 0) {\n    return links.map(({ context: { spanId, traceId, traceFlags, ...restContext }, attributes }) => ({\n      span_id: spanId,\n      trace_id: traceId,\n      sampled: traceFlags === TRACE_FLAG_SAMPLED,\n      attributes,\n      ...restContext,\n    }));\n  } else {\n    return undefined;\n  }\n}\n\n/**\n * Converts the span links array to a flattened version with serialized attributes for V2 spans.\n *\n * If the links array is empty, it returns `undefined` so the empty value can be dropped before it's sent.\n */\nexport function getStreamedSpanLinks(\n  links?: SpanLink[],\n): SpanLinkJSON<RawAttributes<Record<string, unknown>>>[] | undefined {\n  if (links?.length) {\n    return links.map(({ context: { spanId, traceId, traceFlags }, attributes }) => ({\n      span_id: spanId,\n      trace_id: traceId,\n      sampled: traceFlags === TRACE_FLAG_SAMPLED,\n      attributes,\n    }));\n  } else {\n    return undefined;\n  }\n}\n\n/**\n * Convert a span time input into a timestamp in seconds.\n */\nexport function spanTimeInputToSeconds(input: SpanTimeInput | undefined): number {\n  if (typeof input === 'number') {\n    return ensureTimestampInSeconds(input);\n  }\n\n  if (Array.isArray(input)) {\n    // See {@link HrTime} for the array-based time format\n    return input[0] + input[1] / 1e9;\n  }\n\n  if (input instanceof Date) {\n    return ensureTimestampInSeconds(input.getTime());\n  }\n\n  return timestampInSeconds();\n}\n\n/**\n * Converts a timestamp to second, if it was in milliseconds, or keeps it as second.\n */\nfunction ensureTimestampInSeconds(timestamp: number): number {\n  const isMs = timestamp > 9999999999;\n  return isMs ? timestamp / 1000 : timestamp;\n}\n\n/**\n * Convert a span to a JSON representation.\n */\n// Note: Because of this, we currently have a circular type dependency (which we opted out of in package.json).\n// This is not avoidable as we need `spanToJSON` in `spanUtils.ts`, which in turn is needed by `span.ts` for backwards compatibility.\n// And `spanToJSON` needs the Span class from `span.ts` to check here.\nexport function spanToJSON(span: Span): SpanJSON {\n  if (spanIsSentrySpan(span)) {\n    return span.getSpanJSON();\n  }\n\n  const { spanId: span_id, traceId: trace_id } = span.spanContext();\n\n  // Handle a span from @opentelemetry/sdk-base-trace's `Span` class\n  if (spanIsOpenTelemetrySdkTraceBaseSpan(span)) {\n    const { attributes, startTime, name, endTime, status, links } = span;\n\n    return {\n      span_id,\n      trace_id,\n      data: attributes,\n      description: name,\n      parent_span_id: getOtelParentSpanId(span),\n      start_timestamp: spanTimeInputToSeconds(startTime),\n      // This is [0,0] by default in OTEL, in which case we want to interpret this as no end time\n      timestamp: spanTimeInputToSeconds(endTime) || undefined,\n      status: getStatusMessage(status),\n      op: attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n      origin: attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n      links: convertSpanLinksForEnvelope(links),\n    };\n  }\n\n  // Finally, at least we have `spanContext()`....\n  // This should not actually happen in reality, but we need to handle it for type safety.\n  return {\n    span_id,\n    trace_id,\n    start_timestamp: 0,\n    data: {},\n  };\n}\n\n/**\n * Convert a span to the intermediate {@link StreamedSpanJSON} representation.\n */\nexport function spanToStreamedSpanJSON(span: Span): StreamedSpanJSON {\n  if (spanIsSentrySpan(span)) {\n    return span.getStreamedSpanJSON();\n  }\n\n  const { spanId: span_id, traceId: trace_id } = span.spanContext();\n\n  // Handle a span from @opentelemetry/sdk-base-trace's `Span` class\n  if (spanIsOpenTelemetrySdkTraceBaseSpan(span)) {\n    const { attributes, startTime, name, endTime, status, links } = span;\n\n    return {\n      name,\n      span_id,\n      trace_id,\n      parent_span_id: getOtelParentSpanId(span),\n      start_timestamp: spanTimeInputToSeconds(startTime),\n      end_timestamp: spanTimeInputToSeconds(endTime),\n      is_segment: span === INTERNAL_getSegmentSpan(span),\n      status: getSimpleStatus(status),\n      attributes: addStatusMessageAttribute(attributes, status),\n      links: getStreamedSpanLinks(links),\n    };\n  }\n\n  // Finally, as a fallback, at least we have `spanContext()`....\n  // This should not actually happen in reality, but we need to handle it for type safety.\n  return {\n    span_id,\n    trace_id,\n    start_timestamp: 0,\n    name: '',\n    end_timestamp: 0,\n    status: 'ok',\n    is_segment: span === INTERNAL_getSegmentSpan(span),\n  };\n}\n\n/**\n * In preparation for the next major of OpenTelemetry, we want to support\n * looking up the parent span id according to the new API\n * In OTel v1, the parent span id is accessed as `parentSpanId`\n * In OTel v2, the parent span id is accessed as `spanId` on the `parentSpanContext`\n */\nfunction getOtelParentSpanId(span: OpenTelemetrySdkTraceBaseSpan): string | undefined {\n  return 'parentSpanId' in span\n    ? span.parentSpanId\n    : 'parentSpanContext' in span\n      ? (span.parentSpanContext as { spanId?: string } | undefined)?.spanId\n      : undefined;\n}\n\n/**\n * Converts a {@link StreamedSpanJSON} to a {@link SerializedSpan}.\n * This is the final serialized span format that is sent to Sentry.\n * The returned serilaized spans must not be consumed by users or SDK integrations.\n */\nexport function streamedSpanJsonToSerializedSpan(spanJson: StreamedSpanJSON): SerializedStreamedSpan {\n  return {\n    ...spanJson,\n    attributes: serializeAttributes(spanJson.attributes),\n    links: spanJson.links?.map(link => ({\n      ...link,\n      attributes: serializeAttributes(link.attributes),\n    })),\n  };\n}\n\nfunction spanIsOpenTelemetrySdkTraceBaseSpan(span: Span): span is OpenTelemetrySdkTraceBaseSpan {\n  const castSpan = span as Partial<OpenTelemetrySdkTraceBaseSpan>;\n  return !!castSpan.attributes && !!castSpan.startTime && !!castSpan.name && !!castSpan.endTime && !!castSpan.status;\n}\n\n/** Exported only for tests. */\nexport interface OpenTelemetrySdkTraceBaseSpan extends Span {\n  attributes: SpanAttributes;\n  startTime: SpanTimeInput;\n  name: string;\n  status: SpanStatus;\n  endTime: SpanTimeInput;\n  parentSpanId?: string;\n  links?: SpanLink[];\n}\n\n/**\n * Sadly, due to circular dependency checks we cannot actually import the Span class here and check for instanceof.\n * :( So instead we approximate this by checking if it has the `getSpanJSON` method.\n */\nfunction spanIsSentrySpan(span: Span): span is SentrySpan {\n  return typeof (span as SentrySpan).getSpanJSON === 'function';\n}\n\n/**\n * Returns true if a span is sampled.\n * In most cases, you should just use `span.isRecording()` instead.\n * However, this has a slightly different semantic, as it also returns false if the span is finished.\n * So in the case where this distinction is important, use this method.\n */\nexport function spanIsSampled(span: Span): boolean {\n  // We align our trace flags with the ones OpenTelemetry use\n  // So we also check for sampled the same way they do.\n  const { traceFlags } = span.spanContext();\n  return traceFlags === TRACE_FLAG_SAMPLED;\n}\n\n/** Get the status message to use for a JSON representation of a span. */\nexport function getStatusMessage(status: SpanStatus | undefined): string | undefined {\n  if (!status || status.code === SPAN_STATUS_UNSET) {\n    return undefined;\n  }\n\n  if (status.code === SPAN_STATUS_OK) {\n    return 'ok';\n  }\n\n  return status.message || 'internal_error';\n}\n\n/**\n * Convert the various statuses to the simple ones expected by Sentry for streamed spans ('ok' is default).\n */\nexport function getSimpleStatus(status: SpanStatus | undefined): 'ok' | 'error' {\n  return !status ||\n    status.code === SPAN_STATUS_OK ||\n    status.code === SPAN_STATUS_UNSET ||\n    status.message === 'cancelled'\n    ? 'ok'\n    : 'error';\n}\n\n/**\n * Returns the span's attributes with the SEMANTIC_ATTRIBUTE_SENTRY_STATUS_MESSAGE attribute added\n * if the span has an error status message worth preserving.\n *\n * An explicitly set attribute is never overwritten.\n */\nexport function addStatusMessageAttribute(\n  attributes: SpanAttributes,\n  status: SpanStatus | undefined,\n): RawAttributes<Record<string, unknown>> {\n  const statusMessage = getSimpleStatus(status) === 'error' ? status?.message : undefined;\n  return {\n    ...(statusMessage && { [SEMANTIC_ATTRIBUTE_SENTRY_STATUS_MESSAGE]: statusMessage }),\n    ...attributes,\n  };\n}\n\nconst CHILD_SPANS_FIELD = '_sentryChildSpans';\nconst ROOT_SPAN_FIELD = '_sentryRootSpan';\n\ntype SpanWithPotentialChildren = Span & {\n  [CHILD_SPANS_FIELD]?: Set<Span>;\n  [ROOT_SPAN_FIELD]?: Span;\n};\n\n/**\n * Adds an opaque child span reference to a span.\n */\nexport function addChildSpanToSpan(span: SpanWithPotentialChildren, childSpan: Span): void {\n  // We store the root span reference on the child span\n  // We need this for `getRootSpan()` to work\n  const rootSpan = span[ROOT_SPAN_FIELD] || span;\n  addNonEnumerableProperty(childSpan as SpanWithPotentialChildren, ROOT_SPAN_FIELD, rootSpan);\n\n  // We store a list of child spans on the parent span\n  // We need this for `getSpanDescendants()` to work\n  if (span[CHILD_SPANS_FIELD]) {\n    span[CHILD_SPANS_FIELD].add(childSpan);\n  } else {\n    addNonEnumerableProperty(span, CHILD_SPANS_FIELD, new Set([childSpan]));\n  }\n}\n\n/** This is only used internally by Idle Spans. */\nexport function removeChildSpanFromSpan(span: SpanWithPotentialChildren, childSpan: Span): void {\n  if (span[CHILD_SPANS_FIELD]) {\n    span[CHILD_SPANS_FIELD].delete(childSpan);\n  }\n}\n\n/**\n * Returns an array of the given span and all of its descendants.\n */\nexport function getSpanDescendants(span: SpanWithPotentialChildren): Span[] {\n  const resultSet = new Set<Span>();\n\n  function addSpanChildren(span: SpanWithPotentialChildren): void {\n    // This exit condition is required to not infinitely loop in case of a circular dependency.\n    if (resultSet.has(span)) {\n      return;\n      // We want to ignore unsampled spans (e.g. non recording spans)\n    } else if (spanIsSampled(span)) {\n      resultSet.add(span);\n      const childSpans = span[CHILD_SPANS_FIELD] ? Array.from(span[CHILD_SPANS_FIELD]) : [];\n      for (const childSpan of childSpans) {\n        addSpanChildren(childSpan);\n      }\n    }\n  }\n\n  addSpanChildren(span);\n\n  return Array.from(resultSet);\n}\n\n/**\n * Returns the root span of a given span.\n */\nexport const getRootSpan = INTERNAL_getSegmentSpan;\n\n/**\n * Returns the segment span of a given span.\n */\nexport function INTERNAL_getSegmentSpan(span: SpanWithPotentialChildren): Span {\n  return span[ROOT_SPAN_FIELD] || span;\n}\n\n/**\n * Returns the currently active span.\n */\nexport function getActiveSpan(): Span | undefined {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  if (acs.getActiveSpan) {\n    return acs.getActiveSpan();\n  }\n\n  return _getSpanForScope(getCurrentScope());\n}\n\n/**\n * Logs a warning once if `beforeSendSpan` is used to drop spans.\n */\nexport function showSpanDropWarning(): void {\n  if (!hasShownSpanDropWarning) {\n    consoleSandbox(() => {\n      // eslint-disable-next-line no-console\n      console.warn(\n        '[Sentry] Returning null from `beforeSendSpan` is disallowed. To drop certain spans, configure the respective integrations directly or use `ignoreSpans`.',\n      );\n    });\n    hasShownSpanDropWarning = true;\n  }\n}\n\n/**\n * Updates the name of the given span and ensures that the span name is not\n * overwritten by the Sentry SDK.\n *\n * Use this function instead of `span.updateName()` if you want to make sure that\n * your name is kept. For some spans, for example root `http.server` spans the\n * Sentry SDK would otherwise overwrite the span name with a high-quality name\n * it infers when the span ends.\n *\n * Use this function in server code or when your span is started on the server\n * and on the client (browser). If you only update a span name on the client,\n * you can also use `span.updateName()` the SDK does not overwrite the name.\n *\n * @param span - The span to update the name of.\n * @param name - The name to set on the span.\n */\nexport function updateSpanName(span: Span, name: string): void {\n  span.updateName(name);\n  span.setAttributes({\n    [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n    [SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME]: name,\n  });\n}\n","import type { Event } from '../types/event';\nimport type { StackFrame } from '../types/stackframe';\nimport type { StackLineParser, StackParser } from '../types/stacktrace';\nimport type { VNode, VueViewModel } from '../types/vue';\n\nconst STACKTRACE_FRAME_LIMIT = 50;\nexport const UNKNOWN_FUNCTION = '?';\n// Used to sanitize webpack (error: *) wrapped stack errors\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/;\nconst STRIP_FRAME_REGEXP = /captureMessage|captureException/;\n\n/**\n * Creates a stack parser with the supplied line parsers\n *\n * StackFrames are returned in the correct order for Sentry Exception\n * frames and with Sentry SDK internal frames removed from the top and bottom\n *\n */\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n  const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map(p => p[1]);\n\n  return (stack: string, skipFirstLines: number = 0, framesToPop: number = 0): StackFrame[] => {\n    const frames: StackFrame[] = [];\n    const lines = stack.split('\\n');\n\n    for (let i = skipFirstLines; i < lines.length; i++) {\n      let line = lines[i] as string;\n      // Truncate lines over 1kb because many of the regular expressions use\n      // backtracking which results in run time that increases exponentially\n      // with input size. Huge strings can result in hangs/Denial of Service:\n      // https://github.com/getsentry/sentry-javascript/issues/2286\n      if (line.length > 1024) {\n        line = line.slice(0, 1024);\n      }\n\n      // https://github.com/getsentry/sentry-javascript/issues/5459\n      // Remove webpack (error: *) wrappers\n      const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line;\n\n      // https://github.com/getsentry/sentry-javascript/issues/7813\n      // Skip Error: lines\n      // Using includes() instead of a regex to avoid O(n²) backtracking on long lines\n      // https://github.com/getsentry/sentry-javascript/issues/20052\n      if (cleanedLine.includes('Error: ')) {\n        continue;\n      }\n\n      for (const parser of sortedParsers) {\n        const frame = parser(cleanedLine);\n\n        if (frame) {\n          frames.push(frame);\n          break;\n        }\n      }\n\n      if (frames.length >= STACKTRACE_FRAME_LIMIT + framesToPop) {\n        break;\n      }\n    }\n\n    return stripSentryFramesAndReverse(frames.slice(framesToPop));\n  };\n}\n\n/**\n * Gets a stack parser implementation from Options.stackParser\n * @see Options\n *\n * If options contains an array of line parsers, it is converted into a parser\n */\nexport function stackParserFromStackParserOptions(stackParser: StackParser | StackLineParser[]): StackParser {\n  if (Array.isArray(stackParser)) {\n    return createStackParser(...stackParser);\n  }\n  return stackParser;\n}\n\n/**\n * Removes Sentry frames from the top and bottom of the stack if present and enforces a limit of max number of frames.\n * Assumes stack input is ordered from top to bottom and returns the reverse representation so call site of the\n * function that caused the crash is the last frame in the array.\n * @hidden\n */\nexport function stripSentryFramesAndReverse(stack: ReadonlyArray<StackFrame>): StackFrame[] {\n  if (!stack.length) {\n    return [];\n  }\n\n  const localStack = Array.from(stack);\n\n  // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n  if (/sentryWrapped/.test(getLastStackFrame(localStack).function || '')) {\n    localStack.pop();\n  }\n\n  // Reversing in the middle of the procedure allows us to just pop the values off the stack\n  localStack.reverse();\n\n  // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n  if (STRIP_FRAME_REGEXP.test(getLastStackFrame(localStack).function || '')) {\n    localStack.pop();\n\n    // When using synthetic events, we will have a 2 levels deep stack, as `new Error('Sentry syntheticException')`\n    // is produced within the scope itself, making it:\n    //\n    //   Sentry.captureException()\n    //   scope.captureException()\n    //\n    // instead of just the top `Sentry` call itself.\n    // This forces us to possibly strip an additional frame in the exact same was as above.\n    if (STRIP_FRAME_REGEXP.test(getLastStackFrame(localStack).function || '')) {\n      localStack.pop();\n    }\n  }\n\n  return localStack.slice(0, STACKTRACE_FRAME_LIMIT).map(frame => ({\n    ...frame,\n    filename: frame.filename || getLastStackFrame(localStack).filename,\n    function: frame.function || UNKNOWN_FUNCTION,\n  }));\n}\n\nfunction getLastStackFrame(arr: StackFrame[]): StackFrame {\n  return arr[arr.length - 1] || {};\n}\n\nconst defaultFunctionName = '<anonymous>';\n\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn: unknown): string {\n  try {\n    if (!fn || typeof fn !== 'function') {\n      return defaultFunctionName;\n    }\n    return fn.name || defaultFunctionName;\n  } catch {\n    // Just accessing custom props in some Selenium environments\n    // can cause a \"Permission denied\" exception (see raven-js#495).\n    return defaultFunctionName;\n  }\n}\n\n/**\n * Get's stack frames from an event without needing to check for undefined properties.\n */\nexport function getFramesFromEvent(event: Event): StackFrame[] | undefined {\n  const exception = event.exception;\n\n  if (exception) {\n    const frames: StackFrame[] = [];\n    try {\n      // @ts-expect-error Object could be undefined\n      exception.values.forEach(value => {\n        // @ts-expect-error Value could be undefined\n        if (value.stacktrace.frames) {\n          // @ts-expect-error Value could be undefined\n          frames.push(...value.stacktrace.frames);\n        }\n      });\n      return frames;\n    } catch {\n      return undefined;\n    }\n  }\n  return undefined;\n}\n\n/**\n * Get the internal name of an internal Vue value, to represent it in a stacktrace.\n *\n * @param value The value to get the internal name of.\n * @deprecated This is Vue-specific and will be removed from `@sentry/core` in a future major version.\n * The `@sentry/vue` SDK inlines its own equivalent — there's no replacement export from core.\n */\nexport function getVueInternalName(value: VueViewModel | VNode): string {\n  // Check if it's a VNode (has __v_isVNode) or a component instance (has _isVue/__isVue)\n  const isVNode = '__v_isVNode' in value && value.__v_isVNode;\n\n  return isVNode ? '[VueVNode]' : '[VueViewModel]';\n}\n\n/**\n * Normalizes stack line paths by removing file:// prefix and leading slashes for Windows paths\n */\nexport function normalizeStackTracePath(path: string | undefined): string | undefined {\n  let filename = path?.startsWith('file://') ? path.slice(7) : path;\n  // If it's a Windows path, trim the leading slash so that `/C:/foo` becomes `C:/foo`\n  if (filename?.match(/\\/[A-Z]:/)) {\n    filename = filename.slice(1);\n  }\n  return filename;\n}\n","import { isPrimitive, isRegExp, isString } from './is';\nimport { stringifyValue } from './normalize';\n\nexport { escapeStringForRegex } from '../vendor/escapeStringForRegex';\n\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string (0 = unlimited)\n * @returns string Encoded\n */\nexport function truncate(str: string, max: number = 0): string {\n  if (typeof str !== 'string' || max === 0) {\n    return str;\n  }\n  return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\n\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function snipLine(line: string, colno: number): string {\n  let newLine = line;\n  const lineLength = newLine.length;\n  if (lineLength <= 150) {\n    return newLine;\n  }\n  if (colno > lineLength) {\n    // eslint-disable-next-line no-param-reassign\n    colno = lineLength;\n  }\n\n  let start = Math.max(colno - 60, 0);\n  if (start < 5) {\n    start = 0;\n  }\n\n  let end = Math.min(start + 140, lineLength);\n  if (end > lineLength - 5) {\n    end = lineLength;\n  }\n  if (end === lineLength) {\n    start = Math.max(end - 140, 0);\n  }\n\n  newLine = newLine.slice(start, end);\n  if (start > 0) {\n    newLine = `'{snip} ${newLine}`;\n  }\n  if (end < lineLength) {\n    newLine += ' {snip}';\n  }\n\n  return newLine;\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\nexport function safeJoin(input: unknown[], delimiter?: string): string {\n  if (!Array.isArray(input)) {\n    return '';\n  }\n\n  const output = [];\n  // eslint-disable-next-line typescript/prefer-for-of\n  for (let i = 0; i < input.length; i++) {\n    const value = input[i];\n    if (isPrimitive(value)) {\n      output.push(String(value));\n    } else if (value instanceof Error) {\n      // While stringifyValue does not special-case errors, because we later handle them specifically based on the [object XXX] fallback,\n      // in this method we want to render them more nicely\n      output.push(value.message ? `${value.name}: ${value.message}` : value.name);\n    } else {\n      output.push(stringifyValue(undefined, value));\n    }\n  }\n\n  return output.join(delimiter);\n}\n\n/**\n * Checks if the given value matches a regex or string\n *\n * @param value The string to test\n * @param pattern Either a regex or a string against which `value` will be matched\n * @param requireExactStringMatch If true, `value` must match `pattern` exactly. If false, `value` will match\n * `pattern` if it contains `pattern`. Only applies to string-type patterns.\n */\nexport function isMatchingPattern(\n  value: string,\n  pattern: RegExp | string | ((value: string) => boolean),\n  requireExactStringMatch: boolean = false,\n): boolean {\n  if (!isString(value)) {\n    return false;\n  }\n\n  if (isRegExp(pattern)) {\n    return pattern.test(value);\n  }\n  if (isString(pattern)) {\n    return requireExactStringMatch ? value === pattern : value.includes(pattern);\n  }\n  if (typeof pattern === 'function') {\n    return pattern(value);\n  }\n\n  return false;\n}\n\n/**\n * Test the given string against an array of strings and regexes. By default, string matching is done on a\n * substring-inclusion basis rather than a strict equality basis\n *\n * @param testString The string to test\n * @param patterns The patterns against which to test the string\n * @param requireExactStringMatch If true, `testString` must match one of the given string patterns exactly in order to\n * count. If false, `testString` will match a string pattern if it contains that pattern.\n * @returns\n */\nexport function stringMatchesSomePattern(\n  testString: string,\n  patterns:\n    | Array<string | RegExp | ((value: string) => boolean)>\n    | Set<string | RegExp | ((value: string) => boolean)> = [],\n  requireExactStringMatch: boolean = false,\n): boolean {\n  for (const pattern of patterns) {\n    if (isMatchingPattern(testString, pattern, requireExactStringMatch)) {\n      return true;\n    }\n  }\n  return false;\n}\n","import { safeDateNow, withRandomSafeContext } from './randomSafeContext';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst ONE_SECOND_IN_MS = 1000;\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\ninterface Performance {\n  /**\n   * The millisecond timestamp at which measurement began, measured in Unix time.\n   */\n  timeOrigin: number;\n  /**\n   * Returns the current millisecond timestamp, where 0 represents the start of measurement.\n   */\n  now(): number;\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nexport function dateTimestampInSeconds(): number {\n  return safeDateNow() / ONE_SECOND_IN_MS;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction createUnixTimestampInSecondsFunc(): () => number {\n  const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & { performance?: Performance };\n  // Some browser and environments don't have a performance or timeOrigin, so we fallback to\n  // using Date.now() to compute the starting time.\n  if (!performance?.now || !performance.timeOrigin) {\n    return dateTimestampInSeconds;\n  }\n\n  const timeOrigin = performance.timeOrigin;\n\n  // performance.now() is a monotonic clock, which means it starts at 0 when the process begins. To get the current\n  // wall clock time (actual UNIX timestamp), we need to add the starting time origin and the current time elapsed.\n  //\n  // TODO: This does not account for the case where the monotonic clock that powers performance.now() drifts from the\n  // wall clock time, which causes the returned timestamp to be inaccurate. We should investigate how to detect and\n  // correct for this.\n  // See: https://github.com/getsentry/sentry-javascript/issues/2590\n  // See: https://github.com/mdn/content/issues/4713\n  // See: https://dev.to/noamr/when-a-millisecond-is-not-a-millisecond-3h6\n  return () => {\n    return (timeOrigin + withRandomSafeContext(() => performance.now())) / ONE_SECOND_IN_MS;\n  };\n}\n\nlet _cachedTimestampInSeconds: (() => number) | undefined;\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport function timestampInSeconds(): number {\n  // We store this in a closure so that we don't have to create a new function every time this is called.\n  const func = _cachedTimestampInSeconds ?? (_cachedTimestampInSeconds = createUnixTimestampInSecondsFunc());\n  return func();\n}\n\n/**\n * Cached result of getBrowserTimeOrigin.\n */\nlet cachedTimeOrigin: number | null | undefined = null;\n\n/**\n * Gets the time origin and the mode used to determine it.\n *\n * Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n * performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n * data as reliable if they are within a reasonable threshold of the current time.\n *\n * TODO: move to `@sentry/browser-utils` package.\n */\nfunction getBrowserTimeOrigin(): number | undefined {\n  const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n  if (!performance?.now) {\n    return undefined;\n  }\n\n  const threshold = 300_000; // 5 minutes in milliseconds\n  const performanceNow = withRandomSafeContext(() => performance.now());\n  const dateNow = safeDateNow();\n\n  const timeOrigin = performance.timeOrigin;\n  if (typeof timeOrigin === 'number') {\n    const timeOriginDelta = Math.abs(timeOrigin + performanceNow - dateNow);\n    if (timeOriginDelta < threshold) {\n      return timeOrigin;\n    }\n  }\n\n  // TODO: Remove all code related to `performance.timing.navigationStart` once we drop support for Safari 14.\n  // `performance.timeSince` is available in Safari 15.\n  // see: https://caniuse.com/mdn-api_performance_timeorigin\n\n  // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n  // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n  // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n  // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n  // Date API.\n  // eslint-disable-next-line typescript/no-deprecated\n  const navigationStart = performance.timing?.navigationStart;\n  if (typeof navigationStart === 'number') {\n    const navigationStartDelta = Math.abs(navigationStart + performanceNow - dateNow);\n    if (navigationStartDelta < threshold) {\n      return navigationStart;\n    }\n  }\n\n  // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to subtracting\n  // `performance.now()` from `Date.now()`.\n  return dateNow - performanceNow;\n}\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport function browserPerformanceTimeOrigin(): number | undefined {\n  if (cachedTimeOrigin === null) {\n    cachedTimeOrigin = getBrowserTimeOrigin();\n  }\n\n  return cachedTimeOrigin;\n}\n","// This is a magic string replaced by rollup\ndeclare const __SENTRY_SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SENTRY_SDK_VERSION__ === 'string' ? __SENTRY_SDK_VERSION__ : '0.0.0-unknown.0';\n","import { GLOBAL_OBJ } from './worldwide';\n\n/**\n * Interface representing a weak reference to an object.\n * This matches the standard WeakRef interface but is defined here\n * because WeakRef is not available in ES2020 type definitions.\n */\ninterface WeakRefLike<T extends object> {\n  deref(): T | undefined;\n}\n\n/**\n * A wrapper type that represents either a WeakRef-like object or a direct reference.\n * Used for optional weak referencing in environments where WeakRef may not be available.\n */\nexport type MaybeWeakRef<T extends object> = WeakRefLike<T> | T;\n\n/**\n * Creates a weak reference to an object if WeakRef is available,\n * otherwise returns the object directly.\n *\n * This is useful for breaking circular references while maintaining\n * compatibility with environments that don't support WeakRef (e.g., older browsers).\n *\n * @param value - The object to create a weak reference to\n * @returns A WeakRef wrapper if available, or the original object as fallback\n */\nexport function makeWeakRef<T extends object>(value: T): MaybeWeakRef<T> {\n  try {\n    // @ts-expect-error - WeakRef may not be in the type definitions for older TS targets\n    const WeakRefImpl = GLOBAL_OBJ.WeakRef;\n    if (typeof WeakRefImpl === 'function') {\n      return new WeakRefImpl(value);\n    }\n  } catch {\n    // WeakRef not available or construction failed\n  }\n  return value;\n}\n\n/**\n * Resolves a potentially weak reference, returning the underlying object\n * or undefined if the reference has been garbage collected.\n *\n * @param ref - A MaybeWeakRef or undefined\n * @returns The referenced object, or undefined if GC'd or ref was undefined\n */\nexport function derefWeakRef<T extends object>(ref: MaybeWeakRef<T> | undefined): T | undefined {\n  if (!ref) {\n    return undefined;\n  }\n\n  // Check if this is a WeakRef (has deref method)\n  if (typeof ref === 'object' && 'deref' in ref && typeof ref.deref === 'function') {\n    try {\n      return ref.deref();\n    } catch {\n      // deref() failed - treat as GC'd\n      return undefined;\n    }\n  }\n\n  // Direct reference fallback\n  return ref as T;\n}\n","/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the `debug` singleton, or b) put your function elsewhere.\n *\n * Note: This file was originally called `global.ts`, but was changed to unblock users which might be doing\n * string replaces with bundlers like Vite for `global` (would break imports that rely on importing from utils/src/global).\n *\n * Why worldwide?\n *\n * Why not?\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { Carrier } from '../carrier';\nimport type { SdkSource } from './env';\n\n/** Internal global with common properties and Sentry extensions  */\nexport type InternalGlobal = {\n  navigator?: { userAgent?: string; maxTouchPoints?: number };\n  console: Console;\n  PerformanceObserver?: any;\n  Sentry?: any;\n  onerror?: {\n    (event: object | string, source?: string, lineno?: number, colno?: number, error?: Error): any;\n    __SENTRY_INSTRUMENTED__?: true;\n  };\n  onunhandledrejection?: {\n    (event: unknown): boolean;\n    __SENTRY_INSTRUMENTED__?: true;\n  };\n  SENTRY_ENVIRONMENT?: string;\n  SENTRY_DSN?: string;\n  SENTRY_RELEASE?: {\n    id?: string;\n  };\n  SENTRY_SDK_SOURCE?: SdkSource;\n  /**\n   * Debug IDs are indirectly injected by Sentry CLI or bundler plugins to directly reference a particular source map\n   * for resolving of a source file. The injected code will place an entry into the record for each loaded bundle/JS\n   * file.\n   */\n  _sentryDebugIds?: Record<string, string>;\n  /**\n   * Native debug IDs implementation (e.g., from Vercel).\n   * This uses the same format as _sentryDebugIds but with a different global name.\n   * Keys are `error.stack` strings, values are debug IDs.\n   */\n  _debugIds?: Record<string, string>;\n  /**\n   * Raw module metadata that is injected by bundler plugins.\n   *\n   * Keys are `error.stack` strings, values are the metadata.\n   */\n  _sentryModuleMetadata?: Record<string, any>;\n  _sentryEsmLoaderHookRegistered?: boolean;\n  _sentryWrappedDepth?: number;\n} & Carrier;\n\n/** Get's the global object for the current JavaScript runtime */\nexport const GLOBAL_OBJ = globalThis as unknown as InternalGlobal;\n","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction AskToJoinIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 18.156q.478 0 .802-.323.323-.324.323-.802h-2.25q0 .478.323.802.324.323.802.323M8.063 16.47h7.874a.54.54 0 0 0 .394-.169.54.54 0 0 0 0-.788.54.54 0 0 0-.393-.168h-.563V12.7q0-1.237-.675-2.25a3 3 0 0 0-1.856-1.294v-.281a.82.82 0 0 0-.24-.605.82.82 0 0 0-.604-.239.82.82 0 0 0-.844.844v.281A3 3 0 0 0 9.3 10.45a3.97 3.97 0 0 0-.675 2.25v2.644h-.562a.54.54 0 0 0-.394.168.54.54 0 0 0 0 .788.54.54 0 0 0 .394.169M3 19.844V9.719q0-.534.24-1.013.238-.478.66-.787l6.75-5.063q.31-.225.647-.337.338-.113.703-.113.366 0 .703.113.337.112.647.337L20.1 7.92q.422.309.66.787.24.479.24 1.013v10.125q0 .927-.66 1.589-.662.66-1.59.66H5.25q-.928 0-1.59-.66-.66-.66-.66-1.59m2.25 0h13.5V9.719L12 4.656 5.25 9.72z\"\n    })\n  });\n}\n;\nAskToJoinIcon.displayName = \"AskToJoinIcon\";\nexport default forwardRef(AskToJoinIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction BlockIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 22a9.7 9.7 0 0 1-3.9-.788 10.1 10.1 0 0 1-3.175-2.137q-1.35-1.35-2.137-3.175A9.7 9.7 0 0 1 2 12q0-2.075.788-3.9a10.1 10.1 0 0 1 2.137-3.175q1.35-1.35 3.175-2.137A9.7 9.7 0 0 1 12 2q2.075 0 3.9.788a10.1 10.1 0 0 1 3.175 2.137q1.35 1.35 2.137 3.175A9.7 9.7 0 0 1 22 12a9.7 9.7 0 0 1-.788 3.9 10.1 10.1 0 0 1-2.137 3.175q-1.35 1.35-3.175 2.137A9.7 9.7 0 0 1 12 22m0-2q3.35 0 5.675-2.325T20 12q0-1.35-.437-2.6A8 8 0 0 0 18.3 7.1L7.1 18.3q1.05.825 2.3 1.262T12 20m-6.3-3.1L16.9 5.7a8 8 0 0 0-2.3-1.263A7.8 7.8 0 0 0 12 4Q8.65 4 6.325 6.325T4 12q0 1.35.438 2.6A8 8 0 0 0 5.7 16.9\"\n    })\n  });\n}\n;\nBlockIcon.displayName = \"BlockIcon\";\nexport default forwardRef(BlockIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction BoldIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M8.8 19q-.824 0-1.413-.587A1.93 1.93 0 0 1 6.8 17V7q0-.824.587-1.412A1.93 1.93 0 0 1 8.8 5h3.525q1.624 0 3 1T16.7 8.775q0 1.275-.575 1.963-.575.687-1.075.987.626.275 1.387 1.025.763.75.763 2.25 0 2.224-1.625 3.113-1.625.887-3.05.887zm1.025-2.8h2.6q1.2 0 1.462-.612.263-.614.263-.888 0-.275-.263-.887-.262-.613-1.537-.613H9.825zm0-5.7h2.325q.825 0 1.2-.425a1.4 1.4 0 0 0 .375-.95q0-.6-.425-.975t-1.1-.375H9.825z\"\n    })\n  });\n}\n;\nBoldIcon.displayName = \"BoldIcon\";\nexport default forwardRef(BoldIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ChatSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M2.95 16.3 1.5 21.25a.94.94 0 0 0 .25 1 .94.94 0 0 0 1 .25l4.95-1.45a10.2 10.2 0 0 0 2.1.712Q10.875 22 12 22a9.7 9.7 0 0 0 3.9-.788 10.1 10.1 0 0 0 3.175-2.137q1.35-1.35 2.137-3.175A9.7 9.7 0 0 0 22 12a9.7 9.7 0 0 0-.788-3.9 10.1 10.1 0 0 0-2.137-3.175q-1.35-1.35-3.175-2.137A9.7 9.7 0 0 0 12 2a9.7 9.7 0 0 0-3.9.788 10.1 10.1 0 0 0-3.175 2.137Q3.575 6.275 2.788 8.1A9.7 9.7 0 0 0 2 12q0 1.125.238 2.2.237 1.076.712 2.1\"\n    })\n  });\n}\n;\nChatSolidIcon.displayName = \"ChatSolidIcon\";\nexport default forwardRef(ChatSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ChatIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"m1.5 21.25 1.45-4.95a10.2 10.2 0 0 1-.712-2.1A10.2 10.2 0 0 1 2 12q0-2.075.788-3.9a10.1 10.1 0 0 1 2.137-3.175q1.35-1.35 3.175-2.137A9.7 9.7 0 0 1 12 2q2.075 0 3.9.788a10.1 10.1 0 0 1 3.175 2.137q1.35 1.35 2.137 3.175A9.7 9.7 0 0 1 22 12a9.7 9.7 0 0 1-.788 3.9 10.1 10.1 0 0 1-2.137 3.175q-1.35 1.35-3.175 2.137A9.7 9.7 0 0 1 12 22q-1.125 0-2.2-.238a10.2 10.2 0 0 1-2.1-.712L2.75 22.5a.94.94 0 0 1-1-.25.94.94 0 0 1-.25-1m2.45-1.2 3.2-.95a1 1 0 0 1 .275-.062q.15-.013.275-.013.225 0 .438.038.212.036.412.137a7.4 7.4 0 0 0 1.675.6Q11.1 20 12 20q3.35 0 5.675-2.325T20 12t-2.325-5.675T12 4 6.325 6.325 4 12q0 .9.2 1.775t.6 1.675q.176.325.188.688t-.088.712z\"\n    })\n  });\n}\n;\nChatIcon.displayName = \"ChatIcon\";\nexport default forwardRef(ChatIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction CheckCircleSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"m10.6 13.8-2.15-2.15a.95.95 0 0 0-.7-.275.95.95 0 0 0-.7.275.95.95 0 0 0-.275.7q0 .425.275.7L9.9 15.9q.3.3.7.3t.7-.3l5.65-5.65a.95.95 0 0 0 .275-.7.95.95 0 0 0-.275-.7.95.95 0 0 0-.7-.275.95.95 0 0 0-.7.275zM12 22a9.7 9.7 0 0 1-3.9-.788 10.1 10.1 0 0 1-3.175-2.137q-1.35-1.35-2.137-3.175A9.7 9.7 0 0 1 2 12q0-2.075.788-3.9a10.1 10.1 0 0 1 2.137-3.175q1.35-1.35 3.175-2.137A9.7 9.7 0 0 1 12 2q2.075 0 3.9.788a10.1 10.1 0 0 1 3.175 2.137q1.35 1.35 2.137 3.175A9.7 9.7 0 0 1 22 12a9.7 9.7 0 0 1-.788 3.9 10.1 10.1 0 0 1-2.137 3.175q-1.35 1.35-3.175 2.137A9.7 9.7 0 0 1 12 22\"\n    })\n  });\n}\n;\nCheckCircleSolidIcon.displayName = \"CheckCircleSolidIcon\";\nexport default forwardRef(CheckCircleSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction CheckCircleIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"m10.6 13.8-2.15-2.15a.95.95 0 0 0-.7-.275.95.95 0 0 0-.7.275.95.95 0 0 0-.275.7q0 .425.275.7L9.9 15.9q.3.3.7.3t.7-.3l5.65-5.65a.95.95 0 0 0 .275-.7.95.95 0 0 0-.275-.7.95.95 0 0 0-.7-.275.95.95 0 0 0-.7.275zM12 22a9.7 9.7 0 0 1-3.9-.788 10.1 10.1 0 0 1-3.175-2.137q-1.35-1.35-2.137-3.175A9.7 9.7 0 0 1 2 12q0-2.075.788-3.9a10.1 10.1 0 0 1 2.137-3.175q1.35-1.35 3.175-2.137A9.7 9.7 0 0 1 12 2q2.075 0 3.9.788a10.1 10.1 0 0 1 3.175 2.137q1.35 1.35 2.137 3.175A9.7 9.7 0 0 1 22 12a9.7 9.7 0 0 1-.788 3.9 10.1 10.1 0 0 1-2.137 3.175q-1.35 1.35-3.175 2.137A9.7 9.7 0 0 1 12 22m0-2q3.35 0 5.675-2.325T20 12t-2.325-5.675T12 4 6.325 6.325 4 12t2.325 5.675T12 20\"\n    })\n  });\n}\n;\nCheckCircleIcon.displayName = \"CheckCircleIcon\";\nexport default forwardRef(CheckCircleIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ChevronLeftIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"m13.3 17.3-4.6-4.6a.9.9 0 0 1-.213-.325A1.1 1.1 0 0 1 8.425 12q0-.2.062-.375A.9.9 0 0 1 8.7 11.3l4.6-4.6a.95.95 0 0 1 .7-.275q.425 0 .7.275a.95.95 0 0 1 .275.7.95.95 0 0 1-.275.7L10.8 12l3.9 3.9a.95.95 0 0 1 .275.7.95.95 0 0 1-.275.7.95.95 0 0 1-.7.275.95.95 0 0 1-.7-.275\"\n    })\n  });\n}\n;\nChevronLeftIcon.displayName = \"ChevronLeftIcon\";\nexport default forwardRef(ChevronLeftIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ChevronUpIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"m12 10.775-3.9 3.9a.95.95 0 0 1-.7.275.95.95 0 0 1-.7-.275.95.95 0 0 1-.275-.7q0-.425.275-.7l4.6-4.6q.15-.15.325-.212Q11.8 8.4 12 8.4t.375.063a.9.9 0 0 1 .325.212l4.6 4.6a.95.95 0 0 1 .275.7.95.95 0 0 1-.275.7.95.95 0 0 1-.7.275.95.95 0 0 1-.7-.275z\"\n    })\n  });\n}\n;\nChevronUpIcon.displayName = \"ChevronUpIcon\";\nexport default forwardRef(ChevronUpIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction CollapseIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 11.034a1 1 0 0 0 .29.702l.005.005c.18.18.43.29.705.29h8a1 1 0 0 0 0-2h-5.586L22 3.445a1 1 0 0 0-1.414-1.414L14 8.617V3.031a1 1 0 1 0-2 0zm0 1.963a1 1 0 0 0-.29-.702l-.005-.004A1 1 0 0 0 11 12H3a1 1 0 1 0 0 2h5.586L2 20.586A1 1 0 1 0 3.414 22L10 15.414V21a1 1 0 0 0 2 0z\"\n    })\n  });\n}\n;\nCollapseIcon.displayName = \"CollapseIcon\";\nexport default forwardRef(CollapseIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction CopyIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M14 5H5v9h1a1 1 0 1 1 0 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1a1 1 0 1 1-2 0z\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M8 10a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-9a2 2 0 0 1-2-2zm2 0v9h9v-9z\"\n    })]\n  });\n}\n;\nCopyIcon.displayName = \"CopyIcon\";\nexport default forwardRef(CopyIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction DeleteIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M7 21q-.824 0-1.412-.587A1.93 1.93 0 0 1 5 19V6a.97.97 0 0 1-.713-.287A.97.97 0 0 1 4 5q0-.424.287-.713A.97.97 0 0 1 5 4h4q0-.424.287-.712A.97.97 0 0 1 10 3h4q.424 0 .713.288Q15 3.575 15 4h4q.424 0 .712.287Q20 4.576 20 5t-.288.713A.97.97 0 0 1 19 6v13q0 .824-.587 1.413A1.93 1.93 0 0 1 17 21zM7 6v13h10V6zm2 10q0 .424.287.712Q9.576 17 10 17t.713-.288A.97.97 0 0 0 11 16V9a.97.97 0 0 0-.287-.713A.97.97 0 0 0 10 8a.97.97 0 0 0-.713.287A.97.97 0 0 0 9 9zm4 0q0 .424.287.712.288.288.713.288.424 0 .713-.288A.97.97 0 0 0 15 16V9a.97.97 0 0 0-.287-.713A.97.97 0 0 0 14 8a.97.97 0 0 0-.713.287A.97.97 0 0 0 13 9z\"\n    })\n  });\n}\n;\nDeleteIcon.displayName = \"DeleteIcon\";\nexport default forwardRef(DeleteIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction DialPadIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 18.6c-.99 0-1.8.81-1.8 1.8s.81 1.8 1.8 1.8 1.8-.81 1.8-1.8-.81-1.8-1.8-1.8M6.6 2.4c-.99 0-1.8.81-1.8 1.8S5.61 6 6.6 6s1.8-.81 1.8-1.8-.81-1.8-1.8-1.8m0 5.4c-.99 0-1.8.81-1.8 1.8s.81 1.8 1.8 1.8 1.8-.81 1.8-1.8-.81-1.8-1.8-1.8m0 5.4c-.99 0-1.8.81-1.8 1.8s.81 1.8 1.8 1.8 1.8-.81 1.8-1.8-.81-1.8-1.8-1.8M17.4 6c.99 0 1.8-.81 1.8-1.8s-.81-1.8-1.8-1.8-1.8.81-1.8 1.8.81 1.8 1.8 1.8M12 13.2c-.99 0-1.8.81-1.8 1.8s.81 1.8 1.8 1.8 1.8-.81 1.8-1.8-.81-1.8-1.8-1.8m5.4 0c-.99 0-1.8.81-1.8 1.8s.81 1.8 1.8 1.8 1.8-.81 1.8-1.8-.81-1.8-1.8-1.8m0-5.4c-.99 0-1.8.81-1.8 1.8s.81 1.8 1.8 1.8 1.8-.81 1.8-1.8-.81-1.8-1.8-1.8m-5.4 0c-.99 0-1.8.81-1.8 1.8s.81 1.8 1.8 1.8 1.8-.81 1.8-1.8-.81-1.8-1.8-1.8m0-5.4c-.99 0-1.8.81-1.8 1.8S11.01 6 12 6s1.8-.81 1.8-1.8-.81-1.8-1.8-1.8\"\n    })\n  });\n}\n;\nDialPadIcon.displayName = \"DialPadIcon\";\nexport default forwardRef(DialPadIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction DownloadIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 15.575q-.2 0-.375-.062a.9.9 0 0 1-.325-.213l-3.6-3.6a.95.95 0 0 1-.275-.7q0-.425.275-.7.274-.275.712-.288t.713.263L11 12.15V5q0-.424.287-.713A.97.97 0 0 1 12 4q.424 0 .713.287Q13 4.576 13 5v7.15l1.875-1.875q.274-.274.713-.263.437.014.712.288a.95.95 0 0 1 .275.7.95.95 0 0 1-.275.7l-3.6 3.6q-.15.15-.325.212a1.1 1.1 0 0 1-.375.063M6 20q-.824 0-1.412-.587A1.93 1.93 0 0 1 4 18v-2q0-.424.287-.713A.97.97 0 0 1 5 15q.424 0 .713.287Q6 15.576 6 16v2h12v-2q0-.424.288-.713A.97.97 0 0 1 19 15q.424 0 .712.287.288.288.288.713v2q0 .824-.587 1.413A1.93 1.93 0 0 1 18 20z\"\n    })\n  });\n}\n;\nDownloadIcon.displayName = \"DownloadIcon\";\nexport default forwardRef(DownloadIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction EditIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      fillRule: \"evenodd\",\n      d: \"M15.706 2.637a2 2 0 0 1 2.829 0l2.828 2.828a2 2 0 0 1 0 2.829L9.605 20.052a1 1 0 0 1-.465.263L3.483 21.73a1 1 0 0 1-1.212-1.213l1.414-5.657a1 1 0 0 1 .263-.465zm1.224 7.262L14.102 7.07l-8.544 8.544-.943 3.771 3.771-.943z\",\n      clipRule: \"evenodd\"\n    })\n  });\n}\n;\nEditIcon.displayName = \"EditIcon\";\nexport default forwardRef(EditIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction EndCallIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"m2.765 16.02-2.47-2.416A1.02 1.02 0 0 1 0 12.852q0-.456.295-.751a15.6 15.6 0 0 1 5.316-3.786A15.9 15.9 0 0 1 12 7q3.355 0 6.39 1.329a16 16 0 0 1 5.315 3.772q.295.294.295.751t-.295.752l-2.47 2.416a1.047 1.047 0 0 1-1.396.108l-3.114-2.363a1.1 1.1 0 0 1-.322-.376 1.1 1.1 0 0 1-.108-.483v-2.27a13.6 13.6 0 0 0-2.12-.524C13.459 9.996 12 9.937 12 9.937s-1.459.059-2.174.175q-1.074.174-2.121.523v2.271q0 .268-.108.483a1.1 1.1 0 0 1-.322.376l-3.114 2.363a1.047 1.047 0 0 1-1.396-.107\"\n    })\n  });\n}\n;\nEndCallIcon.displayName = \"EndCallIcon\";\nexport default forwardRef(EndCallIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ErrorIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 17q.424 0 .713-.288A.97.97 0 0 0 13 16a.97.97 0 0 0-.287-.713A.97.97 0 0 0 12 15a.97.97 0 0 0-.713.287A.97.97 0 0 0 11 16q0 .424.287.712.288.288.713.288m0-4q.424 0 .713-.287A.97.97 0 0 0 13 12V8a.97.97 0 0 0-.287-.713A.97.97 0 0 0 12 7a.97.97 0 0 0-.713.287A.97.97 0 0 0 11 8v4q0 .424.287.713.288.287.713.287m0 9a9.7 9.7 0 0 1-3.9-.788 10.1 10.1 0 0 1-3.175-2.137q-1.35-1.35-2.137-3.175A9.7 9.7 0 0 1 2 12q0-2.075.788-3.9a10.1 10.1 0 0 1 2.137-3.175q1.35-1.35 3.175-2.137A9.7 9.7 0 0 1 12 2q2.075 0 3.9.788a10.1 10.1 0 0 1 3.175 2.137q1.35 1.35 2.137 3.175A9.7 9.7 0 0 1 22 12a9.7 9.7 0 0 1-.788 3.9 10.1 10.1 0 0 1-2.137 3.175q-1.35 1.35-3.175 2.137A9.7 9.7 0 0 1 12 22m0-2q3.35 0 5.675-2.325T20 12t-2.325-5.675T12 4 6.325 6.325 4 12t2.325 5.675T12 20\"\n    })\n  });\n}\n;\nErrorIcon.displayName = \"ErrorIcon\";\nexport default forwardRef(ErrorIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ExpandIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M21 3.997a1 1 0 0 0-.29-.702l-.005-.004A1 1 0 0 0 20 3h-8a1 1 0 1 0 0 2h5.586L5 17.586V12a1 1 0 1 0-2 0v8.003a1 1 0 0 0 .29.702l.005.004c.18.18.43.291.705.291h8a1 1 0 1 0 0-2H6.414L19 6.414V12a1 1 0 1 0 2 0z\"\n    })\n  });\n}\n;\nExpandIcon.displayName = \"ExpandIcon\";\nexport default forwardRef(ExpandIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction FilesIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M6 22q-.824 0-1.412-.587A1.93 1.93 0 0 1 4 20V4q0-.824.588-1.412A1.93 1.93 0 0 1 6 2h7.175a1.98 1.98 0 0 1 1.4.575l4.85 4.85q.275.275.425.638.15.361.15.762V20q0 .824-.587 1.413A1.93 1.93 0 0 1 18 22zm7-14V4H6v16h12V9h-4a.97.97 0 0 1-.713-.287A.97.97 0 0 1 13 8\"\n    })\n  });\n}\n;\nFilesIcon.displayName = \"FilesIcon\";\nexport default forwardRef(FilesIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ForwardIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M14.597 5.708a1.004 1.004 0 0 1 0-1.416.996.996 0 0 1 1.412 0l4.699 4.714c.39.391.39 1.025 0 1.416l-4.7 4.714a.996.996 0 0 1-1.411 0 1.004 1.004 0 0 1 0-1.416l3.043-3.053H8.487c-1.888 0-3.485 1.604-3.485 3.666C5.002 16.396 6.599 18 8.487 18h2.093a1 1 0 1 1 0 2H8.487c-3.067 0-5.485-2.575-5.485-5.667S5.42 8.667 8.487 8.667h9.059z\"\n    })\n  });\n}\n;\nForwardIcon.displayName = \"ForwardIcon\";\nexport default forwardRef(ForwardIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction GroupIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M1 17.2q0-.85.438-1.562.437-.713 1.162-1.088a14.8 14.8 0 0 1 3.15-1.163A13.8 13.8 0 0 1 9 13q1.65 0 3.25.387 1.6.388 3.15 1.163.724.375 1.162 1.087Q17 16.35 17 17.2v.8q0 .824-.587 1.413A1.93 1.93 0 0 1 15 20H3q-.824 0-1.412-.587A1.93 1.93 0 0 1 1 18zM21 20h-2.55q.274-.45.413-.962Q19 18.525 19 18v-1q0-1.1-.613-2.113-.612-1.012-1.737-1.737 1.275.15 2.4.512 1.125.363 2.1.888.9.5 1.375 1.112T23 17v1q0 .824-.587 1.413A1.93 1.93 0 0 1 21 20M9 12q-1.65 0-2.825-1.175T5 8t1.175-2.825T9 4t2.825 1.175T13 8t-1.175 2.825T9 12m10-4q0 1.65-1.175 2.825T15 12q-.275 0-.7-.062a6 6 0 0 1-.7-.138 6 6 0 0 0 1.037-1.775Q15 9.05 15 8t-.363-2.025A6 6 0 0 0 13.6 4.2a3 3 0 0 1 .7-.163Q14.65 4 15 4q1.65 0 2.825 1.175T19 8M3 18h12v-.8a.97.97 0 0 0-.5-.85q-1.35-.675-2.725-1.012a11.6 11.6 0 0 0-5.55 0Q4.85 15.675 3.5 16.35a.97.97 0 0 0-.5.85zm6-8q.825 0 1.412-.588Q11 8.826 11 8q0-.824-.588-1.412A1.93 1.93 0 0 0 9 6q-.825 0-1.412.588A1.93 1.93 0 0 0 7 8q0 .825.588 1.412Q8.175 10 9 10\"\n    })\n  });\n}\n;\nGroupIcon.displayName = \"GroupIcon\";\nexport default forwardRef(GroupIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction InfoSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 17q.424 0 .713-.288A.97.97 0 0 0 13 16v-4a.97.97 0 0 0-.287-.713A.97.97 0 0 0 12 11a.97.97 0 0 0-.713.287A.97.97 0 0 0 11 12v4q0 .424.287.712.288.288.713.288m0-8q.424 0 .713-.287A.97.97 0 0 0 13 8a.97.97 0 0 0-.287-.713A.97.97 0 0 0 12 7a.97.97 0 0 0-.713.287A.97.97 0 0 0 11 8q0 .424.287.713Q11.576 9 12 9m0 13a9.7 9.7 0 0 1-3.9-.788 10.1 10.1 0 0 1-3.175-2.137q-1.35-1.35-2.137-3.175A9.7 9.7 0 0 1 2 12q0-2.075.788-3.9a10.1 10.1 0 0 1 2.137-3.175q1.35-1.35 3.175-2.137A9.7 9.7 0 0 1 12 2q2.075 0 3.9.788a10.1 10.1 0 0 1 3.175 2.137q1.35 1.35 2.137 3.175A9.7 9.7 0 0 1 22 12a9.7 9.7 0 0 1-.788 3.9 10.1 10.1 0 0 1-2.137 3.175q-1.35 1.35-3.175 2.137A9.7 9.7 0 0 1 12 22\"\n    })\n  });\n}\n;\nInfoSolidIcon.displayName = \"InfoSolidIcon\";\nexport default forwardRef(InfoSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction InfoIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M11.288 7.288A.97.97 0 0 1 12 7q.424 0 .713.287Q13 7.576 13 8t-.287.713A.97.97 0 0 1 12 9a.97.97 0 0 1-.713-.287A.97.97 0 0 1 11 8q0-.424.287-.713m.001 4.001A.97.97 0 0 1 12 11q.424 0 .713.287.287.288.287.713v4q0 .424-.287.712A.97.97 0 0 1 12 17a.97.97 0 0 1-.713-.288A.97.97 0 0 1 11 16v-4q0-.424.287-.713\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      fillRule: \"evenodd\",\n      d: \"M22 12c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2s10 4.477 10 10m-2 0a8 8 0 1 1-16 0 8 8 0 0 1 16 0\",\n      clipRule: \"evenodd\"\n    })]\n  });\n}\n;\nInfoIcon.displayName = \"InfoIcon\";\nexport default forwardRef(InfoIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction InlineCodeIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M14.958 5.62a1 1 0 0 0-1.916-.574l-4 13.333a1 1 0 0 0 1.916.575zM5.974 7.232a1 1 0 0 0-1.409.128l-3.333 4a1 1 0 0 0 0 1.28l3.333 4a1 1 0 1 0 1.537-1.28L3.302 12l2.8-3.36a1 1 0 0 0-.128-1.408m12.053 0a1 1 0 0 1 1.408.128l3.333 4a1 1 0 0 1 0 1.28l-3.333 4a1 1 0 1 1-1.537-1.28l2.8-3.36-2.8-3.36a1 1 0 0 1 .128-1.408\"\n    })\n  });\n}\n;\nInlineCodeIcon.displayName = \"InlineCodeIcon\";\nexport default forwardRef(InlineCodeIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ItalicIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M6.25 19q-.525 0-.888-.363A1.2 1.2 0 0 1 5 17.75q0-.525.362-.887.363-.363.888-.363H9l3-9H9.25q-.525 0-.887-.362A1.2 1.2 0 0 1 8 6.25q0-.525.363-.888Q8.725 5 9.25 5h7.5q.525 0 .887.362.363.363.363.888t-.363.888a1.2 1.2 0 0 1-.887.362H14.5l-3 9h2.25q.525 0 .887.363.363.362.363.887t-.363.887a1.2 1.2 0 0 1-.887.363z\"\n    })\n  });\n}\n;\nItalicIcon.displayName = \"ItalicIcon\";\nexport default forwardRef(ItalicIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction LeaveIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M14 13q.424 0 .713-.287A.97.97 0 0 0 15 12a.97.97 0 0 0-.287-.713A.97.97 0 0 0 14 11a.97.97 0 0 0-.713.287A.97.97 0 0 0 13 12q0 .424.287.713.288.287.713.287\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M10.385 21.788A1 1 0 0 1 10 21V3a1.003 1.003 0 0 1 1.242-.97l8 2A1 1 0 0 1 20 5v14a1 1 0 0 1-.758.97l-8 2a1 1 0 0 1-.857-.182M18 5.781l-6-1.5v15.438l6-1.5zM9 6H7v12h2v2H7a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2z\"\n    })]\n  });\n}\n;\nLeaveIcon.displayName = \"LeaveIcon\";\nexport default forwardRef(LeaveIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction LinkIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 19.071q-1.467 1.467-3.536 1.467-2.067 0-3.535-1.467t-1.467-3.535q0-2.07 1.467-3.536L7.05 9.879q.3-.3.707-.3t.707.3.301.707-.3.707l-2.122 2.121a2.9 2.9 0 0 0-.884 2.122q0 1.237.884 2.12.884.885 2.121.885t2.122-.884l2.121-2.121q.3-.3.707-.3t.707.3.3.707q0 .405-.3.707zm-1.414-4.243q-.3.3-.707.301a.97.97 0 0 1-.707-.3q-.3-.3-.301-.708 0-.405.3-.707l4.243-4.242q.3-.3.707-.3t.707.3.3.707-.3.707zm6.364-.707q-.3.3-.707.3a.97.97 0 0 1-.707-.3q-.3-.3-.301-.707 0-.405.3-.707l2.122-2.121q.884-.885.884-2.121 0-1.238-.884-2.122a2.9 2.9 0 0 0-2.121-.884q-1.237 0-2.122.884l-2.121 2.122q-.3.3-.707.3a.97.97 0 0 1-.707-.3q-.3-.3-.3-.708 0-.405.3-.707L12 4.93q1.467-1.467 3.536-1.467t3.535 1.467 1.467 3.536T19.071 12z\"\n    })\n  });\n}\n;\nLinkIcon.displayName = \"LinkIcon\";\nexport default forwardRef(LinkIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction LocationPinSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 21.325a2.1 2.1 0 0 1-.7-.125 1.8 1.8 0 0 1-.625-.375A39 39 0 0 1 7.8 17.9q-1.25-1.425-2.087-2.762-.838-1.338-1.275-2.575Q4 11.325 4 10.2q0-3.75 2.412-5.975T12 2t5.587 2.225T20 10.2q0 1.125-.437 2.363-.438 1.237-1.275 2.574A22 22 0 0 1 16.2 17.9a39 39 0 0 1-2.875 2.925 1.8 1.8 0 0 1-.625.375 2.1 2.1 0 0 1-.7.125M12 12q.825 0 1.412-.588Q14 10.826 14 10t-.588-1.412A1.93 1.93 0 0 0 12 8q-.825 0-1.412.588A1.93 1.93 0 0 0 10 10q0 .825.588 1.412Q11.175 12 12 12\"\n    })\n  });\n}\n;\nLocationPinSolidIcon.displayName = \"LocationPinSolidIcon\";\nexport default forwardRef(LocationPinSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction LockSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M6 22q-.824 0-1.412-.587A1.93 1.93 0 0 1 4 20V10q0-.825.588-1.412A1.93 1.93 0 0 1 6 8h1V6q0-2.075 1.463-3.537Q9.926 1 12 1q2.075 0 3.537 1.463Q17 3.925 17 6v2h1q.824 0 1.413.588Q20 9.175 20 10v10q0 .824-.587 1.413A1.93 1.93 0 0 1 18 22zM9 8h6V6q0-1.25-.875-2.125A2.9 2.9 0 0 0 12 3q-1.25 0-2.125.875A2.9 2.9 0 0 0 9 6z\"\n    })\n  });\n}\n;\nLockSolidIcon.displayName = \"LockSolidIcon\";\nexport default forwardRef(LockSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction MentionIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 4a8 8 0 1 0 0 16 1 1 0 1 1 0 2C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10v1.5a3.5 3.5 0 0 1-6.396 1.966A5 5 0 1 1 17 12v1.5a1.5 1.5 0 0 0 3 0V12a8 8 0 0 0-8-8m3 8a3 3 0 1 0-6 0 3 3 0 0 0 6 0\"\n    })\n  });\n}\n;\nMentionIcon.displayName = \"MentionIcon\";\nexport default forwardRef(MentionIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction OverflowHorizontalIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M6 14q-.824 0-1.412-.588A1.93 1.93 0 0 1 4 12q0-.825.588-1.412A1.93 1.93 0 0 1 6 10q.824 0 1.412.588Q8 11.175 8 12t-.588 1.412A1.93 1.93 0 0 1 6 14m6 0q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 12q0-.825.588-1.412A1.93 1.93 0 0 1 12 10q.825 0 1.412.588Q14 11.175 14 12t-.588 1.412A1.93 1.93 0 0 1 12 14m6 0q-.824 0-1.413-.588A1.93 1.93 0 0 1 16 12q0-.825.587-1.412A1.93 1.93 0 0 1 18 10q.824 0 1.413.588Q20 11.175 20 12t-.587 1.412A1.93 1.93 0 0 1 18 14\"\n    })\n  });\n}\n;\nOverflowHorizontalIcon.displayName = \"OverflowHorizontalIcon\";\nexport default forwardRef(OverflowHorizontalIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction PinIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      fillRule: \"evenodd\",\n      d: \"M6.119 2a.5.5 0 0 0-.35.857L7.85 4.9a.5.5 0 0 1 .15.357v4.487a.5.5 0 0 1-.15.356l-3.7 3.644A.5.5 0 0 0 4 14.1v1.4a.5.5 0 0 0 .5.5H11v6a1 1 0 1 0 2 0v-6h6.5a.5.5 0 0 0 .5-.5v-1.4a.5.5 0 0 0-.15-.356l-3.7-3.644a.5.5 0 0 1-.15-.356V5.257a.5.5 0 0 1 .15-.357l2.081-2.043a.5.5 0 0 0-.35-.857zM10 4h4v5.744a2.5 2.5 0 0 0 .746 1.781L17.26 14H6.74l2.514-2.475A2.5 2.5 0 0 0 10 9.744z\",\n      clipRule: \"evenodd\"\n    })\n  });\n}\n;\nPinIcon.displayName = \"PinIcon\";\nexport default forwardRef(PinIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction PollsEndIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M21 10.659V19q0 .824-.587 1.413A1.93 1.93 0 0 1 19 21H5q-.824 0-1.412-.587A1.93 1.93 0 0 1 3 19V5q0-.824.587-1.412A1.93 1.93 0 0 1 5 3h8.341A6 6 0 0 0 13 5H5v14h14v-8a6 6 0 0 0 2-.341\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M13.803 8a6 6 0 0 0 1.88 2H13a.97.97 0 0 1-.713-.287A.97.97 0 0 1 12 9q0-.424.287-.713A.97.97 0 0 1 13 8zm2.91 7.713A.97.97 0 0 1 16 16h-3a.97.97 0 0 1-.713-.287A.97.97 0 0 1 12 15q0-.424.287-.713A.97.97 0 0 1 13 14h3q.424 0 .712.287.288.288.288.713 0 .424-.288.713m-6.299-5.3A1.93 1.93 0 0 1 9 11q-.825 0-1.412-.588A1.93 1.93 0 0 1 7 9q0-.825.588-1.412A1.93 1.93 0 0 1 9 7q.825 0 1.412.588Q11 8.175 11 9t-.588 1.412m.001 6.001A1.93 1.93 0 0 1 9 17q-.825 0-1.412-.587A1.93 1.93 0 0 1 7 15q0-.825.588-1.412A1.93 1.93 0 0 1 9 13q.825 0 1.412.588Q11 14.175 11 15q0 .824-.588 1.413m12.295-14.12a1 1 0 0 1 0 1.414l-4 4a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L18 5.586l3.293-3.293a1 1 0 0 1 1.414 0\"\n    })]\n  });\n}\n;\nPollsEndIcon.displayName = \"PollsEndIcon\";\nexport default forwardRef(PollsEndIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction PollsIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M16 10q.424 0 .712-.287A.97.97 0 0 0 17 9a.97.97 0 0 0-.288-.713A.97.97 0 0 0 16 8h-3a.97.97 0 0 0-.713.287A.97.97 0 0 0 12 9q0 .424.287.713.288.287.713.287zm0 6q.424 0 .712-.287A.97.97 0 0 0 17 15a.97.97 0 0 0-.288-.713A.97.97 0 0 0 16 14h-3a.97.97 0 0 0-.713.287A.97.97 0 0 0 12 15q0 .424.287.713.288.287.713.287zm-7-5q.825 0 1.412-.588Q11 9.826 11 9t-.588-1.412A1.93 1.93 0 0 0 9 7q-.825 0-1.412.588A1.93 1.93 0 0 0 7 9q0 .825.588 1.412Q8.175 11 9 11m0 6q.825 0 1.412-.587Q11 15.825 11 15t-.588-1.412A1.93 1.93 0 0 0 9 13q-.825 0-1.412.588A1.93 1.93 0 0 0 7 15q0 .824.588 1.413Q8.175 17 9 17m-4 4q-.824 0-1.412-.587A1.93 1.93 0 0 1 3 19V5q0-.824.587-1.412A1.93 1.93 0 0 1 5 3h14q.824 0 1.413.587Q21 4.176 21 5v14q0 .824-.587 1.413A1.93 1.93 0 0 1 19 21zm0-2h14V5H5z\"\n    })\n  });\n}\n;\nPollsIcon.displayName = \"PollsIcon\";\nexport default forwardRef(PollsIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction PresenceOutline8X8Icon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 8 8\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"g\", {\n      clipPath: \"url(#cpd_PresenceOutline8X8Icon_a)\",\n      children: /*#__PURE__*/_jsx(\"path\", {\n        fillRule: \"evenodd\",\n        d: \"M4 6.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5M4 8a4 4 0 1 0 0-8 4 4 0 0 0 0 8\",\n        clipRule: \"evenodd\"\n      })\n    }), /*#__PURE__*/_jsx(\"defs\", {\n      children: /*#__PURE__*/_jsx(\"clipPath\", {\n        id: \"cpd_PresenceOutline8X8Icon_a\",\n        children: /*#__PURE__*/_jsx(\"path\", {\n          d: \"M0 0h8v8H0z\"\n        })\n      })\n    })]\n  });\n}\n;\nPresenceOutline8X8Icon.displayName = \"PresenceOutline8X8Icon\";\nexport default forwardRef(PresenceOutline8X8Icon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction PresenceSolid8X8Icon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 8 8\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"g\", {\n      clipPath: \"url(#cpd_PresenceSolid8X8Icon_a)\",\n      children: /*#__PURE__*/_jsx(\"path\", {\n        d: \"M8 4a4 4 0 1 1-8 0 4 4 0 0 1 8 0\"\n      })\n    }), /*#__PURE__*/_jsx(\"defs\", {\n      children: /*#__PURE__*/_jsx(\"clipPath\", {\n        id: \"cpd_PresenceSolid8X8Icon_a\",\n        children: /*#__PURE__*/_jsx(\"path\", {\n          d: \"M0 0h8v8H0z\"\n        })\n      })\n    })]\n  });\n}\n;\nPresenceSolid8X8Icon.displayName = \"PresenceSolid8X8Icon\";\nexport default forwardRef(PresenceSolid8X8Icon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction PresenceStrikethrough8X8Icon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 8 8\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"g\", {\n      clipPath: \"url(#cpd_PresenceStrikethrough8X8Icon_a)\",\n      children: /*#__PURE__*/_jsx(\"path\", {\n        fillRule: \"evenodd\",\n        d: \"M8 4a4 4 0 1 1-8 0 4 4 0 0 1 8 0M5.435 6.048A2.5 2.5 0 0 1 1.687 3.05zm.914-1.19L2.648 1.897a2.5 2.5 0 0 1 3.701 2.961\",\n        clipRule: \"evenodd\"\n      })\n    }), /*#__PURE__*/_jsx(\"defs\", {\n      children: /*#__PURE__*/_jsx(\"clipPath\", {\n        id: \"cpd_PresenceStrikethrough8X8Icon_a\",\n        children: /*#__PURE__*/_jsx(\"path\", {\n          d: \"M0 0h8v8H0z\"\n        })\n      })\n    })]\n  });\n}\n;\nPresenceStrikethrough8X8Icon.displayName = \"PresenceStrikethrough8X8Icon\";\nexport default forwardRef(PresenceStrikethrough8X8Icon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction PublicIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 22a9.7 9.7 0 0 1-3.9-.788 10.1 10.1 0 0 1-3.175-2.137q-1.35-1.35-2.137-3.175A9.7 9.7 0 0 1 2 12q0-2.075.788-3.9a10.1 10.1 0 0 1 2.137-3.175q1.35-1.35 3.175-2.137A9.7 9.7 0 0 1 12 2q2.075 0 3.9.788a10.1 10.1 0 0 1 3.175 2.137q1.35 1.35 2.137 3.175A9.7 9.7 0 0 1 22 12a9.7 9.7 0 0 1-.788 3.9 10.1 10.1 0 0 1-2.137 3.175q-1.35 1.35-3.175 2.137A9.7 9.7 0 0 1 12 22m-1-2.05V18q-.825 0-1.412-.587A1.93 1.93 0 0 1 9 16v-1l-4.8-4.8q-.075.45-.138.9Q4 11.55 4 12q0 3.025 1.987 5.3T11 19.95m6.9-2.55q.5-.55.9-1.187.4-.638.662-1.326.263-.687.4-1.412Q20 12.75 20 12a7.85 7.85 0 0 0-1.363-4.475A7.7 7.7 0 0 0 15 4.6V5q0 .824-.588 1.412A1.93 1.93 0 0 1 13 7h-2v2q0 .424-.287.713A.97.97 0 0 1 10 10H8v2h6q.424 0 .713.287.287.288.287.713v3h1q.65 0 1.175.387.525.388.725 1.013\"\n    })\n  });\n}\n;\nPublicIcon.displayName = \"PublicIcon\";\nexport default forwardRef(PublicIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction QuoteIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M4.719 4.34c.094-.642-.366-1.236-1.028-1.328-.663-.092-1.276.354-1.371.996l-.808 5.478c-.094.642.366 1.237 1.028 1.328.663.092 1.276-.354 1.371-.996zm12.115 10.174c.095-.642-.366-1.237-1.028-1.328-.662-.092-1.276.354-1.37.996l-.809 5.478c-.094.642.366 1.236 1.028 1.328.663.092 1.277-.354 1.371-.996zM9.318 3.009c.665.077 1.138.662 1.058 1.306l-.022.175a221 221 0 0 1-.266 2.006c-.161 1.171-.368 2.579-.535 3.386-.13.636-.769 1.049-1.425.921s-1.082-.745-.95-1.381c.148-.72.345-2.052.509-3.237a191 191 0 0 0 .262-1.981l.021-.17c.08-.644.684-1.103 1.348-1.025m13.17 11.505c.094-.642-.366-1.237-1.028-1.328-.663-.092-1.276.354-1.371.996l-.808 5.478c-.094.642.366 1.236 1.028 1.328.663.092 1.276-.354 1.371-.996z\"\n    })\n  });\n}\n;\nQuoteIcon.displayName = \"QuoteIcon\";\nexport default forwardRef(QuoteIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction RestartIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M18.93 8A8 8 0 1 1 4 12a1 1 0 1 0-2 0c0 5.523 4.477 10 10 10s10-4.477 10-10a10 10 0 0 0-.832-4A10 10 0 0 0 12 2a9.99 9.99 0 0 0-8 3.999V4a1 1 0 0 0-2 0v4a1 1 0 0 0 1 1h4a1 1 0 0 0 0-2H5.755A7.99 7.99 0 0 1 12 4a8 8 0 0 1 6.93 4\"\n    })\n  });\n}\n;\nRestartIcon.displayName = \"RestartIcon\";\nexport default forwardRef(RestartIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction SearchIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M15.05 16.463a7.5 7.5 0 1 1 1.414-1.414l3.243 3.244a1 1 0 0 1-1.414 1.414zM16 10.5a5.5 5.5 0 1 0-11 0 5.5 5.5 0 0 0 11 0\"\n    })\n  });\n}\n;\nSearchIcon.displayName = \"SearchIcon\";\nexport default forwardRef(SearchIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ShareIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 16a.97.97 0 0 1-.713-.287A.97.97 0 0 1 11 15V7.85L9.125 9.725q-.3.3-.7.3T7.7 9.7a.93.93 0 0 1-.288-.713A.98.98 0 0 1 7.7 8.3l3.6-3.6q.15-.15.325-.213.175-.062.375-.062t.375.062a.9.9 0 0 1 .325.213l3.6 3.6q.3.3.287.712a.98.98 0 0 1-.287.688q-.3.3-.713.313a.93.93 0 0 1-.712-.288L13 7.85V15q0 .424-.287.713A.97.97 0 0 1 12 16m-6 4q-.824 0-1.412-.587A1.93 1.93 0 0 1 4 18v-2q0-.424.287-.713A.97.97 0 0 1 5 15q.424 0 .713.287Q6 15.576 6 16v2h12v-2q0-.424.288-.713A.97.97 0 0 1 19 15q.424 0 .712.287.288.288.288.713v2q0 .824-.587 1.413A1.93 1.93 0 0 1 18 20z\"\n    })\n  });\n}\n;\nShareIcon.displayName = \"ShareIcon\";\nexport default forwardRef(ShareIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction ShieldIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      fillRule: \"evenodd\",\n      d: \"M11.106 2.447a2 2 0 0 1 1.789 0l6 3A2 2 0 0 1 20 7.237V12c0 6.742-5.773 9.246-7.51 9.846-.32.111-.66.111-.98 0C9.774 21.246 4 18.743 4 12V7.236a2 2 0 0 1 1.105-1.789zm4.601 6.846a1 1 0 0 0-1.414 0L11 12.586l-1.293-1.293a1 1 0 0 0-1.414 1.414l2 2a1 1 0 0 0 1.414 0l4-4a1 1 0 0 0 0-1.414\",\n      clipRule: \"evenodd\"\n    })\n  });\n}\n;\nShieldIcon.displayName = \"ShieldIcon\";\nexport default forwardRef(ShieldIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction StrikethroughIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12.15 20q-1.9 0-3.375-1.125T6.65 15.8l2.2-.95q.35 1.2 1.213 1.975.861.775 2.137.775 1.05 0 1.9-.5t.85-1.6q0-.45-.175-.825A2.4 2.4 0 0 0 14.3 14h2.8a4.3 4.3 0 0 1 .25 1.5q0 2.15-1.538 3.325Q14.277 20 12.15 20M3 12a.97.97 0 0 1-.712-.287A.97.97 0 0 1 2 11q0-.424.288-.713A.97.97 0 0 1 3 10h18q.424 0 .712.287.288.288.288.713 0 .424-.288.713A.97.97 0 0 1 21 12zm9.05-8.15q1.65 0 2.887.812T16.85 7.15l-2.2.975a3 3 0 0 0-.838-1.3Q13.2 6.25 12.1 6.25q-1.025 0-1.7.462-.675.463-.75 1.288h-2.4q.05-1.725 1.363-2.938Q9.925 3.85 12.05 3.85\"\n    })\n  });\n}\n;\nStrikethroughIcon.displayName = \"StrikethroughIcon\";\nexport default forwardRef(StrikethroughIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction TakePhotoSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      fillRule: \"evenodd\",\n      d: \"M2.588 20.413Q3.175 21 4 21h16q.824 0 1.413-.587Q22 19.825 22 19V7q0-.824-.587-1.412A1.93 1.93 0 0 0 20 5h-3.15L15.6 3.65a2 2 0 0 0-.662-.475A1.95 1.95 0 0 0 14.125 3h-4.25q-.425 0-.812.175-.389.175-.663.475L7.15 5H4q-.824 0-1.412.588A1.93 1.93 0 0 0 2 7v12q0 .824.587 1.413M12 16.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7\",\n      clipRule: \"evenodd\"\n    })\n  });\n}\n;\nTakePhotoSolidIcon.displayName = \"TakePhotoSolidIcon\";\nexport default forwardRef(TakePhotoSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction ThreadsIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M7 10a.97.97 0 0 1-.713-.287A.97.97 0 0 1 6 9q0-.424.287-.713A.97.97 0 0 1 7 8h10q.424 0 .712.287Q18 8.576 18 9t-.288.713A.97.97 0 0 1 17 10zm0 4a.97.97 0 0 1-.713-.287A.97.97 0 0 1 6 13q0-.424.287-.713A.97.97 0 0 1 7 12h6q.424 0 .713.287.287.288.287.713 0 .424-.287.713A.97.97 0 0 1 13 14z\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M3.707 21.293c-.63.63-1.707.184-1.707-.707V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6zM6 17h14V5H4v13.172l.586-.586A2 2 0 0 1 6 17\"\n    })]\n  });\n}\n;\nThreadsIcon.displayName = \"ThreadsIcon\";\nexport default forwardRef(ThreadsIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction TreeIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M9.01 5v1H11c.333 0 1 0 1.5.5S13 7.667 13 8v7.01c0 .54.45.99.99.99H15v-1a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-3a2 2 0 0 1-2-2v-1h-1.01C12.34 18 11 16.66 11 15.01V9c0-1 0-1-1-1H9v1a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5c0-1.1.9-2 2-2h3.01a2 2 0 0 1 2 2\"\n    })\n  });\n}\n;\nTreeIcon.displayName = \"TreeIcon\";\nexport default forwardRef(TreeIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction UnpinIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      fillRule: \"evenodd\",\n      d: \"M5.457 2.083a1 1 0 0 0-1.414 1.414L8.04 7.494v2.25a.5.5 0 0 1-.15.356l-3.7 3.644a.5.5 0 0 0-.15.356v1.4a.5.5 0 0 0 .5.5h6.5v6a1 1 0 0 0 2 0v-6h3.506l4.497 4.497a1 1 0 0 0 1.414-1.414zM14.546 14 10.04 9.494v.25a2.5 2.5 0 0 1-.746 1.781L6.78 14z\",\n      clipRule: \"evenodd\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M14.04 4v3.85l2.015 2.015a.5.5 0 0 1-.015-.12V5.257a.5.5 0 0 1 .15-.357l2.081-2.043a.5.5 0 0 0-.35-.857h-9.73l2 2z\"\n    })]\n  });\n}\n;\nUnpinIcon.displayName = \"UnpinIcon\";\nexport default forwardRef(UnpinIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction UserAddSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M10 12q-1.65 0-2.825-1.175T6 8t1.175-2.825T10 4t2.825 1.175T14 8t-1.175 2.825T10 12m-8 6v-.8q0-.85.438-1.562.437-.713 1.162-1.088a14.8 14.8 0 0 1 3.15-1.163A13.8 13.8 0 0 1 10 13q1.65 0 3.25.387 1.6.388 3.15 1.163.724.375 1.163 1.087Q18 16.35 18 17.2v.8q0 .824-.587 1.413A1.93 1.93 0 0 1 16 20H4q-.824 0-1.412-.587A1.93 1.93 0 0 1 2 18m15-7h2v2q0 .424.288.713.287.287.712.287.424 0 .712-.287A.97.97 0 0 0 21 13v-2h2q.424 0 .712-.287A.97.97 0 0 0 24 10a.97.97 0 0 0-.288-.713A.97.97 0 0 0 23 9h-2V7a.97.97 0 0 0-.288-.713A.97.97 0 0 0 20 6a.97.97 0 0 0-.712.287A.97.97 0 0 0 19 7v2h-2a.97.97 0 0 0-.712.287A.97.97 0 0 0 16 10q0 .424.288.713.287.287.712.287\"\n    })\n  });\n}\n;\nUserAddSolidIcon.displayName = \"UserAddSolidIcon\";\nexport default forwardRef(UserAddSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction UserAddIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M10 12q-1.65 0-2.825-1.175T6 8t1.175-2.825T10 4t2.825 1.175T14 8t-1.175 2.825T10 12m-8 6v-.8q0-.85.438-1.562.437-.713 1.162-1.088a14.8 14.8 0 0 1 3.15-1.163A13.8 13.8 0 0 1 10 13q1.65 0 3.25.387 1.6.388 3.15 1.163.724.375 1.163 1.087Q18 16.35 18 17.2v.8q0 .824-.587 1.413A1.93 1.93 0 0 1 16 20H4q-.824 0-1.412-.587A1.93 1.93 0 0 1 2 18m2 0h12v-.8a.97.97 0 0 0-.5-.85q-1.35-.675-2.725-1.012a11.6 11.6 0 0 0-5.55 0Q5.85 15.675 4.5 16.35a.97.97 0 0 0-.5.85zm6-8q.825 0 1.412-.588Q12 8.826 12 8q0-.824-.588-1.412A1.93 1.93 0 0 0 10 6q-.825 0-1.412.588A1.93 1.93 0 0 0 8 8q0 .825.588 1.412Q9.175 10 10 10m7 1h2v2q0 .424.288.713.287.287.712.287.424 0 .712-.287A.97.97 0 0 0 21 13v-2h2q.424 0 .712-.287A.97.97 0 0 0 24 10a.97.97 0 0 0-.288-.713A.97.97 0 0 0 23 9h-2V7a.97.97 0 0 0-.288-.713A.97.97 0 0 0 20 6a.97.97 0 0 0-.712.287A.97.97 0 0 0 19 7v2h-2a.97.97 0 0 0-.712.287A.97.97 0 0 0 16 10q0 .424.288.713.287.287.712.287\"\n    })\n  });\n}\n;\nUserAddIcon.displayName = \"UserAddIcon\";\nexport default forwardRef(UserAddIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction UserProfileSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 15q-1.65 0-2.825-1.175T8 11t1.175-2.825T12 7t2.825 1.175T16 11t-1.175 2.825T12 15\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M19.528 18.583A9.96 9.96 0 0 0 22 12c0-5.523-4.477-10-10-10S2 6.477 2 12c0 2.52.933 4.824 2.472 6.583A9.98 9.98 0 0 0 12 22a9.98 9.98 0 0 0 7.528-3.417M8.75 16.388q-1.373.332-2.709.95a8 8 0 1 1 11.918 0 14.7 14.7 0 0 0-2.709-.95A13.8 13.8 0 0 0 12 16q-1.65 0-3.25.387\"\n    })]\n  });\n}\n;\nUserProfileSolidIcon.displayName = \"UserProfileSolidIcon\";\nexport default forwardRef(UserProfileSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction VerifiedIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M8.15 21.75 6.7 19.3l-2.75-.6a.94.94 0 0 1-.6-.387.93.93 0 0 1-.175-.688L3.45 14.8l-1.875-2.15a.93.93 0 0 1-.25-.65q0-.375.25-.65L3.45 9.2l-.275-2.825a.93.93 0 0 1 .175-.687.94.94 0 0 1 .6-.388l2.75-.6 1.45-2.45a.98.98 0 0 1 .55-.437.97.97 0 0 1 .7.037l2.6 1.1 2.6-1.1a.97.97 0 0 1 .7-.038q.35.112.55.438L17.3 4.7l2.75.6q.375.075.6.388.225.312.175.687L20.55 9.2l1.875 2.15q.25.275.25.65t-.25.65L20.55 14.8l.275 2.825a.93.93 0 0 1-.175.688.94.94 0 0 1-.6.387l-2.75.6-1.45 2.45a.98.98 0 0 1-.55.438.97.97 0 0 1-.7-.038l-2.6-1.1-2.6 1.1a.97.97 0 0 1-.7.038.98.98 0 0 1-.55-.438m2.8-9.05L9.5 11.275A.93.93 0 0 0 8.812 11q-.412 0-.712.3a.95.95 0 0 0-.275.7q0 .425.275.7l2.15 2.15q.3.3.7.3t.7-.3l4.25-4.25q.3-.3.287-.7a1.06 1.06 0 0 0-.287-.7 1.02 1.02 0 0 0-.713-.312.93.93 0 0 0-.712.287z\"\n    })\n  });\n}\n;\nVerifiedIcon.displayName = \"VerifiedIcon\";\nexport default forwardRef(VerifiedIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction VideoCallSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M6 4h10a2 2 0 0 1 2 2v4.286l3.35-2.871a1 1 0 0 1 1.65.76v7.65a1 1 0 0 1-1.65.76L18 13.715V18a2 2 0 0 1-2 2H6a4 4 0 0 1-4-4V8a4 4 0 0 1 4-4\"\n    })\n  });\n}\n;\nVideoCallSolidIcon.displayName = \"VideoCallSolidIcon\";\nexport default forwardRef(VideoCallSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction VisibilityOffIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"m16.1 13.3-1.45-1.45q.225-1.175-.675-2.2t-2.325-.8L10.2 7.4q.424-.2.863-.3A4.2 4.2 0 0 1 12 7q1.875 0 3.188 1.312Q16.5 9.625 16.5 11.5q0 .5-.1.938t-.3.862m3.2 3.15-1.45-1.4a11 11 0 0 0 1.688-1.588A9 9 0 0 0 20.8 11.5q-1.25-2.524-3.588-4.013Q14.875 6 12 6q-.724 0-1.425.1a10 10 0 0 0-1.375.3L7.65 4.85A11.1 11.1 0 0 1 12 4q3.575 0 6.425 1.887T22.7 10.8a.8.8 0 0 1 .1.313q.025.188.025.387a2 2 0 0 1-.125.7 10.9 10.9 0 0 1-3.4 4.25m-.2 5.45-3.5-3.45q-.874.274-1.762.413Q12.95 19 12 19q-3.575 0-6.425-1.887T1.3 12.2a.8.8 0 0 1-.1-.312 3 3 0 0 1 0-.763.8.8 0 0 1 .1-.3Q1.825 9.7 2.55 8.75A13.3 13.3 0 0 1 4.15 7L2.075 4.9a.93.93 0 0 1-.275-.688q0-.412.3-.712a.95.95 0 0 1 .7-.275q.425 0 .7.275l17 17q.275.275.288.688a.93.93 0 0 1-.288.712.95.95 0 0 1-.7.275.95.95 0 0 1-.7-.275M5.55 8.4q-.725.65-1.325 1.425A9 9 0 0 0 3.2 11.5q1.25 2.524 3.588 4.012T12 17q.5 0 .975-.062.475-.063.975-.138l-.9-.95q-.274.075-.525.113A3.5 3.5 0 0 1 12 16q-1.875 0-3.187-1.312Q7.5 13.375 7.5 11.5q0-.274.038-.525.037-.25.112-.525z\"\n    })\n  });\n}\n;\nVisibilityOffIcon.displayName = \"VisibilityOffIcon\";\nexport default forwardRef(VisibilityOffIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction VisibilityOnIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M12 16q1.875 0 3.188-1.312Q16.5 13.375 16.5 11.5t-1.312-3.187T12 7 8.813 8.313 7.5 11.5t1.313 3.188T12 16m0-1.8q-1.125 0-1.912-.787A2.6 2.6 0 0 1 9.3 11.5q0-1.125.787-1.912A2.6 2.6 0 0 1 12 8.8q1.125 0 1.912.787.788.788.788 1.913t-.787 1.912A2.6 2.6 0 0 1 12 14.2m0 4.8q-3.475 0-6.35-1.837Q2.775 15.324 1.3 12.2a.8.8 0 0 1-.1-.312 3 3 0 0 1 0-.775.8.8 0 0 1 .1-.313q1.475-3.125 4.35-4.962Q8.525 4 12 4t6.35 1.838T22.7 10.8a.8.8 0 0 1 .1.313 3 3 0 0 1 0 .774.8.8 0 0 1-.1.313q-1.475 3.125-4.35 4.963Q15.475 19 12 19m0-2a9.54 9.54 0 0 0 5.188-1.488A9.77 9.77 0 0 0 20.8 11.5a9.77 9.77 0 0 0-3.613-4.012A9.54 9.54 0 0 0 12 6a9.55 9.55 0 0 0-5.187 1.487A9.77 9.77 0 0 0 3.2 11.5a9.77 9.77 0 0 0 3.613 4.012A9.54 9.54 0 0 0 12 17\"\n    })\n  });\n}\n;\nVisibilityOnIcon.displayName = \"VisibilityOnIcon\";\nexport default forwardRef(VisibilityOnIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction VoiceCallSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"m20.958 16.374.039 3.527q0 .427-.33.756-.33.33-.756.33a16 16 0 0 1-6.57-1.105 16.2 16.2 0 0 1-5.563-3.663 16.1 16.1 0 0 1-3.653-5.573 16.3 16.3 0 0 1-1.115-6.56q0-.427.33-.757T4.095 3l3.528.039a1.07 1.07 0 0 1 1.085.93l.543 3.954q.039.271-.039.504a1.1 1.1 0 0 1-.271.426l-1.64 1.64q.505 1.008 1.154 1.909c.433.6 1.444 1.696 1.444 1.696s1.095 1.01 1.696 1.444q.9.65 1.909 1.153l1.64-1.64q.193-.193.426-.27t.504-.04l3.954.543q.406.059.668.359t.262.727\"\n    })\n  });\n}\n;\nVoiceCallSolidIcon.displayName = \"VoiceCallSolidIcon\";\nexport default forwardRef(VoiceCallSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction VolumeOffSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M3.5 3.5a1 1 0 1 0-1.414 1.414L5.172 8H5a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h2l3.293 3.293c.63.63 1.707.184 1.707-.707v-3.758l7.086 7.086A1 1 0 0 0 20.5 20.5l-2.136-2.136.003-.003-1.414-1.414-.003.003-1.414-1.414.003-.003-1.415-1.415-.002.003L12 12v-.006L7.503 7.497 7.5 7.5zm11.496 8.662 1.661 1.66c.222-.564.343-1.18.343-1.822 0-1.38-.56-2.632-1.464-3.536a1 1 0 1 0-1.414 1.414 3 3 0 0 1 .874 2.284m3.164 3.165 1.462 1.46A8.96 8.96 0 0 0 21 12a8.98 8.98 0 0 0-2.636-6.364A1 1 0 0 0 16.95 7.05 6.98 6.98 0 0 1 19 12a7 7 0 0 1-.84 3.326M8.917 6.083 12 9.166V5.414c0-.89-1.077-1.337-1.707-.707z\"\n    })\n  });\n}\n;\nVolumeOffSolidIcon.displayName = \"VolumeOffSolidIcon\";\nexport default forwardRef(VolumeOffSolidIcon);","import { forwardRef } from \"react\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction VolumeOnSolidIcon(props, ref) {\n  return /*#__PURE__*/_jsxs(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: [/*#__PURE__*/_jsx(\"path\", {\n      d: \"M3 14v-4a2 2 0 0 1 2-2h2l3.293-3.293c.63-.63 1.707-.184 1.707.707v13.172c0 .89-1.077 1.337-1.707.707L7 16H5a2 2 0 0 1-2-2m11.122-5.536a1 1 0 0 1 1.414 0A5 5 0 0 1 17 12c0 1.38-.56 2.632-1.464 3.536a1 1 0 0 1-1.415-1.415 3 3 0 0 0 .88-2.121c0-.829-.335-1.577-.88-2.121a1 1 0 0 1 0-1.415\"\n    }), /*#__PURE__*/_jsx(\"path\", {\n      d: \"M16.95 5.636a1 1 0 0 1 1.414 0A8.98 8.98 0 0 1 21 12a8.98 8.98 0 0 1-2.636 6.364 1 1 0 0 1-1.414-1.414A6.98 6.98 0 0 0 19 12a6.98 6.98 0 0 0-2.05-4.95 1 1 0 0 1 0-1.414\"\n    })]\n  });\n}\n;\nVolumeOnSolidIcon.displayName = \"VolumeOnSolidIcon\";\nexport default forwardRef(VolumeOnSolidIcon);","/** Types of elements found in htmlparser2's DOM */\nexport var ElementType;\n(function (ElementType) {\n    /** Type for the root element of a document */\n    ElementType[\"Root\"] = \"root\";\n    /** Type for Text */\n    ElementType[\"Text\"] = \"text\";\n    /** Type for <? ... ?> */\n    ElementType[\"Directive\"] = \"directive\";\n    /** Type for <!-- ... --> */\n    ElementType[\"Comment\"] = \"comment\";\n    /** Type for <script> tags */\n    ElementType[\"Script\"] = \"script\";\n    /** Type for <style> tags */\n    ElementType[\"Style\"] = \"style\";\n    /** Type for Any tag */\n    ElementType[\"Tag\"] = \"tag\";\n    /** Type for <![CDATA[ ... ]]> */\n    ElementType[\"CDATA\"] = \"cdata\";\n    /** Type for <!doctype ...> */\n    ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType || (ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n * @param element Element to test\n * @param element.type Node type discriminator to check.\n */\nexport function isTag(element) {\n    return (element.type === ElementType.Tag ||\n        element.type === ElementType.Script ||\n        element.type === ElementType.Style);\n}\n// Exports for backwards compatibility\n/** Type for the root element of a document */\n// eslint-disable-next-line prefer-destructuring\nexport const Root = ElementType.Root;\n/** Type for Text */\n// eslint-disable-next-line prefer-destructuring\nexport const Text = ElementType.Text;\n/** Type for <? ... ?> */\n// eslint-disable-next-line prefer-destructuring\nexport const Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\n// eslint-disable-next-line prefer-destructuring\nexport const Comment = ElementType.Comment;\n/** Type for <script> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Script = ElementType.Script;\n/** Type for <style> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Style = ElementType.Style;\n/** Type for Any tag */\n// eslint-disable-next-line prefer-destructuring\nexport const Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\n// eslint-disable-next-line prefer-destructuring\nexport const CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\n// eslint-disable-next-line prefer-destructuring\nexport const Doctype = ElementType.Doctype;\n","import { ElementType } from \"domelementtype\";\nimport { CDATA, Comment, Document, Element, ProcessingInstruction, Text, } from \"./node.js\";\nexport * from \"./node.js\";\n// Default options\nconst defaultOptions = {\n    withStartIndices: false,\n    withEndIndices: false,\n    xmlMode: false,\n};\n/**\n * Event-based handler that builds a DOM tree from parser callbacks.\n */\nexport class DomHandler {\n    /** The elements of the DOM */\n    dom = [];\n    /** The root element for the DOM */\n    root = new Document(this.dom);\n    /** Called once parsing has completed. */\n    callback;\n    /** Settings for the handler. */\n    options;\n    /** Callback whenever a tag is closed. */\n    elementCB;\n    /** Indicated whether parsing has been completed. */\n    done = false;\n    /** Stack of open tags. */\n    tagStack = [this.root];\n    /** A data node that is still being written to. */\n    lastNode = null;\n    /** Reference to the parser instance. Used for location information. */\n    parser = null;\n    /**\n     * @param callback Called once parsing has completed.\n     * @param options Settings for the handler.\n     * @param elementCB Callback whenever a tag is closed.\n     */\n    constructor(callback, options, elementCB) {\n        // Make it possible to skip arguments, for backwards-compatibility\n        if (typeof options === \"function\") {\n            elementCB = options;\n            options = defaultOptions;\n        }\n        if (typeof callback === \"object\") {\n            options = callback;\n            callback = undefined;\n        }\n        this.callback = callback ?? null;\n        this.options = options ?? defaultOptions;\n        this.elementCB = elementCB ?? null;\n    }\n    onparserinit(parser) {\n        this.parser = parser;\n    }\n    // Resets the handler back to starting state\n    onreset() {\n        this.dom = [];\n        this.root = new Document(this.dom);\n        this.done = false;\n        this.tagStack = [this.root];\n        this.lastNode = null;\n        this.parser = null;\n    }\n    // Signals the handler that parsing is done\n    onend() {\n        if (this.done)\n            return;\n        this.done = true;\n        this.parser = null;\n        this.handleCallback(null);\n    }\n    onerror(error) {\n        this.handleCallback(error);\n    }\n    onclosetag() {\n        this.lastNode = null;\n        const element = this.tagStack.pop();\n        if (this.options.withEndIndices && this.parser) {\n            element.endIndex = this.parser.endIndex;\n        }\n        if (this.elementCB)\n            this.elementCB(element);\n    }\n    onopentag(name, attribs) {\n        const type = this.options.xmlMode ? ElementType.Tag : undefined;\n        const element = new Element(name, attribs, undefined, type);\n        this.addNode(element);\n        this.tagStack.push(element);\n    }\n    ontext(data) {\n        const { lastNode } = this;\n        if (lastNode && lastNode.type === ElementType.Text) {\n            lastNode.data += data;\n            if (this.options.withEndIndices && this.parser) {\n                lastNode.endIndex = this.parser.endIndex;\n            }\n        }\n        else {\n            const node = new Text(data);\n            this.addNode(node);\n            this.lastNode = node;\n        }\n    }\n    oncomment(data) {\n        if (this.lastNode && this.lastNode.type === ElementType.Comment) {\n            this.lastNode.data += data;\n            return;\n        }\n        const node = new Comment(data);\n        this.addNode(node);\n        this.lastNode = node;\n    }\n    oncommentend() {\n        this.lastNode = null;\n    }\n    oncdatastart() {\n        const text = new Text(\"\");\n        const node = new CDATA([text]);\n        this.addNode(node);\n        text.parent = node;\n        this.lastNode = text;\n    }\n    oncdataend() {\n        this.lastNode = null;\n    }\n    onprocessinginstruction(name, data) {\n        const node = new ProcessingInstruction(name, data);\n        this.addNode(node);\n    }\n    handleCallback(error) {\n        if (typeof this.callback === \"function\") {\n            this.callback(error, this.dom);\n        }\n        else if (error) {\n            throw error;\n        }\n    }\n    addNode(node) {\n        const parent = this.tagStack[this.tagStack.length - 1];\n        const previousSibling = parent.children[parent.children.length - 1];\n        if (this.options.withStartIndices && this.parser) {\n            node.startIndex = this.parser.startIndex;\n        }\n        if (this.options.withEndIndices && this.parser) {\n            node.endIndex = this.parser.endIndex;\n        }\n        parent.children.push(node);\n        if (previousSibling) {\n            node.prev = previousSibling;\n            previousSibling.next = node;\n        }\n        node.parent = parent;\n        this.lastNode = null;\n    }\n}\nexport default DomHandler;\n","import { ElementType, isTag as isTagRaw } from \"domelementtype\";\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nexport class Node {\n    /** Parent of the node */\n    parent = null;\n    /** Previous sibling */\n    prev = null;\n    /** Next sibling */\n    next = null;\n    /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n    startIndex = null;\n    /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n    endIndex = null;\n    // Read-write aliases for properties\n    /**\n     * Same as {@link parent}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get parentNode() {\n        return this.parent;\n    }\n    set parentNode(parent) {\n        this.parent = parent;\n    }\n    /**\n     * Same as {@link prev}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get previousSibling() {\n        return this.prev;\n    }\n    set previousSibling(previous) {\n        this.prev = previous;\n    }\n    /**\n     * Same as {@link next}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get nextSibling() {\n        return this.next;\n    }\n    set nextSibling(next) {\n        this.next = next;\n    }\n    /**\n     * Clone this node, and optionally its children.\n     * @param recursive Clone child nodes as well.\n     * @returns A clone of the node.\n     */\n    cloneNode(recursive = false) {\n        return cloneNode(this, recursive);\n    }\n}\n/**\n * A node that contains some data.\n */\nexport class DataNode extends Node {\n    data;\n    /**\n     * @param data The content of the data node\n     */\n    constructor(data) {\n        super();\n        this.data = data;\n    }\n    /**\n     * Same as {@link data}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get nodeValue() {\n        return this.data;\n    }\n    set nodeValue(data) {\n        this.data = data;\n    }\n}\n/**\n * Text within the document.\n */\nexport class Text extends DataNode {\n    type = ElementType.Text;\n    get nodeType() {\n        return 3;\n    }\n}\n/**\n * Comments within the document.\n */\nexport class Comment extends DataNode {\n    type = ElementType.Comment;\n    get nodeType() {\n        return 8;\n    }\n}\n/**\n * Processing instructions, including doc types.\n */\nexport class ProcessingInstruction extends DataNode {\n    type = ElementType.Directive;\n    name;\n    constructor(name, data) {\n        super(data);\n        this.name = name;\n    }\n    get nodeType() {\n        return 1;\n    }\n    /** If this is a doctype, the document type name (parse5 only). */\n    \"x-name\";\n    /** If this is a doctype, the document type public identifier (parse5 only). */\n    \"x-publicId\";\n    /** If this is a doctype, the document type system identifier (parse5 only). */\n    \"x-systemId\";\n}\n/**\n * A node that can have children.\n */\nexport class NodeWithChildren extends Node {\n    children;\n    /**\n     * @param children Children of the node. Only certain node types can have children.\n     */\n    constructor(children) {\n        super();\n        this.children = children;\n    }\n    // Aliases\n    /** First child of the node. */\n    get firstChild() {\n        return this.children[0] ?? null;\n    }\n    /** Last child of the node. */\n    get lastChild() {\n        return this.children.length > 0\n            ? this.children[this.children.length - 1]\n            : null;\n    }\n    /**\n     * Same as {@link children}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get childNodes() {\n        return this.children;\n    }\n    set childNodes(children) {\n        this.children = children;\n    }\n}\n/**\n * CDATA nodes.\n */\nexport class CDATA extends NodeWithChildren {\n    type = ElementType.CDATA;\n    get nodeType() {\n        return 4;\n    }\n}\n/**\n * The root node of the document.\n */\nexport class Document extends NodeWithChildren {\n    type = ElementType.Root;\n    get nodeType() {\n        return 9;\n    }\n}\n/**\n * An element within the DOM.\n */\nexport class Element extends NodeWithChildren {\n    name;\n    attribs;\n    type;\n    /**\n     * @param name Name of the tag, eg. `div`, `span`.\n     * @param attribs Object mapping attribute names to attribute values.\n     * @param children Children of the node.\n     * @param type Node type used for the new node instance.\n     */\n    constructor(name, attribs, children = [], type = name === \"script\"\n        ? ElementType.Script\n        : name === \"style\"\n            ? ElementType.Style\n            : ElementType.Tag) {\n        super(children);\n        this.name = name;\n        this.attribs = attribs;\n        this.type = type;\n    }\n    get nodeType() {\n        return 1;\n    }\n    // DOM Level 1 aliases\n    /**\n     * Same as {@link name}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get tagName() {\n        return this.name;\n    }\n    set tagName(name) {\n        this.name = name;\n    }\n    get attributes() {\n        return Object.keys(this.attribs).map((name) => ({\n            name,\n            value: this.attribs[name],\n            namespace: this[\"x-attribsNamespace\"]?.[name],\n            prefix: this[\"x-attribsPrefix\"]?.[name],\n        }));\n    }\n    /** Element namespace (parse5 only). */\n    namespace;\n    /** Element attribute namespaces (parse5 only). */\n    \"x-attribsNamespace\";\n    /** Element attribute namespace-related prefixes (parse5 only). */\n    \"x-attribsPrefix\";\n}\n/**\n * Checks if `node` is an element node.\n * @param node Node to check.\n * @returns `true` if the node is an element node.\n */\nexport function isTag(node) {\n    return isTagRaw(node);\n}\n/**\n * Checks if `node` is a CDATA node.\n * @param node Node to check.\n * @returns `true` if the node is a CDATA node.\n */\nexport function isCDATA(node) {\n    return node.type === ElementType.CDATA;\n}\n/**\n * Checks if `node` is a text node.\n * @param node Node to check.\n * @returns `true` if the node is a text node.\n */\nexport function isText(node) {\n    return node.type === ElementType.Text;\n}\n/**\n * Checks if `node` is a comment node.\n * @param node Node to check.\n * @returns `true` if the node is a comment node.\n */\nexport function isComment(node) {\n    return node.type === ElementType.Comment;\n}\n/**\n * Checks if `node` is a directive node.\n * @param node Node to check.\n * @returns `true` if the node is a directive node.\n */\nexport function isDirective(node) {\n    return node.type === ElementType.Directive;\n}\n/**\n * Checks if `node` is a document node.\n * @param node Node to check.\n * @returns `true` if the node is a document node.\n */\nexport function isDocument(node) {\n    return node.type === ElementType.Root;\n}\n/**\n * Checks if `node` has children.\n * @param node Node to check.\n * @returns `true` if the node has children.\n */\nexport function hasChildren(node) {\n    return Object.hasOwn(node, \"children\");\n}\n/**\n * Clone a node, and optionally its children.\n * @param node Node to clone.\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nexport function cloneNode(node, recursive = false) {\n    let result;\n    if (isText(node)) {\n        result = new Text(node.data);\n    }\n    else if (isComment(node)) {\n        result = new Comment(node.data);\n    }\n    else if (isTag(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new Element(node.name, { ...node.attribs }, children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        if (node.namespace != null) {\n            clone.namespace = node.namespace;\n        }\n        if (node[\"x-attribsNamespace\"]) {\n            clone[\"x-attribsNamespace\"] = { ...node[\"x-attribsNamespace\"] };\n        }\n        if (node[\"x-attribsPrefix\"]) {\n            clone[\"x-attribsPrefix\"] = { ...node[\"x-attribsPrefix\"] };\n        }\n        result = clone;\n    }\n    else if (isCDATA(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new CDATA(children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        result = clone;\n    }\n    else if (isDocument(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new Document(children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        if (node[\"x-mode\"]) {\n            clone[\"x-mode\"] = node[\"x-mode\"];\n        }\n        result = clone;\n    }\n    else if (isDirective(node)) {\n        const instruction = new ProcessingInstruction(node.name, node.data);\n        if (node[\"x-name\"] != null) {\n            instruction[\"x-name\"] = node[\"x-name\"];\n            instruction[\"x-publicId\"] = node[\"x-publicId\"];\n            instruction[\"x-systemId\"] = node[\"x-systemId\"];\n        }\n        result = instruction;\n    }\n    else {\n        throw new Error(`Not implemented yet: ${node.type}`);\n    }\n    result.startIndex = node.startIndex;\n    result.endIndex = node.endIndex;\n    if (node.sourceCodeLocation != null) {\n        result.sourceCodeLocation = node.sourceCodeLocation;\n    }\n    return result;\n}\n/**\n * Clone a list of child nodes.\n * @param childs The child nodes to clone.\n * @returns A list of cloned child nodes.\n */\nfunction cloneChildren(childs) {\n    const children = childs.map((child) => cloneNode(child, true));\n    for (let index = 1; index < children.length; index++) {\n        children[index].prev = children[index - 1];\n        children[index - 1].next = children[index];\n    }\n    return children;\n}\n","// This file is autogenerated by tools/process-named-references.ts\nconst pairDivider = \"~\";\nconst blockDivider = \"~~\";\n\ntype GeneratedReferences = {\n    entities: Record<string, string>;\n    characters: Record<string, string>;\n};\n\nfunction generateNamedReferences(input: string, prev?: GeneratedReferences): GeneratedReferences {\n    const entities: Record<string, string> = {};\n    const characters: Record<string, string> = {};\n    const blocks = input.split(blockDivider);\n    let isOptionalBlock = false;\n    for (let i = 0; blocks.length > i; i++) {\n        const entries = blocks[i].split(pairDivider);\n        for (let j = 0; j < entries.length; j+=2) {\n            const entity = entries[j];\n            const character = entries[j+1];\n            const fullEntity = '&' + entity + ';';\n            entities[fullEntity] = character;\n            if (isOptionalBlock) {\n                entities['&' + entity] = character;\n            }\n            characters[character] = fullEntity;\n        }\n        isOptionalBlock = true;\n    }\n    return prev ? \n        {entities: {...entities, ...prev.entities}, characters: {...characters, ...prev.characters}} :\n        {entities, characters};\n}\n\nexport type NamedReferences = {\n    [K in 'xml' | 'html4' | 'html5']: {\n        entities: Record<string, string>;\n        characters: Record<string, string>;\n    }\n};\nexport const bodyRegExps = {\n    xml: /&(?:#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);?/g,\n    html4: /&notin;|&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);?/g,\n    html5: /&centerdot;|&copysr;|&divideontimes;|&gtcc;|&gtcir;|&gtdot;|&gtlPar;|&gtquest;|&gtrapprox;|&gtrarr;|&gtrdot;|&gtreqless;|&gtreqqless;|&gtrless;|&gtrsim;|&ltcc;|&ltcir;|&ltdot;|&lthree;|&ltimes;|&ltlarr;|&ltquest;|&ltrPar;|&ltri;|&ltrie;|&ltrif;|&notin;|&notinE;|&notindot;|&notinva;|&notinvb;|&notinvc;|&notni;|&notniva;|&notnivb;|&notnivc;|&parallel;|&timesb;|&timesbar;|&timesd;|&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);?/g\n};\nexport const namedReferences = {} as NamedReferences;\nnamedReferences['xml'] = generateNamedReferences(\"lt~<~gt~>~quot~\\\"~apos~'~amp~&\");\nnamedReferences['html4'] = generateNamedReferences(\"apos~'~OElig~Œ~oelig~œ~Scaron~Š~scaron~š~Yuml~Ÿ~circ~ˆ~tilde~˜~ensp~ ~emsp~ ~thinsp~ ~zwnj~‌~zwj~‍~lrm~‎~rlm~‏~ndash~–~mdash~—~lsquo~‘~rsquo~’~sbquo~‚~ldquo~“~rdquo~”~bdquo~„~dagger~†~Dagger~‡~permil~‰~lsaquo~‹~rsaquo~›~euro~€~fnof~ƒ~Alpha~Α~Beta~Β~Gamma~Γ~Delta~Δ~Epsilon~Ε~Zeta~Ζ~Eta~Η~Theta~Θ~Iota~Ι~Kappa~Κ~Lambda~Λ~Mu~Μ~Nu~Ν~Xi~Ξ~Omicron~Ο~Pi~Π~Rho~Ρ~Sigma~Σ~Tau~Τ~Upsilon~Υ~Phi~Φ~Chi~Χ~Psi~Ψ~Omega~Ω~alpha~α~beta~β~gamma~γ~delta~δ~epsilon~ε~zeta~ζ~eta~η~theta~θ~iota~ι~kappa~κ~lambda~λ~mu~μ~nu~ν~xi~ξ~omicron~ο~pi~π~rho~ρ~sigmaf~ς~sigma~σ~tau~τ~upsilon~υ~phi~φ~chi~χ~psi~ψ~omega~ω~thetasym~ϑ~upsih~ϒ~piv~ϖ~bull~•~hellip~…~prime~′~Prime~″~oline~‾~frasl~⁄~weierp~℘~image~ℑ~real~ℜ~trade~™~alefsym~ℵ~larr~←~uarr~↑~rarr~→~darr~↓~harr~↔~crarr~↵~lArr~⇐~uArr~⇑~rArr~⇒~dArr~⇓~hArr~⇔~forall~∀~part~∂~exist~∃~empty~∅~nabla~∇~isin~∈~notin~∉~ni~∋~prod~∏~sum~∑~minus~−~lowast~∗~radic~√~prop~∝~infin~∞~ang~∠~and~∧~or~∨~cap~∩~cup~∪~int~∫~there4~∴~sim~∼~cong~≅~asymp~≈~ne~≠~equiv~≡~le~≤~ge~≥~sub~⊂~sup~⊃~nsub~⊄~sube~⊆~supe~⊇~oplus~⊕~otimes~⊗~perp~⊥~sdot~⋅~lceil~⌈~rceil~⌉~lfloor~⌊~rfloor~⌋~lang~〈~rang~〉~loz~◊~spades~♠~clubs~♣~hearts~♥~diams~♦~~nbsp~ ~iexcl~¡~cent~¢~pound~£~curren~¤~yen~¥~brvbar~¦~sect~§~uml~¨~copy~©~ordf~ª~laquo~«~not~¬~shy~­~reg~®~macr~¯~deg~°~plusmn~±~sup2~²~sup3~³~acute~´~micro~µ~para~¶~middot~·~cedil~¸~sup1~¹~ordm~º~raquo~»~frac14~¼~frac12~½~frac34~¾~iquest~¿~Agrave~À~Aacute~Á~Acirc~Â~Atilde~Ã~Auml~Ä~Aring~Å~AElig~Æ~Ccedil~Ç~Egrave~È~Eacute~É~Ecirc~Ê~Euml~Ë~Igrave~Ì~Iacute~Í~Icirc~Î~Iuml~Ï~ETH~Ð~Ntilde~Ñ~Ograve~Ò~Oacute~Ó~Ocirc~Ô~Otilde~Õ~Ouml~Ö~times~×~Oslash~Ø~Ugrave~Ù~Uacute~Ú~Ucirc~Û~Uuml~Ü~Yacute~Ý~THORN~Þ~szlig~ß~agrave~à~aacute~á~acirc~â~atilde~ã~auml~ä~aring~å~aelig~æ~ccedil~ç~egrave~è~eacute~é~ecirc~ê~euml~ë~igrave~ì~iacute~í~icirc~î~iuml~ï~eth~ð~ntilde~ñ~ograve~ò~oacute~ó~ocirc~ô~otilde~õ~ouml~ö~divide~÷~oslash~ø~ugrave~ù~uacute~ú~ucirc~û~uuml~ü~yacute~ý~thorn~þ~yuml~ÿ~quot~\\\"~amp~&~lt~<~gt~>\");\nnamedReferences['html5'] = generateNamedReferences(\"Abreve~Ă~Acy~А~Afr~𝔄~Amacr~Ā~And~⩓~Aogon~Ą~Aopf~𝔸~ApplyFunction~⁡~Ascr~𝒜~Assign~≔~Backslash~∖~Barv~⫧~Barwed~⌆~Bcy~Б~Because~∵~Bernoullis~ℬ~Bfr~𝔅~Bopf~𝔹~Breve~˘~Bscr~ℬ~Bumpeq~≎~CHcy~Ч~Cacute~Ć~Cap~⋒~CapitalDifferentialD~ⅅ~Cayleys~ℭ~Ccaron~Č~Ccirc~Ĉ~Cconint~∰~Cdot~Ċ~Cedilla~¸~CenterDot~·~Cfr~ℭ~CircleDot~⊙~CircleMinus~⊖~CirclePlus~⊕~CircleTimes~⊗~ClockwiseContourIntegral~∲~CloseCurlyDoubleQuote~”~CloseCurlyQuote~’~Colon~∷~Colone~⩴~Congruent~≡~Conint~∯~ContourIntegral~∮~Copf~ℂ~Coproduct~∐~CounterClockwiseContourIntegral~∳~Cross~⨯~Cscr~𝒞~Cup~⋓~CupCap~≍~DD~ⅅ~DDotrahd~⤑~DJcy~Ђ~DScy~Ѕ~DZcy~Џ~Darr~↡~Dashv~⫤~Dcaron~Ď~Dcy~Д~Del~∇~Dfr~𝔇~DiacriticalAcute~´~DiacriticalDot~˙~DiacriticalDoubleAcute~˝~DiacriticalGrave~`~DiacriticalTilde~˜~Diamond~⋄~DifferentialD~ⅆ~Dopf~𝔻~Dot~¨~DotDot~⃜~DotEqual~≐~DoubleContourIntegral~∯~DoubleDot~¨~DoubleDownArrow~⇓~DoubleLeftArrow~⇐~DoubleLeftRightArrow~⇔~DoubleLeftTee~⫤~DoubleLongLeftArrow~⟸~DoubleLongLeftRightArrow~⟺~DoubleLongRightArrow~⟹~DoubleRightArrow~⇒~DoubleRightTee~⊨~DoubleUpArrow~⇑~DoubleUpDownArrow~⇕~DoubleVerticalBar~∥~DownArrow~↓~DownArrowBar~⤓~DownArrowUpArrow~⇵~DownBreve~̑~DownLeftRightVector~⥐~DownLeftTeeVector~⥞~DownLeftVector~↽~DownLeftVectorBar~⥖~DownRightTeeVector~⥟~DownRightVector~⇁~DownRightVectorBar~⥗~DownTee~⊤~DownTeeArrow~↧~Downarrow~⇓~Dscr~𝒟~Dstrok~Đ~ENG~Ŋ~Ecaron~Ě~Ecy~Э~Edot~Ė~Efr~𝔈~Element~∈~Emacr~Ē~EmptySmallSquare~◻~EmptyVerySmallSquare~▫~Eogon~Ę~Eopf~𝔼~Equal~⩵~EqualTilde~≂~Equilibrium~⇌~Escr~ℰ~Esim~⩳~Exists~∃~ExponentialE~ⅇ~Fcy~Ф~Ffr~𝔉~FilledSmallSquare~◼~FilledVerySmallSquare~▪~Fopf~𝔽~ForAll~∀~Fouriertrf~ℱ~Fscr~ℱ~GJcy~Ѓ~Gammad~Ϝ~Gbreve~Ğ~Gcedil~Ģ~Gcirc~Ĝ~Gcy~Г~Gdot~Ġ~Gfr~𝔊~Gg~⋙~Gopf~𝔾~GreaterEqual~≥~GreaterEqualLess~⋛~GreaterFullEqual~≧~GreaterGreater~⪢~GreaterLess~≷~GreaterSlantEqual~⩾~GreaterTilde~≳~Gscr~𝒢~Gt~≫~HARDcy~Ъ~Hacek~ˇ~Hat~^~Hcirc~Ĥ~Hfr~ℌ~HilbertSpace~ℋ~Hopf~ℍ~HorizontalLine~─~Hscr~ℋ~Hstrok~Ħ~HumpDownHump~≎~HumpEqual~≏~IEcy~Е~IJlig~IJ~IOcy~Ё~Icy~И~Idot~İ~Ifr~ℑ~Im~ℑ~Imacr~Ī~ImaginaryI~ⅈ~Implies~⇒~Int~∬~Integral~∫~Intersection~⋂~InvisibleComma~⁣~InvisibleTimes~⁢~Iogon~Į~Iopf~𝕀~Iscr~ℐ~Itilde~Ĩ~Iukcy~І~Jcirc~Ĵ~Jcy~Й~Jfr~𝔍~Jopf~𝕁~Jscr~𝒥~Jsercy~Ј~Jukcy~Є~KHcy~Х~KJcy~Ќ~Kcedil~Ķ~Kcy~К~Kfr~𝔎~Kopf~𝕂~Kscr~𝒦~LJcy~Љ~Lacute~Ĺ~Lang~⟪~Laplacetrf~ℒ~Larr~↞~Lcaron~Ľ~Lcedil~Ļ~Lcy~Л~LeftAngleBracket~⟨~LeftArrow~←~LeftArrowBar~⇤~LeftArrowRightArrow~⇆~LeftCeiling~⌈~LeftDoubleBracket~⟦~LeftDownTeeVector~⥡~LeftDownVector~⇃~LeftDownVectorBar~⥙~LeftFloor~⌊~LeftRightArrow~↔~LeftRightVector~⥎~LeftTee~⊣~LeftTeeArrow~↤~LeftTeeVector~⥚~LeftTriangle~⊲~LeftTriangleBar~⧏~LeftTriangleEqual~⊴~LeftUpDownVector~⥑~LeftUpTeeVector~⥠~LeftUpVector~↿~LeftUpVectorBar~⥘~LeftVector~↼~LeftVectorBar~⥒~Leftarrow~⇐~Leftrightarrow~⇔~LessEqualGreater~⋚~LessFullEqual~≦~LessGreater~≶~LessLess~⪡~LessSlantEqual~⩽~LessTilde~≲~Lfr~𝔏~Ll~⋘~Lleftarrow~⇚~Lmidot~Ŀ~LongLeftArrow~⟵~LongLeftRightArrow~⟷~LongRightArrow~⟶~Longleftarrow~⟸~Longleftrightarrow~⟺~Longrightarrow~⟹~Lopf~𝕃~LowerLeftArrow~↙~LowerRightArrow~↘~Lscr~ℒ~Lsh~↰~Lstrok~Ł~Lt~≪~Map~⤅~Mcy~М~MediumSpace~ ~Mellintrf~ℳ~Mfr~𝔐~MinusPlus~∓~Mopf~𝕄~Mscr~ℳ~NJcy~Њ~Nacute~Ń~Ncaron~Ň~Ncedil~Ņ~Ncy~Н~NegativeMediumSpace~​~NegativeThickSpace~​~NegativeThinSpace~​~NegativeVeryThinSpace~​~NestedGreaterGreater~≫~NestedLessLess~≪~NewLine~\\n~Nfr~𝔑~NoBreak~⁠~NonBreakingSpace~ ~Nopf~ℕ~Not~⫬~NotCongruent~≢~NotCupCap~≭~NotDoubleVerticalBar~∦~NotElement~∉~NotEqual~≠~NotEqualTilde~≂̸~NotExists~∄~NotGreater~≯~NotGreaterEqual~≱~NotGreaterFullEqual~≧̸~NotGreaterGreater~≫̸~NotGreaterLess~≹~NotGreaterSlantEqual~⩾̸~NotGreaterTilde~≵~NotHumpDownHump~≎̸~NotHumpEqual~≏̸~NotLeftTriangle~⋪~NotLeftTriangleBar~⧏̸~NotLeftTriangleEqual~⋬~NotLess~≮~NotLessEqual~≰~NotLessGreater~≸~NotLessLess~≪̸~NotLessSlantEqual~⩽̸~NotLessTilde~≴~NotNestedGreaterGreater~⪢̸~NotNestedLessLess~⪡̸~NotPrecedes~⊀~NotPrecedesEqual~⪯̸~NotPrecedesSlantEqual~⋠~NotReverseElement~∌~NotRightTriangle~⋫~NotRightTriangleBar~⧐̸~NotRightTriangleEqual~⋭~NotSquareSubset~⊏̸~NotSquareSubsetEqual~⋢~NotSquareSuperset~⊐̸~NotSquareSupersetEqual~⋣~NotSubset~⊂⃒~NotSubsetEqual~⊈~NotSucceeds~⊁~NotSucceedsEqual~⪰̸~NotSucceedsSlantEqual~⋡~NotSucceedsTilde~≿̸~NotSuperset~⊃⃒~NotSupersetEqual~⊉~NotTilde~≁~NotTildeEqual~≄~NotTildeFullEqual~≇~NotTildeTilde~≉~NotVerticalBar~∤~Nscr~𝒩~Ocy~О~Odblac~Ő~Ofr~𝔒~Omacr~Ō~Oopf~𝕆~OpenCurlyDoubleQuote~“~OpenCurlyQuote~‘~Or~⩔~Oscr~𝒪~Otimes~⨷~OverBar~‾~OverBrace~⏞~OverBracket~⎴~OverParenthesis~⏜~PartialD~∂~Pcy~П~Pfr~𝔓~PlusMinus~±~Poincareplane~ℌ~Popf~ℙ~Pr~⪻~Precedes~≺~PrecedesEqual~⪯~PrecedesSlantEqual~≼~PrecedesTilde~≾~Product~∏~Proportion~∷~Proportional~∝~Pscr~𝒫~Qfr~𝔔~Qopf~ℚ~Qscr~𝒬~RBarr~⤐~Racute~Ŕ~Rang~⟫~Rarr~↠~Rarrtl~⤖~Rcaron~Ř~Rcedil~Ŗ~Rcy~Р~Re~ℜ~ReverseElement~∋~ReverseEquilibrium~⇋~ReverseUpEquilibrium~⥯~Rfr~ℜ~RightAngleBracket~⟩~RightArrow~→~RightArrowBar~⇥~RightArrowLeftArrow~⇄~RightCeiling~⌉~RightDoubleBracket~⟧~RightDownTeeVector~⥝~RightDownVector~⇂~RightDownVectorBar~⥕~RightFloor~⌋~RightTee~⊢~RightTeeArrow~↦~RightTeeVector~⥛~RightTriangle~⊳~RightTriangleBar~⧐~RightTriangleEqual~⊵~RightUpDownVector~⥏~RightUpTeeVector~⥜~RightUpVector~↾~RightUpVectorBar~⥔~RightVector~⇀~RightVectorBar~⥓~Rightarrow~⇒~Ropf~ℝ~RoundImplies~⥰~Rrightarrow~⇛~Rscr~ℛ~Rsh~↱~RuleDelayed~⧴~SHCHcy~Щ~SHcy~Ш~SOFTcy~Ь~Sacute~Ś~Sc~⪼~Scedil~Ş~Scirc~Ŝ~Scy~С~Sfr~𝔖~ShortDownArrow~↓~ShortLeftArrow~←~ShortRightArrow~→~ShortUpArrow~↑~SmallCircle~∘~Sopf~𝕊~Sqrt~√~Square~□~SquareIntersection~⊓~SquareSubset~⊏~SquareSubsetEqual~⊑~SquareSuperset~⊐~SquareSupersetEqual~⊒~SquareUnion~⊔~Sscr~𝒮~Star~⋆~Sub~⋐~Subset~⋐~SubsetEqual~⊆~Succeeds~≻~SucceedsEqual~⪰~SucceedsSlantEqual~≽~SucceedsTilde~≿~SuchThat~∋~Sum~∑~Sup~⋑~Superset~⊃~SupersetEqual~⊇~Supset~⋑~TRADE~™~TSHcy~Ћ~TScy~Ц~Tab~\\t~Tcaron~Ť~Tcedil~Ţ~Tcy~Т~Tfr~𝔗~Therefore~∴~ThickSpace~  ~ThinSpace~ ~Tilde~∼~TildeEqual~≃~TildeFullEqual~≅~TildeTilde~≈~Topf~𝕋~TripleDot~⃛~Tscr~𝒯~Tstrok~Ŧ~Uarr~↟~Uarrocir~⥉~Ubrcy~Ў~Ubreve~Ŭ~Ucy~У~Udblac~Ű~Ufr~𝔘~Umacr~Ū~UnderBar~_~UnderBrace~⏟~UnderBracket~⎵~UnderParenthesis~⏝~Union~⋃~UnionPlus~⊎~Uogon~Ų~Uopf~𝕌~UpArrow~↑~UpArrowBar~⤒~UpArrowDownArrow~⇅~UpDownArrow~↕~UpEquilibrium~⥮~UpTee~⊥~UpTeeArrow~↥~Uparrow~⇑~Updownarrow~⇕~UpperLeftArrow~↖~UpperRightArrow~↗~Upsi~ϒ~Uring~Ů~Uscr~𝒰~Utilde~Ũ~VDash~⊫~Vbar~⫫~Vcy~В~Vdash~⊩~Vdashl~⫦~Vee~⋁~Verbar~‖~Vert~‖~VerticalBar~∣~VerticalLine~|~VerticalSeparator~❘~VerticalTilde~≀~VeryThinSpace~ ~Vfr~𝔙~Vopf~𝕍~Vscr~𝒱~Vvdash~⊪~Wcirc~Ŵ~Wedge~⋀~Wfr~𝔚~Wopf~𝕎~Wscr~𝒲~Xfr~𝔛~Xopf~𝕏~Xscr~𝒳~YAcy~Я~YIcy~Ї~YUcy~Ю~Ycirc~Ŷ~Ycy~Ы~Yfr~𝔜~Yopf~𝕐~Yscr~𝒴~ZHcy~Ж~Zacute~Ź~Zcaron~Ž~Zcy~З~Zdot~Ż~ZeroWidthSpace~​~Zfr~ℨ~Zopf~ℤ~Zscr~𝒵~abreve~ă~ac~∾~acE~∾̳~acd~∿~acy~а~af~⁡~afr~𝔞~aleph~ℵ~amacr~ā~amalg~⨿~andand~⩕~andd~⩜~andslope~⩘~andv~⩚~ange~⦤~angle~∠~angmsd~∡~angmsdaa~⦨~angmsdab~⦩~angmsdac~⦪~angmsdad~⦫~angmsdae~⦬~angmsdaf~⦭~angmsdag~⦮~angmsdah~⦯~angrt~∟~angrtvb~⊾~angrtvbd~⦝~angsph~∢~angst~Å~angzarr~⍼~aogon~ą~aopf~𝕒~ap~≈~apE~⩰~apacir~⩯~ape~≊~apid~≋~approx~≈~approxeq~≊~ascr~𝒶~ast~*~asympeq~≍~awconint~∳~awint~⨑~bNot~⫭~backcong~≌~backepsilon~϶~backprime~‵~backsim~∽~backsimeq~⋍~barvee~⊽~barwed~⌅~barwedge~⌅~bbrk~⎵~bbrktbrk~⎶~bcong~≌~bcy~б~becaus~∵~because~∵~bemptyv~⦰~bepsi~϶~bernou~ℬ~beth~ℶ~between~≬~bfr~𝔟~bigcap~⋂~bigcirc~◯~bigcup~⋃~bigodot~⨀~bigoplus~⨁~bigotimes~⨂~bigsqcup~⨆~bigstar~★~bigtriangledown~▽~bigtriangleup~△~biguplus~⨄~bigvee~⋁~bigwedge~⋀~bkarow~⤍~blacklozenge~⧫~blacksquare~▪~blacktriangle~▴~blacktriangledown~▾~blacktriangleleft~◂~blacktriangleright~▸~blank~␣~blk12~▒~blk14~░~blk34~▓~block~█~bne~=⃥~bnequiv~≡⃥~bnot~⌐~bopf~𝕓~bot~⊥~bottom~⊥~bowtie~⋈~boxDL~╗~boxDR~╔~boxDl~╖~boxDr~╓~boxH~═~boxHD~╦~boxHU~╩~boxHd~╤~boxHu~╧~boxUL~╝~boxUR~╚~boxUl~╜~boxUr~╙~boxV~║~boxVH~╬~boxVL~╣~boxVR~╠~boxVh~╫~boxVl~╢~boxVr~╟~boxbox~⧉~boxdL~╕~boxdR~╒~boxdl~┐~boxdr~┌~boxh~─~boxhD~╥~boxhU~╨~boxhd~┬~boxhu~┴~boxminus~⊟~boxplus~⊞~boxtimes~⊠~boxuL~╛~boxuR~╘~boxul~┘~boxur~└~boxv~│~boxvH~╪~boxvL~╡~boxvR~╞~boxvh~┼~boxvl~┤~boxvr~├~bprime~‵~breve~˘~bscr~𝒷~bsemi~⁏~bsim~∽~bsime~⋍~bsol~\\\\~bsolb~⧅~bsolhsub~⟈~bullet~•~bump~≎~bumpE~⪮~bumpe~≏~bumpeq~≏~cacute~ć~capand~⩄~capbrcup~⩉~capcap~⩋~capcup~⩇~capdot~⩀~caps~∩︀~caret~⁁~caron~ˇ~ccaps~⩍~ccaron~č~ccirc~ĉ~ccups~⩌~ccupssm~⩐~cdot~ċ~cemptyv~⦲~centerdot~·~cfr~𝔠~chcy~ч~check~✓~checkmark~✓~cir~○~cirE~⧃~circeq~≗~circlearrowleft~↺~circlearrowright~↻~circledR~®~circledS~Ⓢ~circledast~⊛~circledcirc~⊚~circleddash~⊝~cire~≗~cirfnint~⨐~cirmid~⫯~cirscir~⧂~clubsuit~♣~colon~:~colone~≔~coloneq~≔~comma~,~commat~@~comp~∁~compfn~∘~complement~∁~complexes~ℂ~congdot~⩭~conint~∮~copf~𝕔~coprod~∐~copysr~℗~cross~✗~cscr~𝒸~csub~⫏~csube~⫑~csup~⫐~csupe~⫒~ctdot~⋯~cudarrl~⤸~cudarrr~⤵~cuepr~⋞~cuesc~⋟~cularr~↶~cularrp~⤽~cupbrcap~⩈~cupcap~⩆~cupcup~⩊~cupdot~⊍~cupor~⩅~cups~∪︀~curarr~↷~curarrm~⤼~curlyeqprec~⋞~curlyeqsucc~⋟~curlyvee~⋎~curlywedge~⋏~curvearrowleft~↶~curvearrowright~↷~cuvee~⋎~cuwed~⋏~cwconint~∲~cwint~∱~cylcty~⌭~dHar~⥥~daleth~ℸ~dash~‐~dashv~⊣~dbkarow~⤏~dblac~˝~dcaron~ď~dcy~д~dd~ⅆ~ddagger~‡~ddarr~⇊~ddotseq~⩷~demptyv~⦱~dfisht~⥿~dfr~𝔡~dharl~⇃~dharr~⇂~diam~⋄~diamond~⋄~diamondsuit~♦~die~¨~digamma~ϝ~disin~⋲~div~÷~divideontimes~⋇~divonx~⋇~djcy~ђ~dlcorn~⌞~dlcrop~⌍~dollar~$~dopf~𝕕~dot~˙~doteq~≐~doteqdot~≑~dotminus~∸~dotplus~∔~dotsquare~⊡~doublebarwedge~⌆~downarrow~↓~downdownarrows~⇊~downharpoonleft~⇃~downharpoonright~⇂~drbkarow~⤐~drcorn~⌟~drcrop~⌌~dscr~𝒹~dscy~ѕ~dsol~⧶~dstrok~đ~dtdot~⋱~dtri~▿~dtrif~▾~duarr~⇵~duhar~⥯~dwangle~⦦~dzcy~џ~dzigrarr~⟿~eDDot~⩷~eDot~≑~easter~⩮~ecaron~ě~ecir~≖~ecolon~≕~ecy~э~edot~ė~ee~ⅇ~efDot~≒~efr~𝔢~eg~⪚~egs~⪖~egsdot~⪘~el~⪙~elinters~⏧~ell~ℓ~els~⪕~elsdot~⪗~emacr~ē~emptyset~∅~emptyv~∅~emsp13~ ~emsp14~ ~eng~ŋ~eogon~ę~eopf~𝕖~epar~⋕~eparsl~⧣~eplus~⩱~epsi~ε~epsiv~ϵ~eqcirc~≖~eqcolon~≕~eqsim~≂~eqslantgtr~⪖~eqslantless~⪕~equals~=~equest~≟~equivDD~⩸~eqvparsl~⧥~erDot~≓~erarr~⥱~escr~ℯ~esdot~≐~esim~≂~excl~!~expectation~ℰ~exponentiale~ⅇ~fallingdotseq~≒~fcy~ф~female~♀~ffilig~ffi~fflig~ff~ffllig~ffl~ffr~𝔣~filig~fi~fjlig~fj~flat~♭~fllig~fl~fltns~▱~fopf~𝕗~fork~⋔~forkv~⫙~fpartint~⨍~frac13~⅓~frac15~⅕~frac16~⅙~frac18~⅛~frac23~⅔~frac25~⅖~frac35~⅗~frac38~⅜~frac45~⅘~frac56~⅚~frac58~⅝~frac78~⅞~frown~⌢~fscr~𝒻~gE~≧~gEl~⪌~gacute~ǵ~gammad~ϝ~gap~⪆~gbreve~ğ~gcirc~ĝ~gcy~г~gdot~ġ~gel~⋛~geq~≥~geqq~≧~geqslant~⩾~ges~⩾~gescc~⪩~gesdot~⪀~gesdoto~⪂~gesdotol~⪄~gesl~⋛︀~gesles~⪔~gfr~𝔤~gg~≫~ggg~⋙~gimel~ℷ~gjcy~ѓ~gl~≷~glE~⪒~gla~⪥~glj~⪤~gnE~≩~gnap~⪊~gnapprox~⪊~gne~⪈~gneq~⪈~gneqq~≩~gnsim~⋧~gopf~𝕘~grave~`~gscr~ℊ~gsim~≳~gsime~⪎~gsiml~⪐~gtcc~⪧~gtcir~⩺~gtdot~⋗~gtlPar~⦕~gtquest~⩼~gtrapprox~⪆~gtrarr~⥸~gtrdot~⋗~gtreqless~⋛~gtreqqless~⪌~gtrless~≷~gtrsim~≳~gvertneqq~≩︀~gvnE~≩︀~hairsp~ ~half~½~hamilt~ℋ~hardcy~ъ~harrcir~⥈~harrw~↭~hbar~ℏ~hcirc~ĥ~heartsuit~♥~hercon~⊹~hfr~𝔥~hksearow~⤥~hkswarow~⤦~hoarr~⇿~homtht~∻~hookleftarrow~↩~hookrightarrow~↪~hopf~𝕙~horbar~―~hscr~𝒽~hslash~ℏ~hstrok~ħ~hybull~⁃~hyphen~‐~ic~⁣~icy~и~iecy~е~iff~⇔~ifr~𝔦~ii~ⅈ~iiiint~⨌~iiint~∭~iinfin~⧜~iiota~℩~ijlig~ij~imacr~ī~imagline~ℐ~imagpart~ℑ~imath~ı~imof~⊷~imped~Ƶ~in~∈~incare~℅~infintie~⧝~inodot~ı~intcal~⊺~integers~ℤ~intercal~⊺~intlarhk~⨗~intprod~⨼~iocy~ё~iogon~į~iopf~𝕚~iprod~⨼~iscr~𝒾~isinE~⋹~isindot~⋵~isins~⋴~isinsv~⋳~isinv~∈~it~⁢~itilde~ĩ~iukcy~і~jcirc~ĵ~jcy~й~jfr~𝔧~jmath~ȷ~jopf~𝕛~jscr~𝒿~jsercy~ј~jukcy~є~kappav~ϰ~kcedil~ķ~kcy~к~kfr~𝔨~kgreen~ĸ~khcy~х~kjcy~ќ~kopf~𝕜~kscr~𝓀~lAarr~⇚~lAtail~⤛~lBarr~⤎~lE~≦~lEg~⪋~lHar~⥢~lacute~ĺ~laemptyv~⦴~lagran~ℒ~langd~⦑~langle~⟨~lap~⪅~larrb~⇤~larrbfs~⤟~larrfs~⤝~larrhk~↩~larrlp~↫~larrpl~⤹~larrsim~⥳~larrtl~↢~lat~⪫~latail~⤙~late~⪭~lates~⪭︀~lbarr~⤌~lbbrk~❲~lbrace~{~lbrack~[~lbrke~⦋~lbrksld~⦏~lbrkslu~⦍~lcaron~ľ~lcedil~ļ~lcub~{~lcy~л~ldca~⤶~ldquor~„~ldrdhar~⥧~ldrushar~⥋~ldsh~↲~leftarrow~←~leftarrowtail~↢~leftharpoondown~↽~leftharpoonup~↼~leftleftarrows~⇇~leftrightarrow~↔~leftrightarrows~⇆~leftrightharpoons~⇋~leftrightsquigarrow~↭~leftthreetimes~⋋~leg~⋚~leq~≤~leqq~≦~leqslant~⩽~les~⩽~lescc~⪨~lesdot~⩿~lesdoto~⪁~lesdotor~⪃~lesg~⋚︀~lesges~⪓~lessapprox~⪅~lessdot~⋖~lesseqgtr~⋚~lesseqqgtr~⪋~lessgtr~≶~lesssim~≲~lfisht~⥼~lfr~𝔩~lg~≶~lgE~⪑~lhard~↽~lharu~↼~lharul~⥪~lhblk~▄~ljcy~љ~ll~≪~llarr~⇇~llcorner~⌞~llhard~⥫~lltri~◺~lmidot~ŀ~lmoust~⎰~lmoustache~⎰~lnE~≨~lnap~⪉~lnapprox~⪉~lne~⪇~lneq~⪇~lneqq~≨~lnsim~⋦~loang~⟬~loarr~⇽~lobrk~⟦~longleftarrow~⟵~longleftrightarrow~⟷~longmapsto~⟼~longrightarrow~⟶~looparrowleft~↫~looparrowright~↬~lopar~⦅~lopf~𝕝~loplus~⨭~lotimes~⨴~lowbar~_~lozenge~◊~lozf~⧫~lpar~(~lparlt~⦓~lrarr~⇆~lrcorner~⌟~lrhar~⇋~lrhard~⥭~lrtri~⊿~lscr~𝓁~lsh~↰~lsim~≲~lsime~⪍~lsimg~⪏~lsqb~[~lsquor~‚~lstrok~ł~ltcc~⪦~ltcir~⩹~ltdot~⋖~lthree~⋋~ltimes~⋉~ltlarr~⥶~ltquest~⩻~ltrPar~⦖~ltri~◃~ltrie~⊴~ltrif~◂~lurdshar~⥊~luruhar~⥦~lvertneqq~≨︀~lvnE~≨︀~mDDot~∺~male~♂~malt~✠~maltese~✠~map~↦~mapsto~↦~mapstodown~↧~mapstoleft~↤~mapstoup~↥~marker~▮~mcomma~⨩~mcy~м~measuredangle~∡~mfr~𝔪~mho~℧~mid~∣~midast~*~midcir~⫰~minusb~⊟~minusd~∸~minusdu~⨪~mlcp~⫛~mldr~…~mnplus~∓~models~⊧~mopf~𝕞~mp~∓~mscr~𝓂~mstpos~∾~multimap~⊸~mumap~⊸~nGg~⋙̸~nGt~≫⃒~nGtv~≫̸~nLeftarrow~⇍~nLeftrightarrow~⇎~nLl~⋘̸~nLt~≪⃒~nLtv~≪̸~nRightarrow~⇏~nVDash~⊯~nVdash~⊮~nacute~ń~nang~∠⃒~nap~≉~napE~⩰̸~napid~≋̸~napos~ʼn~napprox~≉~natur~♮~natural~♮~naturals~ℕ~nbump~≎̸~nbumpe~≏̸~ncap~⩃~ncaron~ň~ncedil~ņ~ncong~≇~ncongdot~⩭̸~ncup~⩂~ncy~н~neArr~⇗~nearhk~⤤~nearr~↗~nearrow~↗~nedot~≐̸~nequiv~≢~nesear~⤨~nesim~≂̸~nexist~∄~nexists~∄~nfr~𝔫~ngE~≧̸~nge~≱~ngeq~≱~ngeqq~≧̸~ngeqslant~⩾̸~nges~⩾̸~ngsim~≵~ngt~≯~ngtr~≯~nhArr~⇎~nharr~↮~nhpar~⫲~nis~⋼~nisd~⋺~niv~∋~njcy~њ~nlArr~⇍~nlE~≦̸~nlarr~↚~nldr~‥~nle~≰~nleftarrow~↚~nleftrightarrow~↮~nleq~≰~nleqq~≦̸~nleqslant~⩽̸~nles~⩽̸~nless~≮~nlsim~≴~nlt~≮~nltri~⋪~nltrie~⋬~nmid~∤~nopf~𝕟~notinE~⋹̸~notindot~⋵̸~notinva~∉~notinvb~⋷~notinvc~⋶~notni~∌~notniva~∌~notnivb~⋾~notnivc~⋽~npar~∦~nparallel~∦~nparsl~⫽⃥~npart~∂̸~npolint~⨔~npr~⊀~nprcue~⋠~npre~⪯̸~nprec~⊀~npreceq~⪯̸~nrArr~⇏~nrarr~↛~nrarrc~⤳̸~nrarrw~↝̸~nrightarrow~↛~nrtri~⋫~nrtrie~⋭~nsc~⊁~nsccue~⋡~nsce~⪰̸~nscr~𝓃~nshortmid~∤~nshortparallel~∦~nsim~≁~nsime~≄~nsimeq~≄~nsmid~∤~nspar~∦~nsqsube~⋢~nsqsupe~⋣~nsubE~⫅̸~nsube~⊈~nsubset~⊂⃒~nsubseteq~⊈~nsubseteqq~⫅̸~nsucc~⊁~nsucceq~⪰̸~nsup~⊅~nsupE~⫆̸~nsupe~⊉~nsupset~⊃⃒~nsupseteq~⊉~nsupseteqq~⫆̸~ntgl~≹~ntlg~≸~ntriangleleft~⋪~ntrianglelefteq~⋬~ntriangleright~⋫~ntrianglerighteq~⋭~num~#~numero~№~numsp~ ~nvDash~⊭~nvHarr~⤄~nvap~≍⃒~nvdash~⊬~nvge~≥⃒~nvgt~>⃒~nvinfin~⧞~nvlArr~⤂~nvle~≤⃒~nvlt~<⃒~nvltrie~⊴⃒~nvrArr~⤃~nvrtrie~⊵⃒~nvsim~∼⃒~nwArr~⇖~nwarhk~⤣~nwarr~↖~nwarrow~↖~nwnear~⤧~oS~Ⓢ~oast~⊛~ocir~⊚~ocy~о~odash~⊝~odblac~ő~odiv~⨸~odot~⊙~odsold~⦼~ofcir~⦿~ofr~𝔬~ogon~˛~ogt~⧁~ohbar~⦵~ohm~Ω~oint~∮~olarr~↺~olcir~⦾~olcross~⦻~olt~⧀~omacr~ō~omid~⦶~ominus~⊖~oopf~𝕠~opar~⦷~operp~⦹~orarr~↻~ord~⩝~order~ℴ~orderof~ℴ~origof~⊶~oror~⩖~orslope~⩗~orv~⩛~oscr~ℴ~osol~⊘~otimesas~⨶~ovbar~⌽~par~∥~parallel~∥~parsim~⫳~parsl~⫽~pcy~п~percnt~%~period~.~pertenk~‱~pfr~𝔭~phiv~ϕ~phmmat~ℳ~phone~☎~pitchfork~⋔~planck~ℏ~planckh~ℎ~plankv~ℏ~plus~+~plusacir~⨣~plusb~⊞~pluscir~⨢~plusdo~∔~plusdu~⨥~pluse~⩲~plussim~⨦~plustwo~⨧~pm~±~pointint~⨕~popf~𝕡~pr~≺~prE~⪳~prap~⪷~prcue~≼~pre~⪯~prec~≺~precapprox~⪷~preccurlyeq~≼~preceq~⪯~precnapprox~⪹~precneqq~⪵~precnsim~⋨~precsim~≾~primes~ℙ~prnE~⪵~prnap~⪹~prnsim~⋨~profalar~⌮~profline~⌒~profsurf~⌓~propto~∝~prsim~≾~prurel~⊰~pscr~𝓅~puncsp~ ~qfr~𝔮~qint~⨌~qopf~𝕢~qprime~⁗~qscr~𝓆~quaternions~ℍ~quatint~⨖~quest~?~questeq~≟~rAarr~⇛~rAtail~⤜~rBarr~⤏~rHar~⥤~race~∽̱~racute~ŕ~raemptyv~⦳~rangd~⦒~range~⦥~rangle~⟩~rarrap~⥵~rarrb~⇥~rarrbfs~⤠~rarrc~⤳~rarrfs~⤞~rarrhk~↪~rarrlp~↬~rarrpl~⥅~rarrsim~⥴~rarrtl~↣~rarrw~↝~ratail~⤚~ratio~∶~rationals~ℚ~rbarr~⤍~rbbrk~❳~rbrace~}~rbrack~]~rbrke~⦌~rbrksld~⦎~rbrkslu~⦐~rcaron~ř~rcedil~ŗ~rcub~}~rcy~р~rdca~⤷~rdldhar~⥩~rdquor~”~rdsh~↳~realine~ℛ~realpart~ℜ~reals~ℝ~rect~▭~rfisht~⥽~rfr~𝔯~rhard~⇁~rharu~⇀~rharul~⥬~rhov~ϱ~rightarrow~→~rightarrowtail~↣~rightharpoondown~⇁~rightharpoonup~⇀~rightleftarrows~⇄~rightleftharpoons~⇌~rightrightarrows~⇉~rightsquigarrow~↝~rightthreetimes~⋌~ring~˚~risingdotseq~≓~rlarr~⇄~rlhar~⇌~rmoust~⎱~rmoustache~⎱~rnmid~⫮~roang~⟭~roarr~⇾~robrk~⟧~ropar~⦆~ropf~𝕣~roplus~⨮~rotimes~⨵~rpar~)~rpargt~⦔~rppolint~⨒~rrarr~⇉~rscr~𝓇~rsh~↱~rsqb~]~rsquor~’~rthree~⋌~rtimes~⋊~rtri~▹~rtrie~⊵~rtrif~▸~rtriltri~⧎~ruluhar~⥨~rx~℞~sacute~ś~sc~≻~scE~⪴~scap~⪸~sccue~≽~sce~⪰~scedil~ş~scirc~ŝ~scnE~⪶~scnap~⪺~scnsim~⋩~scpolint~⨓~scsim~≿~scy~с~sdotb~⊡~sdote~⩦~seArr~⇘~searhk~⤥~searr~↘~searrow~↘~semi~;~seswar~⤩~setminus~∖~setmn~∖~sext~✶~sfr~𝔰~sfrown~⌢~sharp~♯~shchcy~щ~shcy~ш~shortmid~∣~shortparallel~∥~sigmav~ς~simdot~⩪~sime~≃~simeq~≃~simg~⪞~simgE~⪠~siml~⪝~simlE~⪟~simne~≆~simplus~⨤~simrarr~⥲~slarr~←~smallsetminus~∖~smashp~⨳~smeparsl~⧤~smid~∣~smile~⌣~smt~⪪~smte~⪬~smtes~⪬︀~softcy~ь~sol~/~solb~⧄~solbar~⌿~sopf~𝕤~spadesuit~♠~spar~∥~sqcap~⊓~sqcaps~⊓︀~sqcup~⊔~sqcups~⊔︀~sqsub~⊏~sqsube~⊑~sqsubset~⊏~sqsubseteq~⊑~sqsup~⊐~sqsupe~⊒~sqsupset~⊐~sqsupseteq~⊒~squ~□~square~□~squarf~▪~squf~▪~srarr~→~sscr~𝓈~ssetmn~∖~ssmile~⌣~sstarf~⋆~star~☆~starf~★~straightepsilon~ϵ~straightphi~ϕ~strns~¯~subE~⫅~subdot~⪽~subedot~⫃~submult~⫁~subnE~⫋~subne~⊊~subplus~⪿~subrarr~⥹~subset~⊂~subseteq~⊆~subseteqq~⫅~subsetneq~⊊~subsetneqq~⫋~subsim~⫇~subsub~⫕~subsup~⫓~succ~≻~succapprox~⪸~succcurlyeq~≽~succeq~⪰~succnapprox~⪺~succneqq~⪶~succnsim~⋩~succsim~≿~sung~♪~supE~⫆~supdot~⪾~supdsub~⫘~supedot~⫄~suphsol~⟉~suphsub~⫗~suplarr~⥻~supmult~⫂~supnE~⫌~supne~⊋~supplus~⫀~supset~⊃~supseteq~⊇~supseteqq~⫆~supsetneq~⊋~supsetneqq~⫌~supsim~⫈~supsub~⫔~supsup~⫖~swArr~⇙~swarhk~⤦~swarr~↙~swarrow~↙~swnwar~⤪~target~⌖~tbrk~⎴~tcaron~ť~tcedil~ţ~tcy~т~tdot~⃛~telrec~⌕~tfr~𝔱~therefore~∴~thetav~ϑ~thickapprox~≈~thicksim~∼~thkap~≈~thksim~∼~timesb~⊠~timesbar~⨱~timesd~⨰~tint~∭~toea~⤨~top~⊤~topbot~⌶~topcir~⫱~topf~𝕥~topfork~⫚~tosa~⤩~tprime~‴~triangle~▵~triangledown~▿~triangleleft~◃~trianglelefteq~⊴~triangleq~≜~triangleright~▹~trianglerighteq~⊵~tridot~◬~trie~≜~triminus~⨺~triplus~⨹~trisb~⧍~tritime~⨻~trpezium~⏢~tscr~𝓉~tscy~ц~tshcy~ћ~tstrok~ŧ~twixt~≬~twoheadleftarrow~↞~twoheadrightarrow~↠~uHar~⥣~ubrcy~ў~ubreve~ŭ~ucy~у~udarr~⇅~udblac~ű~udhar~⥮~ufisht~⥾~ufr~𝔲~uharl~↿~uharr~↾~uhblk~▀~ulcorn~⌜~ulcorner~⌜~ulcrop~⌏~ultri~◸~umacr~ū~uogon~ų~uopf~𝕦~uparrow~↑~updownarrow~↕~upharpoonleft~↿~upharpoonright~↾~uplus~⊎~upsi~υ~upuparrows~⇈~urcorn~⌝~urcorner~⌝~urcrop~⌎~uring~ů~urtri~◹~uscr~𝓊~utdot~⋰~utilde~ũ~utri~▵~utrif~▴~uuarr~⇈~uwangle~⦧~vArr~⇕~vBar~⫨~vBarv~⫩~vDash~⊨~vangrt~⦜~varepsilon~ϵ~varkappa~ϰ~varnothing~∅~varphi~ϕ~varpi~ϖ~varpropto~∝~varr~↕~varrho~ϱ~varsigma~ς~varsubsetneq~⊊︀~varsubsetneqq~⫋︀~varsupsetneq~⊋︀~varsupsetneqq~⫌︀~vartheta~ϑ~vartriangleleft~⊲~vartriangleright~⊳~vcy~в~vdash~⊢~vee~∨~veebar~⊻~veeeq~≚~vellip~⋮~verbar~|~vert~|~vfr~𝔳~vltri~⊲~vnsub~⊂⃒~vnsup~⊃⃒~vopf~𝕧~vprop~∝~vrtri~⊳~vscr~𝓋~vsubnE~⫋︀~vsubne~⊊︀~vsupnE~⫌︀~vsupne~⊋︀~vzigzag~⦚~wcirc~ŵ~wedbar~⩟~wedge~∧~wedgeq~≙~wfr~𝔴~wopf~𝕨~wp~℘~wr~≀~wreath~≀~wscr~𝓌~xcap~⋂~xcirc~◯~xcup~⋃~xdtri~▽~xfr~𝔵~xhArr~⟺~xharr~⟷~xlArr~⟸~xlarr~⟵~xmap~⟼~xnis~⋻~xodot~⨀~xopf~𝕩~xoplus~⨁~xotime~⨂~xrArr~⟹~xrarr~⟶~xscr~𝓍~xsqcup~⨆~xuplus~⨄~xutri~△~xvee~⋁~xwedge~⋀~yacy~я~ycirc~ŷ~ycy~ы~yfr~𝔶~yicy~ї~yopf~𝕪~yscr~𝓎~yucy~ю~zacute~ź~zcaron~ž~zcy~з~zdot~ż~zeetrf~ℨ~zfr~𝔷~zhcy~ж~zigrarr~⇝~zopf~𝕫~zscr~𝓏~~AMP~&~COPY~©~GT~>~LT~<~QUOT~\\\"~REG~®\", namedReferences['html4']);\n","export const numericUnicodeMap: Record<number, number> = {\n    0: 65533,\n    128: 8364,\n    130: 8218,\n    131: 402,\n    132: 8222,\n    133: 8230,\n    134: 8224,\n    135: 8225,\n    136: 710,\n    137: 8240,\n    138: 352,\n    139: 8249,\n    140: 338,\n    142: 381,\n    145: 8216,\n    146: 8217,\n    147: 8220,\n    148: 8221,\n    149: 8226,\n    150: 8211,\n    151: 8212,\n    152: 732,\n    153: 8482,\n    154: 353,\n    155: 8250,\n    156: 339,\n    158: 382,\n    159: 376\n};\n","export const fromCodePoint =\n    String.fromCodePoint ||\n    function (astralCodePoint: number) {\n        return String.fromCharCode(\n            Math.floor((astralCodePoint - 0x10000) / 0x400) + 0xd800,\n            ((astralCodePoint - 0x10000) % 0x400) + 0xdc00\n        );\n    };\n\n// @ts-expect-error - String.prototype.codePointAt might not exist in older node versions\nexport const getCodePoint = String.prototype.codePointAt\n    ? function (input: string, position: number) {\n          return input.codePointAt(position);\n      }\n    : function (input: string, position: number) {\n          return (input.charCodeAt(position) - 0xd800) * 0x400 + input.charCodeAt(position + 1) - 0xdc00 + 0x10000;\n      };\n\nexport const highSurrogateFrom = 0xd800;\nexport const highSurrogateTo = 0xdbff;\n","import {bodyRegExps, namedReferences} from './named-references.js';\nimport {numericUnicodeMap} from './numeric-unicode-map.js';\nimport {fromCodePoint, getCodePoint} from './surrogate-pairs.js';\n\nconst allNamedReferences = {\n    ...namedReferences,\n    all: namedReferences.html5\n};\n\nexport type Level = 'xml' | 'html4' | 'html5' | 'all';\n\ninterface CommonOptions {\n    level?: Level;\n}\n\nexport type EncodeMode = 'specialChars' | 'nonAscii' | 'nonAsciiPrintable' | 'nonAsciiPrintableOnly' | 'extensive';\n\nexport interface EncodeOptions extends CommonOptions {\n    mode?: EncodeMode;\n    numeric?: 'decimal' | 'hexadecimal';\n}\n\nexport type DecodeScope = 'strict' | 'body' | 'attribute';\n\nexport interface DecodeOptions extends CommonOptions {\n    scope?: DecodeScope;\n}\n\nconst encodeRegExps: Record<EncodeMode, RegExp> = {\n    specialChars: /[<>'\"&]/g,\n    nonAscii: /[<>'\"&\\u0080-\\uD7FF\\uE000-\\uFFFF\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]?/g,\n    nonAsciiPrintable: /[<>'\"&\\x01-\\x08\\x11-\\x15\\x17-\\x1F\\x7f-\\uD7FF\\uE000-\\uFFFF\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]?/g,\n    nonAsciiPrintableOnly: /[\\x01-\\x08\\x11-\\x15\\x17-\\x1F\\x7f-\\uD7FF\\uE000-\\uFFFF\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]?/g,\n    extensive: /[\\x01-\\x0c\\x0e-\\x1f\\x21-\\x2c\\x2e-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7d\\x7f-\\uD7FF\\uE000-\\uFFFF\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]?/g\n};\n\nconst defaultEncodeOptions: EncodeOptions = {\n    mode: 'specialChars',\n    level: 'all',\n    numeric: 'decimal'\n};\n\n/** Encodes all the necessary (specified by `level`) characters in the text */\nexport function encode(\n    text: string | undefined | null,\n    {mode = 'specialChars', numeric = 'decimal', level = 'all'}: EncodeOptions = defaultEncodeOptions\n) {\n    if (!text) {\n        return '';\n    }\n\n    const encodeRegExp = encodeRegExps[mode];\n    const references = allNamedReferences[level].characters;\n    const isHex = numeric === 'hexadecimal';\n\n    return String.prototype.replace.call(text, encodeRegExp, (input) => {\n        let result = references[input];\n        if (!result) {\n            const code = input.length > 1 ? getCodePoint(input, 0)! : input.charCodeAt(0);\n            result = (isHex ? '&#x' + code.toString(16) : '&#' + code) + ';';\n        }\n        return result;\n    });\n}\n\nconst defaultDecodeOptions: DecodeOptions = {\n    scope: 'body',\n    level: 'all'\n};\n\nconst strict = /&(?:#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);/g;\nconst attribute = /&(?:#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g;\n\nconst baseDecodeRegExps: Record<Exclude<Level, 'all'>, Record<DecodeScope, RegExp>> = {\n    xml: {\n        strict,\n        attribute,\n        body: bodyRegExps.xml\n    },\n    html4: {\n        strict,\n        attribute,\n        body: bodyRegExps.html4\n    },\n    html5: {\n        strict,\n        attribute,\n        body: bodyRegExps.html5\n    }\n};\n\nconst decodeRegExps: Record<Level, Record<DecodeScope, RegExp>> = {\n    ...baseDecodeRegExps,\n    all: baseDecodeRegExps.html5\n};\n\nconst fromCharCode = String.fromCharCode;\nconst outOfBoundsChar = fromCharCode(65533);\n\nconst defaultDecodeEntityOptions: CommonOptions = {\n    level: 'all'\n};\n\nfunction getDecodedEntity(\n    entity: string,\n    references: Record<string, string>,\n    isAttribute: boolean,\n    isStrict: boolean\n): string {\n    let decodeResult = entity;\n    const decodeEntityLastChar = entity[entity.length - 1];\n    if (isAttribute && decodeEntityLastChar === '=') {\n        decodeResult = entity;\n    } else if (isStrict && decodeEntityLastChar !== ';') {\n        decodeResult = entity;\n    } else {\n        const decodeResultByReference = references[entity];\n        if (decodeResultByReference) {\n            decodeResult = decodeResultByReference;\n        } else if (entity[0] === '&' && entity[1] === '#') {\n            const decodeSecondChar = entity[2];\n            const decodeCode =\n                decodeSecondChar == 'x' || decodeSecondChar == 'X'\n                    ? parseInt(entity.substr(3), 16)\n                    : parseInt(entity.substr(2));\n\n            decodeResult =\n                decodeCode >= 0x10ffff\n                    ? outOfBoundsChar\n                    : decodeCode > 65535\n                    ? fromCodePoint(decodeCode)\n                    : fromCharCode(numericUnicodeMap[decodeCode] || decodeCode);\n        }\n    }\n    return decodeResult;\n}\n\n/** Decodes a single entity */\nexport function decodeEntity(\n    entity: string | undefined | null,\n    {level = 'all'}: CommonOptions = defaultDecodeEntityOptions\n): string {\n    if (!entity) {\n        return '';\n    }\n    return getDecodedEntity(entity, allNamedReferences[level].entities, false, false);\n}\n\n/** Decodes all entities in the text */\nexport function decode(\n    text: string | undefined | null,\n    {level = 'all', scope = level === 'xml' ? 'strict' : 'body'}: DecodeOptions = defaultDecodeOptions\n) {\n    if (!text) {\n        return '';\n    }\n\n    const decodeRegExp = decodeRegExps[level][scope];\n    const references = allNamedReferences[level].entities;\n    const isAttribute = scope === 'attribute';\n    const isStrict = scope === 'strict';\n\n    return text.replace(decodeRegExp, (entity) => getDecodedEntity(entity, references, isAttribute, isStrict));\n}\n"],"names":["_path","_path2","_path3","_path4","_extends","Object","assign","bind","n","e","arguments","length","t","r","hasOwnProperty","call","apply","SvgEmailPrompt","props","ref","react__WEBPACK_IMPORTED_MODULE_0__","createElement","xmlns","viewBox","role","fill","d","fillOpacity","ForwardRef","forwardRef","_defs","_g","SvgIconEmailPillAvatar","id","width","height","x","y","filterUnits","dy","in","result","stdDeviation","values","fillRule","stroke","strokeLinecap","strokeLinejoin","filter","transform","cx","cy","SvgLiveLocation","clipRule","ExtensibleEvent","constructor","wireFormat","this","wireContent","content","InvalidEventError","Error","message","super","MessageEvent","_defineProperty","mmessage","M_MESSAGE","findIn","mtext","M_TEXT","mhtml","M_HTML","isProvided","Array","isArray","text","find","mimetype","html","body","renderings","isOptionalAString","undefined","push","isEquivalentTo","primaryEventType","isEventTypeSame","serializeMMessageOnly","messageRendering","name","mime","serialize","_this$html","type","_objectSpread","msgtype","format","formatted_body","from","PollAnswerSubevent","PollStartEvent","poll","M_POLL_START","question","rawKind","kind","M_POLL_KIND_DISCLOSED","matches","M_POLL_KIND_UNDISCLOSED","maxSelections","Number","isFinite","max_selections","answers","slice","map","a","i","join","NamespacedValue","LETTERS","charAt","Math","floor","random","VerificationMethod","module","exports","__webpack_public_path__","MINUTE_MS","HOUR_MS","DAY_MS","getDaysArray","weekday","dateTimeFormat","Intl","DateTimeFormat","getUserLanguage","timeZone","keys","day","getTwelveHourOptions","showTwelveHour","hourCycle","formatDate","date","locale","_locale","now","Date","toDateString","formatTime","getTime","hour","minute","getUserTimezone","getFullYear","month","formatFullDate","formatFullDateNoTime","year","showSeconds","second","formatFullTime","formatTimeLeft","inSeconds","hours","toFixed","minutes","seconds","_t","withinPast24Hours","prevDate","nextDate","abs","wantsDateSeparator","prevEventDate","nextEventDate","getDay","formatFullDateNoDay","toLocaleDateString","replace","time","toLocaleTimeString","formatFullDateNoDayISO","toISOString","formatFullDateNoDayNoTime","formatRelativeTime","relativeDate","m","UTC","getMonthsArray","getMonth","getDate","withinCurrentYear","formatDuration","durationMs","value","round","formatPreciseDuration","days","formatLocalDateShort","timestamp","editorRoomKey","roomId","context","eventId","ParseError","token","start","end","error","loc","input","lexer","underlined","position","rawMessage","setPrototypeOf","prototype","uppercase","hyphenate","str","toLowerCase","ESCAPE_LOOKUP","ESCAPE_REGEX","katex_escape","String","match","getBaseElem","group","characterNodesTypes","Set","isCharacterBox","has","SETTINGS_SCHEMA","displayMode","description","cli","output","enum","leqno","fleqn","throwOnError","default","cliDescription","errorColor","cliProcessor","color","macros","cliDefault","def","defs","minRuleThickness","processor","max","parseFloat","colorIsTextColor","strict","trust","maxSize","Infinity","s","parseInt","maxExpand","globalGroup","getDefaultValue","schema","getImplicitDefault","applySetting","target","prop","options","optionValue","Settings","reportNonstrict","errorCode","errorMsg","console","warn","useStrictBehavior","isTrusted","url","protocol","exec","test","protocolFromUrl","Boolean","Style","size","cramped","sup","styles","sub","fracNum","fracDen","cramp","text$1","isTight","Style$1","DISPLAY","TEXT","SCRIPT","SCRIPTSCRIPT","scriptData","blocks","allBlocks","supportedCodepoint","codepoint","forEach","b","doubleBrushStroke","svgPath","hLinePad","path","doubleleftarrow","doublerightarrow","leftarrow","leftbrace","leftbraceunder","leftgroup","leftgroupunder","leftharpoon","leftharpoonplus","leftharpoondown","leftharpoondownplus","lefthook","leftlinesegment","leftbracketunder","leftbracketover","leftmapsto","leftToFrom","longequal","midbrace","midbraceunder","oiintSize1","oiintSize2","oiiintSize1","oiiintSize2","rightarrow","rightbrace","rightbraceunder","rightgroup","rightgroupunder","rightharpoon","rightharpoonplus","rightharpoondown","rightharpoondownplus","righthook","rightlinesegment","rightbracketunder","rightbracketover","rightToFrom","twoheadleftarrow","twoheadrightarrow","tilde1","tilde2","tilde3","tilde4","vec","widehat1","widehat2","widehat3","widehat4","widecheck1","widecheck2","widecheck3","widecheck4","baraboveleftarrow","rightarrowabovebar","baraboveshortleftharpoon","rightharpoonaboveshortbar","shortbaraboveleftharpoon","shortrightharpoonabovebar","DocumentFragment","children","classes","depth","maxFontSize","style","hasClass","className","includes","toNode","frag","document","createDocumentFragment","appendChild","toMarkup","markup","toText","child","ptPerUnit","pt","mm","cm","bp","pc","dd","cc","nd","nc","sp","px","relativeUnit","ex","em","mu","validUnit","unit","calculateSize","sizeValue","scale","fontMetrics","ptPerEm","sizeMultiplier","cssEmPerMu","unitOptions","havingStyle","xHeight","quad","min","number","makeEm","createClass","cls","cssStyleToString","key","initNode","attributes","getColor","tagName","node","attr","setAttribute","invalidAttributeNameRegex","Span","italic","attribute","Anchor","href","Img","src","alt","iCombinations","SymbolNode","skew","script","_i","block","scriptFromCodepoint","charCodeAt","createTextNode","span","marginRight","needsSpan","escaped","SvgNode","createElementNS","PathNode","pathName","alternate","LineNode","fontMetricsData","sigmasAndXis","slant","space","stretch","shrink","extraSpace","num1","num2","num3","denom1","denom2","sup1","sup2","sup3","sub1","sub2","supDrop","subDrop","delim1","delim2","axisHeight","defaultRuleThickness","bigOpSpacing1","bigOpSpacing2","bigOpSpacing3","bigOpSpacing4","bigOpSpacing5","sqrtRuleThickness","doubleRuleSep","arrayRuleWidth","fboxsep","fboxrule","extraCharacterMap","getCharacterMetrics","character","font","mode","ch","metrics","fontMetricsBySizeIndex","symbols","math","defineSymbol","acceptUnicodeChar","katex_text","main","ams","accent","bin","katex_close","inner","mathord","op","katex_open","punct","rel","spacing","textord","ligatures","mathTextSymbols","textSymbols","_ch","wideChar","letters","_i2","_ch2","_i3","_ch3","fromCharCode","_i4","_ch4","toString","extraLatin","_i5","_ch5","boldUpright","mathClass","textClass","boldItalic","noFont","fraktur","doubleStruck","boldFraktur","sansSerif","boldSansSerif","italicSansSerif","monospace","wideLatinLetterData","wideNumeralData","lookupSymbol","fontName","replacement","makeSymbol","symbolNode","lookup","mathsym","concat","makeOrd","fontFamily","fontWeight","fontShape","useFont","fontOrFamily","wideFontName","wideFontClass","wideCharData","codePoint","wideCharacterFont","fontClasses","fontData","fontClass","boldSymbol","fontMap","retrieveTextFontName","parts","makeFragment","_font","_fontName","_fontName3","_fontName2","canCombine","prev","next","_key","tryCombineChars","chars","splice","sizeElementFromChildren","elem","makeSpan","makeSvgSpan","makeLineSpan","thickness","line","borderBottomWidth","fragment","wrapFragment","makeVList","params","positionType","oldChildren","_depth","shift","currPos","diff","bottom","positionData","firstChild","getVListChildrenAndDepth","pstrutSize","pstrut","realChildren","minPos","maxPos","_child","_elem","wrapperClasses","wrapperStyle","childWrap","top","marginLeft","rows","vlist","emptySpan","depthStrut","topStrut","vtable","makeGlue","measurement","rule","baseFontName","mathbf","variant","mathrm","textit","mathit","mathnormal","mathsfit","mathbb","mathcal","mathfrak","mathscr","mathsf","mathtt","svgData","staticSvg","svgNode","preserveAspectRatio","thinspace","mediumspace","thickspace","spacings","mord","mop","mbin","mrel","minner","mopen","mclose","mpunct","tightSpacings","_functions","_htmlGroupBuilders","_mathmlGroupBuilders","defineFunction","data","names","htmlBuilder","mathmlBuilder","defineFunctionBuilders","_ref","normalizeArgument","arg","ordargument","binLeftCanceller","binRightCanceller","styleMap$1","display","scriptscript","DomEnum","buildExpression$1","expression","isRealGroup","surrounding","groups","buildGroup$1","glueOptions","havingSize","dummyPrev","dummyNext","isRoot","_traverseNonSpaceNodes","prevType","_tightSpacings$prevTy","_spacings$prevType","getTypeOfDomTree","nodes","callback","partialGroup","checkPartialGroup","nonspace","insertAfter","unshift","index","pop","_getOutermostNode","side","makeNullDelimiter","moreClasses","baseSizingClasses","baseOptions","groupNode","sizingClasses","multiplier","buildHTMLUnbreakable","strut","verticalAlign","buildHTML","tree","tag","eqnNum","tagChild","nobreak","htmlNode","newDocumentFragment","MathNode","getAttribute","TextNode","SpaceNode","noVariantSymbols","rowLikeTypes","makeText","makeRow","mathFontVariants","boldsymbol","getVariant","mathVariant","isNumberPunctuation","buildExpression","isOrdgroup","buildGroup","lastGroup","_group","base","lastChild","buildExpressionRow","buildMathML","texExpression","isDisplayMode","forMathmlOnly","wrapper","annotation","semantics","sizeStyleMap","sizeMultipliers","sizeAtStyle","Options","textSize","phantom","_fontMetrics","BASESIZE","extend","extension","havingCrampedStyle","havingBaseStyle","wantSize","havingBaseSizing","withColor","withPhantom","withFont","withTextFontFamily","withTextFontWeight","withTextFontShape","oldOptions","sizeIndex","getGlobalMetrics","optionsFromSettings","settings","displayWrap","stretchyCodePoint","widehat","widecheck","widetilde","utilde","overleftarrow","underleftarrow","xleftarrow","overrightarrow","underrightarrow","xrightarrow","underbrace","overbrace","underbracket","overbracket","overgroup","undergroup","overleftrightarrow","underleftrightarrow","xleftrightarrow","Overrightarrow","xRightarrow","overleftharpoon","xleftharpoonup","overrightharpoon","xrightharpoonup","xLeftarrow","xLeftrightarrow","xhookleftarrow","xhookrightarrow","xmapsto","xrightharpoondown","xleftharpoondown","xrightleftharpoons","xleftrightharpoons","xtwoheadleftarrow","xtwoheadrightarrow","xlongequal","xtofrom","xrightleftarrows","xrightequilibrium","xleftequilibrium","stretchyMathML","label","katexImagesData","overlinesegment","underlinesegment","wideAccentLabels","stretchySvg","minWidth","viewBoxWidth","viewBoxHeight","_height","numChars","imgIndex","spans","widthClasses","aligns","paths","_minWidth","_viewBoxHeight","_height2","numSvgChildren","_svgNode","_span","buildSvgSpan_","ATOMS","close","open","NON_ATOMS","assertNodeType","assertSymbolNodeType","typedNode","checkSymbolNodeType","getBaseSymbol","htmlBuilder$a","grp","supSubGroup","assertSpan","_getBaseSymbol$skew","_getBaseSymbol","isShifty","accentBody","accentBelow","clearance","isStretchy","assertSymbolDomNode","accentFull","left","accentWrap","NON_STRETCHY_ACCENT_REGEX","RegExp","numArgs","handler","args","funcName","parser","accentNode","allowedInText","allowedInMath","argTypes","innerGroup","kern","paddedNode","numOptionalArgs","optArgs","below","lowerGroup","newOptions","upperGroup","arrowPrefix","arrowBody","arrowShift","upperShift","lowerShift","arrowNode","upperNode","lowerNode","_lowerNode","primitive","mclass","elements","lspace","rspace","binrelClass","atom","family","_ref2","_ref3","baseArg","shiftedArg","baseOp","limits","alwaysHandleSupSub","parentIsSupSub","symbol","suppressBaseShift","supsub","textShadow","cdArrowFunctionName","A","V","newCell","resetFont","isStartOfArrow","isLabelEnd","endChar","cdArrow","arrowChar","labels","callFunction","bareArrow","arrowGroup","parent","code","isNaN","breakOnTokenText","gullet","set","parseExpression","future","parseSizeGroup","newLine","marginTop","globalMap","checkControlSequence","tok","letCommand","global","macro","get","noexpand","tokens","unexpandable","isExpandable","consumeSpaces","fetch","parseFunction","popToken","insert","delimiters","consumeArg","expandTokens","reverse","getRHS","_ref4","middle","pushToken","getMetrics","styleWrap","delim","toStyle","delimSizeMultiplier","centerSpan","makeLargeDelim","center","mathrmSize","makeGlyphSpan","makeInner","innerPath","lap","verts","doubleVerts","makeStackedDelim","heightTotal","repeat","svgLabel","topMetrics","topHeightTotal","repeatMetrics","repeatHeightTotal","bottomMetrics","bottomHeightTotal","middleHeightTotal","middleFactor","middleMetrics","minHeight","realHeightTotal","ceil","stack","midHeight","pathStr","tallDelim","svg","innerHeight","_innerHeight","emPad","sqrtSvg","sqrtName","extraVinculum","sqrtMain","sqrtSize1","sqrtSize2","sqrtSize3","sqrtSize4","sqrtTall","sqrtPath","pathNode","stackLargeDelimiters","stackAlwaysDelimiters","stackNeverDelimiters","sizeToMaxHeight","makeSizedDelim","stackNeverDelimiterSequence","stackAlwaysDelimiterSequence","stackLargeDelimiterSequence","delimTypeToFont","delimKind","traverseSequence","sequence","delimType","heightDepth","makeCustomSizedDelim","makeSmallDelim","makeLeftRightDelim","delimiterExtend","maxDistFromAxis","totalHeight","delimiterSizes","isMiddleDelimNode","checkDelimiter","symDelim","assertParsed","leftrightDepth","expect","right","rightColor","leftDelim","rightDelim","innerDepth","hadMiddle","middleDelim","isMiddle","colorOptions","leftNode","rightNode","textNode","middleNode","backgroundColor","img","imgShift","isSingleChar","lineWeight","angleHeight","paddingLeft","topPad","bottomPad","ruleThickness","borderColor","lines","x1","y1","x2","y2","stretchyEnclose","borderStyle","borderWidth","borderTopWidth","borderRightWidth","thk","_ref5","_ref6","_environments","defineEnvironment","_macros","defineMacro","SourceLocation","range","first","Token","treatAsRelax","endToken","getHLines","hlineInfo","nxt","consume","validateAmsEnvironmentContext","envName","gatherEnvironments","getAutoTag","parseArray","hskipBeforeAndAfter","addJot","cols","arraystretch","colSeparationType","autoTag","singleRow","emptySingleRow","maxNumCols","beginGroup","expandMacroAsText","row","rowGaps","hLinesBeforeRow","tags","beginRow","endRow","subparse","cellBody","endGroup","cell","nextToken","dCellStyle","htmlBuilder$6","c","nr","hlines","arraycolsep","baselineskip","jot","arrayskip","arstrutHeight","arstrutDepth","setHLinePos","hlinesInGap","pos","isDashed","inrow","outrow","cells","elt","rowGap","gap","colSep","colDescrNum","offset","colDescriptions","tagSpans","some","rw","tagSpan","_colDescr3","colDescr","firstSeparator","_colDescr","separator","lineType","borderRightStyle","margin","_shift","_colDescr$pregap","_colDescr2","sepwidth","pregap","colElems","_shift2","_colDescr$postgap","_colDescr4","colVList","colSpan","align","postgap","tableBody","dashes","vListElems","hline","lineShift","eqnNumCol","tagCol","alignMap","l","mathmlBuilder$5","tbl","glue","j","table","menclose","columnLines","prevTypeWasAlign","iStart","iEnd","col","trim","_cols","rowLines","alignedHandler","isSplit","res","numMaths","numCols","emptyGroup","arg0","isAligned","styling","curMaths","nde","ca","matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","colAlign","payload","parsedRows","rowNodes","labelNum","inLabel","k","wrappedArrow","parseCD","environments","nameGroup","env","_args","parseArguments","endNameToken","fontAliases","allowedInArgument","func","wrapWithStyle","frac","hasBarLine","numer","denom","continued","startsWith","barSize","nstyle","dstyle","numerm","hStrut","dStrut","ruleWidth","ruleSpacing","numShift","denomShift","delimSize","denomm","candidateClearance","withDelims","leftOp","rightOp","infix","replaceWith","stylArray","delimFromValue","delimString","barNode","isBlank","styl","textOrd","htmlBuilder$3","braceBody","isOver","vSpan","command","formatUnsupportedCmd","anchor","makeAnchor","trustContext","string","class","split","item","firstEquals","indexOf","_value","mathml","sizeData","totalheight","keyVal","substring","lastIndexOf","mathFunction","muUnit","dimension","alignment","fix","outerMode","switchMode","chooseMathStyle","assembleSupSub","supGroup","subGroup","baseShift","finalGroup","subIsSingleCharacter","_bottom","spacer","noSuccessor","htmlBuilder$2","hasLimits","symbolItalic","large","stash","oval","_base$italic","singleCharBigOps","fName","operator","singleCharIntegrals","htmlBuilder$1","childText","sizingGroup","isAllString","word","identifier","semisimple","amount","sizeFuncs","smashHeight","smashDepth","tbArg","letter","smashedNode","theta","phi","lineClearance","minDelimiterHeight","advanceWidth","spanHeight","texHeight","makeSqrtImage","delimDepth","rootm","toShift","rootVList","rootVListWrap","styleMap","newStyle","builderDelegate","htmlBuilderDelegate","supm","subm","minSupShift","valueBase","valueSup","valueSub","supShift","subShift","isCharBox","_newOptions","isOiint","maxWidth","psi","isBrace","nodeType","_base2","_base","defaultVariant","mi","mn","cssSpace","regularSpace","ord","pad","padNode","textFontFamilies","textFontWeights","textFontShapes","optionsWithFont","mpadded","makeVerb","star","functions","spaceRegexString","controlWordWhitespaceRegexString","combiningDiacriticalMarkString","combiningDiacriticalMarksEndRegex","tokenRegexString","Lexer","tokenRegex","catcodes","setCatcode","char","lex","lastIndex","nlIndex","Namespace","builtins","globalMacros","current","undefStack","undefs","undef","endGroups","expandOnce","consumeArgs","digitToNumber","B","C","D","E","f","F","digit","newcommand","existsOK","nonexistsOK","skipIfExists","exists","isDefined","argText","expandNextToken","log","dotsByToken","dotsbGroups","thedots","expandAfterFuture","spaceAfterDots","$","latexRaiseA","braketHelper","one","middleDouble","oldMiddle","oldMiddleDouble","midMacro","double","doubled","expanded","implicitCommands","_","MacroExpander","expansionCount","feed","newMode","pushTokens","scanArgument","isOptional","delims","isDelimited","countExpansion","expandableOnly","topToken","expansion","_getExpansion","expandMacro","oldStackLength","definition","catcode","stripped","bodyLexer","unicodeSubRegEx","uSubsAndSups","freeze","unicodeAccents","unicodeSymbols","Parser","parse","oldToken","breakOnInfix","endOfExpression","parseAtom","formLigatures","handleInfixNodes","overIndex","numerNode","denomNode","numerBody","denomBody","handleSupSubscript","symbolToken","parseGroup","textordArray","superscript","subscript","prime","primes","isSub","subsupTokens","funcData","_funcData$numOptional","totalArgs","_funcData$argTypes","argType","parseGroupOfType","optional","parseColorGroup","parseUrlGroup","parseArgumentGroup","parseStringGroup","_group2","argToken","parseRegexGroup","regex","modeName","firstToken","lastToken","groupEnd","parseSymbol","v","afterNext","nucleus","parseTree","toParse","TypeError","compatMode","renderError","renderToDomTree","katexNode","mathMLNode","_htmlNode","buildTree","katex","SURROGATE_PAIR_PATTERN","SYMBOL_PATTERN","EMOJI_SEPARATOR_REGEX","EMOJI_REGEX","BIGEMOJI_REGEX","source","mightContainEmoji","unicodeToShortcode","_getEmojiFromUnicode","shortcodes","getEmojiFromUnicode","sanitizedHtmlNode","insaneHtml","sanitizeParams","sanitizeHtmlParams","saneHtml","sanitizeHtml","React","dangerouslySetInnerHTML","__html","dir","getHtmlText","allowedTags","allowedAttributes","selfClosing","allowedSchemes","disallowedTagsMode","isUrlPermitted","inputUrl","PERMITTED_URL_SCHEMES","URL","composerSanitizeHtmlParams","transformTags","topicSanitizeHtmlParams","BaseHighlighter","highlightClass","highlightLink","applyHighlights","safeSnippet","safeHighlights","lastOffset","safeHighlight","subSnippet","applySubHighlights","endOffset","processSnippet","HtmlHighlighter","snippet","highlight","encodeURI","emojiToHtmlSpan","emoji","emojiToJsxSpan","title","formatEmojis","isHtmlMessage","emojiToSpan","graphemeSegmenter","segment","analyseEvent","highlights","opts","_sanitizeParams$trans","forComposerQuote","mediaIsVisible","attribs","linkify","LINKIFIED_DATA_ATTRIBUTE","isFormattedBody","safeBody","bodyHasEmoji","formattedBody","plainBody","stripReplyFallback","stripHTMLReply","strippedBody","stripPlainReply","highlighter","textFilter","safeText","unsafeBody","linkifyHtml","phtml","DOMParser","parseFromString","innerHTML","textContent","SettingsStore","getValue","querySelectorAll","outerHTML","decode","escapeHtml","bodyToNode","eventInfo","emojiBody","disableBigEmoji","_eventInfo$safeBody","_match$","contentBody","contentBodyTrimmed","classNames","mx_EventTile_body","mx_EventTile_bigEmoji","translate","emojiBodyElements","bodyToHtml","topicToHtml","topic","htmlTopic","allowExtendedHtml","isFormattedTopic","topicHasEmoji","safeTopic","checkBlockNode","nodeName","hasAttribute","AbortedIdentityActionError","IdentityAuthClient","identityUrl","tempClient","createClient","baseUrl","idBaseUrl","identityClient","_this$tempClient","matrixClient","MatrixClientPeg","safeGet","writeToken","accessToken","window","localStorage","setItem","removeItem","readToken","getItem","getAccessToken","check","authEnabled","registerForToken","checkToken","TermsNotSignedError","identityServerUrl","getIdentityServerUrl","getIdentityAccount","MatrixError","errcode","logger","startTermsFlow","Service","SERVICE_TYPES","IS","doesAccountDataHaveIdentityServer","doesIdentityServerHaveTerms","finished","Modal","createDialog","QuestionDialog","server","abbreviateUrl","button","confirmed","setToDefaultIdentityServer","hsOpenIdToken","getOpenIdToken","access_token","registerWithIdentityServer","identityAccessToken","IncomingLegacyCallToast","legacyCallHandler","addListener","LegacyCallHandlerEvent","SilencedCallsChanged","onSilencedCallsChanged","setState","silenced","isCallSilenced","callId","stopPropagation","answerCall","hangupOrReject","state","unSilenceCall","silenceCall","roomIdForCall","componentWillUnmount","removeListener","render","_this$context$client","_room$name","room","client","getRoom","isVoice","CallType","Voice","callForcedSilent","isForcedSilent","silenceButtonTooltip","RoomAvatar","getCallStateIcon","AccessibleButton","onClick","onRejectClick","EndCallIcon","onAnswerClick","VoiceCallSolidIcon","VideoCallSolidIcon","disabled","onSilenceClick","VolumeOffSolidIcon","VolumeOnSolidIcon","SDKContext","PROTOCOL_PSTN","PROTOCOL_PSTN_PREFIXED","AudioID","LegacyCallHandler","TypedEventEmitter","sdkContext","Map","BackgroundAudio","_MatrixClientPeg$get","_cli$getCrypto","supportsVoip","mappedRoomId","getCallForRoom","addCallForRoom","setCallListeners","onCallStateChanged","getCrypto","prepareToEncrypt","newState","oldState","matchesCallForThisRoom","setCallState","dis","dispatch","action","room_id","CallState","Ringing","pause","Ring","InviteSent","Ringback","silencedCalls","delete","incomingCallPushRule","pushProcessor","getPushRuleById","RuleId","IncomingCall","pushRuleEnabled","enabled","tweakSetToRing","actions","set_tweak","TweakName","Sound","play","Ended","hangupReason","isNotNull","removeCallForRoom","hangupParty","CallParty","Remote","Busy","CallErrorCode","UserHangup","UserBusy","ErrorDialog","AnsweredElsewhere","Connecting","Fledgling","CallEnd","logCallStats","_call$roomId","shouldObeyAssertedfIdentity","nativeUser","assertedIdentityNativeUsers","findDMForUser","UIFeature","Voip","on","CallEventHandlerEvent","Incoming","onCallIncoming","checkProtocols","stop","localNotificationsAreSilenced","add","emit","areAnyCallsUnsilenced","calls","setCallSidebarShown","sidebarShown","shownSidebars","ShownSidebarsChanged","isCallSidebarShown","_this$shownSidebars$g","maxTries","protocols","getThirdpartyProtocols","supportsPstnProtocol","pstnSupportPrefixed","ProtocolSupport","setTimeout","_SdkConfig$getObject","SdkConfig","getObject","getSupportsPstnProtocol","_this$supportsPstnPro","pstnLookup","phoneNumber","getThirdpartyUser","Promise","resolve","getCallById","getAllActiveCalls","activeCalls","getAllActiveCallsNotInRoom","notInThisRoomId","callsNotInThatRoom","entries","getAllActiveCallsForPip","widgetLayoutStore","hasMaximisedWidget","getTransfereeForCallId","transferees","audioId","logPrefix","debug","audioInfo","urlPrefix","loop","backgroundAudio","pickFormatAndPlay","playingSources","isPlaying","callForThisRoom","CallEvent","err","NoUserMedia","getTurnServers","showICEFallbackPrompt","showMediaCaptureError","Hangup","State","Replaced","newCall","AssertedIdentityChanged","async","_call$getRemoteAssert","getRemoteAssertedIdentity","newAssertedIdentity","ensureDMExists","newMappedRoomId","stats","getCurrentCallStats","direction","ourPartyId","cand","address","ip","candidateType","port","relayProtocol","networkType","pair","localCandidateId","remoteCandidateId","nominated","requestsSent","requestsReceived","responsesReceived","responsesSent","bytesReceived","bytesSent","status","toastKey","ToastStore","sharedInstance","addOrReplaceToast","priority","component","bodyClassName","dismissToast","CallsChanged","homeserverDomain","getDomain","FALLBACK_ICE_SERVER","pathname","cancelButton","then","allow","setValue","SettingLevel","DEVICE","Video","placeMatrixCall","transferee","timeUntilTurnCresExpire","getTurnServersExpiry","createCall","setActiveCallRoomId","placeVoiceCall","placeVideoCall","placeCall","isManagedHybridWidgetEnabled","addManagedHybridWidget","getSyncState","SyncState","members","getJoinedNonFunctionalMembers","Jitsi","getInstance","useFor1To1Calls","placeJitsiCall","info","hangupAllCalls","stopRingingIfPossible","hangup","reject","answer","Action","ViewRoom","metricsTrigger","dialNumber","results","userid","userId","startTransferToPhoneNumber","destination","consultFirst","startTransferToMatrixID","dmRoomId","should_peek","joining","transfer","activeCallRoomId","setRemoteOnHold","hasAnyUnheldCall","isRemoteOnHold","show","widget","widgetStore","getApps","app","WidgetType","JITSI","moveToContainer","WidgetUtils","addJitsiWidget","hangupCallApp","roomInfo","widgets","w","messaging","WidgetMessagingStore","instance","getMessagingForUid","getWidgetUid","widgetApi","transport","send","ElementWidgetActions","HangupCall","showTransferDialog","OpenInviteDialog","InviteKind","CallTransfer","analyticsName","onFinishedCallback","changedRooms","CallChangeRoom","COLOR_REGEX","MEDIA_API_MXC_REGEX","tryTransformPermalinkToLocalHref","ELEMENT_URL_PATTERN","requestedWidth","requestedHeight","mediaFromMxc","getThumbnailOfSourceHttp","cl","customCSSMapper","customAttributeKey","cssAttributeKey","customAttributeValue","div","ol","allowProtocolRelative","nestingLimit","onUserClick","event","preventDefault","ViewUser","member","User","LinkedTextConfiguration","userIdListener","click","_parsePermalink$userI","_parsePermalink","parsePermalink","roomAliasListener","_parsePermalink$roomI","_parsePermalink2","alias","roomIdOrAlias","roomAlias","room_alias","metricsViaKeyboard","urlListener","permalink","localHref","globalThis","location","hash","hrefTransformer","LinkifyMatrixOpaqueIdType","getHttpUriForMxc","RoomAlias","UserId","_tryTransformEntityTo","tryTransformEntityToPermalink","urlTargetTransformer","decodeURIComponent","generateLinkedTextOptions","_linkifyHtml","linkifyAndSanitizeHtml","dirtyHtml","_linkifyString","linkifyString","isContainer","_type","resumeAt","entering","cur","container","_firstChild","root","_next","_parent","NodeWalker","Node","sourcepos","_lastChild","_prev","_sourcepos","_open","_string_content","_literal","_listData","_info","_destination","_title","_isFenced","_fenceChar","_fenceLength","_fenceOffset","_level","_onEnter","_onExit","proto","defineProperty","tight","delimiter","unlink","prependChild","sibling","insertBefore","walker","lib_node","_fromCodePoint","ENTITY","TAGNAME","OPENTAG","CLOSETAG","reHtmlTag","reBackslashOrAmp","ESCAPABLE","reEntityOrEscapedChar","reXmlSpecial","unescapeChar","lib","hl","unescapeString","replaceUnsafeChar","escapeXml","fromCodePoint","RangeError","stringFromCharCode","highSurrogate","lowSurrogate","codeUnits","inlines_normalizeURI","uri","encode","inlines_unescapeString","C_SINGLEQUOTE","C_DOUBLEQUOTE","inlines_ESCAPABLE","ESCAPED_CHAR","inlines_ENTITY","inlines_reHtmlTag","rePunctuation","reLinkTitle","reLinkDestinationBraces","reEscapable","reEntityHere","reTicks","reTicksHere","reEllipses","reDash","reEmailAutolink","reAutolink","reSpnl","reWhitespaceChar","reUnicodeWhitespaceChar","reFinalSpace","reInitialSpace","reSpaceAtEndOfLine","reLinkLabel","reMain","inlines_text","normalizeReference","toUpperCase","re","subject","peek","spnl","parseBackticks","ticks","matched","contents","afterOpenTicks","parseBackslash","subj","parseAutolink","dest","parseHtmlTag","scanDelims","char_before","char_after","cc_after","left_flanking","right_flanking","can_open","can_close","after_is_whitespace","after_is_punctuation","before_is_whitespace","before_is_punctuation","numdelims","startpos","handleDelim","smart","origdelims","previous","removeDelimiter","removeDelimitersBetween","processEmphasis","stack_bottom","opener","closer","old_closer","opener_inl","closer_inl","tempstack","use_delims","tmp","opener_found","openers_bottom_index","openers_bottom","odd_match","closercc","emph","literal","parseLinkTitle","parseLinkDestination","savepos","openparens","parseLinkLabel","parseOpenBracket","addBracket","parseBang","parseCloseBracket","is_image","reflabel","brackets","active","removeBracket","image","beforelabel","bracketAfter","link","refmap","previousDelimiter","parseEntity","parseString","enCount","emCount","parseNewline","lastc","hardbreak","parseReference","rawlabel","matchChars","beforetitle","atLineEnd","normlabel","parseInline","parseInlines","inlines","reHtmlBlockOpen","reHtmlBlockClose","reThematicBreak","reMaybeSpecial","reNonSpace","reBulletListMarker","reOrderedListMarker","reATXHeadingMarker","reCodeFence","reClosingCodeFence","reSetextHeadingLine","reLineEnding","isSpaceOrTab","blocks_peek","ln","endsWithBlankLine","addLine","partiallyConsumedTab","charsToTab","column","tip","currentLine","addChild","canContain","finalize","lineNumber","column_number","newBlock","closeUnmatchedBlocks","allClosed","oldtip","lastMatchedContainer","continue","emptyNodes","hasReferenceDefs","inlineParser","removedText","removeLinkReferenceDefinitions","acceptsLines","list","subitem","block_quote","indented","nextNonspace","advanceNextNonspace","advanceOffset","blank","indent","markerOffset","padding","heading","thematic_break","code_block","lastLineLength","newlinePos","firstLine","rest","html_block","_htmlBlockType","paragraph","blockStarts","level","fenceLength","blockType","list_data","item_data","nextc","spacesStartCol","spacesStartOffset","bulletChar","blank_item","spaces_after_marker","parseListMarker","count","columns","charsToAdvance","nextNonspaceColumn","findNextNonspace","incorporateLine","all_matched","doc","matchedLeaf","starts","startsLen","above","processInlines","Document","len","timeEnd","lib_blocks","Renderer","ast","buffer","lastOut","out","lit","cr","esc","renderer","reUnsafeProtocol","reSafeDataProtocol","potentiallyUnsafe","HtmlRenderer","softbreak","disableTags","create","html_inline","safe","linebreak","attrs","strong","grandparent","listTight","tagname","info_words","listType","listStart","custom_inline","onEnter","onExit","custom_block","selfclosing","attrib","att","reXMLTag","toTagName","XmlRenderer","indentLevel","nodetype","listDelimiter","delimword","ALLOWED_HTML_TAGS","TEXT_NODES","isAllowedHtmlTag","isMultiLine","par","getTextUntilEndOrLinebreak","currentNode","formattingChangesByNodeType","innerNodeLiteral","step","currentNodeLiteral","emptyItemWithNoSiblings","Markdown","commonmark","parsed","repairLinks","isInPara","previousNode","shouldUnlinkFormattingNode","_previousNode","thisPart","nextParts","part","nextNode","foundLinks","findLinksInString","_node$firstChild","nonEmphasizedText","newText","emphasisTextNode","isPlainText","ev","toHTML","externalLinks","realParagraph","_node$parent","escape","toPlaintext","MediaDeviceKindEnum","MediaDeviceHandlerEvent","MediaDeviceHandler","EventEmitter","internalInstance","hasAnyLabeledDevices","navigator","mediaDevices","enumerateDevices","getDevices","devices","AudioOutput","AudioInput","VideoInput","device","loadDevices","audioDeviceId","videoDeviceId","getMediaHandler","setAudioInput","setVideoInput","updateAudioSettings","setAudioSettings","autoGainControl","getAudioAutoGainControl","echoCancellation","getAudioEchoCancellation","noiseSuppression","getAudioNoiseSuppression","setAudioOutput","deviceId","AudioOutputChanged","setDevice","setAudioAutoGainControl","setAudioEchoCancellation","setAudioNoiseSuppression","getAudioOutput","getValueAt","getAudioInput","getVideoInput","getDevice","startWithAudioMuted","startWithVideoMuted","Resend","resendUnsentEvents","all","getPendingEvents","EventStatus","NOT_SENT","resend","cancelUnsentEvents","removeFromQueue","getRoomId","resendEvent","cancelPendingEvent","levelRoleMap","usersDefault","textualPowerLevel","LEVEL_ROLE_MAP","cache","storeRoomAliasInCache","viaServers","getCachedRoomIdForAlias","showStartChatInviteDialog","initialText","InviteDialog","Dm","showRoomInviteDialog","Invite","isValid3pidInvite","getType","EventType","RoomThirdPartyInvite","getContent","showAnyInviteErrors","states","inviter","userMap","failedUsers","fatal","roomName","getErrorText","errorList","addr","reason","RoomName","_getMxcAvatarUrl","user","getUser","rawDisplayName","avatarUrl","getMxcAvatarUrl","BaseAvatar","getSquareThumbnailHttp","idName","RoomNotifState","getRoomNotifsState","_roomRule","isGuest","AllMessages","findOverrideMuteRule","Mute","roomRule","getRoomPushRule","isMuteRule","MentionsOnly","PushProcessor","actionListToActionsObject","tweaks","sound","AllMessagesLoud","setRoomNotifsState","promises","deletePushRule","PushRuleKind","RoomSpecific","rule_id","addPushRule","Override","conditions","ConditionKind","EventMatch","pattern","PushRuleActionName","DontNotify","setRoomNotifsStateMuted","overrideMuteRule","Notify","setRoomNotifsStateUnmuted","getUnreadNotificationCount","includeThreads","threadId","getCountShownForRoom","getRoomUnreadNotificationCount","notificationCount","getThreadUnreadNotificationCount","msc3946ProcessDynamicPredecessor","predecessor","findPredecessor","oldRoomId","oldRoom","NotificationCountType","Highlight","_cli$pushRules","pushRules","override","isRuleRoomMuteRuleForRoomId","isRuleMaybeRoomMuteRule","_rule$conditions","determineUnreadState","NotificationLevel","None","invited","threadRootId","getUnsentMessages","Unsent","getEffectiveMembership","getMyMembership","EffectiveMembership","isKnockDenied","redNotifs","greyNotifs","Total","trueCount","markedUnreadState","getMarkedUnreadState","Notification","hasUnread","thread","getThread","doesRoomOrThreadHaveUnreadMessages","doesRoomHaveUnreadMessages","Activity","getDisplayAliasForRoom","getDisplayAliasForAliasSet","getCanonicalAlias","getAltAliases","canonicalAlias","altAliases","AliasCustomisations","guessAndSetDMRoom","isDirect","newTarget","myUserId","oldestTs","oldestUser","getJoinedMembers","_user$events$member","events","getTs","currentState","getMembers","_user$events$member2","guessDMRoomTargetId","getSafeUserId","setDMRoom","_mDirectEvent$getCont","mDirectEvent","getAccountData","Direct","filteredContent","filterValidMDirect","thisUserId","setAccountData","AccessSecretStorageDialog","onFinished","debounce","validateRecoveryKey","recoveryKey","validateRecoveryKeyOnChange","keyParams","_this$inputRef$curren","inputRef","focus","recoveryKeyCorrect","_this$props$keyInfo","_this$props$keyInfo2","hasPassphrase","keyInfo","passphrase","salt","iterations","checkPrivateKey","getRecoveryKeyFeedback","ErrorSolidIcon","Flex","recoveryKeyFeedback","onSubmit","onRecoveryKeyNext","spellCheck","autoComplete","PasswordInput","placeholder","onChange","onRecoveryKeyChange","autoFocus","EncryptionCardButtons","Button","onCancel","BaseDialog","fixedWidth","hasCancel","EncryptionCard","Icon","LockSolidIcon","secretStorageKeys","secretStorageKeyInfo","secretStorageBeingAccessed","rootLogger","getChild","isSecretStorageBeingAccessed","AccessCancelledError","cacheSecretStorageKey","keyId","crossSigningCallbacks","getSecretStorageKey","keyInfos","secretName","defaultKeyId","secretStorage","getDefaultKeyId","usefulKeys","keyFromCustomisations","ModuleRunner","extensions","cryptoSetup","inputToKey","deriveRecoveryKeyFromPassphrase","decodeRecoveryKey","makeInputToKey","checkKey","withSecretStorageKeyCache","accessSecretStorage","crypto","forceReset","lazy","__webpack_require__","hasKey","bootstrapCrossSigning","authUploadDeviceSigningKeys","InteractiveAuthDialog","makeRequest","bootstrapSecretStorage","catchAccessSecretStorageError","doAccessSecretStorage","SendHistoryManager","prefix","itemJSON","sessionStorage","history","JSON","currentIndex","createItem","model","replyEvent","serializeParts","replyEventId","getId","save","editorModel","stringify","clamp","getSenderName","_event$sender$name","_event$sender","sender","getSender","getRoomMemberDisplayname","_client$getRoom","getMember","textForCallEvent","_client$getRoom2","getCallInviteText","isSupported","senderName","Modification","getModification","Changed","Unset","onViewJoinRuleSettingsClick","defaultDispatcher","initial_tab_id","RoomSettingsTab","Security","textForMessageEvent","isLocationEvent","textForLocationEvent","senderDisplayName","isRedacted","textForRedactedPollAndMessageEvent","MsgType","Emote","Image","Sticker","onPinnedMessagesClick","PosthogTrackers","trackInteraction","RightPanelStore","setCard","phase","RightPanelPhases","PinnedMessages","textForMjolnirEvent","entity","prevEntity","getPrevContent","recommendation","USER_RULE_TYPES","glob","ROOM_RULE_TYPES","SERVER_RULE_TYPES","oldGlob","newGlob","_unsigned$redacted_be","unsigned","getUnsigned","redactedBecauseUserId","redacted_because","textForPollStartEvent","_event$unstableExtens","pollQuestion","unstableExtensibleEvent","textForPollEndEvent","handlers","RoomMessage","CallInvite","_content$offer","offer","sdp","RTCNotification","M_POLL_END","altName","stateHandlers","RoomCanonicalAlias","oldAlias","oldAltAliases","alt_aliases","newAlias","newAltAliases","removedAltAliases","addedAltAliases","addresses","oldRoomName","newRoomName","RoomTopic","ContentHelpers","RoomMember","allowJSX","showHiddenEvents","_ev$sender","_ev$target","targetName","getStateKey","prevContent","membership","KnownMembership","threePidContent","third_party_invite","display_name","displayName","Ban","Spoiler","Join","modDisplayname","displayname","modAvatarUrl","avatar_url","oldDisplayName","removeDirectionOverrideChars","state_key","Leave","_ev$sender2","targetDisplayName","RoomHistoryVisibility","history_visibility","HistoryVisibility","Invited","Joined","Shared","WorldReadable","visibility","RoomPowerLevels","_event$getPrevContent","_event$getContent","users","previousUserDefault","users_default","currentUserDefault","diffs","isInteger","to","powerLevelDiffText","fromPowerLevel","Roles","toPowerLevel","RoomPinnedEvents","pinned","previouslyPinned","newlyPinned","newlyUnpinned","messageId","highlightEvent","RoomTombstone","RoomJoinRules","join_rule","JoinRule","Public","Knock","Restricted","RoomGuestAccess","guest_access","GuestAccess","CanJoin","Forbidden","prevName","prevUrl","widgetName","WIDGET_LAYOUT_EVENT_TYPE","evType","ALL_RULE_TYPES","ElementCallEventType","hasText","isState","textForEvent","_handler","USER_TIMEZONE_KEY","setUserTimezone","timezone","getAllTimezones","supportedValuesOf","shortBrowserTimezone","_Intl$DateTimeFormat$","_Intl$DateTimeFormat$2","timeZoneName","formatToParts","isNotUndefined","eventTriggersUnreadCount","CallAnswer","CallHangup","RoomServerAcl","M_BEACON","haveRendererForEvent","toCheck","getThreads","withTimeline","doesTimelineHaveUnreadMessages","timeline","_findLatestImportantE","isSpaceRoom","latestImportantEventId","isImportantEvent","findLatestImportantEvent","hasUserReadEvent","_timeline$at","earliestUnimportantEventId","at","doesRoomHaveUnreadThreads","roomOrThread","Thread","getLiveTimeline","getEvents","shouldHideEvent","UserActivity","visibilityState","activeNowTimeout","abort","activeRecentlyTimeout","onUserActivity","hasFocus","isMouseEvent","screenX","lastScreenX","screenY","lastScreenY","isRunning","restart","runTimersUntilTimeout","attachedActiveNowTimers","attachedActiveRecentlyTimers","Timer","mxUserActivity","timeWhileActiveNow","timer","timeWhile","userActiveNow","timeWhileActiveRecently","userActiveRecently","attachedTimers","finally","catch","addEventListener","onPageVisibilityChanged","onWindowBlurred","passive","capture","removeEventListener","timeout","emailRegex","mxUserIdRegex","mxRoomIdRegex","AddressType","getAddressType","inputText","Email","MatrixUserId","MatrixRoomId","WorkerManager","worker","deferred","pendingDeferredMap","seq","onmessage","onMessage","request","withResolvers","postMessage","promise","Landmark","ORDERED_LANDMARKS","ACTIVE_SPACE_BUTTON","ROOM_SEARCH","ROOM_LIST","MESSAGE_COMPOSER_OR_HOME","LandmarkNavigation","getLandmark","currentLandmark","backwards","findIndex","findAndFocusNextLandmark","_element","landmark","element","landmarkToDomElementMap","focusVisible","querySelector","_document$activeEleme","inThread","activeElement","closest","FocusSendMessageComposer","TimelineRenderingType","Room","__WEBPACK_DEFAULT_EXPORT__","_objectWithoutProperties","_excluded","RovingTabIndexProvider","handleHomeEnd","handleLeftRight","handleUpDown","onKeyDown","handled","getKeyBindingsManager","getAccessibilityAction","KeyBindingAction","ArrowUp","ArrowDown","onKeyDownHandler","isExpanded","onContextMenu","disableTooltip","RovingAccessibleButton","formatMap","mp3","ogg","createAudioContext","formats","pickFormat","sounds","response","arrayBuffer","audioContext","decodeAudioData","createBufferSource","connect","resume","onended","suspend","audioElement","canPlayType","PlaybackClock","SimpleObservable","force","timeSeconds","lastCheck","observable","update","durationSeconds","clipDuration","placeholderDuration","val","currentTime","clipStart","liveData","populatePlaceholdersFrom","_event$getContent$inf","flagLoadTime","flagStart","stopped","timerId","setInterval","checkTime","flagStop","syncTo","contextTime","clipTime","destroy","clearInterval","PlaybackEncoder","Worker","p","u","getPlaybackWaveform","resp","waveform","_PlaybackEncoder","PlaybackState","Playback","buf","seedWaveform","DEFAULT_WAVEFORM","Decoding","Stopped","clock","fileSize","byteLength","resampledWaveform","arrayFastResample","PLAYBACK_WAVEFORM_SAMPLES","thumbnailWaveform","waveformObservable","sizeBytes","waveformData","clockInfo","Playing","UPDATE_EVENT","removeAllListeners","revokeObjectURL","remove","prepare","_this$element$duratio","_this$element","Preparing","onloadeddata","onerror","createObjectURL","Blob","audioBuf","wav","decodeOgg","getChannelData","duration","disconnectSource","makeNewSourceBuffer","_this$source","_this$source2","disconnect","onPlaybackEnd","_this$audioBuf","createMediaElementSource","Paused","toggle","skipTo","ManagedPlayback","manager","pauseAllExcept","destroyPlaybackInstance","PlaybackManager","playback","instances","createPlaybackInstance","encoderWorker_min","FixedRollingArray","padValue","samples","arraySeed","pushValue","swap","arrayFastClone","voiceRecorderOptions","bitrate","encoderApplication","highQualityRecorderOptions","RecordingState","VoiceRecording","processAudioUpdate","playbackTime","recording","liveWaveform","targetMaxLength","secondsLeft","recorderSeconds","Singleflight","for","do","EndingSoon","Void","contentType","recorder","recorderContext","isRecording","disableMaxLength","shouldRecordInHighQuality","makeRecorder","requestedDeviceId","deviceIdConstraint","exact","recorderStream","getUserMedia","audio","channelCount","ideal","recorderSource","createMediaStreamSource","audioWorklet","addModule","mxRecorderWorkletPath","recorderWorklet","AudioWorkletNode","WORKLET_NAME","PayloadEvent","Timekeep","AmplitudeMark","amplitudes","recorderProcessor","createScriptProcessor","onAudioProcess","recorderOptions","Recorder","encoderPath","encoderSampleRate","streamPages","encoderFrameSize","numberOfChannels","sourceNode","encoderBitRate","encoderComplexity","resampleQuality","ondataavailable","_this$onDataAvailable","onDataAvailable","DOMException","getTracks","encodedSamplePosition","_this$recorder","Started","_this$observable","forgetAllFor","decoderWorker_min","waveWorker_min","dist_decoderWorker_min","AudioContext","ctx","audioBuffer","decoderWasmPath","typedArray","Uint8Array","decoderWorker","decoderPath","wavWorker","wavEncoderPath","decoderSampleRate","SAMPLE_RATE","outputBufferSampleRate","wavBitDepth","wavSampleRate","buffers","page","pages","AutocompleteProvider","commandRegex","forcedCommandRegex","renderingType","getCurrentCommand","query","selection","shouldForceComplete","COMMAND_RE","CommandProvider","matcher","QueryMatcher","Commands","funcs","aliases","getCompletions","limit","CommandMap","isEnabled","hideCompletionAfterSpace","cmd","renderingTypes","completion","getCommand","usedAlias","TextualCompletion","subtitle","getName","renderCompletions","completions","ariaSelectedAttribute","restProps","titleIcon","_excluded2","objects","_options","setObjects","shouldMatchWordsOnly","_items","object","keyValues","keyValue","processQuery","keyWeight","candidates","resultKey","candidate","sort","dedupped","uniq","maxLength","fuzzy","removeHiddenChars","UserStatusIconViewModel","BaseViewModel","syncedUserId","syncProfile","snapshot","merge","validateUserStatus","disposables","trackListener","ClientEvent","UserProfileUpdate","onUserProfileUpdate","fetchUserStatus","isDisposed","USER_REGEX","FORCED_USER_REGEX","UserProvider","toStartOfTimeline","removed","getTimelineSet","getUnfilteredTimelineSet","liveEvent","onUserSpoke","obj","RoomEvent","Timeline","onRoomTimeline","RoomStateEvent","Update","onRoomStateUpdate","_MatrixClientPeg$get2","vm","statusViewModels","dispose","clear","getStatusViewModel","rawQuery","makeUsers","fullMatch","_UserIdentifierCustom","UserIdentifierCustomisations","getDisplayUserIdentifier","withDisplayName","completionId","suffix","beginning","makeUserPermalink","PillCompletion","UserStatusIconView","MemberAvatar","lastSpoken","currentUserId","credentials","getMembersWithMembership","sortBy","user2","GroupCallPrefix","ElementCallMemberEventType","GroupCallMemberPrefix","MenuItem","ariaLabel","MenuItemCheckbox","ContextualMenuContainerId","ChevronFace","ContextMenu","_this$props$onFinishe","_this$props","contextMenuElem","clientX","clientY","_document$elementFrom","clickEvent","MouseEvent","relatedTarget","elementFromPoint","dispatchEvent","_this$props$onFinishe2","_this$props2","_this$props$onFinishe3","_this$props3","closeOnInteraction","managed","checkInputableElement","Escape","Tab","ArrowLeft","ArrowRight","initialFocus","componentDidMount","ModalManagerEvent","Opened","onModalOpen","off","renderMenu","hasBackground","_this$props4","bottomAligned","rightAligned","menuClassName","menuHeight","menuWidth","menuPaddingLeft","menuPaddingRight","menuPaddingBottom","menuPaddingTop","zIndex","focusLock","wrapperClassName","chevronFace","propsChevronFace","chevronOffset","propsChevronOffset","mountAsChild","Left","Right","contextMenuRect","getBoundingClientRect","hasChevron","Top","Bottom","windowWidth","windowHeight","UIStore","maxTop","maxLeft","chevron","menuClasses","mx_ContextualMenu","mx_ContextualMenu_left","mx_ContextualMenu_right","mx_ContextualMenu_top","mx_ContextualMenu_bottom","mx_ContextualMenu_withChevron_left","mx_ContextualMenu_withChevron_right","mx_ContextualMenu_withChevron_top","mx_ContextualMenu_withChevron_bottom","mx_ContextualMenu_rightAligned","mx_ContextualMenu_bottomAligned","menuStyle","background","FocusLock","returnFocus","_hasBackground","_onFinished","divProps","onContextMenuPreventBubbling","TooltipProvider","collectContextMenuRect","ReactDOM","getElementById","getOrCreateContainer","toRightOf","elementRect","scrollX","scrollY","aboveLeftOf","vPadding","menuOptions","buttonRight","buttonBottom","buttonTop","aboveRightOf","buttonLeft","alwaysMenuProps","alwaysAboveRightOf","useContextMenu","useRef","isOpen","setIsOpen","useState","ERROR_USER_CANCELLED","InteractiveAuthComponent","createRef","email","secret","attempt","session","busy","requestEmailToken","stageType","stageState","oldStage","authStage","errorText","setFocus","_this$stageComponent$","_this$stageComponent$2","stageComponent","attemptFailed","auth","AuthType","Sso","SsoUnstable","authData","authLogic","submitAuthDict","newPhase","_this$props$onStagePh","_this$state$authStage","onStagePhaseChange","onAuthFinished","sid","setEmailSid","submitButtonEnabled","InteractiveAuth","doRequest","requestCallback","busyChanged","onBusyChanged","inputs","stateUpdated","authStateUpdated","sessionId","clientSecret","emailSid","supportedStages","Password","Recaptcha","Msisdn","Terms","RegistrationToken","UnstableRegistrationToken","OAuth","CustomAuthType","MasCrossSigningReset","unmounted","intervalId","attemptAuth","extra","getEmailSid","getClientSecret","msg","_this$stageComponent$3","_this$stageComponent$4","stage","Spinner","StageComponent","getEntryComponentForLoginType","loginType","authSessionId","getSessionId","stageParams","getStageParams","fail","onAuthStageFailed","onPhaseChange","continueText","continueKind","onStageCancel","LegacyCallEventGrouperEvent","CONNECTING_STATES","WaitLocalMedia","CreateOffer","CreateAnswer","SUPPORTED_STATES","Connected","buildLegacyCallEventGroupers","callEventGroupers","newCallEventGroupers","eventType","call_id","LegacyCallEventGrouper","SDKContextClass","SilencedChanged","LengthChanged","invite","StateChanged","setCall","CallReject","selectAnswer","CallSelectAnswer","_invite$getContent","_this$call$hangupReas","_this$call","_this$hangup","rejectParty","_this$reject","gotRejected","_this$hangup2","_this$selectAnswer","callWasMissed","getUserId","_2","onLengthChanged","debuglog","ScrollPanel","_this$context","_this$scrollTimeout","_this$props$onScroll","resizeNotifier","isResizing","getScrollNode","scrollTop","scrollTimeout","saveScrollState","updatePreventShrinking","onScroll","checkFillState","checkScroll","preventShrinkingState","preventShrinking","isFromPropsUpdate","restoreSavedScrollState","sn","scrollHeight","clientHeight","isFirstCall","isFilling","isFillingDueToPropsUpdate","fillRequestWhileRunning","pendingFillDueToPropsUpdate","itemlist","firstTile","firstElementChild","fillPromises","offsetTop","maybeFill","refillDueToPropsUpdate","scrollState","stuckAtBottom","startAtBottom","bottomGrowth","minListHeight","heightUpdateInProgress","multiple","scrollNode","delta","scrollBy","getRoomAction","ScrollUp","scrollRelative","ScrollDown","JumpToFirstMessage","scrollToTop","JumpToLatestMessage","scrollToBottom","scrollToken","pixelOffset","offsetBase","trackedScrollToken","trackedNode","getTrackedNode","divScroll","messageList","tiles","lastTileNode","dataset","scrollTokens","clearPreventShrinking","offsetFromBottom","offsetNode","balanceElement","parentElement","removeProperty","shouldClear","offsetDiff","paddingBottom","resetScrollState","_this$context2","onResize","componentDidUpdate","_this$context3","getExcessHeight","contentHeight","getMessagesHeight","clippedHeight","getListHeight","unclippedScrollTop","checkUnfillState","excessHeight","origExcessHeight","tile","markerScrollToken","unfillDebouncer","clearTimeout","_this$props$onUnfillR","onUnfillRequest","pendingFillRequests","_this$props$onFillReq","onFillRequest","hasMoreResults","_dataset$scrollTokens","stickyBottom","isAtBottom","viewportBottom","messages","_htmlMessage$dataset","htmlMessage","topFromBottom","bottomOffset","_scrollState$bottomOf","newBottomOffset","bottomDiff","newHeight","updateHeight","_this$scrollTimeout2","oldTop","topDiff","_m$dataset$scrollToke","_offsetTop","_itemlist$firstElemen","lastNode","lastElementChild","AutoHideScrollbar","wrappedRef","collectScroll","fixedChildren","SearchBox","search","searchTerm","onSearch","throttle","_this$search$current$","_this$search$current","trailing","leading","clearSearch","blurred","select","onFocus","onBlur","initialValue","_this$props$onCleared","onCleared","blurredPlaceholder","collapsed","clearButton","tabIndex","CloseIcon","mx_SearchBox_blurred","SpacePillButton","icon","ViewSource","isEditing","onEdit","viewSourceContent","mxEvent","replacingEvent","ignoreEdits","isEncrypted","decryptedEventSource","clearEvent","originalEventSource","copyOriginalFunc","copyDecryptedFunc","CopyableText","getTextToCopy","SyntaxHighlight","language","editSourceContent","isStateEvent","MatrixClientContext","Consumer","DevtoolsContext","Provider","StateEventEditor","onBack","TimelineEventEditor","canSendStateEvent","mayClientSendStateEvent","canEdit","canEditContent","border","AuthHeaderContext","createContext","AuthHeaderActionType","AuthHeaderProvider","useReducer","Add","Remove","isEqual","useMemo","PlayPauseButton","toggleState","playbackPhase","SharedPlayPauseButton","togglePlay","playing","onPlaybackUpdate","onUpdate","onTimeUpdate","_this$props$defaultDi","defaultDisplaySeconds","Clock","AudioPlayerBase","_this$playPauseRef$cu","_this$seekRef$current","_this$seekRef$current2","Space","playPauseRef","seekRef","renderComponent","LegacySeekBar","MarkedExecution","doUpdate","requestAnimationFrame","animationFrameFn","trigger","percentage","percentageOf","mark","onMouseDown","PlaybackWaveform","heights","toHeights","progress","onWaveformUpdate","seed","arrayTrimFill","Waveform","relHeights","PlaybackLayout","RecordingPlayback","renderComposerLook","renderTimelineLook","layout","Composer","MediaBody","h","isCompleteBar","mx_Waveform_bar","mx_Waveform_bar_100pct","AuthHeaderModifier","_context$dispatch","useContext","useEffect","DIV_ID","CaptchaForm","isRecaptchaReady","onCaptchaLoaded","_this$recaptchaContai","mxOnRecaptchaLoaded","scriptTag","recaptchaContainer","resetRecaptcha","iframes","iframe","_parentBeforeBody2","parentBeforeBody","_parentBeforeBody","grecaptcha","renderRecaptcha","divId","_global$grecaptcha","publicKey","sitePublicKey","captchaWidgetId","sitekey","onCaptchaResponse","_global","reset","PasswordAuthEntry","password","passwordBoxClass","submitButtonOrSpinner","errorSection","Field","onPasswordFieldChange","RecaptchaAuthEntry","public_key","TermsAuthEntry","_this$props$stagePara","allChecked","policy","policies","checked","toggledPolicies","allPolicies","initToggles","pickedPolicies","policyId","langPolicy","pickBestPolicyLanguage","togglePolicy","newToggles","checkboxes","trySubmit","EmailIdentityAuthEntry","requested","requesting","_this$props$inputs","_this$props$stageStat","emailAddress","EmailPromptIcon","hideServerPicker","Fragment","as","onTooltipOpenChange","_this$props$requestEm","MsisdnAuthEntry","submitUrl","submitMsisdnTokenOtherUrl","success","creds","client_secret","threepid_creds","requestingToken","requestMsisdnToken","_this$props$inputs$ph","_this$props$inputs2","_this$props$inputs$ph2","_this$props$inputs3","requestRegisterMsisdnToken","phoneCountry","submit_url","msisdn","enableSubmit","submitClasses","mx_InteractiveAuthEntryComponents_msisdnSubmit","mx_GeneralButton","onFormSubmit","onTokenChange","RegistrationTokenAuthEntry","registrationToken","registrationTokenBoxClass","onRegistrationTokenFieldChange","SSOAuthEntry","popupWindow","ssoUrl","PHASE_POSTAUTH","getFallbackAuthUrl","PHASE_PREAUTH","onReceiveMessage","_this$props$onCancel","continueButton","onStartAuthClick","onConfirmClick","FallbackAuthEntry","_this$fallbackButton$","fallbackButton","_this$popupWindow","onShowFallbackClick","MasUnlockCrossSigningAuthEntry","_this$props$stagePara2","LOGIN_TYPE","UserProfileSolidIcon","serverName","PopOutIcon","onGoToAccountClick","onRetryClick","calculateUrls","urls","lowBandwidth","_urls","altText","otherProps","imageUrl","onError","useImageUrl","_roomContext$lowBandw","roomContext","useScopedRoomContext","imageUrls","setUrls","urlsIndex","setIndex","useCallback","onClientSync","syncState","prevState","useTypedEventEmitter","Sync","extraProps","Avatar","BUSY_PRESENCE_NAME","UnstableValue","tooltipText","Globe","PresenceOnline","PresenceAway","PresenceOffline","PresenceBusy","DecoratedRoomAvatar","isUnmounted","newIcon","calculateIcon","getPresenceIcon","notificationState","RoomNotificationStateStore","getRoomState","isWatchingTimeline","dmUser","isPublicRoom","getJoinRule","_dmUser","oldUser","UserEvent","CurrentlyActive","onPresenceUpdate","Presence","isOnline","currentlyActive","presence","otherUserId","DMRoomMap","shared","getUserIdForRoomId","isPresenceEnabled","displayBadge","hideIfDot","oobData","viewAvatarOnClick","tooltipProps","badge","_this$props$tooltipPr","_this$props$tooltipPr2","NotificationBadge","notification","PublicIcon","mx_DecoratedRoomAvatar_cutout","Tooltip","placement","_member$name","_member$userId2","resizeMethod","viewUserOnClick","forceHistorical","fallbackUserId","hideTitle","propsMember","card","CardContext","useRoomMemberProfile","_member$getMxcAvatarU","_member$userId","_member$roomId","isCard","avatars_RoomAvatar","_room$getType","useTypedEventEmitterState","Name","avatarEvent","useRoomState","getStateEvents","roomIdName","dmMember","useDmMember","LocalRoom","targets","useRoomIdName","showAvatarsOnInvites","useSettingValue","invite_avatars","MediaPreviewValue","On","onRoomAvatarClick","ImageView","myMembership","sizeInt","oobAvatar","filterBoolean","roomType","RoomType","SearchResultAvatar","isEmail","emailPillAvatar","getDmMember","setDmMember","updateDmMember","useEventEmitter","Members","AccountData","getPresence","_member$user","Online","Offline","Away","getPresenceFromUser","usePresence","setPresence","updatePresence","_event","WithPresenceIndicator","AvatarPresenceIconView","presenceState","useMsRemaining","beacon","beaconInfo","useEventEmitterState","BeaconEvent","msRemaining","setMsRemaining","getBeaconMsUntilExpiry","updateMsRemaining","ms","useInterval","beacon_LiveTimeRemaining","LiveTimeRemaining","timeRemaining","liveTimeRemaining","BeaconExpiryTime","expiryTime","getBeaconExpiryTimestamp","beacon_BeaconStatus","displayStatus","displayLiveTimeRemaining","withIcon","isIdle","BeaconDisplayStatus","Loading","StyledLiveBeaconIcon","withError","Active","hasLocationPublishError","hasStopSharingError","stoppingInProgress","onStopSharing","onResetLocationPublishError","useOwnLiveBeacons","ownDisplayStatus","BeaconStatus","preventDefaultWrapper","LiveLocationIcon","mx_StyledLiveBeaconIcon_error","mx_StyledLiveBeaconIcon_idle","getBeaconDisplayStatus","isLive","latestLocationState","waitingToStart","dialogs_GenericFeatureFeedbackDialog","GenericFeatureFeedbackDialog","subheading","rageshakeLabel","rageshakeData","comment","setComment","canContact","setCanContact","hasCancelButton","StyledCheckbox","buttonDisabled","ok","submitFeedback","InfoDialog","hasCloseButton","dialogs_BetaFeedbackDialog","BetaFeedbackDialog","featureId","_SettingsStore$getBet","getBetaInfo","featureName","feedbackSubheading","feedbackLabel","fromEntries","extraSettings","ViewUserSettings","initialTabId","UserTab","Labs","BetaPill","tooltipTitle","tooltipCaption","caption","beta_BetaCard","BetaCard","titleOverride","useFeatureEnabled","setBusy","faq","requiresRefresh","feedbackButton","refreshWarning","shouldShowFeedback","brand","InlineSpinner","sleep","SettingsFlag","compact","_excluded4","mx_IconizedContextMenu_compact","marker","words","CheckIcon","mx_IconizedContextMenu_item","mx_IconizedContextMenu_active","isDestructive","_excluded3","mx_IconizedContextMenu_itemDestructive","MenuItemRadio","IconizedContextMenuOptionList","red","mx_IconizedContextMenu_optionList_notFirst","mx_IconizedContextMenu_optionList_red","ReplyIcon","jsx_runtime","jsx","reply","react","ReactionAddIcon","jsxs","reaction_add","PollEndEvent","REFERENCE_RELATION","rel_type","event_id","pollEventId","closingMessage","EndPollDialog","endPoll","polls","responses","getResponses","topAnswer","findTopAnswer","endEvent","sendEvent","ReplyInThreadButton","closeMenu","_mxEvent$getRelation","relationType","getRelation","RelationType","IconizedContextMenuOption","ThreadsIcon","isThreadRoot","ShowThread","rootEvent","initialEvent","scroll_into_view","highlighted","MessageContextMenu","canRedact","maySendRedactionForEvent","RoomEncryption","canPin","PinningUtils","canUnpin","reaction","getUnsentReactions","relatedEventId","OpenReportEventDialog","onCloseDialog","createRedactEventDialog","forwardableEvent","_this$props$permalink","OpenForwardDialog","permalinkCreator","isPinned","pinOrUnpinEvent","trackPinUnpinMessage","_this$props$eventTile","eventTileOps","unhideWidget","ShareDialog","copyPlaintext","_this$props$collapseR","collapseReplyChain","getSelectedText","selectedText","quotedText","ComposerInsert","timelineRenderingType","editEvent","getRelationsForEvent","reactionPickerDisplayed","RoomMemberEvent","PowerLevel","checkPermissions","MatrixEventEvent","Status","canEndPoll","isPollEnded","isSelectionWithinSingleTextBody","getSelection","rangeCount","getRangeAt","getParentByClass","HTMLElement","classList","contains","parentNode","startTextBody","startContainer","endTextBody","endContainer","getReactions","_room$getPendingEvent","relation","Annotation","_this$props$permalink2","_mxEvent$getThread","me","rightClick","reactions","other","eventStatus","unsentReactionsCount","contentActionable","isContentActionable","forEvent","isSent","SENT","canReact","canSendMessages","isThreadRootEvent","ThreadsList","resendReactionsButton","redactButton","openInMapSiteButton","RestartIcon","unsentCount","onResendReactionsClick","DeleteIcon","onRedactClick","shareableLocationEvent","getShareableLocationEvent","mapSiteLink","createMapSiteLinkFromEvent","forwardButton","getForwardableEvent","ForwardIcon","onForwardClick","viewSourceButton","InlineCodeIcon","onViewSourceClick","unhidePreviewButton","permalinkButton","endPollButton","externalURLButton","collapseReplyChainButton","jumpToRelatedEventButton","isWidgetHidden","VisibilityOnIcon","onUnhidePreviewClick","ShareIcon","onShareClick","onEndPollClick","external_url","LinkIcon","ChevronUpIcon","onCollapseReplyChainClick","getAssociatedId","reportEventButton","copyLinkButton","TreeIcon","onJumpToRelatedEventClick","onReportEventClick","CopyIcon","onCopyLinkClick","copyButton","quoteButton","editButton","replyButton","replyInThreadButton","reactButton","pinButton","viewInRoomButton","nativeItemsList","quickItemsList","triggerOnMouseDown","onCopyClick","QuoteIcon","onQuoteClick","EditIcon","onEditClick","onReplyClick","hasServerSideSupport","onReactClick","reactButtonRef","UnpinIcon","PinIcon","onPinClick","viewInRoom","commonItemsList","redactItemList","reactionPicker","_this$reactButtonRef$","buttonRect","ReactionPicker","onCloseReactionPicker","IconizedContextMenu","RoomContext","Entry","useId","currentTarget","getScrollState","numItems","prevGroupSizes","heightBefore","GROUP_MARGIN","viewportTop","listTop","listBottom","AddExistingToSpace","footerPrompt","emptySelectionButton","filterPlaceholder","roomsRenderer","dmsRenderer","spacesRenderer","visibleRooms","_cli$getVisibleRooms$","getVisibleRooms","scrollRef","setScrollState","selectedToAdd","setSelectedToAdd","setProgress","setError","setQuery","lcQuery","existingSubspacesSet","spaceStore","getChildSpaces","existingRoomsSet","getChildRooms","spaces","rooms","dms","joinRule","sortRoomsByRecency","reduce","arr","addRooms","via","calculateRoomVia","addRoomToSpace","retry_after_ms","footer","ErrorIcon","ProgressBar","numSpaces","numRooms","numDms","noResults","roomsScrollState","spacesScrollState","dmsScrollState","defaultRendererFactory","LazyRenderList","itemHeight","items","renderItem","defaultRoomsRenderer","_td","defaultSpacesRenderer","defaultDmsRenderer","SubspaceSelector","maySendStateEvent","SpaceChild","Dropdown","onOptionChange","mx_SubspaceSelector_dropdownOptionActive","AddExistingToSpaceDialog","onCreateRoomClick","onAddSubspaceClick","selectedSpace","setSelectedSpace","contentId","BugReportDialog","issueUrl","userText","sendProgressCallback","isLocalOnly","sendBugReport","bug_report_endpoint_url","sendLogs","progressCallback","sendSentryReport","downloadBusy","downloadProgressCallback","downloadBugReport","downloadProgress","issueRef","BugReportEndpointURLLocal","_this$issueRef$curren","DumpDebugLogs","_error$errorcode","RageshakeError","errorcode","policyURL","Link","warning","Modernizr","support","getBrowserSupport","Text","weight","feedback","new_issue_url","onDownload","onIssueUrlChange","onTextChange","DialogButtons","primaryButton","onPrimaryButtonClick","ConfirmRedactDialog","TextInputDialog","proceed","withRelTypes","redactEvent","statusCode","ConfirmUserActionDialog","confirmButtonClass","danger","reasonBox","askReason","onOk","onReasonChange","avatar","displayUserIdentifier","primaryButtonClass","CreateRoomDialog","_this$props$defaultEn","_this$props$defaultSt","Enter","nameField","blur","validate","allowEmpty","aliasField","nameIsValid","isValid","field","focused","roomCreateOptions","evt","isStateEncrypted","detailsOpen","noFederate","validateRoomName","fieldState","valid","isPublicKnockRoom","askToJoinEnabled","advancedSettingsEnabled","AdvancedSettings","allowCreatingPublicRooms","AllowCreatingPublicRooms","supportsRestricted","parentSpace","defaultPublic","defaultEncrypted","privateShouldBeEncrypted","defaultStateEncrypted","defaultName","default_federate","canChangeEncryption","createOpts","Visibility","preset","Preset","PublicChat","guestAccess","room_alias_name","encryptedStateFeature","encryption","stateEncryption","creation_content","Private","_this$nameField$curre","checkUserIsAllowedToChangeEncryption","PrivateChat","allowChange","forcedValue","isVideoRoom","ElementVideo","UnstableCall","publicPrivateLabel","visibilitySection","e2eeSection","e2eeStateSection","domain","RoomAliasField","onAliasChange","SpaceName","_this$props$parentSpa","_this$props$parentSpa2","_this$props$parentSpa3","_this$props$parentSpa4","SettingsToggleInput","onIsPublicKnockRoomChange","microcopy","onEncryptedChange","helpMessage","onStateEncryptedChange","federateLabel","screenName","Form","Root","onNameChange","onValidate","onNameValidate","onTopicChange","JoinRuleDropdown","labelInvite","labelKnock","labelPublic","labelRestricted","onJoinRuleChange","onToggle","onDetailsToggled","onNoFederateChange","withValidation","rules","invalid","devtools_ServersInRoom","ServersInRoom","servers","_servers$server","BaseTool","numUsers","devtools_SettingExplorer","SettingExplorer","setting","setSetting","editing","setEditing","EditSetting","ViewSetting","onView","SettingsList","CanEditLevelField","canSetValue","renderExplicitSettingValues","vals","LEVEL_ORDER","explicitValue","setExplicitValue","explicitRoomValue","setExplicitRoomValue","actionLabel","onAction","parsedExplicit","parsedExplicitRoom","SETTINGS","lvl","renderSettingValue","allSettings","devtools_WidgetExplorer","WidgetExplorer","setWidget","WidgetStore","FilteredList","UserButton","UserView","_member$events$member","_member$membership","verificationStatus","useAsyncMemo","getUserVerificationStatus","isCrossSigningVerified","e2eIcon","E2EIcon","isUser","hideTooltip","E2EStatus","Verified","wasCrossSigningVerified","Warning","needsUserApproval","Normal","_devices$get","getUserDeviceInfo","userIdentity","identity","getUserCrossSigningKeys","DeviceView","memberEventContent","DeviceButton","verificationIcon","getDeviceVerificationStatus","crossSigningVerified","signedByOwner","keyIdSuffix","deviceKeys","endsWith","dehydrated","AccountDataEventEditor","fields","eventTypeField","defaultContent","EventEditor","fieldDefs","onSend","RoomAccountDataEventEditor","setRoomAccountData","BaseAccountDataExplorer","Editor","setTool","setEvent","EventViewer","UserReadUpTo","_target$getReadReceip","_target$getReadReceip2","_target$getReadReceip3","_target$getReadReceip4","_target$getReadReceip5","_target$getReadReceip6","_target$getReadReceip7","_target$getReadReceip8","hasPrivate","getReadReceiptForUserId","ReceiptType","ReadPrivate","KeyStorage","useMatrixClientContext","keyStorageData","backupInfo","getKeyBackupInfo","backupKeyStored","isKeyBackupKeyStored","backupKeyFromCache","getSessionBackupPrivateKey","backupKeyCached","backupKeyWellFormed","activeBackupVersion","getActiveSessionBackupVersion","secretStorageKeyInAccount","secretStorageReady","isSecretStorageReady","scope","version","algorithm","CrossSigning","crossSigningData","crossSigningStatus","getCrossSigningStatus","crossSigningPublicKeysOnDevice","publicKeysOnDevice","crossSigningPrivateKeysInStorage","privateKeysInSecretStorage","masterPrivateKeyCached","privateKeysCachedLocally","masterKey","selfSigningPrivateKeyCached","selfSigningKey","userSigningPrivateKeyCached","userSigningKey","crossSigningReady","isCrossSigningReady","Session","sessionData","fingerprint","getOwnDeviceKeys","ed25519","elements_SettingsField","SettingsField","settingKey","isExplicit","_onSave","settingsValue","onSave","EditInPlace","getDisplayName","saveButtonLabel","cancelButtonLabel","savedLabel","savingLabel","StickyEventTableLine","stickyKey","expiresAt","timeRemainingFormatted","setTimeRemainingFormatted","updateCountdown","remaining","totalSeconds","interval","Key","ENTER","SPACE","StickyEventListPerType","showEmptyState","setShowEmptyState","StickyEventEditor","Pill","contentKeys","_ev$getContent$msc","msc4354_sticky_key","_a$unstableStickyExpi","_b$unstableStickyExpi","unstableStickyExpiresAt","stickyDurationField","randomUUID","stickyDuration","UserFriendlyError","_unstable_sendStickyEvent","Category","categoryLabels","Other","Tools","RoomStateExplorer","RoomAccountDataExplorer","accountData","isRoomEncrypted","useIsEncrypted","useNotificationState","humanReadableNotificationLevel","total","dot","roomHasUnread","threadHasUnread","_thread$lastReply","_thread$lastReply2","_thread$lastReply3","lastReply","UserList","showOnlyJoined","setShowOnlyJoined","setMember","StickyStateExplorer","setEventType","stickyEventsSupported","doesServerSupportUnstableFeature","RoomStickyEventsEvent","_unstable_getStickyEvents","Alert","_onBack","effectiveEvent","getEffectiveEvent","MatrixEvent","renderSingleEvent","uniqueEventTypes","AccountDataExplorer","store","ServerInfo","ManualDeviceKeyVerificationDialog","RestoreKeyBackupDialog","dialogs_DevtoolsDialog","DevtoolsDialog","tool","Tool","category","tools","ACCOUNT","authError","newStage","uiaStage","uiaStagePhase","getDefaultDialogAesthetics","ssoAesthetics","UNSTABLE_LOGIN_TYPE","_this$props$title","dialogAesthetics","aestheticsForStagePhases","aesthetics","LinkedText","onDismissClick","onUpdateStagePhase","DMRoomTile","_this$props$onToggle","avatarSize","EmailPillAvatarIcon","userIdentifier","RichItem","lastActiveTs","selected","isSelected","PageHeader","PageHeader_module_default","BigIcon","Heading","DmButtons","onContinue","InviteButtons","onRemove","onInvite","invite_UnknownIdentityUsersWarningDialog","userListItem","headerText","buttons","UserAddSolidIcon","TabId","DMUserTile","toMember","DirectoryMember","user_id","convertFilter","startDmOnFirstMessage","targetIds","MultiInviter","inhibitProgressDialog","shouldAbortAfterInviteError","currentTabId","UserDirectory","dialPadValue","searchUserDirectory","term","filterText","profile","profilesStore","getOrFetchProfile","shouldThrow","serverResultsMixin","canUseIdentityServer","canInviteThirdParty","IdentityServer","threepidResultsMixin","ThreepidMember","authClient","lookupThreePid","mxid","tryingIdentityServer","debounceTimer","updateSuggestions","numRecentsShown","numSuggestionsShown","idx","editorRef","clipboardData","getData","potentialAddresses","parseFilter","possibleMembers","recents","suggestions","toAdd","failed","unableToAddMore","canInviteMore","csvNames","uniqBy","fire","transferCall","_this$numberEntryFiel","numberEntryFieldRef","_this$numberEntryFiel2","tabId","newTargets","_this$state$unknownId","unknownIdentityUsers","userProfilesStore","excludedIds","isRoomInvite","_room$currentState$ge","isFederated","RoomCreate","ourHomeserver","excludeExternals","buildRecents","buildSuggestions","encryptionByDefault","homeserver","excludedTargetIds","buildMemberScores","getUniqueRoomsWithIndividuals","dmTaggedRooms","RoomListStoreV3","getDmRooms","dmRoom","otherMembers","roomMember","searchTypes","maxSearchEvents","lastEventTs","lastActive","activityScores","buildActivityScores","memberScores","memberComparator","compareMembers","newMember","startDmOrSendInvites","startDm","inviteUsers","renderSection","sourceMembers","showNum","showMoreFn","showMoreRecents","showMoreSuggestions","sectionName","priorityAdditionalMembers","otherAdditionalMembers","hasMixins","notAlreadyExists","hasAdditionalMembers","filterBy","RichList","titleAttributes","isEmpty","toRender","showMore","toggleMember","renderEditor","removeMember","PillInput","inputProps","updateFilter","onPaste","onRemoveChildren","renderIdentityServerWarning","defaultIdentityServerUrl","getDefaultIdentityServerUrl","defaultIdentityServerName","onUseDefaultIdentityServerClick","onManageSettingsClick","onLinkClick","selectText","hasFilterAtLeastOneEmail","hasSelection","renderSuggestions","onlyOneThreepidNote","extraSection","onGoButtonPressed","known","renderMainTab","helpText","buttonText","identityServersEnabled","helpTextUntranslated","makeRoomPermalink","logErrorAndShowErrorDialog","InviteProgressBody","renderRegularDialog","UnknownIdentityUsersWarningDialog","onRemoveUnknownIdentityUsersClicked","spaceName","renderCallTransferDialog","usersSection","tabs","backspaceButton","DialPadBackspaceButton","onBackspacePress","onDeletePress","dialPadField","onDialChange","postfixComponent","dialPadSection","onDialFormSubmit","Dialpad","hasDial","onDigitPress","DialPad","DialPadIcon","consultConnectSection","onConsultFirstChange","dialogContent","TabbedView","activeTabId","tabLocation","TabLocation","TOP","onTabChange","setDeviceId","setFingerprint","onDialogFinished","confirm","manuallyVerifyDevice","onDeviceIdChange","onFingerprintChange","cause","getDeviceCryptoInfo","deviceTrust","isVerified","getFingerprint","fprint","crossSignDevice","doManuallyVerifyDevice","translatedMessage","RoomUpgradeWarningDialog","_joinRules$getContent","_this$props$doUpgrade","isInviteOrKnockRoom","inviteUsersToNewRoom","doUpgrade","onProgressCallback","joinRules","currentVersion","getVersion","inviteToggle","onInviteUsersToggle","bugReports","openBugReportDialog","oldVersion","newVersion","targetVersion","SOCIALS","FacebookIcon","TwitterIcon","LinkedInIcon","RedditIcon","EmailIcon","customTitle","showQrCode","ShareQRCode","showSocials","ShareSocial","timeoutIdRef","isCopied","setIsCopied","linkToSpecificEvent","setLinkToSpecificEvent","checkboxLabel","newPermalinkCreator","RoomPermalinkCreator","load","forShareableRoom","useTargetValues","newTitle","QRCode","Checkbox","defaultChecked","SocialLinks","social","validator","_this$field$current","htmlFor","busyMessage","UploadConfirmDialog","file","objectUrl","totalFiles","fileId","mimeType","preview","uploadAllButton","playsInline","controls","FilesIcon","onUploadAllClick","onCancelClick","onUploadClick","defaultValue","validateEventContent","deriveData","fieldData","setFieldData","_def$default","setContent","contentField","_contentField$current","_contentField$current2","json","_originalContent$mNe","_originalContent$mNe2","originalContent","bodyToStartFrom","newContent","baseEvent","_mxEvent$getWireConte","_mxEvent$getWireConte2","_baseEvent$replacingE","getWireContent","extraButton","_children$0$key","_children$","truncateAt","setTruncateAt","filteredChildren","setFilteredChildren","_child$key","TruncatedList","getChildren","getChildCount","createOverflowElement","overflowCount","totalCount","num","stateKeyField","stateKey","sendStateEvent","RoomStateHistory","_events$0$unsigned","replaces_state","fetchRoomEvent","StateEventButton","trimmed","mx_DevTools_RoomStateExplorer_button_hasSpaces","mx_DevTools_RoomStateExplorer_button_emptyString","RoomStateExplorerEventType","setHistory","onEmptyStateToggled","onHistoryClick","RestoreType","ProgressState","forceRecoveryKey","recoveryKeyValid","isValidRecoveryKey","loading","restoreError","restoreType","Passphrase","recoverInfo","restoreKeyBackupWithPassphrase","passPhrase","showSummary","_this$state$backupInf","RecoveryKey","storeSessionBackupPrivateKey","restoreKeyBackup","loadError","PreFetch","loadBackupStatus","restoreWithSecretStorage","SecretStorage","loadSessionBackupPrivateKeyFromSecretStorage","restoreWithCachedKey","_await$cli$getCrypto$","backupHasPassphrase","auth_data","private_key_salt","private_key_iterations","details","Fetch","LoadKeys","successes","failures","completed","MatrixClient","RESTORE_BACKUP_ERROR_BAD_KEY","failedToDecrypt","imported","failedCount","sessionCount","onDone","onPassPhraseChange","onPassPhraseNext","primaryIsSubmit","button1","onUseRecoveryKeyClick","button2","onResetRecoveryClick","keyStatus","primaryDisabled","Filter","CopyTextButton","tooltip","setTooltip","successful","combinedClassName","mx_CopyableText_border","BackspaceSolidIcon","backspace_solid","MenuOption","onMouseEnter","dropdownKey","optClasses","classnames","mx_Dropdown_option","mx_Dropdown_option_highlight","ignoreEvent","highlightedOption","_this$dropdownRootEle","nextKey","nextOption","dropdownRootElement","_this$dropdownRootEle2","prevKey","prevOption","searchQuery","onSearchChange","onRootClick","optionKey","reindexChildren","onDocumentClick","prevProps","_this$props$children","objectHasDiff","childrenByKey","buttonRef","scrollIntoView","behavior","getMenuOptions","setHighlightedOption","onMenuOptionClick","currentValue","menu","searchEnabled","onInputChange","selectedChild","getShortOption","dropdownClasses","mx_Dropdown_disabled","collectRoot","onAccessibleButtonClick","ChevronDownIcon","overflow","tooltipLabel","tooltipShortcut","faces","pileContents","OverflowHorizontalIcon","toggled","useToggled","MemberList","mx_FacePile","mx_FacePile_toggled","AvatarStack","ZoomOutIcon","zoom_out","ZoomInIcon","clipPath","zoom_in","RotateLeftIcon","rotate_left","RotateRightIcon","rotate_right","normalizeWheelEvent","deltaMode","deltaX","deltaY","deltaZ","WheelEvent","MAX_SCALE","thumbnailInfo","zoom","naturalWidth","imageIsLoaded","animatingLoading","setZoomAndRotation","translationX","translationY","inputRotation","imageWrapper","rotation","imageIsNotFlipped","naturalHeight","zoomX","clientWidth","zoomY","minZoom","maxZoom","zoomDelta","offsetX","offsetY","Save","downloadFunction","contextMenuDisplayed","download","_this$props$mxEvent","_this$props$mxEvent2","moving","previousX","previousY","initX","pageX","initY","pageY","nativeEvent","positionX","positionY","getPanelHeight","getComputedStyle","documentElement","getPropertyValue","_this$image$current","onWheel","recalculateZoom","imageLoaded","_this$image$current2","anchorX","anchorY","zoomLevel","oldZoom","newZoom","renderContextMenu","contextMenu","contextMenuButton","onCloseContextMenu","_this$props$mxEvent3","showEventMeta","transitionClassName","rotationDegrees","cursor","_mxEvent$sender$name","_mxEvent$sender","messageTimestamp","MessageTimestampWrapper","onPermalinkClicked","showFullDate","ts","inhibitTooltip","_this$props$mxEvent4","ContextMenuTooltipButton","onOpenContextMenu","presentableTextForFile","lockProps","onZoomOutClick","onZoomInClick","onRotateCounterClockwiseClick","onRotateClockwiseClick","DownloadButton","fileName","onDownloadReady","onDownloadFunctionReady","onMouseMove","onMoving","onMouseUp","onEndMoving","onMouseLeave","draggable","onStartMoving","canDownload","downloader","FileDownloader","blobRef","setLoading","setCanDownload","mediaEventHelper","MediaEventHelper","hints","ModuleApi","customComponents","getHintsForMessage","allowDownloadingMedia","downloadBlob","_mediaEventHelper$fil","blob","showError","sourceBlob","parseErrorResponse","useDownloadMedia","DownloadIcon","useCreateAutoDisposedViewModel","MessageTimestampViewModel","setProps","MessageTimestampView","InfoTooltipKind","InfoTooltip","_this$props$tabIndex","InfoIcon","BaseInlineSpinner","AskToJoinIcon","GroupIcon","ItemRange","topCount","renderCount","bottomCount","expand","topGrow","bottomGrow","totalSize","getDerivedStateFromProps","getVisibleRangeFromProps","intersectRange","overflowMargin","renderRange","overflowItems","itemsAfterTop","visibleItems","paddingTop","renderedItems","elementProps","UserSolidIcon","user_solid","findRoom","_client$getRooms$find","getRooms","usePermalinkTargetRoom","parseResult","permalinkRoom","shouldLookUpRoom","PillType","RoomMention","EventInSameRoom","EventInOtherRoom","initialRoom","determineInitialRoom","AtRoomMention","UserMention","targetRoom","setTargetRoom","newRoom","createMemberFromProfile","_profile$displayname","getDirectionalContent","usePermalinkMember","shouldLookUpUser","determineUserId","_event$getSender","userInRoom","determineMember","targetRoomMember","knownProfile","getOnlyKnownProfile","fetchedProfile","fetchOnlyKnownProfile","doProfileLookup","usePermalink","forcedType","resourceId","_parseResult","primaryEntityId","determineType","usePermalinkEvent","shouldLookUpEvent","eventInRoom","determineInitialEvent","findEventById","eventData","linkIcon","PillRoomAvatar","shouldShowPillAvatar","PillMemberAvatar","propType","inMessage","customPillText","linkText","mx_AtRoomPill","mx_RoomPill","mx_SpacePill","mx_UserPill","mx_UserPill_me","mx_EventPill","mx_KeywordPill","Keyword","pillText","isAnchor","isTriggerInteractive","FocusTarget","creatingInitialState","canSubmit","autoFocusTarget","Topic","PollCreateDialog","ScrollableBaseModal","checkCanSubmit","NewOption","_this$addOptionRef$cu","_this$addOptionRef$cu2","addOptionRef","editingMxEvent","ans","editingInitialState","createEvent","pollStart","submit","pollEvent","doMaybeLocalRoomAction","actualRoomId","_this$props$threadId","tryAgain","cancel","renderContent","onPollTypeChange","onQuestionChange","usePlaceholderAsHint","onOptionRemove","onOptionAdd","CUSTOM_VALUE","PowerSelector","custom","powerLevel","selectValue","powerLevelKey","initStateFromProps","customValue","maxValue","arrayHasDiff","isCustom","picker","onCustomBlur","onCustomKeyDown","onCustomChange","optionsElements","onSelectChange","useSmoothAnimation","targetValue","setCurrentValue","currentStepSize","setCurrentStepSize","totalDelta","EPSILON","timeDelta","valueDelta","maxValueDelta","clampedValueDelta","sign","handle","cancelAnimationFrame","useAnimation","elements_ProgressBar","animated","defaultOptions","errorCorrectionLevel","dataUri","setUri","cancelled","toDataURL","_this$props$onChange","asFullAlias","validationRules","fullAlias","hasColon","final","getRoomIdForAlias","localpart","hashAlias","domainProps","postfix","maxlength","prefixComponent","fieldRef","_this$fieldRef$curren","_this$fieldRef$curren2","secureRandomString","getSettingValue","newValue","_this$props$roomId","_this$props$roomId2","defaultWatchManager","watchSetting","onSettingChange","requires","flag","_this$props$roomId3","unwatchSetting","_this$props$roomId4","_this$props$roomId5","doesSettingSupportLevel","settingIsOveriddenAtConfigLevel","_this$props$roomId6","_this$props$label","hideIfCannotSet","getDescription","shouldHaveWarning","disabledMessage","visible","toggleVisible","initialId","formWrap","descriptionId","InlineField","control","CheckboxInput","Label","HelpMessage","StyledRadioButton","outlined","childrenInLabel","_className","mx_StyledRadioButton_disabled","mx_StyledRadioButton_enabled","mx_StyledRadioButton_checked","mx_StyledRadioButton_outlined","radioButton","definitions","_onChange","_d$disabled","TextWithTooltip","_tooltipProps$tabInde","toArray","overflowNode","totalChildren","upperBound","childNodes","hideDescriptionIfValid","memoize","checkRules","derivedData","_rule$skip","skip","ruleValid","memoizeOne","isDataEqual","isDerivedDataEqual","_deriveData","summary","mx_Validation_detail","mx_Validation_valid","mx_Validation_invalid","a1","a2","b1","b2","Header","changeCategoryRelative","Home","changeCategoryAbsolute","End","categories","findNearestEnabled","cats","_category$ref$current","onAnchorClick","mx_EmojiPicker_anchor_visible","firstVisible","emojipicker_Header","Search","_this$context$state$a","rightButton","SearchIcon","activeNode","RovingTabIndexContext","emojipicker_Search","Preview","unicode","shortcode","emojipicker_Preview","Emoji","selectedEmojis","focusOnMouseOver","emojipicker_Emoji","QUICK_REACTIONS","QuickReactions","hover","Toolbar","hexcode","emojipicker_QuickReactions","hexEncode","hex","rowIndex","emojis","emojisForRow","_this$props$isEmojiDi","isEmojiDisabled","viewportHeight","EMOJIS_PER_ROW","counter","CATEGORY_HEADER_HEIGHT","EMOJI_HEIGHT","localHeight","localScrollTop","renderEmojiRow","emojipicker_Category","EmojiPicker","scrollElement","updateVisibility","rovingNode","_this$getGridcell$par","_this$getGridcell","getGridcell","_rovingNode$parentEle","gridcellNode","ARROW_DOWN","ARROW_RIGHT","ARROW_LEFT","ARROW_UP","showHighlight","RovingStateActionType","SetFocus","focusNode","getRow","inline","rect","firstVisibleFound","cat","_cat$ref$current","elemRect","yEnd","_this$scrollElement","lcFilter","memoizedDataByCategory","recentlyUsed","DATA_BY_CATEGORY","emojiMatchesFilter","indexA","indexB","_emoji$emoticon","emoticon","_this$scrollElement2","btn","previewEmoji","onChoose","recent","hasRecentlyUsed","categoryConfig","config","isVisible","categoryHeightForEmojiCount","RovingGridIndexProvider","getGridCell","getRovingNode","handleInputFields","moveFocus","shouldMoveFocus","onGridNavigation","scrollToCategory","onChangeFilter","onEnterFilter","mx_EmojiPicker_body_showHighlight","categoryElement","onClickEmoji","onHoverEmoji","onHoverEmojiEnd","emojipicker_EmojiPicker","myReactions","canSelfRedact","FocusAComposer","Reaction","addListeners","onReactionsChange","RelationsEvent","Redaction","_this$props$reactions","_this$props$reactions2","myAnnotations","getAnnotationsBySender","_event$getRelation","MapError","isMinimised","mx_MapError_isMinimised","getLocationShareErrorMessage","SvgMap","maskUnits","maskType","mask","location_MapFallback","isLoading","MapFallbackImage","LocationMarkerIcon","MapComponent","Suspense","fallback","SmartMarkerComponent","SmartMarker","LocationButtonComponent","LocationButton","LocationViewDialogComponent","LocationViewDialog","VoiceCallMissedSolidIcon","voice_call_missed_solid","VideoCallMissedSolidIcon","video_call_missed_solid","VideoCallDeclinedSolidIcon","video_call_declined_solid","MAX_NON_NARROW_WIDTH","LegacyCallEvent","wrapperElementEntry","entry","wrapperElement","narrow","contentRect","callState","callEventGrouper","onStateChanged","onSilencedChanged","resizeObserver","ResizeObserver","resizeObserverCallback","observe","_this$resizeObserver","renderCallBackButton","callBack","renderSilenceIcon","toggleSilenced","silenceIcon","rejectCall","InviteTimeout","IceFailed","callType","mx_LegacyCallEvent_voice","mx_LegacyCallEvent_video","mx_LegacyCallEvent_narrow","iconState","AudioPlayerViewModel","computeSnapshot","mediaName","setSnapshot","preparePlayback","newProps","percentComplete","playbackState","playedSeconds","MAudioBody","_content$orgMatrixM","onMount","_this$state$playback","showFileBody","Pinned","MediaProcessingError","forExport","_content$file","contentUrl","AudioPlayer","renderMBody","showFileInfo","FileBodyFactory","AudioPlayerView","DecryptionFailureBodyViewModel","getDecryptionReasonFromCode","decryptionFailureCode","DecryptionFailureCode","HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED","DecryptionFailureReason","HISTORICAL_MESSAGE_NO_KEY_BACKUP","HISTORICAL_MESSAGE_USER_NOT_JOINED","MEGOLM_KEY_WITHHELD_FOR_UNVERIFIED_DEVICE","SENDER_IDENTITY_PREVIOUSLY_VERIFIED","UNSIGNED_SENDER_DEVICE","UNABLE_TO_DECRYPT","verificationState","setVerificationState","isLocalDeviceVerified","setDecryptionFailureCode","decryptionFailureReason","_DecryptionFailureBodyViewModel","downloadIconCache","computedStyle","cssText","btoa","cacheDownloadIcon","FileBodyViewModel","decryptedBlob","userDidClick","_this$props$showFileI","media","decryptFile","downloadFile","fileDownloader","_this$content$info$mi","_this$content$info","fileType","blobUrl","tempAnchor","refIFrame","refLink","getInfoIcon","Audio","FileBodyViewInfoIcon","AUDIO","VIDEO","ATTACHMENT","_props$mediaEventHelp","_props$showFileInfo","_content$file2","mediaFromContent","showDownload","fileInfoLabel","fileInfoTooltip","fileInfoIcon","downloadLabel","downloadLabelForFile","downloadTitle","FileBodyViewState","EXPORT","showInfo","infoLabel","infoTooltip","infoIcon","infoHref","ENCRYPTED","DECRYPTION_PENDING","srcHttp","UNENCRYPTED","downloadHref","INVALID","_this$props$mediaEven","autoDownload","imgSrc","imgStyle","oldEvent","ImageBodyViewModel","initialState","createInitialState","createReconnectedListener","reconnectedListener","imgError","updateSnapshotFromState","openImageViewer","_this$props$setMediaV","setMediaVisible","thumbUrl","clearBlurhashTimeout","loadedImageDimensions","imageRef","imgLoaded","ImageBodyViewPlaceholder","NONE","imageSizeWatcherRef","_s","_r","_l","_nvl","setImageSize","track","_mxEvent$getContent$i","isAnimated","BLURHASH_FIELD","SPINNER","imageSize","generatedThumbnailUrl","getImageDimensions","_info$w","_state$loadedImageDim","_info$h","_state$loadedImageDim2","maxHeight","aspectRatio","isSvg","suggestedImageSize","maxImageHeight","computeErrorLabel","DecryptError","DownloadError","shouldShowBanner","File","_state$thumbUrl","_content$info","dimensions","autoplayGifs","getContentUrl","thumbnailSrc","ImageBodyViewState","ERROR","errorLabel","mediaVisible","READY","showAnimatedContentOnHover","blurhash","gifLabel","bannerLabel","linkUrl","linkTarget","HIDDEN","hiddenButtonLabel","_props$mxEvent$getCon","_props$mxEvent$getCon2","loadInitialMediaIfVisible","scheduleBlurhashPlaceholder","downloadImage","resetState","revokeGeneratedThumbnailUrl","blurhashTimeout","_this$props$mxEvent$g","BLURHASH","getThumbUrl","thumbWidth","thumbHeight","hasThumbnail","getThumbnailHttp","devicePixelRatio","isLargerThanThumbnail","_content$info2","sourceUrl","thumbnailUrl","_content$info3","mayBeAnimated","_content$info4","thumbnail_info","loadPromise","onload","crossOrigin","_content$info5","blobIsAnimated","_content$info$mimetyp","_content$info6","thumbnail","createThumbnail","_this$props$mediaEven2","_this$props$mediaEven3","_this$props$mediaEven4","_this$props$setMediaV2","metaKey","httpUrl","isMimeTypeAllowed","cachedValue","clientRect","previousVisible","setForExport","setMaxImageHeight","wasVisible","setPermalinkCreator","setTimelineRenderingType","setSetMediaVisible","_MatrixClientPeg$get3","RedactedBodyViewModel","showTwelveHourWatcherRef","_settingName","_roomId","_newValAtLevel","newVal","updateTooltip","computeText","computeTooltip","_RedactedBodyViewModel","_mxEvent$getUnsigned$","_sender$name","_mxEvent$getUnsigned$2","redactionTs","origin_server_ts","VideoBodyViewModel","_this$props$onPreview","onPreviewClick","hasContentUrl","fetchingData","currentEvent","currentHelper","_this$props$videoRef$","decryptedUrl","videoRef","downloadVideo","decryptedThumbnailUrl","posterLoading","blurhashUrl","getAspectRatio","getDimensions","suggestedVideoSize","_media$srcHttp","_content$file$url","_state$decryptedUrl","getThumbnailUrl","thumbnailHttp","autoplay","inhibitInteraction","VideoBodyViewState","LOADING","poster","preload","videoLabel","videoTitle","muted","autoPlay","resetMediaState","loadBlurhash","canvas","pixels","getContext","imgData","createImageData","putImageData","setInhibitInteraction","setOnPreviewClick","FileBodyView","VideoBodyFactory","useMediaVisible","VideoBodyView","containerClassName","ImageBodyFactory","shouldFallbackToFileBody","ImageBodyView","imageClassName","RedactedBodyFactory","RedactedBodyView","DecryptionFailureBodyFactory","LocalDeviceVerificationStateContext","DecryptionFailureBodyView","MESSAGE_BODY_TYPES","fallbackFactory","_MESSAGE_BODY_TYPES$g","BodyType","BlurhashCanvas","PureComponent","handleRef","draw","punch","imageData","_a","__objRest","__spreadProps","__spreadValues","defaultProps","canvasStyle","Blurhash","resolutionX","resolutionY","TransitionGroupContext","forceReflow","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","Transition","_React$Component","_this","initialStatus","appear","isMounting","enter","appearStatus","unmountOnExit","mountOnEnter","nextCallback","inheritsLoose","_proto","updateStatus","nextStatus","cancelNextCallback","getTimeouts","exit","mounting","nodeRef","react_dom","findDOMNode","performEnter","performExit","_this2","appearing","maybeNode","maybeAppearing","timeouts","enterTimeout","safeSetState","onEntered","onEntering","onTransitionEnd","_this3","onExiting","onExited","nextState","setNextCallback","_this4","doesNotHaveTimeoutOrListener","addEndListener","maybeNextCallback","childProps","objectWithoutPropertiesLoose","cloneElement","Children","only","Component","noop","contextType","propTypes","esm_Transition","_leaveRenders","_enterRenders","modes","callHook","cb","_element$props","leaveRenders","changeState","enterRenders","SwitchTransition","_len","appeared","newChildren","isValidElement","_this$state","esm_SwitchTransition","replaceClassName","origClass","classToRemove","removeClass","baseVal","CSSTransition","appliedClasses","_this$resolveArgument","resolveArguments","removeClasses","addClass","_this$resolveArgument2","_this$resolveArgument3","getClassNames","isStringClassNames","baseClassName","activeClassName","doneClassName","_addClass","_this$appliedClasses$","done","esm_extends","esm_CSSTransition","ImageErrorIcon","image_error","Placeholder","ImageBodyBaseInner","NoImage","shouldAutoplay","srcMxc","_content$info$orgMat","thumb","sizeWatcher","forceUpdate","getBanner","messageContent","forcedHeight","_content$info7","infoWidth","infoHeight","infoSvg","imageElement","onImageError","onLoad","onImageLoad","HiddenMediaPlaceholder","wrapImage","_this$props$mxEvent$g2","getPlaceholder","showPlaceholder","hoverOrFocus","onImageEnter","onImageLeave","banner","sizing","getTooltipProps","_this$props$mxEvent$g3","getFileBody","_this$props$mediaEven5","_content$info$mimetyp2","_content$info8","_content$info9","_this$props$mxEvent$g4","_this$props$mxEvent$g5","_this$state$thumbUrl","fileBody","MImageReplyBodyInner","messages_MImageReplyBody","setVisible","PollResponseEvent","answerIds","internalAnswerIds","spoiled","internalSpoiled","validateAgainst","_response$answers","M_POLL_RESPONSE","pa","voteRelations","votes","countVotes","collectUserVotes","allVotes","highestScore","bestAnswerIds","answerId","score","bestAnswerTexts","_poll$answers$find$te","_poll$answers$find","formatList","isFetchingResponses","isEnded","pollAlreadyHasVotes","relationsList","pollResponseRelations","pollResposnseAltRelations","RelatedRelations","createVoteRelations","getRelations","launchPollEditor","MPollBody","onRelationsChange","unselectIfNewEventFromMe","pollInitialised","setPollInstance","PollEvent","New","removeListeners","pollId","_this$state$poll","_this$state$poll2","_this$state$poll3","Responses","onResponsesChange","UndecryptableRelations","selectOption","_this$state$poll4","_userVotes$get","userVotes","_this$state$voteRelat","newEvents","seenEventIds","newSelected","newEventIds","totalVotes","collectedVotes","sum","_userVotes$get2","winCount","myVote","disclosed","showResults","totalText","undecryptableRelationsCount","editedSpan","PollIcon","PollsEndIcon","PollsIcon","pollLabel","answerVotes","_votes$get","PollOption","optionNumber","isChecked","voteCount","totalVoteCount","displayVoteCount","onOptionSelected","UserVote","userResponseFromPollResponseEvent","userResponses","otherResponse","collected","tempResponse","PlaybackQueue","roomViewStore","loadClocks","addRoomListener","isActive","currentPlaybackId","recentFullPlays","playbackIdOrder","forRoom","queues","queue","persistClocks","clockStates","unsortedEnqueue","playbacks","onPlaybackStateChange","onPlaybackClock","wasLastPlaying","currentClockState","orderClone","last","nextEv","scanForVoiceMessage","isVoiceMessage","havePlayback","isRecentlyCompleted","order","lastInstance","clocks","MVoiceMessageBody","types","standard_types","standard","_Mime_extensionToType","_Mime_typeToExtension","_Mime_typeToExtensions","__classPrivateFieldGet","receiver","WeakMap","define","typeMap","ext","allExtensions","starred","currentType","hasPath","getExtension","getAllExtensions","_freeze","_getTestState","MVoiceOrAudioBody","MStickerBodyInner","messages_MStickerBody","MLocationBody","idSuffix","mapId","clearError","LocationBodyFallbackContent","LocationBodyContent","_event$getContent2","errorType","locationFallback","isSelfLocation","LocationShareError","MapStyleUrlNotConfigured","boundaryEl","_document$querySelect","markerRoomMember","geoUri","locationEventGeoUri","mapElement","centerGeoUri","boundary","BeaconViewDialogComponent","BeaconViewDialog","messages_MBeaconBody","MBeaconBody","beaconInfoEvent","useBeacon","LivenessChange","LocationUpdate","isBeaconWaitingToStart","useBeaconState","setId","useUniqueId","isMapDisplayError","MapStyleUrlNotReachable","isOwnBeacon","beaconInfoOwner","useHandleBeaconRedaction","onBeforeBeaconInfoRedaction","redactionEvent","_relations$getRelatio","relations","Reference","locationEvent","BeforeRedaction","initialFocusedBeacon","useMemberColor","mx_MBeaconBody_mapErrorInteractive","MapFallback","OwnBeaconStatus","MjolnirBodyViewModel","_this$props$onMessage","localStorageKey","onMessageAllowed","setOnMessageAllowed","EditHistoryActionBarViewModel","buildSnapshot","_this$props$onRemoveC","onRemoveClick","_this$props$onViewSou","canRemove","ActionBarAction","showViewSource","presentation","isDownloadEncrypted","isDownloadLoading","isQuoteExpanded","isThreadReplyAllowed","esm","LinkWithTooltip","ambiguousLinkTooltipRenderer","isHtml","domToReact","xmlCodeMap","getCodePoint","codePointAt","encodeXML","cp","substr","getEscaper","escapeAttribute","escapeText","elementNames","attributeNames","unencodedElements","replaceQuotes","singleTag","renderNode","dom_serializer_dist","dist","bL","fl","WL","Mw","renderComment","KB","renderCdata","eF","OF","vw","xmlMode","foreignModeIntegrationPoints","foreignElements","encodeEntities","decodeEntities","normalizedValue","emptyAttrs","formatAttributes","selfClosingTags","renderTag","EY","renderText","getInnerHTML","dist_node","Go","getOuterHTML","Cn","KH","AT_ROOM_REGEX","getPushRuleGlobRegex","isPreCode","domNode","mentionPillRenderer","hasParentMatching","shouldBePillified","TEXT_NODE","atRoomRule","IsRoomMention","AtRoomNotification","ruleMatchesEvent","reactStringReplace","_match","keywordPillRenderer","keywordRegexpPattern","spoilerRenderer","ExpandCollapseButton","CollapseIcon","ExpandIcon","messages_CodeBlock","CodeBlock","preNode","enableSyntaxHighlightLanguageDetection","showCodeLineNumbers","expandCodeByDefault","setExpanded","expandCollapseButton","lineNumbers","mx_EventTile_collapsedCodeBlock","getElementsByTagName","advertisedLang","maybeLang","getLanguage","_code$textContent","_code$textContent2","highlightAuto","highlightCode","mx_EventTile_buttonBottom","codeBlockRenderer","pre","createReplacer","_PlatformPeg$get","_pushDetails$rule","pushDetails","getPushDetails","ContentSpecific","getPushDetailsKeywordPatternRegexp","combineRenderers","renderers","parameters","replacer","_replacer$Node$TEXT_N","parametersWithReplace","_replacer$tagName","renderMentionPills","renderKeywordPills","renderTooltipsForAmbiguousLinks","PlatformPeg","needsUrlTooltips","renderSpoilers","renderCodeBlocks","EventContentBodyViewModel","_props$renderMentionP","_props$renderKeywordP","_props$renderSpoilers","_props$renderCodeBloc","_props$renderTooltips","_props$enableBigEmoji","_props$shouldShowPill","propsWithSettingDefaults","enableBigEmoji","setEventContent","_this$watchedEvent","watchedEvent","onEventContentChanged","watchEvent","computeBodySnapshot","stripReply","computeDir","unwatchEvent","enableBigEmojiWatcherRef","setEnableBigEmoji","shouldShowPillAvatarWatcherRef","setShouldShowPillAvatar","_this$watchedEvent2","_EventContentBodyViewModel","isEmote","includeDir","parseFormattedBody","__assign","__spreadArray","pack","ar","SuppressedError","Diff","aKey","aValue","checkElementType","simplifiedCheck","elementTypeNames","elementTypeName","ownerDocument","_b","defaultView","objToNode","objNode","insideSvg","createComment","childNode","valueDiffing","simplifiedElementCheck","getFromRoute","route","applyDiff","newNode","reference","_const","addElement","addTextElement","preDiffApply","addAttribute","modifyAttribute","removeAttribute","modifyTextElement","textDiff","oldValue","modifyValue","modifyComment","modifyChecked","modifySelected","replaceElement","namespaceURI","replaceChild","relocateGroup","groupLength","removeChild","removeElement","parentRoute","removeTextElement","postDiffApply","p1","p2","undoDOM","undoDiff","elementDescriptors","el","findUniqueDescriptors","li","uniqueDescriptors","duplicateDescriptors","descriptor","inUnique","uniqueInBoth","l1","l2","l1Unique","l2Unique","inBoth","removeDone","outerDone","innerDone","valueDone","every","cleanNode","diffNode","elementNode","diffChildNode","e1","e2","e1Attributes","e2Attributes","roughlyEqual","sameSiblings","preventRecursion","nodeList1","nodeList2","childUniqueDescriptors_1","makeBooleanArray","markSubTrees","oldTree","newTree","marked1","marked2","subsets","returnIndex","foundAllSubsets","subset","c1","c2","lcsSize","c1Length","c2Length","subsetsSame","c1Desc","c2Desc","c1Index","c1Element","c2Index","c2Element","findCommonSubsets","markBoth","subsetsAge","DiffTracker","fn","getFromVirtualRoute","nodeIndex","applyVirtual","routeInfo","newSubsets","preVirtualDiffApply","movedNode","splitLength","c_1","c_2","postVirtualDiffApply","applyVirtualDiff","nodeToObj","aNode","tagRE","attrRE","module_unescape","area","br","embed","hr","keygen","menuItem","meta","param","wbr","parseTag","caseSensitive","voidElement","tagMatch","endIndex","reg","stringToObj","isComment","nextChar","parent_1","parent_2","DiffFinder","t1Node","t2Node","t1","Element","t2","diffcount","foundAll","t1Orig","t2Orig","tracker","init","findDiffs","diffcap","findNextDiff","fdiffs","maxDepth","findOuterDiff","filterOuterDiff","findInnerDiff","findValueDiff","attr1","attr2","attrLength","t1ChildNodes","t2ChildNodes","childNodesLengthDifference","maxChildCount","cachedSubtrees","subtrees","attemptGroupRelocation","destinationDifferent","toGroup","similarNode","gapInformation","stable","gaps1","gaps2","endOld","endNew","getGapInformation","shortest","index2","index1","testI","DEFAULT_OPTIONS","expectedValue","compress","components","DiffDOM","varNames","constNames_1","varName","applyDOM","undo","TraceLogger","tick","wrapkey","oldfn","fin","fout","tStr","nf","stringCollapse","valueOf","terminator","getSanitizedHtmlBody","textToHtml","wrapInsertion","wrapDeletion","diffTreeToDOM","desc","stringAsTextNode","childDesc","nextSibling","isRouteOfNextSibling","route1","route2","lastD1Idx","adjustRoutes","remainingDiffs","advance","rd","unescape","renderDifferenceInDOM","originalRootNode","diffMathPatch","refNode","refParentNode","isAddition","_refNode","findRefNodes","delNode","insNode","textDiffs","diff_main","diff_cleanupSemantic","modifier","textDiffNode","cloneNode","updatedNode","ConfirmAndWaitRedactDialog","isRedacting","redact","HTTPError","httpStatus","redactionErrorCode","onParentFinished","getReplacedContent","getOriginalContent","EditHistoryMessage","_event$localRedaction","_room$currentState$ma","sendStatus","getAssociatedStatus","localRedactionEvent","onAssociatedStatusChanged","mxEventContent","eventContentBodyViewModel","messageTimestampViewModel","isTwelveHour","editHistoryActionBarViewModel","isBaseEvent","_event$localRedaction2","renderActionBar","ActionBarView","contentContainer","contentElements","previousEdit","editContent","originalBody","editBody","diffActions","DiffMatchPatch","editBodyDiffToHtml","EventContentBodyView","isSending","mx_EventTile_sending","MessageEditHistoryDialog","_this$state$nextBatch","_this$state$originalE","_result$nextBatch","nextBatch","Replace","locallyRedactEventsIfNeeded","originalEvent","getDateSeparatorVm","dateSeparatorVms","DateSeparatorViewModel","pendingEvents","pendingRedaction","pe","RoomRedaction","markLocallyRedacted","loadMoreEdits","renderEdits","lastEvent","allEvents","baseEventId","separatorRoomId","separatorTs","DateSeparatorView","CAPTION_MESSAGE_TYPES","TextualBodyViewModel","computeEventSnapshot","_target$dataset","starterLink","getStarterLink","managers","IntegrationManagers","hasManager","openNoManagerDialog","integrationManager","getPrimaryManager","scalarClient","getScalarClient","completeUrl","integrationsUrl","uiUrl","screen","features","setHighlightLink","computeBodyWrapperSnapshot","setReplacingEventId","replacingEventId","computeEditedMarkerSnapshot","setIsSeeingThroughMessageHiddenForModeration","isSeeingThroughMessageHiddenForModeration","computePendingModerationSnapshot","_TextualBodyViewModel","Notice","TextualBodyViewKind","NOTICE","EMOTE","CAPTION","_mxEvent$getContent$d","bodyWrapper","TextualBodyViewBodyWrapperKind","LINK","bodyLinkHref","bodyActionAriaLabel","ACTION","_props$replacingEvent","showEditedMarker","editedMarkerText","editedMarkerAriaLabel","editedMarkerTooltip","editedMarkerCaption","replacingDate","replacingEventDate","showPendingModerationMarker","pendingModerationText","messageVisibility","_props$mxEvent$sender","_props$mxEvent$sender2","getKind","emoteSenderName","createEditContent","editedEvent","replyToEvent","containsEmote","stripEmoteCommand","textSerialize","htmlSerializeIfNeeded","useMarkdown","attachMentions","attachRelation","EditMessageComposer","_this$context$room","_this$editorRef$curre","isComposing","getMessageComposerAction","SendMessage","sendEdit","CancelReplyOrEdit","cancelEdit","EditPrevMessage","_this$editorRef$curre2","_this$editorRef$curre3","isModified","isCaretAtStart","previousEvent","findEditableEvent","isForward","fromEventId","editState","getEvent","EditEvent","EditNextMessage","_this$editorRef$curre4","_this$editorRef$curre5","isCaretAtEnd","nextEvent","endEdit","clearPreviousEdit","editorStateKey","saveDisabled","PosthogAnalytics","trackEvent","eventName","messageType","isReply","caret","getCaret","positionForOffset","atNodeEnd","replaceEmoticon","REGEX_EMOTICON","shouldSend","cancelPreviousPendingEdit","isContentModified","isSlashCommand","commandText","getSlashCommand","_editedEvent$getThrea","commandSuccessful","runSlashCommand","CommandCategories","effects","sendAnyway","shouldSendAnyway","mxClient","sendMessage","_this$editorRef$curre6","composerType","ComposerType","Edit","_this$editorRef$curre7","insertMention","_this$editorRef$curre8","insertQuotedMessage","_this$editorRef$curre9","insertPlaintext","FocusEditMessageComposer","isRestored","createEditorModel","saveStoredEditorState","dispatcherRef","register","_this$context$liveTim","liveTimelineEvents","liveTimeline","isInThread","shouldSaveStoredEditorState","restoreStoredEditorState","partCreator","serializedParts","deserializePart","oldContent","QUEUED","_this$editorRef$curre0","sel","getCaretOffsetAndText","setEditorState","unregister","CommandPartCreator","hasEditorState","getSerializedParts","restoredParts","parseEvent","shouldEscape","EditorModel","_this$props$editState","_this$props$editState2","BasicMessageComposer","initialCaret","rooms_EditMessageComposer","withMatrixClientHOC","PreviewVisibility","UrlPreviewGroupViewModel","getAnchorLink","_node$textContent","_node$textContent2","canParse","isPermalinkHost","host","findLinks","links","_node$children","previews","totalPreviewCount","previewsLimited","overPreviewLimit","urlPreviewVisible","fetcher","clearCache","_globalThis$localStor","urlPreviewEnabledByUser","storageKey","_globalThis$localStor2","previewKind","previewCount","limitPreviews","onImageClick","onImageClicked","UrlPreviewFetcher","showTooltips","isPreviewHiddenByUser","UserHidden","Visible","MediaHidden","Hidden","bundledLinkPreviews","loadMedia","fetchPreview","updateEventElement","eventElement","newLinks","TextualBodyFactory","willHaveWrapper","getParentEventId","contentRef","textualBodyVm","eventContentBodyVm","_roomContext$room$cli","_roomContext$room","urlPreviewVm","_props$showUrlPreview","_PlatformPeg$get$need","_preview$image","imageFull","showUrlPreview","useViewModel","setStripReply","setAs","setHighlights","_props$showUrlPreview2","updateUrlPreviewVisible","updateMediaVisible","trackUrlPreview","EditWysiwygComposer","editorStateTransfer","TextualBodyView","bodyRef","urlPreviews","UrlPreviewGroupView","baseBodyTypes","baseEvTypes","MStickerBody","M_BEACON_INFO","MjolnirBodyWrappedView","MjolnirBodyView","UnknownBody","UnknownBodyView","_this$body$current","_this$body$current$ge","getEventTileOps","_this$mediaHelper","isEligible","mediaHelper","_content$filename","_mime$getType","filename","validateThumbnailMimetype","typeFromExtension","extensionMajorMimetype","parseMajorMimetype","validateAllowedMimetype","contentMimetype","contentMajorMimetype","thumbnailMimetype","allowedMajorMimeTypes","majorMimetype","updateComponentMaps","Decrypted","onDecrypted","_this$mediaHelper2","_this$mediaHelper3","bodyTypes","bodyType","bodyComponent","_this$props$overrideB","overrideBodyTypes","evTypes","evComponent","_this$props$overrideE","overrideEventTypes","getMediaHelper","isDecryptionFailure","validateImageOrVideoMimetype","validateStickerMimetype","M_LOCATION","Location","userDomain","userBanned","Mjolnir","isUserBanned","serverBanned","isServerBanned","hasCaption","bodyProps","onTileUpdate","CaptionBody","WrappedBodyType","FileErrorIcon","file_error","shared_MediaProcessingError","SvgTrophy","PollOptionContent","isWinner","votesText","TrophyIcon","ActivePollOption","mx_PollOption","mx_PollOption_checked","mx_PollOption_ended","answerPercent","BaseCard","closeLabel","onClose","ariaLabelledBy","hideHeaderButtons","header","withoutScrollContainer","closeButtonRef","backButton","cardHistory","rightPanelStore","roomPhaseHistory","_backLabelForPhase","prevCard","onBackClick","popCard","backLabelForPhase","IconButton","ChevronLeftIcon","closeButton","closeRightPanel","shouldRenderHeader","PendingActionSpinner","EncryptionInfo","waitingForOtherParty","waitingForNetwork","onStartVerification","inDialog","isSelfVerification","error_solid","VerificationQRCode","qrCodeBytes","VerificationPanel","_this$state$reciproca","reciprocateQREvent","reciprocateButtonClicked","_this$state$reciproca2","emojiButtonClicked","startVerification","Sas","_this$state$sasEvent","sasEvent","_this$state$sasEvent2","mismatch","verifier","getShowSasCallbacks","getReciprocateQrCodeCallbacks","VerifierEvent","ShowSas","updateVerifierState","ShowReciprocateQr","maybeGetOtherDevice","Phase","Ready","haveFetchedQRCode","generateQRCode","hadVerifier","hasVerifier","_request$verifier","_request$verifier2","_request$verifier3","verify","renderQRPhase","showSAS","otherPartySupportsMethod","showQR","ScanQrCode","noCommonMethodError","qrBlockDialog","sasBlockDialog","startSAS","or","emojiCompare","qrCode","qrBlock","sasBlock","sasLabel","noCommonMethodBlock","_this$props$request","haveCheckedDevice","otherDeviceId","otherDeviceDetails","renderQRReciprocatePhase","onReciprocateYesClick","onReciprocateNoClick","renderVerifiedPhase","renderCancelledPhase","chosenMethod","Reciprocate","VerificationShowSas","sas","onSasMismatchesClick","onSasMatchesClick","isSelf","Done","Cancelled","VerificationRequestEvent","Change","onRequestChange","MISMATCHES","right_panel_EncryptionPanel","_sdkContext$client","verificationRequest","verificationRequestPromise","setRequest","isRequesting","setRequesting","doSetPhase","setPhase","VerificationPhase","requestFromPromise","awaitPromise","isShowingMismatchModal","changeHandler","_request$cancellation","cancellationCode","headerImage","verificationRequest_","requestVerificationDM","currentCard","EncryptionPanel","pushCard","togglePanel","Requested","initiatedByMe","transactionId","useUserfoHeaderViewModel","showPresence","precenseInfo","lastActiveAgo","enablePresenceByHsUrl","timezoneInfo","useUserTimezone","setTimezone","updateInterval","setUpdateInterval","friendly","setFriendly","supported","setSupported","doesServerSupportExtendedProfiles","_userProfile$ProfileK","userProfile","getExtendedProfile","tz","ProfileKeyTimezone","ProfileKeyMSC4175Timezone","updateTime","toLocaleString","getSeconds","onMemberAvatarClick","useUserInfoVerificationViewModel","userTrust","hasUserVerificationStatus","isUserVerified","isMe","canVerify","hasCrossSigningKeys","useHasCrossSigningKeys","userHasCrossSigningKeys","verifySelectedUser","verifyUser","UserInfoHeaderVerificationView","Badge","VerifiedIcon","justify","UserInfoHeaderView","hideVerificationSection","_vm$timezoneInfo$time","_vm$timezoneInfo","_vm$timezoneInfo$frie","_vm$timezoneInfo2","userStatus","useUserStatus","presenceLabel","PresenceLabel","activeAgo","coloured","Container","StatusTextView","getPowerLevels","_room$currentState","useRoomPermissions","roomPermissions","setRoomPermissions","modifyLevelMax","canInvite","updateRoomPermissions","_powerLevels$invite","powerLevels","them","_powerLevels$events$E","_powerLevels$events","editPowerLevel","state_default","useUserInfoBasicViewModel","useRoomPowerLevels","setPowerLevels","Events","isSynapseAdmin","isSynapseAdministrator","useIsSynapseAdmin","pendingUpdateCount","setPendingUpdateCount","isRoomDMForMember","isMemberSameDomain","showDeactivateButton","startUpdating","stopUpdating","onSynapseDeactivate","accepted","deactivateSynapseUser","PowerLevelSection","useUserInfoPowerlevelViewModel","selectedPowerLevel","setSelectedPowerLevel","onPowerChange","powerLevelEvent","myPower","warnSelfDemote","applyPowerChange","setPowerLevel","powerLevelUsersDefault","PowerLevelEditor","IgnoreToggleButton","unignore","ignoredUsers","getIgnoredUsers","setIgnoredUsers","ignore","isIgnored","setIsIgnored","isUserIgnored","accountDataHandler","ignoreButtonClick","useUserInfoIgnoreButtonViewModel","onSelect","BlockIcon","ChatProblemIcon","chat_problem","dialogs_ConfirmSpaceUserActionDialog","spaceChildFilter","allLabel","specificLabel","noneLabel","warningMessage","spaceChildren","roomsToLeave","setRoomsToLeave","selectedRooms","InfoSolidIcon","SpaceChildrenPicker","useBanButtonViewModel","isUpdating","isBanned","banLabel","onBanOrUnbanClick","commonProps","ConfirmSpaceUserActionDialog","myMember","theirMember","hasSufficientPowerLevelFor","bulkSpaceBehaviour","unban","ban","dialogs_BulkRedactDialog","keepStateEvents","setKeepStateEvents","eventsToRedact","isRedaction","getNeighbouringTimeline","EventTimeline","BACKWARDS","BulkRedactStart","BulkRedactEnd","RoomKickButton","onKickClick","kick","_err$message","canUserBeKicked","kickLabel","useRoomKickButtonViewModel","LeaveIcon","RedactMessagesButton","onRedactAllMessagesClick","BulkRedactDialog","useRedactMessagesButtonViewModel","BanToggleButton","MuteToggleButton","isMuted","powerLevelContent","levelToSend","events_default","muteLabel","isMemberInTheRoom","onMuteButtonClick","_powerLevels$events$m","useMuteButtonViewModel","VisibilityOffIcon","UserInfoAdminToolsContainer","kickButton","banButton","muteButton","banPowerLevel","kickPowerLevel","redactPowerLevel","isCurrentUserInTheRoom","shouldShowKickButton","shouldShowBanButton","shouldShowMuteButton","shouldShowRedactButton","canAffectUser","useUserInfoAdminToolsContainerViewModel","MessageButton","openDMForUser","ChatIcon","UserInfoBasicOptionsView","useUserInfoBasicOptionsViewModel","isSpace","readReceiptButtonDisabled","getEventReadUpTo","showInsertPillButton","showInviteButton","onReadReceiptButton","onInsertPillButton","onInviteUserButton","fallbackRoomId","getCompletionState","errorStringFromInviterUtility","onShareUserClick","onOpenDmForUser","startDmUser","insertPillButton","inviteUserButton","readReceiptButton","MentionIcon","shouldShowComponent","UIComponent","InviteUsers","InviteIcon","shareUserButton","directMessageButton","CreateRooms","UserInfoBasicView","synapseDeactivateButton","spinner","memberDetails","adminToolsContainer","downloadUncached","userDeviceMap","devicesMap","useDevices","setDevices","_devices$i$displayNam","indexList","ambiguous","disambiguateDevices","downloadDeviceList","updateDevices","newDevices","onDevicesUpdated","onUserTrustStatusChanged","_userId","trustLevel","CryptoEvent","DevicesUpdated","UserTrustStatusChanged","right_panel_UserInfo","_useDevices","MemberInfo","onEncryptionPanelClose","pending","previousCard","ROOM_REGEX","matcherObject","displayedAlias","matchName","RoomProvider","matcherObjects","tombstone","r2","matchedString","canonicalScore","EMOTICON_REGEX","SORTED_EMOJI","EMOJI","_orderBy","EmojiProvider","o","nameMatcher","sorters","trimmedMatch","recentlyUsedAutocomplete","exactMatchEmoji","NotifProvider","mayTriggerNotifOfType","PROVIDERS","Autocompleter","providers","Prov","completionsList","provider","generateCompletionDomId","Autocomplete","hide","selectionOffset","completionList","onCompletionClicked","countCompletions","onConfirm","shouldShowCompletions","forceComplete","autocompleter","applyNewProps","oldQuery","_this$autocompleter","complete","_this$autocompleter2","queryRequested","debounceCompletionsRequest","autocompleteDelay","processCompletions","flatMap","currentSelection","onSelectionChange","moveSelection","completionCount","setSelection","onEscape","_this$completionRefs","selectedCompletion","completionRefs","containerRef","scrollTo","renderedCompletions","completionResult","componentPosition","refId","HistoryManager","newlyTypedCharCount","changedSinceLastPush","lastCaret","nonWordBoundarySinceLastPush","addedSinceLastPush","removedSinceLastPush","shouldPush","inputType","added","isWordBoundary","pushState","tryPush","ensureLastChangesPushed","canUndo","canRedo","redo","editor","Range","removeAllRanges","selectionRange","createRange","getNodeAndOffsetForPosition","setStart","setEnd","addRange","setDocumentRangeSelection","caretPosition","collapse","existingRange","startOffset","setCaretPosition","lineIndex","partIndex","lineResult","prevPart","Type","Newline","needsCaretNodeBefore","nextPart","isLastOfLine","needsCaretNodeAfter","findNodeInLineForPart","acceptsCaret","moveOutOfUnselectablePart","getLineAndNodePosition","lineNode","ELEMENT_NODE","Formatting","MessageComposerFormatBar","mx_MessageComposerFormatBar_shown","formatBarRef","FormatButton","Bold","BoldIcon","shortcut","shortcuts","bold","Italics","ItalicIcon","italics","Strikethrough","StrikethroughIcon","Code","Quote","quote","InsertLink","insert_link","showAt","selectionRect","_this$formatBarRef$cu","parentRect","halfBarHeight","BAR_HEIGHT","offsetLimit","formatRange","wasInitializedEmpty","expandForwardsWhile","isFormattable","expandBackwardsWhile","selectRangeOfWordAtCaret","toggleInlineFormat","hasBlockFormatting","needsBlockFormatting","_parts$","_parts","fenceLen","longestBacktickSequence","hasInlineFormatting","plain","newline","rangeStartsAtBeginningOfLine","rangeEndsAtEndOfLine","replaceRangeAndExpandSelection","formatRangeAsCode","formatRangeAsQuote","formatRangeAsLink","newParts","oldLen","addedLen","firstOffset","asOffset","startRange","asPosition","replaceRangeAndMoveCaret","_index","Plain","startsWithPartial","isFirstPart","previousIsNewline","lastPart","endsWithPartial","isLastPart","nextIsNewline","linkRegex","linkDescription","isNL","paragraphIndexes","startIndex","lastNonEmptyPart","startIdx","endIdx","partWithoutPrefix","deserializedPart","partWithoutSuffix","suffixPartText","hasFormatting","rangeHasFormatting","prefixLength","suffixLength","lastStartingPosition","getLastStartingPosition","relativeOffset","distanceFromEnd","offsetDirection","atEnd","replaceRangeAndAutoAdjustCaret","REGEX_EMOTICON_WHITESPACE","SURROUND_WITH_CHARACTERS","SURROUND_WITH_DOUBLE_CHARACTERS","ctrlShortcutLabel","needsShift","needsAlt","IS_MAC","ALTERNATE_KEY_NAME","CONTROL","SHIFT","ALT","cloneSelection","anchorNode","anchorOffset","focusOffset","isCollapsed","BasicMessageEditor","_this$props$model$aut","renderModel","setLastCaretFromPosition","hidePlaceholder","showVisualBell","historyManager","isTyping","parseCommandString","typingStore","setSelfTyping","isIMEComposing","isSafari","onInput","getRangeForSelection","selectedParts","setData","modifiedFlag","onCutCopy","_this$props$onPaste","plainText","partsText","parsePlainTextMessage","isLinkable","onPasteHandler","dataTransfer","lastSelection","refreshLastCaretIfNeeded","_this$formatBarRef$cu2","hasTextSelected","_model$autoComplete","which","surroundWith","navAction","getNavigationAction","NextLandmark","PreviousLandmark","autocompleteAction","getAutocompleteAction","accessibilityAction","hasCompletions","ForceCompleteAutocomplete","CompleteAutocomplete","confirmCompletion","PrevSelectionInAutocomplete","selectPreviousSelection","NextSelectionInAutocomplete","selectNextSelection","CancelAutocomplete","Delete","Backspace","_this$formatBarRef$cu3","tabCompleteName","FormatBold","onFormatAction","FormatItalics","FormatCode","FormatQuote","FormatLink","EditRedo","EditUndo","NewLine","insertText","MoveCursorToStart","MoveCursorToEnd","_this$props$model$aut2","onComponentConfirm","completionIndex","setTransformCallback","showPillAvatar","documentPosition","ua","userAgent","configureEmoticonAutoReplace","enabledChange","placeholderChanged","PillCandidate","emoticonMatch","EMOTICON_TO_EMOJI","firstMatch","moveStart","moveStartForwards","moveEndBackwards","_this$props$placehold","setProperty","CSS","textToInsert","_isCaretAtEnd","isAtEnd","clearUndoHistory","isSelectionCollapsed","Command","pillCandidate","startSelection","onBeforeInput","onCompositionStart","onCompositionEnd","useMarkdownHandle","emoticonSettingHandle","shouldShowPillAvatarSettingHandle","surroundWithHandle","_this$editorRef$curre1","_this$editorRef$curre10","_this$editorRef$curre11","configureUseMarkdown","configureShouldShowPillAvatar","surroundWithSettingChanged","setUpdateCallback","updateEditorState","setAutoCompleteCreator","getAutoCompleteCreator","autocompleteRef","getInitialCaretPosition","getPositionAtEnd","_this$autocompleteRef","queryLen","onAutoCompleteConfirm","onAutoCompleteSelectionChange","mx_BasicMessageComposer_input_error","mx_BasicMessageComposer_input_shouldShowPillAvatar","mx_BasicMessageComposer_input_disabled","hasAutocomplete","activeDescendant","contentEditable","onCopy","onCut","_this$editorRef$curre12","createMentionParts","quoteParts","isQuotedMessage","plainWithEmoji","crossSigningUserTitles","crossSigningRoomTitles","icons","ShieldIcon","tooltipPlacement","e2eTitle","getTooltipText","OnlineOrUnavailableIcon","OfflineIcon","DNDIcon","getIconForPresenceState","showCounts","NotificationStateEvents","onNotificationUpdate","countWatcherRef","countPreferenceChanged","showUnsentTooltip","knocked","StatelessNotificationBadge","forceDot","hideBold","hasUnreadCount","isEmptyBadge","formatCount","badgeType","mx_NotificationBadge","mx_NotificationBadge_visible","mx_NotificationBadge_level_notification","mx_NotificationBadge_level_highlight","mx_NotificationBadge_knocked","mx_NotificationBadge_dot","mx_NotificationBadge_2char","mx_NotificationBadge_3char","getPrettyPresence","mx_PresenceLabel_online","CurrentRightPanelPhaseContext","currentPhase","isPanelOpen","SendComposer","EditComposer","dynamicImportSendMessage","isHTML","dynamicImportConversionFunctions","richToPlain","plainToRich","DynamicImportSendWysiwygComposer","DynamicImportEditWysiwygComposer","destructive","SpaceAvatar","avatarDisabled","setAvatar","avatarUploadRef","setAvatarDataUrl","avatarSection","_avatarUploadRef$curr","_avatarUploadRef$curr2","TakePhotoSolidIcon","_avatarUploadRef$curr3","chromeFileInputFix","_e$target$files","files","reader","FileReader","readAsDataURL","accept","SpaceBasicSettings","nameDisabled","setName","topicDisabled","setTopic","Target","SpecificChildrenPicker","filteredRooms","All","StyledRadioGroup","Specific","createSpace","isPublic","otherOpts","createRoom","power_level_content_override","historyVisibility","andView","inlineErrors","spaceNameValidator","nameToLocalpart","SpaceCreateForm","nameFieldRef","aliasFieldRef","setAlias","showAliasField","_cli$getDomain","newName","_aliasFieldRef$curren","SpaceCreateMenu","settingAllowPublicSpaces","AllowCreatingPublicSpaces","setVisibility","spaceNameField","spaceAliasField","supportsSpaceFiltering","setSupportsSpaceFiltering","isVersionSupported","onSpaceCreateClick","onSearchClick","OpenSpotlight","initialFilter","PublicSpaces","SpacePublicShare","copiedText","setCopiedText","UserAddIcon","cancelling","sasDisplay","sasCaption","SasEmoji","decimal","numberBlocks","otherDevice","deviceName","onMatchClick","onDontMatchClick","BUTTONS","BUTTON_LETTERS","DialPadButtonKind","DialPadButton","Digit","onButtonPress","Dial","digitSubtext","buttonNodes","onDialPress","CurrentRightPanelPhaseContextProvider","getCurrentPhase","currentCardForRoom","getIsOpen","isOpenForRoom","setCurrentPhase","useCurrentPhase","SORT_REGEX","MemberListStore","stores","loadMemberList","joined","collator","Collator","sensitivity","ignorePunctuation","loadMembers","membersByMembership","filterMembers","sortMembers","loadedRooms","isLazyLoadingEnabled","loadMembersInRoom","isLazyMemberStorageEnabled","loadMembersIfNeeded","markOutOfBandMembersStarted","memberEvents","chunk","getEventMapper","setOutOfBandMembers","allMembers","_this$stores$client","isEncryptionEnabledInRoom","hasLazyLoadMembersEnabled","_enablePresenceByHsUr","matchesName","matchesId","memberA","memberB","userA","userB","convertPresence","presenceIndex","idxA","idxB","getLastActiveTs","compare","canonicalisedName","sortNames","INITIAL_STATE","joinError","subscribingRoomId","initialEventId","initialEventPixelOffset","isInitialEventHighlighted","initialEventScrollIntoView","roomLoading","roomLoadError","replyingToEvent","shouldPeek","wasContextSwitch","viewingCall","promptAskToJoin","viewRoomOpts","RoomViewStore","lockedToRoomId","utils","resetDispatcher","removeRoomListener","emitForRoom","stateChanged","lastRoomId","_this$dis","ActiveRoomChanged","newRoomId","onDispatch","viewRoom","ViewThread","viewThread","ViewHomePage","ViewRoomError","viewRoomError","JoinRoom","joinRoom","JoinRoomError","joinRoomError","JoinRoomReady","awaitRoomDownSync","numMembers","getJoinedMemberCount","roomSize","posthogAnalytics","isDM","ClientNotViable","OnLoggedOut","_payload$event","_this$dis2","isRoomDisplayedInModule","PromptAskToJoin","SubmitAskToJoin","submitAskToJoin","CancelAskToJoin","cancelAskToJoin","RoomLoaded","setViewRoomOpts","_payload$room_alias","_payload$event_id","_payload$highlighted","_payload$scroll_into_","_payload$via_servers","_payload$context_swit","_payload$replyingToEv","_this$state$replyingT","activeSpace","MetaSpace","isMetaSpace","_this$stores$spaceSto","activeSpaceRoom","viaKeyboard","view_call","CallStore","getActiveCall","_payload$voiceOnly","getCall","ElementCall","voiceOnly","ActiveWidgetStore","setWidgetPersistence","presented","connectionState","ConnectionState","Disconnected","skipLobby","prevRoomCall","_this$dis3","via_servers","context_switch","slidingSyncManager","setRoomVisible","auto_join","_this$dis4","joinPayload","canAskToJoin","setMarkedUnreadState","_this$dis6","cachedResult","_payload$view_call","_this$dis5","thread_id","joinOpts","acceptSharedHistory","_this$dis7","retry","_this$dis8","_this$dis9","getInvitingUserId","inviteEvent","showJoinRoomError","invitingUserId","_this$dis0","dispatchToken","getThreadId","getInitialEventId","getRoomAlias","isRoomLoading","getRoomLoadError","isJoining","getJoinError","getQuotingEvent","getWasContextSwitch","isViewingCall","knockRoom","leave","getViewRoomOpts","invoke","RoomViewLifecycle","currentSpace","extras","visibleRoomBySpaceKey","TypingStore","typingStates","_currentTyping","isLocalRoom","currentTyping","serverTimer","userTimer","sendTyping","cacheSize","UserProfilesStore","LruCache","profiles","knownProfiles","Membership","onRoomMembershipEvent","getProfile","cachedProfile","fetchProfile","fetchProfileFromApi","isUserIdKnown","flush","_await$this$client$ge","getProfileInfo","ResizeNotifier","_isResizing","startResizing","stopResizing","noisyMiddlePanel","updateMiddlePanel","throttledMiddlePanel","notifyLeftHandleResized","notifyRightHandleResized","notifyTimelineHeightChanged","notifyWindowResized","MultiRoomViewStore","dispatcher","sdkContextClass","getRoomViewStoreForRoom","removeRoomViewStore","getNotificationEventSendTs","sendTs","sender_ts","JoinCallButtonWithCall","disabledTooltip","DeclineCallButtonWithNotificationEvent","notificationEvent","onDeclined","declining","setDeclining","_notificationEvent$ge","sendRtcDecline","IncomingCallToast","_sdkContext$client$ge","notificationContent","useCall","connectedCalls","setConnectedCalls","CallStoreEvent","ConnectedCalls","otherCallIsOngoing","soundHasStarted","notification_type","_ev$getRelation","onCall","callRoomId","participants","onTimelineChange","RTCDecline","relationEventId","onParticipantChange","_notificationContent$","lifetime","useDispatcher","videoToggle","setVideoToggle","videoToggleId","viewCall","onJoinClick","onExpandClick","onCloseClick","Call","Participants","useParticipatingMembers","avatars","detailsInformation","iconLabel","AvatarWithDetails","ToggleInput","getNotificationBodyWithoutSpoilers","_content$body","_replaceSpoilers$text","replaceSpoilers","NotifierEvent","Notifier","Syncing","isSyncing","fromCache","createLocalNotificationSettingsIfNeeded","threadListType","decryptEventIfNeeded","isBeingDecrypted","pendingEncryptedEventIds","evaluateEvent","notifsByRoom","notif","msgTypeHandlers","KeyVerificationRequest","TextForEvent","notificationMessageForEvent","msgType","displayPopupNotification","plaf","supportsNotifications","maySendNotifications","isBodyEnabled","displayNotification","getSoundForRoom","playAudioNotification","_sound$url","soundKey","lastPlayed","lastAudioNotificationMs","onEvent","Receipt","onRoomReceipt","onEventDecrypted","onSyncStateChange","toolbarHidden","_this$sdkContext$clie","_this$sdkContext$clie2","_this$sdkContext$clie3","_this$sdkContext$clie4","supportsDesktopNotifications","_PlatformPeg$get$supp","setEnabled","enable","isLevelSupported","requestNotificationPermission","permission","granted","setPromptHidden","isPossible","isAudioEnabled","hidden","persistent","hideNotificationsToast","NotificationHiddenChange","shouldShowPrompt","isPushNotifyDisabled","isPromptHidden","getPushActionsForEvent","notify","performCustomEventHandling","isViewingRoom","isViewingThread","hasDialogs","_PlatformPeg$get2","loudNotification","handleRTCNotification","toaster","_rtcSession$slotDescr","_callMembership$getCo","rtcSession","matrixRTC","getRoomSession","slotDescription","application","memberships","referencedMembershipEventId","callMembership","getIncomingCallToastKey","hasToast","_this$sdkContext$clie5","_client","isAction","OnLoggedIn","SettingController","constructEagerStores","_RoomViewStore","_LegacyCallHandler","_RightPanelStore","roomNotificationStateStore","_RoomNotificationStateStore","_WidgetLayoutStore","WidgetLayoutStore","widgetPermissionStore","_WidgetPermissionStore","WidgetPermissionStore","_WidgetStore","_PosthogAnalytics","memberListStore","_MemberListStore","_SlidingSyncManager","SlidingSyncManager","_SpaceStore","SpaceStore","_TypingStore","_UserProfilesStore","_ResizeNotifier","multiRoomViewStore","_MultiRoomViewStore","notifier","_Notifier","callStore","_this$_CallStore","_CallStore","latestRtcNotificationEventStore","_LatestRtcNotificationEventStore","LatestRtcNotificationEventStore","onLoggedOut","_SDKContextClass","EfficientContext","changedKeys","objectKeyChanges","ScopedRoomContext","ScopedRoomContextProvider","memo","_context$state","updatedKeys","updatedKey","DEFAULT_EVENTS_POWER_LEVEL","_await$client$getCapa","_await$client$getCapa2","defaultPreset","dmUserId","TrustedPrivateChat","isUrl","invite_3pid","id_server","medium","is_direct","RoomCreateTypeField","JitsiCall","MEMBER_EVENT_TYPE","disable","initial_state","MEGOLM_ENCRYPTION_ALGORITHM","defaultRoomVersion","getCapabilities","doesRoomVersionSupport","PreferredRoomVersions","KnockRooms","room_version","makeSpaceParentEvent","RestrictedRooms","RestrictedAllowType","RoomMembership","content_uri","uploadContent","modal","storedRoom","onRoom","emittedRoom","Rooms","waitTimeMs","hasEncryptionStateEvent","timeoutPromise","timeoutResolve","roomState","getState","Direction","Forward","stateUpdatePromise","stateUpdateResolve","resolution","race","waitForRoomEncryption","setRoomName","htmlSerializeFromMdIfNeeded","forceHTML","setRoomTopic","enableStateEventEncryption","suggested","justCreatedOpts","canEncryptToAllUsers","userIds","_client$getCrypto","usersDeviceMap","existingDMRoom","waitForMember","chatPreset","doesServerForceEncryptionForPreset","doesWellKnownForceDisableEncryption","shouldForceDisableEncryption","_ModuleApi$instance$c","_ComponentVisibilityC","customisations","ComponentVisibilityCustomisations","firstPart","UserPill","RoomPill","run","_await$result$promise","errText","LIST_TYPES","currentLength","isListChild","_n$parentNode","parseAtRoomMentions","ATROOM","textPart","atRoomPill","prefixLines","parseChildren","mkListItem","parseNode","_mkListItem","nodeValue","checkIgnored","parseHeader","getPrimaryPermalinkEntity","userPill","roomPill","parseLink","parseImage","_n$firstChild","fence","parseCodeBlock","_start","_delims$inline$left","_delims$inline","_delims$display$left","_delims$display","_delims$inline$right","_delims$inline2","_delims$display$right","_delims$display2","latex_maths_delims","delimLeft","delimRight","tex","isRainbow","parseHtmlMessage","textToHtmlRainbow","getSelectionOffsetAndText","selectionNode","characterOffset","childNodeCount","_selectionNode","_selectionNode$textCo","MAX_SAFE_INTEGER","tryReduceSelectionToTextNode","offsetToNode","foundNode","enterNodeCallback","nodeText","isCaretNode","CARET_NODE_CHAR","getTextNodeValue","leaveNodeCallback","_node$nextSibling","rootNode","walkDOMDepthFirst","getTextAndOffsetToNode","offsetWithinNode","DocumentOffset","zwsIdx","focusPosition","anchorPosition","firstDiff","compareLen","diffAtCaret","caretPositionBeforeInput","oldStr","newStr","startInCommon","commonStartLen","diffStringsAtEnd","contentPlainText","updateCallback","replaceParts","_this$updateCallback","_range$start","_range$end","autoCompletePartIdx","replaceRange","DocumentPosition","autoCompletePartCount","lastPartIndex","_autoComplete","_partCreator","transformCallback","clone","clonedParts","insertPart","activePartIdx","removePart","replacePart","previousValue","firstDiffIdx","diffDeletion","_this$updateCallback2","insertIndex","splitAt","newTextLength","_this$updateCallback3","removedOffsetDecrease","removeText","addText","mergeAdjacentParts","caretOffset","newPosition","canOpenAutoComplete","acPromise","setActivePart","transformAddedLen","getTransformAddedLen","_this$transformCallba","ac","createAutoComplete","onAutoComplete","onPartUpdate","_prevPart$merge","_prevPart","isMerged","createDefaultPart","secondPart","addLen","it","validateAndInsert","splitPart","newPart","createPartForInput","appendUntilRejected","totalOffset","atPartEnd","currentOffset","partLen","positionA","positionB","startPosition","endPosition","newStartPartIndex","insertIdx","_this$updateCallback4","AutocompleteWrapperModel","getAutocompleterComponent","updateQuery","_this$getAutocomplete","_this$getAutocomplete2","_this$getAutocomplete3","onConfirmCompletion","acComponent","_this$getAutocomplete4","_this$getAutocomplete5","partForCompletion","REGIONAL_EMOJI_SEPARATOR","BasePart","_text","acceptsInsertion","chr","acceptsRemoval","splitText","PlainPart","strWithRemoval","getFirstGrapheme","beforeInsert","afterInsert","PlainBasePart","toDOMNode","updateDOMNode","canUpdateDOMNode","PillPart","onclick","setAvatarVars","initialLetter","avatarTextColor","avatarBackground","avatarLetter","NewlinePart","EmojiPart","RoomPillPart","_this$room","_Avatar$getInitialLet","_this$room2","_this$room$roomId","_this$room3","_this$room$roomId2","_this$room4","_this$room5","AtRoomPillPart","AtRoomPill","UserPillPart","defaultAvatarUrl","_Avatar$getInitialLet2","PillCandidatePart","autoCompleteCreator","_this$autoCompleteCre","_this$autoCompleteCre2","PartCreator","_this$client$getRoom","isRegionalIndicator","_c$codePointAt","insertTrailingCharacter","pill","CommandPart","otherPos","iteratePartsBetween","startPos","endPos","forwardsWhile","predicate","backwardsWhile","lastPartIdx","isAtStart","whitespacePredicate","bIsLarger","_end","_lastStart","_initializedEmpty","setWasEmpty","setLastStartingPosition","newLength","oldLength","serializedPart","isFirst","nodeToInsert","createCaretNode","updateCaretNode","removeNextSiblings","removeNode","linesArr","lineContainer","_currentNode","caretNode","reconcileLine","foundBR","partNode","reconcileEmptyLine","removeChildren","md","makeGenericPermalink","mdSerialize","orig","patternTypes","patternDefaults","latex","patternName","patternType","_SdkConfig$get","p2e","parserOrig","_model$parts$","hasCommand","hasArgument","stripPrefix","unescapeMessage","CHAT_EFFECTS","fallbackMessage","getRenderer","Effect","maxCount","speed","frameInterval","alpha","gradient","gravity","maxDrift","containsEmoji","EMAIL_ADDRESS_REGEX","looksValid","LiveContentSummary","participantCount","mx_LiveContentSummary_text_active","CallDuration","SessionDuration","_session$getOldestMem","setNow","createdTs","getOldestMembership","ActiveCallEvent","participatingMembers","buttonKind","buttonDisabledTooltip","onButtonClick","facePileMembers","facePileOverflow","FacePile","ActiveLoadedCallEvent","useConnectionState","Disconnecting","latestEvent","RoomPredecessorTile","_predecessor$viaServe","onLinkClicked","prevRoom","guessedLink","guessServerNameFromRoomId","MatrixToPermalinkConstructor","guessLinkForRoomId","EventTileBubble","ChatSolidIcon","predecessorPermalink","createLinkWithRoom","matrixToPermalinkConstructor","createLinkWithoutRoom","MJitsiWidgetEventViewModel","_props$widgetStore","_props$widgetLayoutSt","internalProps","trackStoreUpdates","updateSnapshotFromProps","updatedRoomId","emissionForRoom","getWidget","isInContainer","widgetId","MKeyVerificationRequestViewModel","setTimestamp","userLabelForEventRoom","getNameForEventRoom","RoomAvatarEventViewModel","getAvatarUrl","computeLightboxLabel","getSenderDisplayName","getRoomName","lightboxLabel","isRemoved","_cli$getRoom$name","_cli$getRoom","TextualEventViewModel","setTextFromEvent","SentinelUpdated","HiddenBodyViewModel","ViewSourceEventViewModel","computeSource","_JSON$stringify","removeDecryptionListener","setupDecryptionListener","nextProps","eventChanged","clientChanged","decryptionListenerDisposables","Disposables","_this$decryptionListe","_mediaFromMxc$getThum","MemberAvatarViewModel","newSnapshot","FacePileViewModel","memberAvatarViewModels","viewModelMap","updateMembers","newMembers","getIntentFromEvent","getDeclinedEvents","_getRelationsForEvent","getDurationInSeconds","durationInMs","DurationViewModel","callStartTs","setupInterval","intervalRef","getCallOrThrow","doesCallHaveOtherParticipants","participant","_notificationEvent$se","BaseOngoingCallViewModel","extraSnapshot","_room$getLiveTimeline","_call$session$getOlde","startedUserId","callHasOtherParticipants","startedMember","startedByDisplayName","isJoined","callDirection","CallDirection","Outgoing","facePileViewModel","memberAvatarViewModel","isJoinable","FORWARDS","durationViewModel","setupListener","onParticipantsChange","SharedComponentsCallType","PlatformCallType","shiftKey","getSnapshot","isCallDeclinedByOwnUser","_declinedEvents$some","declinedEvents","ownUserId","RoomOngoingCallTileViewModel","totalParticipants","isCallIgnored","RelationsCreated","onRelationsCreated","DmOngoingCallTileViewModel","getTimeFromEvent","senderTs","originServerTs","RoomTombstoneCallTileViewModel","SettingUpdated","isSettingsChangedPayload","settingName","getTimestamp","monitorSetting","generateSnapshot","_getDeclinedEvents$","_getDeclinedEvents","declineEvent","isCallDeclined","DmTombstoneCallTileViewModel","_this$declineEvent","isLastNotificationEvent","getLatestEventId","isLocalEvent","hasOngoingCall","isDmRoom","tileType","tileViewModel","RootCallTileViewModel","recomputeSnapshot","trackViewModel","onCallStoreEvent","LatestRtcNotificationEventUpdate","MessageEventFactory","CallEventFactory","TextualEventFactory","TextualEventView","EncryptionEventWrappedView","EncryptionEventViewModel","EncryptionEventView","MKeyVerificationRequestWrappedView","MKeyVerificationRequestView","VerificationReqFactory","HiddenBodyWrappedView","HiddenBodyView","HiddenEventFactory","ViewSourceEventWrappedView","ViewSourceEventView","expandedClassName","MJitsiWidgetEventWrappedView","MJitsiWidgetEventView","RoomAvatarEventWrappedView","_useMatrixClientConte","RoomAvatarEventView","renderAvatar","CallStartedTileViewWrapped","RootCallTileView","JSONEventFactory","JitsiEventFactory","EVENT_TILE_TYPES","LegacyCallEventFactory","CallStartedEventFactory","STATE_EVENT_TILE_TYPES","EncryptionEventFactory","RoomCreateEventFactory","RoomAvatarEventFactory","SINGULAR_STATE_EVENTS","pickFactory","asHiddenEv","_EVENT_TILE_TYPES$get","noEventFactoryFactory","getMessageModerationState","MessageModerationState","HIDDEN_TO_CURRENT_USER","dynamicPredecessorsEnabled","_STATE_EVENT_TILE_TYP","live","isRelation","renderTile","renderType","factory","renderMessage","origProps","_origProps$showUrlPre","_origProps$showUrlPre2","renderReplyTile","_origProps$showUrlPre3","messageTypes","isMessageEvent","_matrixClient$getRoom","intent","GroupCallIntent","getShareableLocationEventForBeacon","getPlatformCallTypeProps","platformCallType","LegacyCall","useRoomCall","_widget$type","_widget","widgetsFeatureEnabled","Widgets","voipFeatureEnabled","enableLegacyCallsVoip","sdkConfigEcOnly","use_exclusively","useElementCallExclusively","serverIsConfiguredForElementCall","TransportsUpdated","getConfiguredRTCTransports","livekit_service_url","hasLegacyCall","useWidgets","jitsiWidget","hasJitsiWidget","managedHybridWidget","isManagedHybridWidget","hasManagedHybridWidget","groupCall","isConnectedToCall","hasGroupCall","useParticipantCount","activeCallSessionType","memberCount","useRoomMemberCount","mayEditWidgets","mayCreateElementCallState","mayCreateElementCalls","callOptions","CALL","_groupCall$widget","updateWidgetState","setCanPinWidget","canAddToContainer","setWidgetPinned","canPinWidget","widgetPinned","promptPinWidget","Ongoing","Unpinned","NoCall","NoPermission","voiceCallClick","callPlatformType","videoCallClick","voiceCallDisabledReason","videoCallDisabledReason","NotJoined","toggleCallMaximized","roomDoesNotExist","LocalRoomState","CREATED","hideVoiceCallButton","hideVideoCallButton","showVoiceCallButton","showVideoCallButton","propMember","useOnlyCurrentProfiles","threadContexts","_context$room","currentMember","forRoomId","useParticipants","savedHandler","cryptoApi","isEncryptionEnabled","encryptionStateEvent","_roomState$getStateEv","_client$getUserId","mediaPreviewSetting","eventVisibility","setMediaVisibility","computeMediaVisibility","throttleWait","includeInvited","setCount","getInvitedAndJoinedMemberCount","throttledUpdate","Summary","useRoomMembers","setMembers","setMembership","MyMembership","echoChamber","EchoChamber","setNotificationState","notificationVolume","PROPERTY_UPDATED","CachedRoomKey","NotificationVolume","mapper","savedMapper","excludeDefault","useSettingValueAt","explicit","setUserStatus","MatrixGlob","replaced","globToRegexp","extended","globstar","RECOMMENDATION_BAN","PolicyRecommendation","RECOMMENDATION_BAN_TYPES","recommendationToStable","unstable","ListRule","_glob","_entity","_action","_reason","_kind","isMatch","RULE_USER","PolicyRuleUser","RULE_ROOM","PolicyRuleRoom","RULE_SERVER","PolicyRuleServer","ruleTypeToStable","BanList","updateList","serverRules","_rules","userRules","banEntity","unbanEntity","setup","_roomIds","updateLists","atLevel","roomIds","lists","_lists","mjolnirWatchRef","onListsChanged","DoAfterSyncPrepared","deferred_action","getOrCreatePersonalList","personalRoomId","getPersonalList","subscribeToList","unsubscribeFromList","listRoomIds","waitForEvent","emitter","pred","customTimeout","listener","wait","isConnected","_callType","prevCallType","CallTypeChanged","_widgetApi","_connectionState","prevValue","connected","_participants","_presented","initialCallType","_room","setDisconnected","uid","widgetUid","WidgetMessagingStoreEvent","StopMessaging","onStopMessaging","_ElementCall$get","_params","messagingStore","startTime","performance","_messaging","recheck","currentMessaging","onStart","WidgetMessagingEvent","Start","onStoreMessaging","StoreMessaging","setConnected","onMyMembership","beforeUnload","performDisconnection","Close","Destroy","updateParticipants","resendDevicesTimer","removeOurDevice","addOurDevice","STUCK_DEVICE_TIMEOUT_MS","TileLayout","SpotlightLayout","detail","onRoomState","onConnectionState","isElementVideoRoom","_app$data","isVideoChannel","participantsExpirationTimer","allExpireAt","expires_ts","getDeviceId","localMember","clean","myDevices","deviceMap","device_id","last_seen_ts","devicesSet","JoinCall","onJoin","onHangup","ActiveWidgetStoreEvent","Dock","onDock","Undock","onUndock","JitsiCallMemberEventType","ElementCallIntent","checkDestroy","appendRoomParams","append","JoinExisting","oldestCallMember","hasCallStarted","JoinExistingDMVoice","JoinExistingDM","StartCallDMVoice","StartCallDM","JoinExistingVoice","StartCallVoice","StartCall","appendAnalyticsParams","_client$getAccountDat","posthogConfig","project_api_key","api_host","getAnonymity","Anonymity","Disabled","accountAnalyticsData","ANALYTICS_EVENT_TYPE","analyticsID","pseudonymousAnalyticsOptIn","sentryConfig","_sentryConfig$environ","dsn","environment","generateWidgetUrl","elementCallUrlOverride","URLSearchParams","perParticipantE2EE","lang","getCurrentLanguage","fontScale","FontWatcher","getRootFontSize","getBrowserDefaultFontSize","theme","rageshakeSubmitUrl","replacedUrl","createOrGetCallWidget","ecWidget","_ecWidget$data","getWidgetData","addVirtualWidget","creatorUserId","preferred","waitForIframeLoad","currentData","overwriteData","onCallEncryptionSettingsChange","_this$widget$data","getConsensusCallIntent","isCallRoom","MatrixRTCSessionEvent","MembershipsChanged","onMembershipChanged","MatrixRTCSessionManagerEvents","SessionEnded","hasEcWidget","availableOrCreatedWidget","widgetGenerationParameters","DeviceMute","onDeviceMute","destroyPersistentWidget","removeVirtualWidget","settingsStoreCallEncryptionWatcher","terminationTimer","_participants$get","resolvedSyncPromise","SyncPromise","rejectedSyncPromise","executor","_state","_handlers","_runExecutor","onfulfilled","onrejected","_executeHandlers","onfinally","isRejected","cachedHandlers","setResult","is","Qg","notifyEventProcessors","processors","hint","_notifyEventProcessors","debug_build","T","debug_logger","Yz","parsedStackResults","lastSentryKeysCount","lastNativeKeysCount","cachedFilenameDebugIds","getFilenameToDebugIdMap","stackParser","sentryDebugIdMap","worldwide","O","_sentryDebugIds","nativeDebugIdMap","_debugIds","sentryDebugIdKeys","nativeDebugIdKeys","processDebugIds","debugIdKeys","debugIdMap","debugId","parsedStack","stackFrame","prepareEvent","isolationScope","normalizeDepth","normalizeMaxBreadth","prepared","misc","eJ","lu","integrations","release","maxValueLength","constants","U","xv","exception","applyClientOptions","integrationNames","sdk","applyIntegrationsMetadata","filenameDebugIdMap","stacktrace","frames","frame","debug_id","applyDebugIds","finalScope","captureContext","esm_scope","H","getFinalScope","mechanism","M6","clientEventProcessors","getEventProcessors","scopeData","Om","attachments","eventProcessors","__sentry__","abs_path","debug_meta","images","code_file","applyDebugMeta","maxBreadth","normalized","breadcrumbs","normalize","S8","contexts","trace","flags","normalizeEvent","parseEventHintOrCaptureContext","hintIsScopeOrFunction","captureContextKeys","hintIsScopeContext","captureException","currentScopes","o5","captureEvent","startSession","rm","esm_session","fj","currentSession","getSession","qO","endSession","setSession","Vu","_sendSessionUpdate","KU","captureSession","installedIntegrations","getIntegrationsToSetup","defaultIntegrations","userIntegrations","integration","isDefaultInstance","resolvedUserIntegrations","integrationsByName","currentInstance","existingInstance","filterDuplicates","afterSetupIntegrations","afterAllSetup","setupIntegration","integrationIndex","setupOnce","preprocessEvent","processEvent","addEventProcessor","hook","getPossibleEventMessages","possibleMessages","lastException","DEFAULT_IGNORE_ERRORS","eventFiltersIntegration","mergedOptions","clientOptions","getOptions","_mergeOptions","_hint","ignoreTransactions","transaction","Xr","_isIgnoredTransaction","$X","ignoreErrors","_isIgnoredError","_isUselessError","denyUrls","_getEventFilterUrl","_isDeniedUrl","allowUrls","_isAllowedUrl","_shouldDropEvent","inboundFiltersIntegration","internalOptions","disableErrorDefaults","rootException","parent_id","_getLastValidUrl","originalFunctionToString","SETUP_CLIENTS","functionToStringIntegration","Function","originalFunction","instrumented","addHandler","typeHandlers","maybeInstrument","instrumentFn","triggerHandlers","qQ","_filter","instrumentConsole","Ow","GS","originalConsoleMethod","Z9","firstArg","isFiltered","WINDOW","_isFetchSupported","Headers","Request","Response","isNativeFunction","instrumentFetch","onFetchResolved","skipNativeFetchCheck","EdgeRuntime","sandbox","head","contentWindow","supportsNativeFetch","originalFetch","virtualError","method","fetchArgs","resource","getUrlFromResource","hasProp","ks","parseFetchArgs","handlerData","fetchData","startTimestamp","zf","headers","getHeadersFromFetchArgs","endTimestamp","bJ","my","enhanceOption","enhanceFetchErrorMessages","hostname","requestArgument","optionsArgument","DEFAULT_BREADCRUMBS","addBreadcrumb","breadcrumb","beforeBreadcrumb","maxBreadcrumbs","mergedBreadcrumb","finalBreadcrumb","pq","browser_WINDOW","getLocationHref","severityLevelFromString","getBreadcrumbLogLevelFromHttpStatusCode","parseUrl","relative","types_WINDOW","debounceTimerID","lastCapturedEventType","lastCapturedEventTargetId","instrumentDOM","triggerDOMHandler","globalDOMEventHandler","makeDOMEventHandler","globalObject","originalAddEventListener","__sentry_instrumentation_handlers__","handlerForType","refCount","originalRemoveEventListener","globalListener","getEventTarget","isContentEditable","shouldSkipDOMEvent","_sentryId","isSimilarToLastCapturedEvent","SENTRY_XHR_DATA_KEY","instrumentXHR","XMLHttpRequest","xhrproto","Proxy","originalOpen","xhrOpenThisArg","xhrOpenArgArray","Kg","parseXhrUrlArg","request_headers","__sentry_own_request__","onreadystatechangeHandler","xhrInfo","readyState","status_code","xhr","onreadystatechange","originalOnreadystatechange","onreadystatechangeThisArg","onreadystatechangeArgArray","setRequestHeader","originalSetRequestHeader","setRequestHeaderThisArg","setRequestHeaderArgArray","originalSend","sendThisArg","sendArgArray","sentryXhrData","lastHref","addHistoryInstrumentationHandler","instrumentHistory","historyReplacementFunction","originalHistoryFunction","urlOrPath","origin","getAbsoluteUrl","accessors","getOwnPropertyDescriptor","_safeRead","htmlTreeAsString_htmlTreeAsString","currentElem","MAX_TRAVERSE_HEIGHT","sepLength","nextStr","keyAttrs","maxStringLength","htmlTreeAsString_htmlElementAsString","keyAttrPairs","keyAttr","keyAttrPair","debug_build_DEBUG_BUILD","__SENTRY_DEBUG__","helpers_WINDOW","ignoreOnError","shouldIgnoreOnError","wrap","__sentry_wrapped__","sentryWrapped","_sentryWrappedDepth","wrappedArguments","v4","gO","property","pO","configurable","getHttpRequestData","referrer","Referer","MAX_ALLOWED_STRING_LENGTH","breadcrumbsIntegration","dom","sentry","removeHandler","addConsoleInstrumentationHandler","gt","_getConsoleBreadcrumbHandler","componentName","serializeAttribute","_isEvent","maxTraverseHeight","getComponentName","_getDomBreadcrumbHandler","addXhrInstrumentationHandler","_getXhrBreadcrumbHandler","addFetchInstrumentationHandler","_getFetchBreadcrumbHandler","parsedLoc","parsedFrom","parsedTo","_getHistoryBreadcrumbHandler","_getSentryBreadcrumbHandler","safeSetSpanJSONAttributes","spanJSON","newAttributes","originalAttributes","httpContextIntegration","reqData","processSegmentSpan","spanOp","semanticAttributes","uT","dedupeIntegration","currentMessage","previousMessage","_isSameFingerprint","_isSameStacktrace","_isSameMessageEvent","previousException","_getExceptionFromEvent","currentException","_isSameExceptionEvent","dedupe_shouldDropEvent","currentFrames","RV","previousFrames","frameA","frameB","lineno","colno","function","currentFingerprint","previousFingerprint","conversationIdIntegration","getScopeData","isolationScopeData","conversationId","spanUtils","et","Fy","initAndBind","clientClass","initialScope","setClient","setCurrentClient","getBaseApiEndpoint","getEnvelopeEndpointWithUrlEncodedAuth","tunnel","sdkInfo","projectId","_getIngestEndpoint","sentry_version","sentry_key","sentry_client","_encodedAuth","createMetricContainerEnvelopeItem","inferUserData","inferSetting","item_count","content_type","isBrowser","ingest_settings","infer_ip","infer_user_agent","_INTERNAL_flushMetricsBuffer","maybeMetricBuffer","metricBuffer","_INTERNAL_getMetricBuffer","envelope","metadata","utils_dsn","SB","utils_envelope","h4","createMetricEnvelope","_metadata","getDsn","getDataCollectionOptions","userInfo","_getBufferMap","sendEnvelope","carrier","BY","spanJsonToSerializedStreamedSpan","streamedSpan","trace_id","span_id","parent_span_id","start_timestamp","end_timestamp","is_segment","PL","safeUnref","unref","SENTRY_BUFFER_FULL_ERROR","Symbol","makePromiseBuffer","task","taskProducer","drain","drainPromise","allSettled","logIgnoredSpan","droppedSpan","should_ignore_span_shouldIgnoreSpan","ignoreSpans","isStringOrRegExp","_c","hasAttributes","nameMatches","opMatches","attrsMatch","valuePattern","_matchesAttributeValue","actual","pat","reparentChildSpans","dropSpan","droppedSpanParentId","droppedSpanId","PII_HEADER_SNIPPETS","DEFAULTS","cookies","httpHeaders","httpBodies","queryParams","genAI","outputs","stackFrameVariables","frameContextLines","resolveDataCollectionOptions","dataCollection","sendDefaultPii","deny","dc","ALREADY_SEEN_ERROR","MISSING_RELEASE_FOR_SESSION_ERROR","INTERNAL_ERROR_SYMBOL","DO_NOT_SEND_EVENT_SYMBOL","_makeInternalError","_makeDoNotSendEventError","_isInternalError","_isDoNotSendEventError","setupWeightBasedFlushing","afterCaptureHook","flushHook","estimateSizeFn","flushFn","flushTimeout","isTimerActive","flushInterval","_flushInterval","Client","_integrations","_numProcessing","_outcomes","_hooks","_eventProcessors","_promiseBuffer","transportOptions","bufferSize","_dataCollection","_dsn","AD","_transport","recordDroppedEvent","enableLogs","_experiments","estimateLogSizeInBytes","internal","lt","enableMetrics","estimateMetricSizeInBytes","GR","hintWithEventId","_process","eventFromException","_captureEvent","captureMessage","currentScope","eventMessage","NF","isMessage","sO","promisedEvent","eventFromMessage","originalException","sdkProcessingMetadata","capturedSpanScope","capturedSpanIsolationScope","dataCategory","getDataCategoryByType","sendSession","getSdkMetadata","getTransport","clientFinished","_isClientDoneProcessing","transportFlushed","eventProcessor","_isEnabled","_setupIntegrations","getIntegrationByName","integrationName","getIntegrationNames","addIntegration","isAlreadyInstalled","beforeSetup","genAiSpanItem","hasGenAiSpans","streamGenAiSpans","traceLifecycle","hasSpanStreamingEnabled","genAiSpans","remainingSpans","extractGenAiSpansFromEvent","Cj","newSdkInfo","eventSdkInfo","packages","_enhanceEventWithSdkInfo","envelopeHeaders","n2","eventItem","createEventEnvelope","attachment","W3","bm","sendResponse","clientReleaseOption","clientEnvironmentOption","sessionAttrs","sent_at","randomSafeContext","Wk","envelopeItem","toJSON","createSessionEnvelope","sendClientReports","hookCallbacks","uniqueCallback","callbacks","registerCleanup","setupIntegrations","_updateSessionFromEvent","crashed","errored","exceptions","sessionNonTerminal","errors","ticked","_prepareEvent","setLastEventId","vn","dynamicSamplingContext","tracing_dynamicSamplingContext","ao","isErrorEvent","_processEvent","finalEvent","sampleRate","isTransaction","isTransactionEvent","isError","beforeSendLabel","parsedSampleRate","rate","parseSampleRate","hY","beforeSend","beforeSendTransaction","beforeSendSpan","_streamed","processedEvent","rootSpanJson","profile_id","E1","exclusive_time","jG","measurements","convertTransactionEventToSpanJson","processedRootSpanJson","xl","processedSpans","initialSpans","processedSpan","droppedSpans","spanCountBefore","spanCountBeforeProcessing","processBeforeSend","beforeSendResult","invalidValueError","Qd","_validateBeforeSendResult","spanCount","droppedSpanCount","transactionInfo","transaction_info","_clearOutcomes","outcomes","quantity","_flushOutcomes","discarded_events","clientReportItem","createClientReportEnvelope","metric","estimateAttributesSizeInBytes","estimatePrimitiveSizeInBytes","addAutoIpAddressToSession","ip_address","ipAddress","_enhanceErrorWithSentryInfo","__sentry_fetch_url_host__","hasSentryFetchUrlHost","eventbuilder_exceptionFromError","eventbuilder_parseStackFrames","extractType","extractMessage","eventFromPlainObject","syntheticException","isUnhandledRejection","errorFromProp","__serialized__","cd","xH","getNonErrorObjectExceptionValue","eventFromError","skipLines","reactMinifiedRegexp","getSkipFirstStackStringLines","framesToPop","getPopFirstTopFrames","isWebAssemblyException","WebAssembly","Exception","eventbuilder_eventFromUnknownInput","attachStacktrace","T2","BD","W6","domException","firstException","synthetic","eventFromString","__sentry_template_string__","__sentry_template_values__","logentry","HF","captureType","getPrototypeOf","eventbuilder_getObjectClassName","BrowserClient","optionsArg","__SENTRY_RELEASE__","SENTRY_RELEASE","parentSpanIsAlwaysRootSpan","M","applySdkMetadata","SENTRY_SDK_SOURCE","enableMetricsOption","eventbuilder_eventFromMessage","platform","DEFAULT_EVENT_TARGET","browserApiErrorsIntegration","eventTarget","unregisterOriginalCallbacks","_wrapTimeFunction","_wrapRAF","_wrapXHR","eventTargetOption","integrationOptions","original","handleEvent","unregisterOriginalCallback","originalEventHandler","_wrapEventTarget","originalCallback","wrapOptions","addPageListener","removePageListener","browserSessionIntegration","lifecycle","ignoreDuration","initialSessionSent","rIC","requestIdleCallback","called","runOnce","once","whenIdleOrHidden","previousUser","addScopeListener","maybeNewUser","cultureContextIntegration","culture","getCultureContext","calendar","intl","resolvedOptions","_oldOnErrorHandler","instrumentError","__SENTRY_INSTRUMENTED__","_oldOnUnhandledRejectionHandler","instrumentUnhandledRejection","onunhandledrejection","globalHandlersIntegration","stackTraceLimit","addGlobalErrorInstrumentationHandler","ev0","ev0s","ev0sf","getFilenameFromUrl","in_app","_enhanceEventWithInitialFrame","_installGlobalOnErrorHandler","globalHandlerLog","addGlobalUnhandledRejectionInstrumentationHandler","_getUnhandledRejectionError","_installGlobalOnUnhandledRejectionHandler","includeDataPrefix","isBase64","dataStart","dataPrefix","stripDataUrlContent","applyAggregateErrorsToEvent","exceptionFromErrorImplementation","tH","aggregateExceptionsFromError","prevExceptions","exceptionId","newExceptions","applyExceptionGroupFieldsForParentException","newException","newExceptionId","applyExceptionGroupFieldsForChildException","isExceptionGroup","childError","is_exception_group","exception_id","parentId","linkedErrorsIntegration","createFrame","chromeRegexNoFnName","chromeRegex","chromeEvalRegex","chromeDataUriRegex","geckoREgex","geckoEvalRegex","defaultStackLineParsers","dataUriMatch","noFnParts","subMatch","extractSafariExtensionDetails","defaultStackParser","gd","isSafariExtension","isSafariWebExtension","updateRateLimits","updatedRateLimits","rateLimitHeader","retryAfterHeader","retryAfter","namespaces","headerDelay","delay","headerDate","parseRetryAfterHeader","createTransport","rateLimits","filteredEnvelopeItems","yH","zk","disabledUntil","isRateLimited","filteredEnvelope","recordEnvelopeLoss","hP","bN","esm_debug_build_DEBUG_BUILD","cachedImplementations","getNativeImplementation","cached","impl","makeFetchTransport","nativeFetch","pendingBodySize","pendingCount","requestSize","requestOptions","referrerPolicy","keepalive","fetchOptions","HTML_ELEMENT_CONSTRUCTOR_NAME_REGEX","normalizeStringifyValue","wat","isElement","objName","getConstructorName","checkAndWarnIfIsEmbeddedBrowserExtension","_window","nw","extensionObject","runtime","_isEmbeddedBrowserExtension","shouldDisableBecauseIsBrowserExtenstion","skipBrowserExtensionCheck","vk","Ip","getStorageContext","storage","persisted","hasStorageAccess","estimate","quota","usage","usageDetails","getUserContext","username","enabled_labs","getEnabledLabs","low_bandwidth","enabledLabs","getFeatureSettingNames","getCryptoContext","_await$cryptoApi$getC","ownDeviceKeys","curve25519","sessionBackupKeyFromCache","crypto_version","device_keys","cross_signing_ready","cross_signing_key","getCrossSigningKeyId","cross_signing_privkey_in_secret_storage","cross_signing_master_privkey_cached","cross_signing_user_signing_privkey_cached","secret_storage_ready","secret_storage_key_in_account","session_backup_key_in_secret_storage","session_backup_key_cached","session_backup_key_well_formed","getDeviceContext","_client$deviceId","mx_local_settings","exportForRageshake","missingFeatures","getContexts","user_text","issue_url","Sentry","setSentryUser","setUser","initSentry","process","tracesSampleRate","mxSendSentryReport","eventDiff","isMemberEvent","isMembershipChanged","isJoin","isPart","isJoinToJoin","isDisplaynameChange","isAvatarChange","memberEventDiff","dialogs_SlashCommandHelpDialog","SlashCommandHelpDialog","successSync","canAffectPowerlevels","singleMxcUpload","fileSelector","onchange","_target$files","shouldContinue","isCurrentLocalRoom","splitAtFirstSpace","trimmedArgs","trimStart","admin","advanced","_opts$runFn","runFn","getCommandWithArgs","_this$renderingTypes","getUsage","_this$_isEnabled","_this$_isEnabled2","updatePowerLevelHelper","updatePowerLevel","deop","openRoom","autoJoin","isPermalink","parsedUrl","permalinkParts","_openRoom","goto","_openRoom2","upgraderoom_upgraderoom","_threadId","parsedArgs","additionalCreators","parseUpgradeRoomArgs","upgradeRoom","runUpgradeRoomCommand","_cli","statusCommand","emojiText","additionalSegment","Segmenter","userStatusTextWithinMaxLength","upgraderoom","unixTimestamp","inputDate","timestampToEvent","setDisplayName","setAvatarUrl","prom","useDefault","targetRoomId","_rooms$find","leaveRoomBehaviour","AddIntegrations","widgetUrl","_embed$childNodes","canUserModifyWidgets","nowMs","encodeURIComponent","CUSTOM","jitsiData","parsePreferredConferenceUrl","getLocalJitsiWrapperUrl","setRoomWidget","forceDiscardSession","_cli$getRoom2","isPhoneNumber","sendTextMessage","effect","trimmedInput","withoutSlash","AsyncStoreWithClient","_instance","updateRoom","setMaxListeners","fetchTransports","configuredMatrixRTCTransports","_unstable_getRTCTransports","_this$matrixClient$ge","waitForClientWellKnown","foci","getClientWellKnown","onReady","SessionStarted","onRTCSessionStart","onWidgets","uncleanlyDisconnectedRoomIds","_this$getCall","uncleanlyDisconnectedRoomId","onNotReady","_this$matrixClient","listenerMap","callListeners","_connectedCalls","inUpdateRoom","onDestroy","_this$calls$get","getAllCalls","eventIdMap","findAndSetNotificationEvent","populateMap","callMap","_await$getLastRtcNoti","getLastRtcNotificationEvent","callMembershipEventId","callMemberEventId","onNewEvent","_event$getRelation2","getDecryptionPromise","getNotificationEventId","NonUrgentToastStore","toasts","addToast","removeToast","OwnBeaconStoreEvent","CREATED_BEACONS_KEY","getLocallyCreatedBeaconEventIds","ids","_window$localStorage$","OwnBeaconStore","getLiveBeaconIds","beaconHasLocationPublishError","beaconId","counts","beaconLocationPublishErrorCounts","incrementBeaconLocationPublishErrorCount","publishCurrentLocationToBeacons","liveBeaconIds","_this$beaconsByRoomId","beaconsByRoomId","beacons","_beacon$beaconInfo","beaconIdentifier","updateBeaconEvent","removeLocallyCreateBeaconEventId","beaconInfoId","addBeacon","checkLiveness","monitorLiveness","stopBeacon","_this$beaconsByRoomId2","removeBeacon","clearBeacons","initialiseBeaconState","locallyCreatedBeaconEventIds","prevLiveBeaconIds","sortBeaconsByLatestCreation","arrayDiff","isMonitoringLiveLocation","togglePollingLocation","beaconInfoContent","existingLiveBeaconIdsForRoom","unstable_createLiveBeacon","storeLocallyCreateBeaconEventId","startPollingLocation","stopPollingLocation","clearPositionWatch","watchPosition","onWatchedPosition","onGeolocationError","locationInterval","lastPublishedPositionTimestamp","MonitoringLivePosition","timedGeoPosition","mapGeolocationPositionToTimedGeo","debouncedPublishLocationToBeacons","publishLocationToBeacons","GeolocationError","Unavailable","PermissionDenied","getCurrentPosition","assetType","updateContent","unstable_setLiveBeacon","beaconUpdateErrors","BeaconUpdateError","healthyLiveBeaconIds","sendLocationToBeacon","hadError","_this$beaconLocationP","LocationPublishError","onBeaconLiveness","onNewBeacon","onUpdateBeacon","onDestroyBeacon","onRoomStateMembers","dynamicWatcherRef","reinitialiseBeaconState","_OwnBeaconStore","ContextTransactionState","EchoContext","Whenable","NotStarted","AllSuccessful","txn","transactions","TransactionStatus","didPreviouslyFail","PendingErrors","Pending","notifyCondition","_transactions","firstFailedTime","failedTxn","disownTransaction","checkTransactions","beginTransaction","auditName","EchoTransaction","whenAnything","when","Success","RoomEchoContext","offline","ServerOfflineDialog","EchoStore","onEchosUpdated","renderTimeline","NonUrgentEchoFailureToast","openDialog","roomContextKey","caches","getOrCreateChamberForRoom","checkContexts","echo","RoomEchoChamber","hasOrHadError","toastRef","updateState","didFail","_status","setStatus","implicitlyReverted","GenericEchoChamber","lookupFn","oldClient","onClientChanged","cacheVal","decacheKey","markEchoReceived","targetVal","revertFn","ctxn","properties","PushRules","updateNotificationVolume","newClient","onAccountData","Muted","NotificationState","watcherReferences","_symbol","_count","_muted","_knocked","_invited","isUnread","hasMentions","emitIfUpdated","isDifferentFrom","NotificationStateSnapshot","watcherReference","isInvitation","before","after","ListNotificationState","byTileCount","getRoomFn","calculateTotalState","setRooms","oldRooms","onRoomNotificationStateUpdate","getForRoom","RoomNotificationState","updateNotificationState","readReceiptChangeIsFor","MARKED_UNREAD_TYPE_STABLE","MARKED_UNREAD_TYPE_UNSTABLE","handleReadReceipt","handleMembershipUpdate","LocalEchoUpdated","handleLocalEchoUpdated","handleRoomEventUpdate","handleRoomAccountDataUpdate","UnreadNotifications","handleNotificationCountUpdate","handleAccountDataUpdate","isMention","isUnsentMessage","isActivityNotification","hasAnyNotificationOrActivity","isNotification","RoomNotifs","SummarizedNotificationState","numUnreadStates","totalStatesWithUnread","includeSymbol","UPDATE_STATUS_INDICATOR","emitUpdateIfStateChanged","forceEmit","globalState","numFavourites","isRoomVisible","DefaultTagID","Favourite","_globalState","testInstance","getListState","tagId","listMap","useTileCount","roomMap","onSync","_this$matrixClient2","convertToStorePanel","cacheRoom","storeHistory","panelState","_panelState$state","_state$threadHeadEven","_state$memberInfoEven","_state$initialEvent","_state$member","threadHeadEventId","threadHeadEvent","memberInfoEventId","memberInfoEvent","memberId","convertCardToStore","convertToStatePanel","storeRoom","stateHistory","panelStateStore","_panelStateStore$stat","stateStored","convertStoreToCard","ReadyWatchingStore","_this$currentCard","pendingRequest","pendingVerificationRequestForUser","emitAndUpdateSettings","byRoom","viewedRoomId","VerificationRequestReceived","onVerificationRequestUpdate","loadCacheFromSettings","onDispatcherAction","changePayload","handleViewedRoomChange","FocusMessageSearch","RoomSummary","focusRoomSearch","_this$byRoom$isOpen","_this$byRoom","_this$viewedRoomId","_this$byRoom$roomId$i","_this$byRoom$roomId","_this$byRoom$history","_this$byRoom2","_this$viewedRoomId2","hist","_this$byRoom$roomId$h","_this$byRoom$roomId2","allowClose","_redirect$phase","_redirect$state","_card$state","_this$currentCardForR","_this$currentCardForR2","rId","redirect","getVerificationRedirect","targetPhase","cardState","isPhaseValid","_this$byRoom$rId$hist","_this$byRoom$rId","generateHistoryForPhase","setCards","cards","_c$state","_redirect$phase2","_redirect$state2","pState","roomCache","removedCard","_ref7","_ref8","showOrHidePhase","isCardStateValid","ThreadPanel","ThreePidMemberInfo","getPhasesForPhase","_this$mxClient","_ref9","_this$global","_ref0","_this$byRoom$this$vie","filterValidCards","storePanelGlobal","panelThisRoom","storePanelThisRoom","ROOM_DEVICE","rightPanelForRoom","_card$state2","_card$state3","_card$state4","_card$state5","_card$state6","_card$state7","_card$state8","_card$state9","ThreadView","Widget","_this$currentCard2","_this$currentCard3","_this$viewedRoomId3","panel","BaseRecencySorter","tsCache","comparator","roomA","roomB","exceptionalOrdering","getScore","roomALastTs","_cache$room$roomId","getLastTimestamp","RecencySorter","SortingAlgorithm","Recency","isLowPriority","LowPriority","AlphabeticSorter","Alphabetic","UnreadSorter","Unread","roomNotificationState","RoomNode","isInActiveSpace","_isInActiveSpace","checkIfRoomBelongsToActiveSpace","isRoomInSpace","doesRoomMatchFilters","filterKeys","filterKeysSet","applyFilters","filters","shouldPromote","Level","_size","setNext","generateNextLevel","nextLevelSentinel","insertAtHead","existingNode","SortedRoomIterator","SortedSpaceFilteredIterator","iterator","RoomSkipList","sorter","levels","roomNodeMap","sortedRoomNodes","currentLevel","calculateActiveSpaceForNodes","initialized","useNewSorter","useNewFilters","removeRoom","reInsertRoom","addNewRoom","insertRoom","insertionNodes","levelObj","getRoomsInActiveSpace","activeSortAlgorithm","ExcludeTagsFilter","FilterEnum","TagFilter","FILTERS","FavouriteFilter","UnreadFilter","PeopleFilter","RoomsFilter","InvitesFilter","MentionsFilter","LowPriorityFilter","RoomListStoreV3Event","LISTS_UPDATE_EVENT","ListsUpdate","LISTS_LOADED_EVENT","ListsLoaded","SECTION_CREATED_EVENT","SectionCreated","ROOM_TAGGED_EVENT","RoomTagged","RoomListStoreV3Class","UPDATE_SELECTED_SPACE","onActiveSpaceChanged","UPDATE_HOME_BEHAVIOUR","onOrderedCustomSectionsChange","loadCustomSections","scheduleEmit","isLoadingRooms","_this$roomSkipList","roomSkipList","getSortedRooms","_this$roomSkipList2","getSortedRoomsInActiveSpace","_this$roomSkipList$ge","_this$roomSkipList3","spaceId","sections","getSections","CHATS_TAG","getRoomsWithTagInActiveSpace","getTagsForRoom","getServerNoticeRooms","ServerNotice","DM","resort","getSorterFromSortingAlgorithm","_this$roomSkipList4","_this$roomSkipList5","getPreferredSorter","getSkipListFilters","storeReadyPromise","_this$roomSkipList6","addRoomAndEmit","event_type","handleAccountDataPayload","isLiveEvent","isLiveUnfilteredRoomTimelineEvent","_getMember","oldMembership","newMembership","getEffectiveMembershipTag","isKicked","roomUpgradeHistory","getRoomUpgradeHistory","predecessors","AfterForgetRoom","needsEmit","dmMap","_this$roomSkipList7","possibleMuteChangeRoomIds","actionPayload","_actionPayload$event","_prevEvent$getContent","prevEvent","roomPushRules","prevRoomPushRules","getChangedOverrideRoomMutePushRules","_this$roomSkipList8","pendingEmit","isNewRoom","tagsToExclude","sortedTags","tagFilters","filterByTag","_this$filterByTag$get","_this$roomSkipList9","section","createSection","editSection","removeSection","deleteSection","reorderSection","sourceTag","targetTag","orderedSectionTags","reorderable","getOrderedReorderableSections","getRoomListStoreV3","RoomListCustomisations","CreateSectionDialog","sectionToEdit","isEdition","isInvalid","mx_CreateSectionDialog_edition","TextControl","required","RemoveSectionDialog","CUSTOM_SECTION_TAG_PREFIX","isCustomSectionTag","isDefaultSectionTag","isSectionTag","getCustomSectionData","raw","isValidCustomSection","enabledMetaSpaces","spacePanelSpaces","sectionData","rawValue","customData","isReorderableSection","shouldCreateSection","newSection","chatsIndex","shouldEditSection","isSameName","shouldRemoveSection","newOrderedSections","sectionTag","ordered","fromIndex","newToIndex","shouldCauseReorder","mainTimelineLastTs","_timeline$0$getTs","_timeline$","bumpStamp","getBumpStamp","_r$getLiveTimeline$ge","membershipEvent","threadLastEventTimestamps","_thread$replyToEvent","_event$getTs","SpaceNotificationState","getFirstRoomWithNotifications","_Object$values$find","setHasDiff","midPointsBetweenStrings","maxLen","alphabet","DEFAULT_ALPHABET","padN","padA","alphabetPad","padB","baseA","stringToBase","baseB","BigInt","baseToString","reorderLexicographically","orders","toIndex","_newOrder","_newOrder2","_newOrder$order","_newOrder4","_newOrder$order2","_newOrder5","ordersWithIndices","newOrder","moveElement","orderToLeftUndefined","leftBoundIdx","rightBoundIdx","canMoveLeft","nextBase","MAX_VALUE","_newOrder$i","firstOrderBase","bigToIndex","canDisplaceRight","canMoveRight","_newOrder3","_newOrder$rightBoundI","prevBase","MIN_VALUE","_newOrder$i2","leftDiff","rightDiff","prevOrder","traverseSpaceDescendants","spaceDescendantMap","flatSpace","descendentSpaces","descendantSpaceId","flattenSpaceHierarchy","spaceEntityMap","flattenedSpaceIds","flattenedRooms","flattenSpaceHierarchyWithCache","useCache","ACTIVE_SPACE_LS_KEY","metaSpaceOrder","Orphans","VideoRooms","getSpaceContextKey","partitionSpacesAndRooms","validOrder","charCode","getChildOrder","_validOrder","NaN","EnhancedMap","roomIdsBySpace","userIdsBySpace","getRoomHierarchy","viaMap","children_state","_ev$content$via","getOrCreate","room_type","includeDescendantSpaces","allRoomsInHome","_msc3946ProcessDynamicPredecessor","getAggregatedRoomIdsBySpace","childSpacesBySpace","getAggregatedUserIdsBySpace","_aggregatedSpaceCache","rootSpace","unseen","joinedSpaces","unseenSpaces","subspace","rootSpaces","detachedNodes","markTreeChildren","detachedNode","visibleSpaces","invitedSpaces","findRootSpaces","oldRootSpaces","sortRootSpaces","onRoomsUpdate","arrayHasOrderChange","UPDATE_TOP_LEVEL_SPACES","oldInvitedSpaces","_invitedSpaces","UPDATE_INVITED_SPACES","parentMap","showInHomeSpace","switchSpaceIfNeeded","rebuildHomeSpace","orphans","_this$parentMap$get","dmBadgeSpace","flattenedRoomsForSpace","getSpaceFilteredRoomIds","getNotificationState","_this$parentMap$get2","inSpace","isInSpace","_this$userIdsBySpace$","_this$userIdsBySpace$2","affectedParentSpaceIds","getKnownParents","prevRoomsBySpace","prevUsersBySpace","prevChildSpacesBySpace","rebuildParentMap","rebuildMetaSpaces","hiddenChildren","getParents","traverseSpace","parentPath","_hiddenChildren$get","childSpaces","childRooms","newPath","childSpace","expandedRoomIds","roomDiff","mapDiff","userDiff","spaceDiff","roomsChanged","changed","usersChanged","spacesChanged","changeSet","changedId","updateNotificationStates","_this$matrixClient3","switchToRelatedSpace","_this$getCanonicalPar","suggestedRooms","getCanonicalParent","_this$rootSpaces$find","setActiveSpace","goToFirstSpace","roomMembership","_this$parentMap$get3","rebuildSpaceHierarchy","numSuggestedRooms","_suggestedRooms","UPDATE_SUGGESTED_ROOMS","_this$matrixClient4","loadSuggestedRooms","SpaceParent","_this$matrixClient5","getDMRoomsForUserId","onMemberUpdate","lastEv","SpaceOrder","_ev$getContent","_lastEv$getContent","spaceOrderLocalEchoMap","notifyIfOrderChanged","prevEv","_prevEv$getContent","previousRooms","flat","currentRooms","_this$matrixClient6","onRoomDmChange","_space$getAccountData","_storeReadyDeferred","_enabledMetaSpaces","_activeSpace","_this$matrixClient7","_allRoomsInHome","setActiveRoomInSpace","_this$matrixClient8","contextSwitch","cliSpace","spacePanelItems","_cliSpace","_cliSpace2","_this$matrixClient$ge2","getLastSelectedRoomIdForSpace","_this$matrixClient9","fetchSuggestedRooms","_this$matrixClient0","childEvents","_ev$getContent2","canonicalOnly","_this$matrixClient1","canonical","_sortBy","parents","includeAncestors","_this$getSpaceFiltere","_this$getSpaceFiltere2","_this$matrixClient10","dmPartner","getSpaceFilteredUserIds","isDm","_this$roomIdsBySpace$","homeRooms","_this$roomIdsBySpace$2","_this$roomIdsBySpace$3","notificationStateMap","onRoomAccountData","oldMetaSpaces","sendUserProperties","lastSpaceId","_this$enabledMetaSpac","_this$spacePanelSpace","_payload$justCreatedO","_payload$room_id","AfterLeaveRoom","SwitchSpace","numMetaSpaces","hadHomeEnabled","hasHomeEnabled","includeRooms","getSpaceTagOrdering","setRootSpaceOrder","_this$matrixClient11","moveRootSpace","currentOrders","ElementWidgetCapabilities","WidgetOpenIDPermissionsDialog","onPermissionSelection","rememberSelection","allowed","setOIDCState","widgetKind","inRoomId","OIDCState","Allowed","Denied","templateUrl","onAllow","onDeny","additive","onRememberSelectionChange","GENERIC_WIDGET_KIND","CapabilityText","bylineFor","eventCap","EventKind","keyStr","capability","simpleCaps","textForKind","primary","isTimelineCapability","isTimelineCapabilityFor","Symbols","AnyRoom","getTimelineRoomIDFromCapability","_room$getCanonicalAli","WidgetEventCapability","findEventCapabilities","Event","forRoomMessageCap","evSendRecv","stateSendRecvCaps","nonStateSendRecvCaps","textForDirection","WidgetKind","EventDirection","Send","byline","MatrixCapabilities","AlwaysOnScreen","StickerSending","CanChangeViewedRoom","MSC2931Navigate","MSC4039DownloadFile","Receive","WidgetCapabilitiesPromptDialog","newStates","objectShallowClone","booleanStates","closeAndTryRemember","cap","requestedCapabilities","eventPermissionsMap","approved","remember","checkboxRows","capA","capB","isTimelineA","lexicographicCompare","onReject","normalizeTurnServer","credential","uris","ElementWidgetDriver","WidgetDriver","forWidget","forWidgetKind","virtual","allowedCapabilities","Screenshots","RequiresClient","STICKERPICKER","Account","stickerSendingCap","forRoomEvent","MSC3846TurnServers","MSC4157SendDelayedEvent","MSC4157UpdateDelayedEvent","MSC4407SendStickyEvent","MSC4407ReceiveStickyEvent","forStateEvent","clientUserId","clientDeviceId","sendRoomEvents","CallNotify","sendRecvRoomEvents","RTCMembership","sendRecvToDevice","CallCandidates","CallNegotiate","CallSDPStreamMetadataChanged","CallSDPStreamMetadataChangedPrefix","CallReplaces","CallEncryptionKeysPrefix","forToDeviceEvent","validateCapabilities","missing","allowedSoFar","widgetLifecycle","preapproveCapabilities","toWidgetDescriptor","WidgetPermissionCustomisations","approvedCapabilities","WidgetLifecycle","CapabilitiesRequest","rememberApproved","_result$approved","allAllowed","arrayIntersection","iterableIntersection","caps","setRememberedCapabilitiesForWidget","getSendEventTarget","_content$mRelates_to","THREAD_RELATION_TYPE","sendStickyEvent","stickyDurationMs","readStickyEvents","stickyEvents","getSendDelayedEventOpts","parentDelayId","parent_delay_id","sendDelayedEvent","delayOpts","_unstable_sendDelayedStateEvent","_unstable_sendDelayedEvent","delayId","delay_id","sendDelayedStickyEvent","_unstable_sendStickyDelayedEvent","cancelScheduledDelayedEvent","_unstable_cancelScheduledDelayedEvent","restartScheduledDelayedEvent","_unstable_restartScheduledDelayedEvent","sendScheduledDelayedEvent","_unstable_sendScheduledDelayedEvent","sendToDevice","encrypted","contentMap","invertedContentMap","userContentMap","stringifiedContent","recipients","batch","encryptToDeviceMessages","queueToDevice","readRoomTimelineIterator","since","resultCount","readRoomTimeline","readRoomState","askOpenID","observer","preapproveIdentity","legacyOpts","IdentityRequest","OpenIDRequestState","oidcState","getOIDCState","getToken","Blocked","PendingUserConfirmation","navigate","navigateToPermalink","pollingTurnServers","setTurnServer","onTurnServers","onTurnServersError","TurnServers","TurnServersError","initialTurnServer","readEventRelations","prevBatch","limited","getMediaConfig","uploadFile","contentUri","downloadSource","getKnownRooms","processError","matrix_api_error","asWidgetApiErrorData","ELEMENT_CLIENT_ID","ModalWidgetDialog","ThemeWatcher","disabledButtonIds","widgetDefinition","_this$state$messaging","themeWatcher","ThemeWatcherEvent","onThemeChange","getEffectiveTheme","sendWidgetConfig","WidgetApiFromWidgetAction","CloseModalWidget","onWidgetClose","SetModalButtonEnabled","onButtonEnableToggle","_this$state$messaging2","updateTheme","_this$state$messaging4","_this$state$messaging3","BuiltInModalButtonID","possibleButtons","buttonIds","tempSet","ElementWidget","sourceWidgetId","driver","ClientWidgetApi","appFrame","_OwnProfileStore$inst","_OwnProfileStore$inst2","_this$widget$name","templated","getCompleteUrl","widgetRoomId","userDisplayName","OwnProfileStore","userHttpAvatarUrl","getHttpAvatarUrl","clientId","clientTheme","clientLanguage","searchParams","ModalButtonKind","Primary","Secondary","Danger","isDisabled","_this$state$messaging5","notifyModalWidgetButtonClicked","widgetDomain","ModalWidgetStore","modalInstance","requestData","sourceWidget","openSourceWidgetId","openSourceWidgetRoomId","closeModalWidget","sourceMessaging","getMessaging","notifyModalWidgetClose","_ModalWidgetStore","mxModalWidgetStore","rawDefinition","_super$rawData","forLocalRender","rawData","popoutTemplateUrl","_super$rawData2","conferenceId","customTheme","getCustomTheme","is_dark","asPopout","runTemplate","WidgetMessaging","_options$room","WeakSet","_this$widgetApi","_this$widgetApi2","_this$widgetApi3","canOpenModalWidget","openModalWidget","_SDKContextClass$inst","setViewedRoomId","feedEvent","feedStateUpdate","encryptionInfo","_this$widgetApi4","feedToDevice","userWidget","isAppWidget","stickyPromise","embedUrl","runUrlTemplate","popoutUrl","_WidgetVariableCustom","_WidgetVariableCustom2","_this$client$getDevic","fromCustomisation","WidgetVariableCustomisations","provideVariables","defaults","scalarToken","_SDKContextClass$inst2","OpenModalWidget","onOpenModal","onRoomViewStoreUpdate","_this$widgetApi6","_this$widgetApi5","_this$widgetApi7","hasCapability","roomEvent","readUpToMap","onStateUpdate","ReceivedToDeviceMessage","onToDeviceMessage","UpdateAlwaysOnScreen","_this$widgetApi8","_this$roomId","SendSticker","_this$widgetApi9","OpenIntegrationManager","_this$widgetApi0","_IntegrationManagers$","integType","integId","_ev$detail$data","_this$widgetApi1","errorMessage","_WidgetVariableCustom3","_WidgetVariableCustom4","isReady","isScalarUrl","defaultManager","apiUrl","scalar","getScalarToken","forceDestroy","_this$roomId2","_this$widgetApi10","_this$widgetApi11","getWidgetPersistence","Stop","stopMessaging","relatesToUnknown","isFromInvite","advanceReadUpToMarker","evId","upToEventId","timelineEvent","eventsToFeed","packSettingKey","_settings$deny","_settings$allow","settingsKey","Unknown","currentValues","TOAST_KEY","showToast","fromMessageSend","primaryLabel","onPrimaryClick","getLocalNotificationAccountDataEventType","is_silenced","secondaryLabel","onSecondaryClick","GenericToast","hideToast","responseData","_info$mimetype$split$","_info$mimetype","dataArray","encrypt","getBlobSafeMimeType","resourceLimitStrings","monthly_active_user","hs_blocked","adminContactStrings","messageForResourceLimitError","limitType","adminContact","strings","extraTranslations","errString","linkSub","lookupString","messageForSyncError","limitError","limit_type","admin_contact","messageForLoginError","serverConfig","errorTop","errorDetail","hs","hsName","messageForConnectionError","ConnectionError","hsUrl","ExternalLink","allowEditingEvent","canEditOwnEvent","maxIdx","inc","beginIdx","foundFromEventId","msc3531Enabled","VISIBLE_FOR_ALL","SEE_THROUGH_FOR_CURRENT_USER","EVENT_VISIBILITY_CHANGE_TYPE","fetchInitialEvent","_initialEvent","supportsThreads","_room$findEventById","createThread","canCancel","ENCRYPTING","hasThreadSummary","_event$getThread","Feedback","DEFAULT_STYLES","managedIframe","onLoadPromise","iframeFn","_this$iframeFn","_iframe$contentWindow","auto","INVALID_NUMBER","IEC","JEDEC","SI","BYTE","ARRAY","OBJECT","STRING","EXPONENT","ROUND","EMPTY","STRINGS","iec","bits","bytes","jedec","fullform","BINARY_POWERS","DECIMAL_POWERS","LOG_2_1024","LOG_10_1000","STANDARD_CONFIGS","isDecimal","actualStandard","calculateOptimizedValue","autoExponent","decorateResult","neg","localeOptions","full","fullforms","roundingFunc","localePad","minimumFractionDigits","maximumFractionDigits","pow","padEnd","applyNumberFormatting","filesize","exponent","roundingMethod","precision","getBaseConfiguration","toPrecision","handleZeroValue","calculatedE","precisionAdjusted","calculateExponent","valueResult","valueExponent","rounded","applyRounding","precisionResult","computed","applyPrecisionHandling","symbolTable","resolveSymbol","formatted","formatOutput","withSize","fallbackText","shortened","byteCount","defaultOption","cachedFormatter","cachedCompactFormatter","NumberFormat","notation","formatCountLong","getUserNameColorClass","useIdColorHash","itemLimit","includeCount","_items$","formatter","ListFormat","joinedItems","jsxJoin","Items","base_url","fullUrl","_terms","terms","getTerms","arrayBufferRead","arrayBufferReadInt","DataView","getUint32","arrayBufferReadStr","decoder","ImageDecoder","tracks","ready","dv","globalColorTable","getUint8","globalColorTableSize","extensionIntroducer","graphicsControlLabel","delayTime","getUint16","onMarkCallback","marked","_this$onMarkCallback","LazyValue","getFn","present","thumbnailBlob","thumbnail_file","_content$info$thumbna","prepareSourceUrl","prepareThumbnailUrl","fetchSource","fetchThumbnail","canHide","AskInviteAnywayDialog","onGiveUp","onInviteAnyways","unknownProfileUsers","descriptionProp","inviteNeverWarnLabel","inviteLabel","onInviteClicked","onInviteNeverWarnClicked","onGiveUpClicked","InviteProgressDialog","InviteState","UNKNOWN_PROFILE_ERRORS","USER_ALREADY_JOINED","USER_ALREADY_INVITED","USER_BANNED","_fatal","closeDialog","onBeforeClose","openInviteProgressDialog","completionStates","doInvite","handleUnknownProfileUsers","_closeDialog","_this$errors$addr$err","_this$errors$addr","inviteToRoom","ignoreProfile","addrType","inviteByEmail","ourMember","shareEncryptedHistory","_this$options$progres","_this$options","inviteUnknowns","isPinnable","isUnpinnable","PINNABLE_EVENT_TYPES","pinnedEvent","userHasPinOrUnpinPermission","_room$getLiveTimeline2","_room$getLiveTimeline3","pinnedIds","roomAccountDataPromise","_room$getAccountData","ReadPinsEventId","event_ids","unpinAllEvents","roomVer","featureVer","array","joiner","allowVulnerableTags","exclusiveFilter","shouldDisplayReply","_event$getWireContent","inReplyTo","is_falling_back","addReplyToMessageContent","mixin","makeReplyMixIn","checkForRoomFn","handleError","updateSpaces","awaitRoom","inhibitInviteProgressDialog","_spinnerModal","spinnerModal","toInvite","parentsToRelink","roomUpgraded","roomSynced","inviteUsersProgress","inviteUsersTotal","updateSpacesProgress","updateSpacesTotal","replacement_room","inviteOptions","inviteUsersToRoom","currentEv","shieldStatusForRoom","getEncryptionTargetMembers","inDMMap","verified","unverified","devicesByUser","asyncSome","ClientStoppedError","keyMap","SingleflightContext","forgetAll","forget","joinedRooms","earliestAgeConsidered","takeRight","senderEvents","groupBy","mapValues","maxBy","distanceFromNow","inverseTime","lastSpoke","memberPeerEntries","userMeta","roomMemberships","maximumPeers","totalPeers","sumBy","minBy","_activityScores$a$use","_activityScores$a$use2","_memberScores$a$userI","_memberScores$a$userI2","_memberScores$a$userI3","_memberScores$a$userI4","_activityScores$b$use","_activityScores$b$use2","_memberScores$b$userI","_memberScores$b$userI2","_memberScores$b$userI3","_memberScores$b$userI4","aScore","aNumRooms","bScore","bNumRooms","elapsed","startTs","setNotStarted","timerHandle","onTimeout","changeTimeout","isSmallerTimeout","PREVIEW_WIDTH_PX","previewRequestTs","getNumberFromOpenGraph","getBaseMetadataFromResponse","siteName","getAuthorFromResponse","calculatedAuthor","isImagePreview","getUrlPreview","author","hasImage","siteIcon","mxcImageFull","declaredHeight","declaredWidth","imageType","_thumbHeight","fullWidth","fullHeight","widthMulti","heightMulti","playable","imageThumb","ogUrl","showTooltipOnLink","E2EE_WK_KEY","E2EE_WK_KEY_DEPRECATED","TILE_SERVER_WK_KEY","EMBEDDED_PAGES_WK_PROPERTY","getCallBehaviourWellKnown","clientWellKnown","getE2EEWellKnown","getTileServerWellKnown","tileServerFromWellKnown","_clientWellKnown$TILE","getEmbeddedPagesWellKnown","condition","listeners","whenAnyOf","_room$currentState$be","getBeaconInfoIdentifier","latestLocationEvent","msUntilExpiry","sortBeaconsByLatestExpiry","GeolocationOptions","maximumAge","mapGeolocationError","isGeolocationPositionError","Default","PERMISSION_DENIED","POSITION_UNAVAILABLE","PositionUnavailable","TIMEOUT","Timeout","getGeolocation","geolocation","genericPositionFromGeolocation","geoPosition","latitude","longitude","altitude","accuracy","coords","getGeoUri","genericPosition","onWatchPosition","onWatchPositionError","watchId","clearWatch","setBeacon","beaconInstance","beaconInstanceEventId","setStoppingInProgress","resetLocationPublishError","getBeaconById","ALLOWED_BLOB_MIMETYPES","frequency","PI","hue","chroma","cos","sin","generateAB","green","blue","adjustXYZ","z","adjustRGB","labToRGB","padStart","corrected","gammaCorrection","_deviceMap$get","getUserDeviceIds","_deviceMap$get$keys","_deviceMap$get2","e2eeWellKnown","showSpinner","existingRoom","_DMRoomMap$shared$get","getDMRoomForIdentifiers","createRoomOptions","determineCreateRoomEncryptionOption","roomOptions","lookupThreePidProfiles","threePids","lookedUpThreePids","identityServer","bulkLookupThreePids","threepids","_threePidType","threePidId","lookupThreePids","resolvedTargets","threePidMembers","lookedUpProfiles","_lookedUpProfile$prof","_lookedUpProfile$prof2","lookedUpProfile","resolveThreePids","_findDMForUser","findDMRoom","localRoom","LOCAL_ROOM_ID_PREFIX","makeTxnId","creator","KNOWN_SAFE_ROOM_VERSION","_target$getMxcAvatarU","_target$getMxcAvatarU2","updateMyMembership","addLiveEvents","addToState","setStateEvents","getDefaultRoomName","createDmLocalRoom","createRoomFromLocalRoom","isNew","CREATING","waitForRoomReadyAndApplyAfterCreateCallbacks","Member","userDirResult","extractSuitableRoom","findRoomWithThirdpartyInvites","suitableRooms","functionalUsers","getFunctionalMembers","joinedMembers","isJoinedOrNearlyJoined","thirdPartyInvites","r1","getLastActiveTimestamp","suitableRoomForUserId","allRoomIds","getRoomIds","BlurhashEncoder","getBlurhash","_BlurhashEncoder","inputWidth","inputHeight","calculateBlurhash","thumbnailPromise","targetWidth","targetHeight","OffscreenCanvas","drawImage","convertToBlob","toBlob","getImageData","dialogs_LeaveSpaceDialog","LeaveSpaceDialog","roomSet","rejoinWarning","onlyAdminWarning","isOnlyAdmin","_spinnerModal2","leavingAllVersions","activeCall","SENDING","leaveRoomChain","limitExceededError","_limitExceededError$d","roomErr","leaveSpace","isRoomReady","_localRoom$targets","roomEncryptionEvents","isCreated","isActualRoomIdDefined","afterCreateCallbacks","applyAfterCreateCallbacks","finish","checkRoomStateIntervalHandle","stopgapTimeoutHandle","stopgapFinish","afterCreateCallback","WebGLNotEnabled","findMapStyleUrl","_getTileServerWellKno","_getTileServerWellKno2","mapStyleUrl","map_style_url","locationContent","_asset$type","asset","M_ASSET","LocationAssetType","Self","_loc$uri","parseGeoUri","ret","uncertainty","geoCoords","altitudeAccuracy","makeMapSiteLink","mLocation","positionFailureMessage","roomIsPrivate","explicitEventVisibility","media_previews","Off","getMediaVisibility","isRoomPrivate","previousMembership","effective","_client$getRoom$getMe","__","NewMember","_room$getMember","currentUserLevel","userLevelValues","maxUserLevel","editedContent","mentions","userMentions","roomMention","newMentions","user_ids","prevMentions","attachUrlPreviews","urlPreviewSnapshot","_preview$image2","_preview$image3","_preview$image4","_preview$image5","matched_url","MarkedUnread","deviceNotificationSettingsKeys","LOCAL_NOTIFICATION_SETTINGS_PREFIX","isSilenced","_event$getContent$is_","clearRoomNotification","getLastLiveEvent","receiptType","Read","sendReadReceipt","setUnreadNotificationCount","setThreadUnreadNotificationCount","clearAllNotifications","receiptPromises","_room$getAccountData2","currentStateStable","unread","currentStateUnstable","notificationLevelToIndicator","getThreadNotificationLevel","threadsAggregateNotificationType","receipt","isSupportedReceiptType","functionalUsersStateEvent","UNSTABLE_ELEMENT_FUNCTIONAL_USERS","service_members","functionalMembers","Archived","Conference","getTagsOfJoinedRoom","Untagged","compareRoomsByRecency","dialogs_CreateSubspaceDialog","CreateSubspaceDialog","onAddExistingSpaceClick","setParentSpace","spaceJoinRule","defaultJoinRule","setJoinRule","onCreateSubspaceClick","joinRuleMicrocopy","dialogs_AddExistingSubspaceDialog","AddExistingSubspaceDialog","shouldShowSpaceSettings","showSpaceSettings","OpenSpaceSettings","showAddExistingRooms","OpenAddToExistingSpaceDialog","showCreateNewRoom","shouldCreate","shouldShowSpaceInvite","showSpaceInvite","showAddExistingSubspace","showCreateNewSubspace","UpdateSpaceHierarchy","showSpacePreferences","OpenSpacePreferences","setRightPanel","findVerificationRequestDMInProgress","relativeDatesEnabled","TimelineEnableRelativeDates","jumpToDateEnabled","computeLabel","inputTimestamp","roomIdForJumpRequest","currentRoomId","friendlyErrorMessage","submitDebugLogsContent","dateString","debugLogsLink","onBugReport","setDate","pickDate","setMonth","updateSnapshot","jumpToDateWatcherRef","relativeDatesWatcherRef","jumpToEnabled","jumpFromDate","formatDateForInput","relativeTimeFormat","RelativeTimeFormat","numeric","today","yesterday","calculateSnapshot","getInitialIsEncrypted","nextSnapshot","refreshSnapshotFromEvent","_localRoom$isEncrypti","EncryptionEventState","CHANGED","encryptedStateEvents","userName","isRoomLocal","stateEncrypted","enableEncryptedStateEvents","ENABLED","_room$getMember$rawDi","ENABLED_DM","ENABLED_LOCAL","DISABLE_ATTEMPT","UNSUPPORTED","replaceProps","sentAt","receivedAt","showRelative","receivedTs","receivedDate","tsSentAt","tsReceivedAt","getWidgetBuildUrl","widget_build_url","widget_build_url_ignore_dm","wellKnown","ignore_dm","widgetBuildUrl","widgetData","widget_id","widgetContent","WidgetEchoStore","roomHasPendingWidgets","setRoomWidgetContent","canCopyLayoutToRoom","installedWidget","setContainerHeight","copyLayoutToRoom","__importDefault","mod","__esModule","compact_json_1","iamcal_json_1","emoji_json_1","emojibase_1","UNICODE_TO_EMOJI","stripVariation","EMOJIBASE_GROUP_ID_TO_CATEGORY","people","nature","foods","places","activity","MAX_EMOJI_VERSION","EMOJI_TO_VERSION","versionString","emojiData","shortcodeData","categoryId","emoticons","generateEmoticonPermutations","J","Z","q","trunc","L","Uint8ClampedArray","R","P","G","I","weekdays","months","ordinal","utcOffset","Q","g","S","$L","utc","$u","$x","$offset","$d","$y","$M","$D","$W","$H","getHours","$m","getMinutes","$s","$ms","getMilliseconds","$utils","isSame","startOf","endOf","isAfter","isBefore","$g","unix","toDate","$locale","weekStart","$set","daysInMonth","subtract","invalidDate","meridiem","monthsShort","weekdaysMin","weekdaysShort","getTimezoneOffset","toUTCString","Y","$i","isDayjs","en","Ls","isMergeableObject","isNonNullObject","stringValue","$$typeof","REACT_ELEMENT_TYPE","isReactElement","isSpecial","cloneUnlessOtherwiseSpecified","deepmerge","defaultArrayMerge","getKeys","getOwnPropertySymbols","propertyIsEnumerable","getEnumerableOwnPropertySymbols","propertyIsOnObject","mergeObject","propertyIsUnsafe","customMerge","getMergeFunction","arrayMerge","sourceIsArray","deepmerge_1","diff_match_patch","Diff_Timeout","Diff_EditCost","Match_Threshold","Match_Distance","Patch_DeleteThreshold","Patch_Margin","Match_MaxBits","DIFF_DELETE","text1","text2","opt_checklines","opt_deadline","deadline","checklines","commonlength","diff_commonPrefix","commonprefix","diff_commonSuffix","commonsuffix","diff_compute_","diff_cleanupMerge","longtext","shorttext","hm","diff_halfMatch_","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","diff_lineMode_","diff_bisect_","diff_linesToChars_","chars1","chars2","linearray","lineArray","diff_charsToLines_","pointer","count_delete","count_insert","text_delete","text_insert","subDiff","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","front","k1start","k1end","k2start","k2end","k1","k1_offset","k2_offset","diff_bisectSplit_","k2","text1a","text2a","text1b","text2b","diffsb","lineHash","diff_linesToCharsMunge_","lineStart","lineEnd","lineArrayLength","maxLines","pointermin","pointermax","pointermid","pointerstart","pointerend","diff_commonOverlap_","text_length","best","found","dmp","diff_halfMatchI_","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","best_common","hm1","hm2","changes","equalities","equalitiesLength","lastEquality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","diff_cleanupSemanticLossless","deletion","insertion","overlap_length1","overlap_length2","diff_cleanupSemanticScore_","two","char1","char2","nonAlphaNumeric1","nonAlphaNumericRegex_","nonAlphaNumeric2","whitespace1","whitespaceRegex_","whitespace2","lineBreak1","linebreakRegex_","lineBreak2","blankLine1","blanklineEndRegex_","blankLine2","blanklineStartRegex_","equality1","edit","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","diff_cleanupEfficiency","pre_ins","pre_del","post_ins","post_del","diff_xIndex","last_chars1","last_chars2","diff_prettyHtml","pattern_amp","pattern_lt","pattern_gt","pattern_para","diff_text1","diff_text2","diff_levenshtein","levenshtein","insertions","deletions","diff_toDelta","diff_fromDelta","diffsLength","decodeURI","match_main","match_bitap_","match_alphabet_","match_bitapScore_","proximity","score_threshold","best_loc","bin_min","bin_mid","matchmask","last_rd","bin_max","charMatch","patch_addContext_","patch","start2","length1","start1","length2","patch_make","opt_b","opt_c","patches","patch_obj","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patch_deepCopy","patchesCopy","patchCopy","patch_apply","nullPadding","patch_addPadding","patch_splitMax","start_loc","expected_loc","end_loc","paddingLength","extraLength","patch_size","bigpatch","precontext","empty","postcontext","patch_toText","patch_fromText","textline","textPointer","patchHeader","DIFF_INSERT","DIFF_EQUAL","dijkstra","single_source_shortest_paths","graph","costs","cost_of_s_to_u","adjacent_nodes","cost_of_s_to_u_plus_cost_of_e","cost_of_s_to_v","PriorityQueue","make","cost","extract_shortest_path_from_predecessor_list","find_path","default_sorter","__createBinding","writable","enumerable","__setModuleDefault","__importStar","ElementType","entities_1","foreignNames_js_1","Doctype","Directive","Comment","CDATA","Script","Tag","isTag","__exportStar","DomHandler","domelementtype_1","node_js_1","defaultOpts","withStartIndices","withEndIndices","elementCB","tagStack","onparserinit","onreset","onend","handleCallback","onclosetag","onopentag","addNode","ontext","oncomment","oncommentend","oncdatastart","oncdataend","onprocessinginstruction","ProcessingInstruction","previousSibling","extendStatics","__extends","__proto__","hasChildren","isDocument","isDirective","isText","isCDATA","NodeWithChildren","DataNode","recursive","_super","namespace","cloneChildren","clone_1","clone_2","clone_3","instruction","sourceCodeLocation","childs","getFeed","feedRoot","getOneElement","isValidFeed","legacy_js_1","getMediaElements","addConditionally","pubDate","updated","getAtomFeed","getRssFeed","stringify_js_1","MEDIA_KEYS_STRING","MEDIA_KEYS_INT","where","isDefault","MEDIA_KEYS_STRING_1","MEDIA_KEYS_INT_1","recurse","removeSubsets","ancestor","compareDocumentPosition","uniqueSort","PRECEDING","FOLLOWING","domhandler_1","nodeA","nodeB","aParents","bParents","DISCONNECTED","sharedParent","siblings","aSibling","bSibling","CONTAINED_BY","CONTAINS","testElement","compileTest","getElements","querying_js_1","findOne","getAttribCheck","Checks","getElementsByClassName","getElementsByTagType","tag_name","tag_type","tag_contains","combineFuncs","childsIndex","currNext","prepend","findOneChild","searchedNodes","existsOne","findAll","nodeStack","indexStack","getText","innerText","dom_serializer_1","getParent","getSiblings","getAttributeValue","hasAttrib","nextElementSibling","prevElementSibling","MEDIUM_DARK_SKIN","isFace","_options$isFace","withNose","_options$withNose","emo","STRIP_PATTERN","SEQUENCE_REMOVAL_PATTERN","decodeXML","decodeHTMLStrict","decodeHTML","determineBranch","JUMP_OFFSET_BASE","BinTrieFlags","xmlDecodeTree","htmlDecodeTree","decode_data_html_1","decode_data_xml_1","decode_codepoint_1","getDecoder","decodeTree","lastIdx","strIdx","excess","treeIdx","HAS_VALUE","MULTI_BYTE","nodeIdx","branchCount","BRANCH_LENGTH","jumpOffset","JUMP_TABLE","lo","hi","mid","midVal","htmlDecoder","xmlDecoder","decodeMap","getTrie","encodeHTMLTrieRe","entities_json_1","isHighSurrugate","htmlTrie","_d","trie","_e","lastMap","regExp","escapeUTF8","encodeNonAsciiHTML","encodeHTML","xml_json_1","encode_trie_1","htmlReplacer","getCharRegExp","xmlReplacer","xmlInvalidChars","nonAscii","Uint16Array","Zr","FJ","au","EntityLevel","DecodingMode","EncodingMode","decode_1","encode_1","encode_2","decode_2","decode_data_html_js_1","decode_data_xml_js_1","decode_codepoint_js_1","decodeCodePoint","CharCodes","decode_codepoint_js_2","replaceCodePoint","EntityDecoderState","isNumber","ZERO","NINE","isHexadecimalCharacter","UPPER_A","UPPER_F","LOWER_A","LOWER_F","isEntityInAttributeInvalidEnd","EQUALS","UPPER_Z","LOWER_Z","isAsciiAlphaNumeric","EntityDecoder","emitCodePoint","EntityStart","consumed","treeIndex","decodeMode","Strict","startEntity","write","NUM","NumericStart","stateNumericStart","NamedEntity","stateNamedEntity","NumericDecimal","stateNumericDecimal","NumericHex","stateNumericHex","LOWER_X","addToNumericResult","digitCount","emitNumericEntity","lastCp","expectedLength","absenceOfDigitsInNumericCharacterReference","SEMI","missingSemicolonAfterCharacterReference","validateNumericCharacterReference","valueLength","VALUE_LENGTH","Attribute","emitNotTerminatedNamedEntity","emitNamedEntityData","Legacy","decodeHTMLAttribute","encode_html_js_1","escape_js_1","restoreDiff","decode_js_1","encode_js_1","XML","HTML","decodeStrict","UTF8","ASCII","escape_js_2","encode_js_2","decode_js_2","matchHtmlRegExp","reStr","inGroup","prevChar","starCount","CASE_SENSITIVE_TAG_NAMES_MAP","accumulator","CARRIAGE_RETURN_REGEX","CARRIAGE_RETURN_PLACEHOLDER","CARRIAGE_RETURN_PLACEHOLDER_REGEX","attributesLength","formatTagName","caseSensitiveTagName","getCaseSensitiveTagName","hasOpenTag","openTag","revertEscapedCharacters","formatDOM","directive","domNodes","nodesLength","HEAD","BODY","FIRST_TAG_REGEX","parseFromDocument","domParser_1","implementation","htmlDocument_1","createHTMLDocument","parseFromTemplate","template","createNodeList","domparser","escapeSpecialCharacters","firstTagName","_f","DIRECTIVE_REGEX","isInputValueOnly","valueOnlyInputs","attributeName","attributeValue","react_property_1","isCustomAttribute","attributeNameLowerCased","propName","getPropName","propertyInfo","getPropertyInfo","UNCONTROLLED_COMPONENT_ATTRIBUTES","UNCONTROLLED_COMPONENT_NAMES","BOOLEAN","OVERLOADED_BOOLEAN","utilities_1","PRESERVE_CUSTOM_ATTRIBUTES","setStyleProp","possibleStandardNames","reactElements","hasReplace","returnFirstArg","library","isWhitespace","canTextBeChildOfNode","skipAttributesToProps","attributes_to_props_1","react_1","isCustomComponent","dom_to_react_1","html_dom_parser_1","htmlparser2","domParserOptions","htmlToDOM","attributesToProps","lowerCaseAttributeNames","RESERVED_SVG_MATHML_ELEMENTS","style_to_js_1","styleOptions","reactCompat","ELEMENTS_WITH_NO_TEXT_CHILDREN","COMMENT_REGEX","NEWLINE_REGEX","WHITESPACE_REGEX","PROPERTY_REGEX","COLON_REGEX","VALUE_REGEX","SEMICOLON_REGEX","TRIM_REGEX","EMPTY_STRING","updatePosition","Position","whitespace","silent","comments","declaration","decl","decls","declarations","isObject","isPlainObject","ctor","prot","dayjs","cleanHref","firstIndex","naughtyHref","scheme","self","filterTag","integer","padInteger","float","httpsFix","fixUrl","choices","choice","boolean","addBooleanFilterToCriteria","criteria","booleanOrNull","$ne","returnDefault","nowYear","nowCentury","theirYear","ampm","idRegExp","require","encryptAttachment","plaintextBuffer","ivArray","getRandomValues","subarray","subtle","generateKey","cryptoKey","sent","exportKey","exportedKey","ciphertextBuffer","digest","sha256Buffer","iv","encodeBase64","hashes","sha256","decryptAttachment","decodeBase64","expectedSha256base64","importKey","digestResult","counterLength","decrypt","uint8Array","latin1String","paddedBase64","inputLength","outputLength","base64","atob","encodeCache","exclude","keepEscaped","nextCode","defaultChars","getEncodeCache","componentChars","toStringTag","webkitAudioContext","isRecordingSupported","bufferLength","maxFramesPerPage","mediaTrackConstraints","monitorGain","recordingGain","initAudioContext","initialize","initWorklet","initEncoder","clearStream","stream","monitorGainNode","recordingGainNode","encoder","encoderNode","encodeBuffers","createGain","setMonitorGain","setRecordingGain","numberOfOutputs","onaudioprocess","inputBuffer","initSourceNode","initWorker","streamPage","storePage","recordedPages","totalLength","samplePosition","originalSampleRate","onpause","onresume","gain","setTargetAtTime","onstart","onstop","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","collectCharacters","regEx","descriptors","currentDescriptor","regexLeadingSpaces","regexLeadingCommasOrSpaces","regexLeadingNotSpaces","regexTrailingCommas","regexNonNegativeInteger","regexFloatingPoint","parseDescriptors","tokenize","lastChar","intVal","floatVal","pError","isColorSupported","dim","underline","inverse","strikethrough","black","yellow","magenta","cyan","white","gray","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","blackBright","redBright","greenBright","yellowBright","blueBright","magentaBright","cyanBright","whiteBright","bgBlackBright","bgRedBright","bgGreenBright","bgYellowBright","bgBlueBright","bgMagentaBright","bgCyanBright","bgWhiteBright","createColors","AtRule","proxyOf","registerAtRule","Rule","Declaration","isClean","cleanSource","markTreeDirty","markDirty","cleanRaws","keepBetween","each","getIterator","indexes","lastEach","getProxyProcessor","toProxy","exist","existIndex","sample","selector","selectors","rebuild","raws","removeAll","replaceValues","walkDecls","fast","walk","addToError","walkAtRules","walkComments","walkRules","registerParse","dependant","registerRule","registerRoot","pico","terminalHighlight","CssSyntaxError","plugin","endLine","endColumn","setMessage","captureStackTrace","showSourceCode","css","aside","gutter","subLineStart","subLineEnd","subLine","variable","LazyResult","Processor","toResult","registerLazyResult","registerProcessor","Input","PreviousMap","fromJSON","ownInputs","inputHydrated","inputId","nanoid","isAbsolute","SourceMapConsumer","SourceMapGenerator","fileURLToPath","pathToFileURL","lineToIndexCache","sourceMapAvailable","pathAvailable","getLineToIndex","lineToIndex","prevIndex","hasBOM","consumer","mapResolve","fromOffset","fromLineAndColumn","sourceRoot","fromUrl","originalPositionFor","mapFile","sourceContentFor","consumerCache","registerInput","MapGenerator","Result","TYPE_TO_CLASS_NAME","atrule","PLUGIN_PROPS","AtRuleExit","CommentExit","DeclarationExit","DocumentExit","Once","OnceExit","postcssPlugin","RootExit","RuleExit","NOT_VISITORS","isPromise","toStack","eventIndex","visitorIndex","visitors","cleanMarks","postcss","sync","stringified","processed","syntax","helpers","plugins","processing","runAsync","onRejected","onFinally","getAsyncError","lastPlugin","postcssVersion","prepareVisitors","hasListener","runOnRoot","visitTick","visitor","roots","subRoot","stringifier","rootSource","generate","walkSync","visitSync","onFulfilled","visit","warnings","registerPostcss","comma","separators","inQuote","prevQuote","dirname","sep","cssString","mapOpts","originalCSS","usesFileUrls","absolute","memoizedFileURLs","memoizedPaths","memoizedURLs","addAnnotation","isInline","toBase64","outputFile","eol","applyPrevMaps","toUrl","sourcesContent","applySourceMap","clearAnnotation","isMap","generateMap","generateString","fromSourceMap","ignoreInvalidMapping","addMapping","generated","isSourcesContent","setSourcesContent","isAnnotation","noSource","mapping","sourcePath","semicolon","withContent","previousMaps","already","toFileUrl","setSourceContent","Buffer","fileURL","NoWorkResult","_root","_css","_opts","_processor","_map","generatedCSS","generatedMap","Stringifier","cloned","sourceOffset","inputCSS","postcssNode","overrides","between","cloneAfter","cloneBefore","rangeBy","markClean","positionBy","inputString","positionInside","defaultType","bookmark","foundSelf","fixed","emitInputs","inputsNextIndex","proxyCache","tokenizer","SAFE_COMMENT_NEIGHBOR","tokensToString","createTokenizer","unnamedAtrule","endOfFile","getPosition","spacesAndCommentsFromEnd","afterName","spacesAndCommentsFromStart","checkMissedSemicolon","colon","founded","doubleColon","customProperty","findLastWithPosition","unknownWord","propStart","betweenStart","firstSpacesStart","firstSpaces","precheckMissedSemicolon","important","stringFrom","spacesFromEnd","emptyRule","unexpectedClose","endFile","unclosedBlock","freeSemicolon","ownSemicolon","bracket","back","unclosedBracket","lastTokenType","initializer","warningPrinted","LANG","transformer","processOpts","pluginOpts","atRule","existsSync","readFileSync","unsafeMap","loadAnnotation","startWith","loadMap","decodeInline","uriMatch","baseUriMatch","encoding","getAnnotationURL","sourceMapString","mappings","_mappings","loadFile","cssFile","trusted","prevPath","unknown","use","STYLE_TAG","COMMENT_OPEN","escapeHTMLInCSS","DEFAULT_RAW","beforeClose","beforeComment","beforeDecl","beforeOpen","beforeRule","commentLeft","commentRight","emptyBody","builder","beforeAfter","detect","own","rawCache","rawBeforeClose","rawBeforeComment","rawBeforeDecl","rawBeforeOpen","rawBeforeRule","rawColon","rawEmptyBody","rawIndent","rawSemicolon","SINGLE_QUOTE","DOUBLE_QUOTE","BACKSLASH","SLASH","NEWLINE","FEED","TAB","CR","OPEN_SQUARE","CLOSE_SQUARE","OPEN_PARENTHESES","CLOSE_PARENTHESES","OPEN_CURLY","CLOSE_CURLY","SEMICOLON","ASTERISK","COLON","AT","RE_AT_END","RE_WORD_END","RE_BAD_BRACKET","RE_HEX_ESCAPE","currentToken","escapePos","returned","lastBadParen","unclosed","what","ignoreUnclosed","controlChar","printed","opt","canPromise","CanvasRenderer","SvgRenderer","renderCanvas","renderFunc","argsNum","isLastArgCb","dY","renderToDataURL","getSymbolSize","getRowColCoords","posCount","intervals","positions","getPositions","posLength","Mode","ALPHA_NUM_CHARS","AlphanumericData","ALPHANUMERIC","getBitsLength","getLength","bitBuffer","put","BitBuffer","bufIndex","putBit","getLengthInBits","bit","BitMatrix","reservedBit","reserved","xor","isReserved","ByteData","TextEncoder","ECLevel","EC_BLOCKS_TABLE","EC_CODEWORDS_TABLE","getBlocksCount","getTotalCodewordsCount","fromString","Utils","G15_BCH","getBCHDigit","getEncodedBits","EXP_TABLE","LOG_TABLE","exp","mul","KanjiData","KANJI","toSJIS","Patterns","PATTERN000","PATTERN001","PATTERN010","PATTERN011","PATTERN100","PATTERN101","PATTERN110","PATTERN111","PenaltyScores","getMaskAt","maskPattern","getPenaltyN1","points","sameCountCol","sameCountRow","lastCol","lastRow","getPenaltyN2","getPenaltyN3","bitsCol","bitsRow","getPenaltyN4","darkCount","modulesCount","applyMask","getBestMask","setupFormatFunc","numPatterns","bestPattern","lowerPenalty","penalty","VersionCheck","Regex","NUMERIC","ccBits","MIXED","getCharCountIndicator","getBestModeForData","dataStr","testNumeric","testAlphanumeric","testKanji","NumericData","remainingNum","GF","coeff","divident","divisor","generateECPolynomial","degree","poly","AlignmentPattern","FinderPattern","MaskPattern","ECCode","ReedSolomonEncoder","Version","FormatInfo","Segments","setupFormatInfo","createData","segments","dataTotalCodewordsBits","getSymbolTotalCodewords","remainingByte","totalCodewords","ecTotalCodewords","dataTotalCodewords","ecTotalBlocks","blocksInGroup2","blocksInGroup1","totalCodewordsInGroup1","dataCodewordsInGroup1","dataCodewordsInGroup2","ecCount","rs","dcData","ecData","maxDataSize","dataSize","createCodewords","createSymbol","fromArray","estimatedVersion","rawSegments","rawSplit","getBestVersionForData","bestVersion","dataBits","moduleCount","modules","setupFinderPattern","setupTimingPattern","setupAlignmentPattern","setupVersionInfo","bitIndex","byteIndex","dark","setupData","toSJISFunc","setToSJISFunction","Polynomial","genPoly","paddedData","remainder","buff","kanji","byte","BYTE_KANJI","TEST_KANJI","TEST_NUMERIC","TEST_ALPHANUMERIC","getStringByteLength","getSegments","getSegmentsFromString","numSegs","alphaNumSegs","byteSegs","kanjiSegs","isKanjiModeEnabled","s1","s2","getSegmentBitsLength","buildSingleSegment","modesHint","bestMode","acc","seg","segs","buildNodes","prevNodeIds","nodeGroup","currentNodeIds","lastCount","prevNodeId","buildGraph","optimizedSegs","curr","prevSeg","mergeSegments","toSJISFunction","CODEWORDS_COUNT","G18_BCH","getReservedBitsCount","getTotalBitsFromDataArray","totalBits","reservedBits","getCapacity","usableBits","ecl","getBestVersionForMixedData","getBestVersionForDataLength","qrData","canvasEl","getCanvasElement","getImageWidth","qrToImageData","clearRect","clearCanvas","rendererOpts","quality","getColorAttrib","svgCmd","qrcodesize","bg","light","moveBy","newRow","lineLength","qrToPath","svgTag","hex2rgba","hexCode","hexValue","getScale","qrSize","qr","symbolSize","scaledMargin","palette","posDst","pxColor","PropertyInfoRecord","mustUseProperty","attributeNamespace","sanitizeURL","removeEmptyString","acceptsBooleans","propertyName","CAMELIZE","capitalize","CAMELCASE","SAME","possibleStandardNamesOptimized","standardName","acceptCharset","accessKey","allowFullScreen","autoCapitalize","autoCorrect","autoSave","cellPadding","cellSpacing","challenge","charSet","cite","classID","controlsList","dateTime","defer","disablePictureInPicture","disableRemotePlayback","encType","enterKeyHint","form","formMethod","formAction","formEncType","formNoValidate","formTarget","frameBorder","high","hrefLang","httpEquiv","inputMode","integrity","itemID","itemProp","itemRef","itemScope","itemType","keyType","low","manifest","marginWidth","marginHeight","mediaGroup","minLength","noModule","nonce","noValidate","optimum","radioGroup","readOnly","reversed","rowSpan","scoped","scrolling","seamless","shape","sizes","srcDoc","srcLang","srcSet","useMap","wmode","about","accentHeight","accumulate","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPathUnits","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","datatype","decelerate","descent","diffuseConstant","dominantBaseline","dur","dx","edgeMode","elevation","enableBackground","externalResourcesRequired","filterRes","floodOpacity","floodColor","focusable","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","ideographic","imageRendering","in2","inlist","intercept","k3","k4","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","maskContentUnits","mathematical","numOctaves","opacity","orient","orientation","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","primitiveUnits","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","rotate","rx","ry","security","shapeRendering","slope","specularConstant","specularExponent","spreadMethod","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeWidth","strokeOpacity","suppressContentEditableWarning","suppressHydrationWarning","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","typeof","u1","u2","underlinePosition","underlineThickness","unicodeBidi","unicodeRange","unitsPerEm","unselectable","vAlphabetic","vectorEffect","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","vMathematical","vocab","widths","wordSpacing","writingMode","xChannelSelector","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlnsXlink","xmlSpace","yChannelSelector","zoomAndPan","isRegExp","escapeRegExp","reRegExpChar","reHasRegExpChar","isString","replaceString","curCharStart","curCharLen","newArray","htmlparser","escapeStringRegexp","parseSrcset","postcssParse","launderNaughtyHref","mediaTags","vulnerableTags","VALID_HTML_ATTRIBUTE_NAME","_recursing","tempResult","Frame","that","tagPosition","openingTagLength","mediaChildren","updateParentNodeText","updateParentNodeMediaChildren","htmlParserDefaults","tagAllowed","nonTextTagsArray","nonTextTags","allowedAttributesMap","allowedAttributesGlobMap","globRegex","allowedClassesMap","allowedClassesGlobMap","allowedClassesRegexMap","allowedClasses","transformTagsMap","transformTagsAll","skipMap","transformMap","skipText","skipTextDepth","transFun","simpleTransform","addedText","initializeState","onOpenTag","enforceHtmlBoundary","transformedTag","isEmptyObject","allowedScriptHostnames","allowedScriptDomains","preserveEscapedAttributes","allowedEmptyAttributes","nonBooleanAttributes","passedAllowedAttributesMapCheck","splitStrArray","allowedSchemesAppliedToAttributes","allowedHostname","allowedDomain","isRelativeUrl","allowIframeRelativeUrls","allowedIframeHostnames","allowedIframeDomains","evil","allowedSpecificClasses","allowedWildcardClasses","allowedSpecificClassesGlob","allowedSpecificClassesRegex","allowedWildcardClassesRegex","allowedClassesGlobs","filterClasses","parseStyleAttributes","filteredAST","abstractSyntaxTree","allowedStyles","astRules","selectedRule","allowedDeclarationsList","attributeObject","regularExpression","filterDeclarations","filterCss","extractedAttributes","attrObject","stringifyStyleAttributes","lastFrame","isImplied","onCloseTag","filterResult","lastParsedIndex","unparsed","allowedSchemesByTag","allowedGlobs","clss","newTagName","newAttribs","style_to_object_1","StyleToJS","camelCase","CUSTOM_PROPERTY_REGEX","HYPHEN_REGEX","NO_HYPHEN_REGEX","VENDOR_PREFIX_REGEX","MS_VENDOR_PREFIX_REGEX","trimHyphen","skipCamelCase","styleObject","inline_style_parser_1","hasIterator","customAlphabet","defaultSize","bin_trie_flags_js_1","runConsumed","FLAG13","runLength","firstChar","charIndexInPacked","packedWord","expectedChar","returnValue","packedKeySlots","midKey","decode_data_html_js_2","decode_data_xml_js_2","decode_shared_js_1","binary","evenLength","outIndex","Tokenizer_js_1","formTags","pTag","tableSectionTags","ddtTags","rtpTags","openImpliesClose","voidElements","foreignContextElements","htmlIntegrationElements","reNameEnd","cbs","openTagStart","attribname","attribvalue","bufferOffset","writeIndex","ended","htmlMode","lowerCaseTagNames","lowerCaseTags","recognizeSelfClosing","Tokenizer","foreignContext","getSlice","ontextentity","isVoidElement","onopentagname","emitOpenTag","impliesClose","endOpenTag","onopentagend","_h","closeCurrentTag","onselfclosingtag","isOpenImplied","onattribname","onattribdata","onattribentity","onattribend","onattribute","QuoteType","Double","Single","NoValue","getInstructionName","ondeclaration","oncdata","recognizeCDATA","_k","_j","parseComplete","shiftBuffer","running","parseChunk","FormFeed","CarriageReturn","isEndOfTagSection","Slash","Gt","Sequences","Cdata","CdataEnd","CommentEnd","ScriptEnd","StyleEnd","TitleEnd","TextareaEnd","XmpEnd","sectionStart","entityStart","baseState","currentSequence","sequenceIndex","entityDecoder","stateText","Lt","fastForwardTo","BeforeTagName","Amp","stateSpecialStartSequence","isEnd","InTagName","stateInTagName","stateInSpecialTag","endOfText","actualIndex","stateInClosingTagName","stateCDATASequence","InCommentLike","InDeclaration","stateInDeclaration","stateInCommentLike","isTagStartChar","LowerA","LowerZ","UpperA","UpperZ","isASCIIAlpha","startSpecial","SpecialStartSequence","stateBeforeTagName","ExclamationMark","BeforeDeclaration","Questionmark","InProcessingInstruction","lower","BeforeSpecialS","BeforeSpecialT","BeforeClosingTagName","BeforeAttributeName","stateBeforeAttributeName","stateBeforeClosingTagName","InClosingTagName","InSpecialComment","AfterClosingTagName","stateAfterClosingTagName","InSpecialTag","InSelfClosingTag","InAttributeName","stateInSelfClosingTag","stateInAttributeName","Eq","AfterAttributeName","stateAfterAttributeName","BeforeAttributeValue","stateBeforeAttributeValue","DoubleQuote","InAttributeValueDq","SingleQuote","InAttributeValueSq","InAttributeValueNq","stateInAttributeValueNoQuotes","handleInAttributeValue","stateInAttributeValueDoubleQuotes","stateInAttributeValueSingleQuotes","Unquoted","stateBeforeDeclaration","OpeningSquareBracket","CDATASequence","Dash","BeforeComment","stateInProcessingInstruction","stateBeforeComment","stateInSpecialComment","stateBeforeSpecialS","stateBeforeSpecialT","InEntity","stateInEntity","indexInBuffer","cleanup","handleTrailingData","parseDocument","parseDOM","createDocumentStream","elementCallback","Parser_js_1","createDomStream","parseFeed","parseFeedDefaultOptions","domutils_1","Parser_js_2","domhandler_2","domutils_2","DomUtils","Alert_module_default","alert","renderIcon","CheckCircleIcon","ActionInput","onActionClick","Action_module_default","TextInput","ActionControl","Control","asChild","reducer","assertNever","onClearServerErrors","serverInvalid","helpLabel","isFocusWithinRef","isFocusWithin","setFocusWithin","shouldShowSaveButton","hideTimer","formRef","saveButtonRef","cancelButtonRef","onInputHandler","Root$1","_saveButtonRef$curren","onReset","_cancelButtonRef$curr","Field$1","Label$1","EditInPlace_module_default","Submit","iconOnly","Check","LoadingMessage","SuccessMessage","ValidityState","validity","filled","MFA_module_default","MFAInput","setCurrentLength","_input$value","selectionStart","selectionEnd","MFAControl","showState","isHidden","VisibilityOff","hideState","VisibilityOn","togglePasswordVisibility","PasswordControl","_props$id","generatedId","SettingsToggleControl","form_module_default","ErrorMessage","Message","CheckCircleSolidIcon","__defProp","__exportAll","no_symbols","BigIcon_module_default","isActualPromise","kChainedCopy","copyProps","chained","mutated","AsyncContextStack","assignedScope","assignedIsolationScope","_stack","_isolationScope","withScope","_pushScope","maybePromiseResult","_popScope","onSuccess","chainAndCopyPromiseLike","getClient","getStackTop","getScope","getIsolationScope","getAsyncContextStack","registry","esm_carrier","EU","Se","withSetScope","withIsolationScope","getAsyncContextStrategy","acs","withSetIsolationScope","getCurrentScope","attributeValueToTypedAttributeValue","useFallback","maybeObj","primitiveType","getTypedAttributeValue","checkedUnit","serializeAttributes","serializedAttributes","typedValue","getMainCarrier","getSentryCarrier","_utils_worldwide_js__WEBPACK_IMPORTED_MODULE_1__","__SENTRY__","_utils_version_js__WEBPACK_IMPORTED_MODULE_0__","getGlobalSingleton","_externalPropagationContextProvider","_carrier_js__WEBPACK_IMPORTED_MODULE_1__","_asyncContext_index_js__WEBPACK_IMPORTED_MODULE_0__","getGlobalScope","_scope_js__WEBPACK_IMPORTED_MODULE_2__","getTraceContextFromScope","externalContext","traceId","spanId","propagationContext","getPropagationContext","parentSpanId","propagationSpanId","traceContext","_utils_propagationContext_js__WEBPACK_IMPORTED_MODULE_3__","DEBUG_BUILD","_previousTimestampMs","_sequenceNumber","SEVERITY_TEXT_TO_SEVERITY_NUMBER","createLogContainerEnvelopeItem","createLogEnvelope","logs","setLogAttribute","logAttributes","setEvenIfPresent","_INTERNAL_captureSerializedLog","serializedLog","bufferMap","logBuffer","_INTERNAL_getLogBuffer","_INTERNAL_flushLogsBuffer","_INTERNAL_captureLog","beforeLog","captureSerializedLog","beforeSendLog","Bk","kX","_getTraceInfoFromScope","processedLogAttributes","scopeAttributes","replay","replayId","getReplayId","getRecordingMode","beforeLogMessage","spanOnScope","spanContext","processedLog","severityNumber","sequenceAttr","timestampInSeconds","getSequenceAttribute","_removeLoneSurrogates","severity_number","sanitizeLogAttributes","SY","maybeLogBuffer","sanitized","sanitizedKey","strObj","isWellFormed","toWellFormed","captureLog","_internal_js__WEBPACK_IMPORTED_MODULE_0__","KG","Scope","_notifyingListeners","_scopeListeners","_breadcrumbs","_attachments","_user","_tags","_attributes","_extra","_contexts","_sdkProcessingMetadata","_propagationContext","_utils_propagationContext_js__WEBPACK_IMPORTED_MODULE_6__","sampleRand","_utils_randomSafeContext_js__WEBPACK_IMPORTED_MODULE_7__","newScope","_session","_transactionName","_fingerprint","_lastEventId","_conversationId","_utils_spanOnScope_js__WEBPACK_IMPORTED_MODULE_8__","lastEventId","_session_js__WEBPACK_IMPORTED_MODULE_1__","_notifyScopeListeners","setConversationId","setTags","setTag","setAttributes","setExtras","setExtra","setLevel","setTransactionName","setContext","scopeToMerge","scopeInstance","_utils_is_js__WEBPACK_IMPORTED_MODULE_3__","setPropagationContext","maxCrumbs","_utils_time_js__WEBPACK_IMPORTED_MODULE_10__","_utils_string_js__WEBPACK_IMPORTED_MODULE_9__","getLastBreadcrumb","clearBreadcrumbs","addAttachment","clearAttachments","transactionName","setSDKProcessingMetadata","newData","_utils_merge_js__WEBPACK_IMPORTED_MODULE_4__","_utils_misc_js__WEBPACK_IMPORTED_MODULE_5__","_debug_build_js__WEBPACK_IMPORTED_MODULE_0__","_utils_debug_logger_js__WEBPACK_IMPORTED_MODULE_2__","makeSession","startingTime","_utils_time_js__WEBPACK_IMPORTED_MODULE_1__","_utils_misc_js__WEBPACK_IMPORTED_MODULE_0__","started","did","abnormal_mechanism","user_agent","sessionToJSON","updateSession","closeSession","SENTRY_BAGGAGE_KEY_PREFIX","parseBaggageHeader","baggageHeader","currBaggageObject","baggageHeaderToObject","baggageEntry","eqIdx","keyOrValue","hasSpansEnabled","maybeOptions","__SENTRY_TRACING__","tracesSampler","NON_RECORDING_SPAN_FIELD","FROZEN_DSC_FIELD","getDynamicSamplingContextFromClient","dsc","org_id","ul","getDynamicSamplingContextFromScope","getDynamicSamplingContextFromSpan","rootSpan","zU","rootSpanAttributes","traceState","rootSpanSampleRate","sy","Ef","applyLocalSampleRateToDsc","sample_rate","frozenDsc","spanIsNonRecordingSpan","capturedScope","Lb","traceStateDsc","dscOnTraceState","baggageObject","baggageHeaderToDynamicSamplingContext","i_","sampled","pK","sample_rand","SCOPE_ON_START_SPAN_FIELD","ISOLATION_SCOPE_ON_START_SPAN_FIELD","getCapturedScopesOnSpan","spanWithScopes","_utils_weakRef_js__WEBPACK_IMPORTED_MODULE_0__","originalConsoleMethods","consoleSandbox","_worldwide_js__WEBPACK_IMPORTED_MODULE_2__","wrappedFuncs","wrappedLevels","_getLoggerSettings","_maybeLog","_debug_build_js__WEBPACK_IMPORTED_MODULE_1__","_carrier_js__WEBPACK_IMPORTED_MODULE_0__","ORG_ID_REGEX","DSN_REGEX","dsnToString","withPassword","pass","dsnFromComponents","extractOrgIdFromClient","orgId","extractOrgIdFromDsnHost","makeDsn","_debug_logger_js__WEBPACK_IMPORTED_MODULE_1__","lastPath","projectMatch","dsnFromString","isValidProtocol","validateDsn","isBrowserBundle","__SENTRY_BROWSER_BUNDLE__","getSDKSource","createEnvelope","addItemToEnvelope","newItem","forEachEnvelopeItem","envelopeItems","envelopeContainsItemType","encodeUTF8","_worldwide_js__WEBPACK_IMPORTED_MODULE_4__","encodePolyfill","serializeEnvelope","envHeaders","itemHeaders","stringifiedPayload","_normalize_js__WEBPACK_IMPORTED_MODULE_2__","merged","concatBuffers","createAttachmentEnvelopeItem","attachment_type","attachmentType","DATA_CATEGORY_OVERRIDES","sessions","client_report","user_report","profile_chunk","replay_event","replay_recording","check_in","raw_security","trace_metric","envelopeItemTypeToDataCategory","_isOverriddenType","getSdkMetadataForEnvelopeHeader","metadataOrEvent","createEventEnvelopeHeaders","_randomSafeContext_js__WEBPACK_IMPORTED_MODULE_3__","_dsn_js__WEBPACK_IMPORTED_MODULE_1__","objectToString","isInstanceOf","isBuiltin","isDOMError","isDOMException","isParameterizedString","isPrimitive","isEvent","isThenable","isRequest","isElectronNodeRenderer","initialObj","mergeObj","emptyUuid","uuid4","gbl","msCrypto","_randomSafeContext_js__WEBPACK_IMPORTED_MODULE_1__","Qw","getFirstException","getEventDescription","addExceptionTypeValue","addExceptionMechanism","newMechanism","currentMechanism","mergedData","checkOrSetAlreadyCaught","__sentry_captured__","isAlreadyCaptured","_object_js__WEBPACK_IMPORTED_MODULE_0__","SENTRY_SKIP_NORMALIZATION","SENTRY_OVERRIDE_NORMALIZATION_DEPTH","setNormalizeStringifier","newStringifier","maxProperties","normalizeToSize","utf8Length","unmemoize","memoBuilder","stringifyValue","hasSkipNormalizationHint","overrideDepth","getNormalizationDepthOverrideHint","remainingDepth","valueWithToJSON","numAdded","visitable","W4","visitKey","visitValue","replacementFactory","wrapped","markFunctionWrapped","addNonEnumerableProperty","getOriginalFunction","__sentry_original__","convertToPlainObject","_is_js__WEBPACK_IMPORTED_MODULE_2__","getOwnProperties","extractExceptionKeysForMessage","generateTraceId","_misc_js__WEBPACK_IMPORTED_MODULE_0__","generateSpanId","RESOLVED_RUNNER","withRandomSafeContext","sym","globalWithSymbol","_worldwide_js__WEBPACK_IMPORTED_MODULE_0__","safeMathRandom","safeDateNow","applyScopeDataToEvent","applyDataToEvent","_spanUtils_js__WEBPACK_IMPORTED_MODULE_3__","_tracing_dynamicSamplingContext_js__WEBPACK_IMPORTED_MODULE_1__","applySpanToEvent","applyFingerprintToEvent","mergedBreadcrumbs","applyBreadcrumbsToEvent","applySdkMetadataToEvent","mergeScopeData","mergeData","mergeAndOverwriteScopeData","_merge_js__WEBPACK_IMPORTED_MODULE_2__","mergeVal","getCombinedScopeData","_currentScopes_js__WEBPACK_IMPORTED_MODULE_0__","m6","SCOPE_SPAN_FIELD","_setSpanForScope","_weakRef_js__WEBPACK_IMPORTED_MODULE_1__","_getSpanForScope","hasShownSpanDropWarning","spanToTraceContext","isRemote","spanToJSON","_tracing_utils_js__WEBPACK_IMPORTED_MODULE_6__","_propagationContext_js__WEBPACK_IMPORTED_MODULE_7__","convertSpanLinksForEnvelope","traceFlags","restContext","spanTimeInputToSeconds","ensureTimestampInSeconds","_time_js__WEBPACK_IMPORTED_MODULE_8__","spanIsSentrySpan","getSpanJSON","spanIsOpenTelemetrySdkTraceBaseSpan","endTime","getOtelParentSpanId","getStatusMessage","_semanticAttributes_js__WEBPACK_IMPORTED_MODULE_4__","JD","parentSpanContext","streamedSpanJsonToSerializedSpan","spanJson","_attributes_js__WEBPACK_IMPORTED_MODULE_1__","castSpan","spanIsSampled","ROOT_SPAN_FIELD","getRootSpan","INTERNAL_getSegmentSpan","getActiveSpan","_carrier_js__WEBPACK_IMPORTED_MODULE_2__","_spanOnScope_js__WEBPACK_IMPORTED_MODULE_10__","_currentScopes_js__WEBPACK_IMPORTED_MODULE_3__","showSpanDropWarning","_debug_logger_js__WEBPACK_IMPORTED_MODULE_9__","WEBPACK_ERROR_REGEXP","STRIP_FRAME_REGEXP","createStackParser","parsers","sortedParsers","skipFirstLines","cleanedLine","localStack","getLastStackFrame","stripSentryFramesAndReverse","stackParserFromStackParserOptions","defaultFunctionName","getFunctionName","getFramesFromEvent","truncate","safeJoin","_is_js__WEBPACK_IMPORTED_MODULE_0__","_normalize_js__WEBPACK_IMPORTED_MODULE_1__","ng","isMatchingPattern","requireExactStringMatch","stringMatchesSomePattern","testString","patterns","dateTimestampInSeconds","_randomSafeContext_js__WEBPACK_IMPORTED_MODULE_0__","_cachedTimestampInSeconds","_worldwide_js__WEBPACK_IMPORTED_MODULE_1__","timeOrigin","createUnixTimestampInSecondsFunc","makeWeakRef","WeakRefImpl","WeakRef","derefWeakRef","deref","GLOBAL_OBJ","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__","LocationPinSolidIcon","PresenceOutline8X8Icon","PresenceSolid8X8Icon","PresenceStrikethrough8X8Icon","_node_js__WEBPACK_IMPORTED_MODULE_1__","yo","domelementtype__WEBPACK_IMPORTED_MODULE_0__","RJ","Hg","Cd","dz","hasOwn","generateNamedReferences","entities","characters","isOptionalBlock","fullEntity","bodyRegExps","xml","html4","html5","namedReferences","numericUnicodeMap","astralCodePoint","allNamedReferences","esm_assign","encodeRegExps","specialChars","nonAsciiPrintable","nonAsciiPrintableOnly","extensive","defaultEncodeOptions","encodeRegExp","references","isHex","defaultDecodeOptions","baseDecodeRegExps","decodeRegExps","outOfBoundsChar","getDecodedEntity","isAttribute","isStrict","decodeResult","decodeEntityLastChar","decodeResultByReference","decodeSecondChar","decodeCode","decodeRegExp"],"sourceRoot":""}