diff --git a/index.xml b/index.xml index 41fe401..61127f8 100644 --- a/index.xml +++ b/index.xml @@ -27,7 +27,7 @@ implementation of ML-KEM in Rust, and talked about how our high-assurance development methodology helped us find a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">new timing bug</a> in various other Kyber implementations.</p>Verified ML-KEM (Kyber) in Rusthttps://cryspen.com/post/ml-kem-implementation/Tue, 16 Jan 2024 00:00:00 +0000https://cryspen.com/post/ml-kem-implementation/<p>ML-KEM, previously known as <a href="https://pq-crystals.org/kyber/">Kyber</a>, is the first post-quantum secure key-encapsulation mechanism (KEM) to get standardised by NIST in <a href="https://csrc.nist.gov/pubs/fips/203/ipd">FIPS 203</a>.</p> -<p>Cryspen has built <a href="https://github.com/cryspen/libcrux/tree/main/src/kem">a new high assurance Rust implementation of ML-KEM</a>, using our verification framework <a href="https://cryspen.com/hax">hax</a> and <a href="https://fstar-lang.org">F*</a>. Our implementation is among the fastest portable implementations that we know of (see <a href="#performance-comparison">Performance comparison</a>), and helped uncover a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">timing bug</a> (also called <a href="https://kyberslash.cr.yp.to/">KyberSlash</a>) in various Kyber implementations that would allow an attacker to <a href="https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/ldX0ThYJuBo/m/uIOqRF5BAwAJ">recover the private key</a>.</p>Welcome Jan & Lucashttps://cryspen.com/post/welcome_jan_lucas/Mon, 08 Jan 2024 00:00:00 +0000https://cryspen.com/post/welcome_jan_lucas/<p>📢 Exciting News! Cryspen is thrilled to announce the addition of two exceptional minds to our team: <a href="https://lucas.franceschino.fr/">Dr. Lucas Franceschino</a> and <a href="https://github.com/keks">Jan Winkelmann</a>.</p>An Analysis of Signal's PQXDHhttps://cryspen.com/post/pqxdh/Fri, 20 Oct 2023 00:00:00 +0000https://cryspen.com/post/pqxdh/<!-- _Karthikeyan Bhargavan ([Cryspen]), Charlie Jacomme ([Inria Paris](https://www.inria.fr/en/inria-paris-centre)), Franziskus Kiefer ([Cryspen]) and Rolfe Schmidt ([Signal](https://signal.org/))_ --> +<p>Cryspen has built <a href="https://github.com/cryspen/libcrux/tree/main/libcrux-kem">a new high assurance Rust implementation of ML-KEM</a>, using our verification framework <a href="https://cryspen.com/hax">hax</a> and <a href="https://fstar-lang.org">F*</a>. Our implementation is among the fastest portable implementations that we know of (see <a href="#performance-comparison">Performance comparison</a>), and helped uncover a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">timing bug</a> (also called <a href="https://kyberslash.cr.yp.to/">KyberSlash</a>) in various Kyber implementations that would allow an attacker to <a href="https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/ldX0ThYJuBo/m/uIOqRF5BAwAJ">recover the private key</a>.</p>Welcome Jan & Lucashttps://cryspen.com/post/welcome_jan_lucas/Mon, 08 Jan 2024 00:00:00 +0000https://cryspen.com/post/welcome_jan_lucas/<p>📢 Exciting News! Cryspen is thrilled to announce the addition of two exceptional minds to our team: <a href="https://lucas.franceschino.fr/">Dr. Lucas Franceschino</a> and <a href="https://github.com/keks">Jan Winkelmann</a>.</p>An Analysis of Signal's PQXDHhttps://cryspen.com/post/pqxdh/Fri, 20 Oct 2023 00:00:00 +0000https://cryspen.com/post/pqxdh/<!-- _Karthikeyan Bhargavan ([Cryspen]), Charlie Jacomme ([Inria Paris](https://www.inria.fr/en/inria-paris-centre)), Franziskus Kiefer ([Cryspen]) and Rolfe Schmidt ([Signal](https://signal.org/))_ --> <p>Signal recently <a href="https://signal.org/docs/specifications/pqxdh/">published</a> a new, post-quantum secure, version of their <a href="https://signal.org/docs/specifications/x3dh/">X3DH</a> protocol called <a href="https://signal.org/docs/specifications/pqxdh/">PQXDH</a>. As with any new cryptographic protocol, it is important to precisely analyse its security properties, especially for something as important as Signal.</p>Announcing Campus Cyber Circus Projecthttps://cryspen.com/post/cyber-campus-hax/Wed, 20 Sep 2023 00:00:00 +0000https://cryspen.com/post/cyber-campus-hax/<p>🎉 We&rsquo;re excited to announce that Cryspen <a href="https://ptcc.fr/projets/circus-2/">partnered</a> with <a href="https://www.inria.fr/fr">Inria</a> on a transfer project to build a new integrated development and verification environment (IDVE). The project is part of the transfer program at <a href="https://campuscyber.fr/">Campus Cyber</a>, which brings together France&rsquo;s top cybersecurity experts.</p>Specifying Oblivious Pseudonymizationhttps://cryspen.com/post/scrambledb/Mon, 18 Sep 2023 00:00:00 +0000https://cryspen.com/post/scrambledb/<p>In this blog post we announce an executable specification in the <code>hacspec</code> specification language for the <code>ScrambleDB</code> pseudonymization system, developed by Cryspen as part of the <a href="https://www.forschung-it-sicherheit-kommunikationssysteme.de/projekte/atlas">BMBF ATLAS project</a>.</p>Internet Defense Prize 2023https://cryspen.com/post/internet-defense-prize-2023/Mon, 14 Aug 2023 00:00:00 +0000https://cryspen.com/post/internet-defense-prize-2023/<p>At the <a href="https://www.usenix.org/conference/usenixsecurity23">32nd Usenix Security Symposium</a> in Anaheim CA, a paper on the <a href="https://cryspen.com/post/mls-introduction/">Messaging Layer Security Protocol</a>, co-authored by our founders Jonathan Protzenko and Karthikeyan Bhargavan, was awarded both the Distinguished Paper Award and the prestigious <a href="https://www.usenix.org/blog/usenix-announces-winners-2023-internet-defense-prize">Internet Defense Prize</a>.</p>Prairie and Atlashttps://cryspen.com/post/prarie-and-atlas/Wed, 09 Aug 2023 00:00:00 +0000https://cryspen.com/post/prarie-and-atlas/<p>With the widespread adoption and deployment of machine learning across enterprises, diff --git a/post/index.xml b/post/index.xml index 94e72ff..b0e64b9 100644 --- a/post/index.xml +++ b/post/index.xml @@ -27,7 +27,7 @@ implementation of ML-KEM in Rust, and talked about how our high-assurance development methodology helped us find a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">new timing bug</a> in various other Kyber implementations.</p>Verified ML-KEM (Kyber) in Rusthttps://cryspen.com/post/ml-kem-implementation/Tue, 16 Jan 2024 00:00:00 +0000https://cryspen.com/post/ml-kem-implementation/<p>ML-KEM, previously known as <a href="https://pq-crystals.org/kyber/">Kyber</a>, is the first post-quantum secure key-encapsulation mechanism (KEM) to get standardised by NIST in <a href="https://csrc.nist.gov/pubs/fips/203/ipd">FIPS 203</a>.</p> -<p>Cryspen has built <a href="https://github.com/cryspen/libcrux/tree/main/src/kem">a new high assurance Rust implementation of ML-KEM</a>, using our verification framework <a href="https://cryspen.com/hax">hax</a> and <a href="https://fstar-lang.org">F*</a>. Our implementation is among the fastest portable implementations that we know of (see <a href="#performance-comparison">Performance comparison</a>), and helped uncover a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">timing bug</a> (also called <a href="https://kyberslash.cr.yp.to/">KyberSlash</a>) in various Kyber implementations that would allow an attacker to <a href="https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/ldX0ThYJuBo/m/uIOqRF5BAwAJ">recover the private key</a>.</p>Welcome Jan & Lucashttps://cryspen.com/post/welcome_jan_lucas/Mon, 08 Jan 2024 00:00:00 +0000https://cryspen.com/post/welcome_jan_lucas/<p>📢 Exciting News! Cryspen is thrilled to announce the addition of two exceptional minds to our team: <a href="https://lucas.franceschino.fr/">Dr. Lucas Franceschino</a> and <a href="https://github.com/keks">Jan Winkelmann</a>.</p>An Analysis of Signal's PQXDHhttps://cryspen.com/post/pqxdh/Fri, 20 Oct 2023 00:00:00 +0000https://cryspen.com/post/pqxdh/<!-- _Karthikeyan Bhargavan ([Cryspen]), Charlie Jacomme ([Inria Paris](https://www.inria.fr/en/inria-paris-centre)), Franziskus Kiefer ([Cryspen]) and Rolfe Schmidt ([Signal](https://signal.org/))_ --> +<p>Cryspen has built <a href="https://github.com/cryspen/libcrux/tree/main/libcrux-kem">a new high assurance Rust implementation of ML-KEM</a>, using our verification framework <a href="https://cryspen.com/hax">hax</a> and <a href="https://fstar-lang.org">F*</a>. Our implementation is among the fastest portable implementations that we know of (see <a href="#performance-comparison">Performance comparison</a>), and helped uncover a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">timing bug</a> (also called <a href="https://kyberslash.cr.yp.to/">KyberSlash</a>) in various Kyber implementations that would allow an attacker to <a href="https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/ldX0ThYJuBo/m/uIOqRF5BAwAJ">recover the private key</a>.</p>Welcome Jan & Lucashttps://cryspen.com/post/welcome_jan_lucas/Mon, 08 Jan 2024 00:00:00 +0000https://cryspen.com/post/welcome_jan_lucas/<p>📢 Exciting News! Cryspen is thrilled to announce the addition of two exceptional minds to our team: <a href="https://lucas.franceschino.fr/">Dr. Lucas Franceschino</a> and <a href="https://github.com/keks">Jan Winkelmann</a>.</p>An Analysis of Signal's PQXDHhttps://cryspen.com/post/pqxdh/Fri, 20 Oct 2023 00:00:00 +0000https://cryspen.com/post/pqxdh/<!-- _Karthikeyan Bhargavan ([Cryspen]), Charlie Jacomme ([Inria Paris](https://www.inria.fr/en/inria-paris-centre)), Franziskus Kiefer ([Cryspen]) and Rolfe Schmidt ([Signal](https://signal.org/))_ --> <p>Signal recently <a href="https://signal.org/docs/specifications/pqxdh/">published</a> a new, post-quantum secure, version of their <a href="https://signal.org/docs/specifications/x3dh/">X3DH</a> protocol called <a href="https://signal.org/docs/specifications/pqxdh/">PQXDH</a>. As with any new cryptographic protocol, it is important to precisely analyse its security properties, especially for something as important as Signal.</p>Announcing Campus Cyber Circus Projecthttps://cryspen.com/post/cyber-campus-hax/Wed, 20 Sep 2023 00:00:00 +0000https://cryspen.com/post/cyber-campus-hax/<p>🎉 We&rsquo;re excited to announce that Cryspen <a href="https://ptcc.fr/projets/circus-2/">partnered</a> with <a href="https://www.inria.fr/fr">Inria</a> on a transfer project to build a new integrated development and verification environment (IDVE). The project is part of the transfer program at <a href="https://campuscyber.fr/">Campus Cyber</a>, which brings together France&rsquo;s top cybersecurity experts.</p>Specifying Oblivious Pseudonymizationhttps://cryspen.com/post/scrambledb/Mon, 18 Sep 2023 00:00:00 +0000https://cryspen.com/post/scrambledb/<p>In this blog post we announce an executable specification in the <code>hacspec</code> specification language for the <code>ScrambleDB</code> pseudonymization system, developed by Cryspen as part of the <a href="https://www.forschung-it-sicherheit-kommunikationssysteme.de/projekte/atlas">BMBF ATLAS project</a>.</p>Internet Defense Prize 2023https://cryspen.com/post/internet-defense-prize-2023/Mon, 14 Aug 2023 00:00:00 +0000https://cryspen.com/post/internet-defense-prize-2023/<p>At the <a href="https://www.usenix.org/conference/usenixsecurity23">32nd Usenix Security Symposium</a> in Anaheim CA, a paper on the <a href="https://cryspen.com/post/mls-introduction/">Messaging Layer Security Protocol</a>, co-authored by our founders Jonathan Protzenko and Karthikeyan Bhargavan, was awarded both the Distinguished Paper Award and the prestigious <a href="https://www.usenix.org/blog/usenix-announces-winners-2023-internet-defense-prize">Internet Defense Prize</a>.</p>Prairie and Atlashttps://cryspen.com/post/prarie-and-atlas/Wed, 09 Aug 2023 00:00:00 +0000https://cryspen.com/post/prarie-and-atlas/<p>With the widespread adoption and deployment of machine learning across enterprises, diff --git a/post/ml-kem-implementation/index.html b/post/ml-kem-implementation/index.html index f5d1dc6..d97466b 100644 --- a/post/ml-kem-implementation/index.html +++ b/post/ml-kem-implementation/index.html @@ -71,7 +71,7 @@ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */(()=>{var n,s,a,r,j,k,A,B,Ze,S,J,pe,ue,de,Je,Qe,Xe,Ue,We,Me,Se,ke,Ee,Oe,tn=Object.create,he=Object.defineProperty,zn=Object.getOwnPropertyDescriptor,Cn=Object.getOwnPropertyNames,wn=Object.getPrototypeOf,Xt=Object.prototype.hasOwnProperty,e=(e,t)=>()=>(e&&(t=e(e=0)),t),t=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),xn=(e,t)=>{for(var n in t)he(e,n,{get:t[n],enumerable:!0})},Tt=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Cn(t))!Xt.call(e,o)&&o!==n&&he(e,o,{get:()=>t[o],enumerable:!(s=zn(t,o))||s.enumerable});return e},c=(e,t,n)=>(n=e!=null?tn(wn(e)):{},Tt(t||!e||!e.__esModule?he(n,"default",{value:e,enumerable:!0}):n,e)),Ft=e=>Tt(he({},"__esModule",{value:!0}),e),u=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s():typeof define=="function"&&define.amd?define(s):(n=typeof globalThis<"u"?globalThis:n||self,n.EventHandler=s())})(e,function(){"use strict";let f=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},j=/[^.]*(?=\..*)\.|.*/,g=/\..*/,h=/::\d+$/,e={},i=1,b={mouseenter:"mouseover",mouseleave:"mouseout"},p=/^(mouseenter|mouseleave)/i,c=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function l(e,t){return t&&`${t}::${i++}`||e.uidEvent||i++}function s(t){let n=l(t);return t.uidEvent=n,e[n]=e[n]||{},e[n]}function m(e,n){return function s(o){return o.delegateTarget=e,s.oneOff&&t.off(e,o.type,n),n.apply(e,[o])}}function u(e,n,s){return function o(i){let a=e.querySelectorAll(n);for(let{target:r}=i;r&&r!==this;r=r.parentNode)for(let c=a.length;c--;)if(a[c]===r)return i.delegateTarget=r,o.oneOff&&t.off(e,i.type,n,s),s.apply(r,[i]);return null}}function o(e,t,n=null){let s=Object.keys(e);for(let o=0,a=s.length;ofunction(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)};i?i=e(i):n=e(n)}let[c,h,f]=d(t,n,i),v=s(e),b=v[f]||(v[f]={}),g=o(b,h,c?n:null);if(g){g.oneOff=g.oneOff&&a;return}let y=l(h,t.replace(j,"")),r=c?u(e,n,i):m(e,n);r.delegationSelector=c?n:null,r.originalHandler=h,r.oneOff=a,r.uidEvent=y,b[y]=r,e.addEventListener(f,r,c)}function n(e,t,n,s,i){let a=o(t[n],s,i);a&&(e.removeEventListener(n,a,!!i),delete t[n][a.uidEvent])}function v(e,t,s,o){let i=t[s]||{};Object.keys(i).forEach(a=>{if(a.includes(o)){let o=i[a];n(e,t,s,o.originalHandler,o.delegationSelector)}})}function a(e){return e=e.replace(g,""),b[e]||e}let t={on(e,t,n,s){r(e,t,n,s,!1)},one(e,t,n,s){r(e,t,n,s,!0)},off(e,t,o,i){if(typeof t!="string"||!e)return;let[u,c,r]=d(t,o,i),m=r!==t,a=s(e),f=t.startsWith(".");if(typeof c<"u"){if(!a||!a[r])return;n(e,a,r,c,u?o:null);return}f&&Object.keys(a).forEach(n=>{v(e,a,n,t.slice(1))});let l=a[r]||{};Object.keys(l).forEach(s=>{let o=s.replace(h,"");if(!m||t.includes(o)){let t=l[s];n(e,a,r,t.originalHandler,t.delegationSelector)}})},trigger(e,t,n){if(typeof t!="string"||!e)return null;let i=f(),r=a(t),h=t!==r,m=c.has(r),o,l=!0,d=!0,u=!1,s=null;return h&&i&&(o=i.Event(t,n),i(e).trigger(o),l=!o.isPropagationStopped(),d=!o.isImmediatePropagationStopped(),u=o.isDefaultPrevented()),m?(s=document.createEvent("HTMLEvents"),s.initEvent(r,l,!0)):s=new CustomEvent(t,{bubbles:l,cancelable:!0}),typeof n<"u"&&Object.keys(n).forEach(e=>{Object.defineProperty(s,e,{get(){return n[e]}})}),u&&s.preventDefault(),d&&e.dispatchEvent(s),s.defaultPrevented&&typeof o<"u"&&o.preventDefault(),s}};return t})}),Ke=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s():typeof define=="function"&&define.amd?define(s):(n=typeof globalThis<"u"?globalThis:n||self,n.Data=s())})(e,function(){"use strict";let e=new Map;return{set(t,n,s){e.has(t)||e.set(t,new Map);let o=e.get(t);if(!o.has(n)&&o.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(o.keys())[0]}.`);return}o.set(n,s)},get(t,n){return e.has(t)&&e.get(t).get(n)||null},remove(t,n){if(!e.has(t))return;let s=e.get(t);s.delete(n),s.size===0&&e.delete(t)}}})}),l=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(Ke(),u()):typeof define=="function"&&define.amd?define(["./dom/data","./dom/event-handler"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Base=s(n.Data,n.EventHandler))})(e,function(e,t){"use strict";let a=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},n=a(e),u=a(t),r=1e3,s="transitionend",d=e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e),s=Number.parseFloat(t),o=Number.parseFloat(n);return!s&&!o?0:(t=t.split(",")[0],n=n.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(n))*r)},c=e=>{e.dispatchEvent(new Event(s))},l=e=>!!e&&typeof e=="object"&&(typeof e.jquery<"u"&&(e=e[0]),typeof e.nodeType<"u"),o=e=>l(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(e):null,i=e=>{typeof e=="function"&&e()},h=(e,t,n=!0)=>{if(!n){i(e);return}let r=d(t)+5,o=!1,a=({target:n})=>{n===t&&(o=!0,t.removeEventListener(s,a),i(e))};t.addEventListener(s,a),setTimeout(()=>{o||c(t)},r)},m="5.1.3";class f{constructor(e){e=o(e),e&&(this._element=e,n.default.set(this._element,this.constructor.DATA_KEY,this))}dispose(){n.default.remove(this._element,this.constructor.DATA_KEY),u.default.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(e=>{this[e]=null})}_queueCallback(e,t,n=!0){h(e,t,n)}static getInstance(e){return n.default.get(o(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,typeof t=="object"?t:null)}static get VERSION(){return m}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}return f})}),kn=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(u(),l()):typeof define=="function"&&define.amd?define(["./dom/event-handler","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Alert=s(n.EventHandler,n.Base))})(e,function(e,t){"use strict";let a=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},o=a(e),j=a(t),f=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t},r=e=>{let t=f(e);return t?document.querySelector(t):null},l=e=>!!(!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains("disabled"))||(typeof e.disabled<"u"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false"),c=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},s=[],d=e=>{document.readyState==="loading"?(s.length||document.addEventListener("DOMContentLoaded",()=>{s.forEach(e=>e())}),s.push(e)):e()},u=e=>{d(()=>{let t=c();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},h=(e,t="hide")=>{let s=`click.dismiss${e.EVENT_KEY}`,n=e.NAME;o.default.on(document,s,`[data-bs-dismiss="${n}"]`,function(s){if(["A","AREA"].includes(this.tagName)&&s.preventDefault(),l(this))return;let o=r(this)||this.closest(`.${n}`);e.getOrCreateInstance(o)[t]()})},m="alert",i=".bs.alert",p=`close${i}`,g=`closed${i}`,v="fade",b="show";class n extends j.default{static get NAME(){return m}close(){if(o.default.trigger(this._element,p).defaultPrevented)return;this._element.classList.remove(b);let e=this._element.classList.contains(v);this._queueCallback(()=>this._destroyElement(),this._element,e)}_destroyElement(){this._element.remove(),o.default.trigger(this._element,g),this.dispose()}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}return h(n,"close"),u(n),n})}),Fn=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(u(),l()):typeof define=="function"&&define.amd?define(["./dom/event-handler","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Button=s(n.EventHandler,n.Base))})(e,function(e,t){"use strict";let i=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},p=i(e),m=i(t),c=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},s=[],r=e=>{document.readyState==="loading"?(s.length||document.addEventListener("DOMContentLoaded",()=>{s.forEach(e=>e())}),s.push(e)):e()},a=e=>{r(()=>{let t=c();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},l="button",d=".bs.button",u=".data-api",h="active",o='[data-bs-toggle="button"]',f=`click${d}${u}`;class n extends m.default{static get NAME(){return l}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(h))}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);e==="toggle"&&t[e]()})}}return p.default.on(document,f,o,e=>{e.preventDefault();let t=e.target.closest(o);n.getOrCreateInstance(t).toggle()}),a(n),n})}),x=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s():typeof define=="function"&&define.amd?define(s):(n=typeof globalThis<"u"?globalThis:n||self,n.Manipulator=s())})(e,function(){"use strict";function t(e){return e==="true"||e!=="false"&&(e===Number(e).toString()?Number(e):e===""||e==="null"?null:e)}function e(e){return e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}return{setDataAttribute(t,n,s){t.setAttribute(`data-bs-${e(n)}`,s)},removeDataAttribute(t,n){t.removeAttribute(`data-bs-${e(n)}`)},getDataAttributes(e){if(!e)return{};let n={};return Object.keys(e.dataset).filter(e=>e.startsWith("bs")).forEach(s=>{let o=s.replace(/^bs/,"");o=o.charAt(0).toLowerCase()+o.slice(1,o.length),n[o]=t(e.dataset[s])}),n},getDataAttribute(n,s){return t(n.getAttribute(`data-bs-${e(s)}`))},offset(e){let t=e.getBoundingClientRect();return{top:t.top+window.pageYOffset,left:t.left+window.pageXOffset}},position(e){return{top:e.offsetTop,left:e.offsetLeft}}}})}),O=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s():typeof define=="function"&&define.amd?define(s):(n=typeof globalThis<"u"?globalThis:n||self,n.SelectorEngine=s())})(e,function(){"use strict";let e=e=>!!e&&typeof e=="object"&&(typeof e.jquery<"u"&&(e=e[0]),typeof e.nodeType<"u"),t=t=>!!e(t)&&t.getClientRects().length!==0&&getComputedStyle(t).getPropertyValue("visibility")==="visible",n=e=>!!(!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains("disabled"))||(typeof e.disabled<"u"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false");return{find(e,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,e))},findOne(e,t=document.documentElement){return Element.prototype.querySelector.call(t,e)},children(e,t){return[].concat(...e.children).filter(e=>e.matches(t))},parents(e,t){let s=[],n=e.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&n.nodeType!==3;)n.matches(t)&&s.push(n),n=n.parentNode;return s},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]},focusableChildren(e){let s=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(e=>`${e}:not([tabindex^="-"])`).join(", ");return this.find(s,e).filter(e=>!n(e)&&t(e))}}})}),Dn=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(u(),x(),O(),l()):typeof define=="function"&&define.amd?define(["./dom/event-handler","./dom/manipulator","./dom/selector-engine","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Carousel=s(n.EventHandler,n.Manipulator,n.SelectorEngine,n.Base))})(e,function(e,t,n,s){"use strict";let f=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},o=f(e),g=f(t),a=f(n),ge=f(s),ae="transitionend",Z=e=>e==null?`${e}`:{}.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),L=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t},N=e=>{let t=L(e);return t?document.querySelector(t):null},D=e=>{e.dispatchEvent(new Event(ae))},y=e=>!!e&&typeof e=="object"&&(typeof e.jquery<"u"&&(e=e[0]),typeof e.nodeType<"u"),C=(e,t,n)=>{Object.keys(n).forEach(s=>{let i=n[s],o=t[s],a=o&&y(o)?"element":Z(o);if(!new RegExp(i).test(a))throw new TypeError(`${e.toUpperCase()}: Option "${s}" provided type "${a}" but expected type "${i}".`)})},F=e=>!!y(e)&&e.getClientRects().length!==0&&getComputedStyle(e).getPropertyValue("visibility")==="visible",H=e=>{e.offsetHeight},W=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},p=[],z=e=>{document.readyState==="loading"?(p.length||document.addEventListener("DOMContentLoaded",()=>{p.forEach(e=>e())}),p.push(e)):e()},v=()=>document.documentElement.dir==="rtl",E=e=>{z(()=>{let t=W();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},K=(e,t,n,s)=>{let o=e.indexOf(t);if(o===-1)return e[!n&&s?e.length-1:0];let i=e.length;return o+=n?1:-1,s&&(o=(o+i)%i),e[Math.max(0,Math.min(o,i-1))]},b="carousel",i=".bs.carousel",w=".data-api",k="ArrowLeft",A="ArrowRight",S=500,M=40,_={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},T={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},u="next",d="prev",l="left",h="right",U={[k]:h,[A]:l},P=`slide${i}`,j=`slid${i}`,I=`keydown${i}`,B=`mouseenter${i}`,V=`mouseleave${i}`,$=`touchstart${i}`,O=`touchmove${i}`,R=`touchend${i}`,ue=`pointerdown${i}`,te=`pointerup${i}`,Y=`dragstart${i}`,G=`load${i}${w}`,X=`click${i}${w}`,Q="carousel",c="active",J="slide",ee="carousel-item-end",q="carousel-item-start",ne="carousel-item-next",se="carousel-item-prev",oe="pointer-event",ie=".active",m=".active.carousel-item",re=".carousel-item",ce=".carousel-item img",le=".carousel-item-next, .carousel-item-prev",de=".carousel-indicators",x="[data-bs-target]",he="[data-bs-slide], [data-bs-slide-to]",me='[data-bs-ride="carousel"]',fe="touch",pe="pen";class r extends ge.default{constructor(e,t){super(e),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(t),this._indicatorsElement=a.default.findOne(de,this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=!!window.PointerEvent,this._addEventListeners()}static get Default(){return _}static get NAME(){return b}next(){this._slide(u)}nextWhenVisible(){!document.hidden&&F(this._element)&&this.next()}prev(){this._slide(d)}pause(e){e||(this._isPaused=!0),a.default.findOne(le,this._element)&&(D(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(e){this._activeElement=a.default.findOne(m,this._element);let t=this._getItemIndex(this._activeElement);if(e>this._items.length-1||e<0)return;if(this._isSliding){o.default.one(this._element,j,()=>this.to(e));return}if(t===e){this.pause(),this.cycle();return}let n=e>t?u:d;this._slide(n,this._items[e])}_getConfig(e){return e={..._,...g.default.getDataAttributes(this._element),...typeof e=="object"?e:{}},C(b,e,T),e}_handleSwipe(){let e=Math.abs(this.touchDeltaX);if(e<=M)return;let t=e/this.touchDeltaX;this.touchDeltaX=0,t&&this._slide(t>0?h:l)}_addEventListeners(){this._config.keyboard&&o.default.on(this._element,I,e=>this._keydown(e)),this._config.pause==="hover"&&(o.default.on(this._element,B,e=>this.pause(e)),o.default.on(this._element,V,e=>this.cycle(e))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){let e=e=>this._pointerEvent&&(e.pointerType===pe||e.pointerType===fe),t=t=>{e(t)?this.touchStartX=t.clientX:this._pointerEvent||(this.touchStartX=t.touches[0].clientX)},s=e=>{this.touchDeltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this.touchStartX},n=t=>{e(t)&&(this.touchDeltaX=t.clientX-this.touchStartX),this._handleSwipe(),this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(e=>this.cycle(e),S+this._config.interval))};a.default.find(ce,this._element).forEach(e=>{o.default.on(e,Y,e=>e.preventDefault())}),this._pointerEvent?(o.default.on(this._element,ue,e=>t(e)),o.default.on(this._element,te,e=>n(e)),this._element.classList.add(oe)):(o.default.on(this._element,$,e=>t(e)),o.default.on(this._element,O,e=>s(e)),o.default.on(this._element,R,e=>n(e)))}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;let t=U[e.key];t&&(e.preventDefault(),this._slide(t))}_getItemIndex(e){return this._items=e&&e.parentNode?a.default.find(re,e.parentNode):[],this._items.indexOf(e)}_getItemByOrder(e,t){let n=e===u;return K(this._items,t,n,this._config.wrap)}_triggerSlideEvent(e,t){let n=this._getItemIndex(e),s=this._getItemIndex(a.default.findOne(m,this._element));return o.default.trigger(this._element,P,{relatedTarget:e,direction:t,from:s,to:n})}_setActiveIndicatorElement(e){if(this._indicatorsElement){let n=a.default.findOne(ie,this._indicatorsElement);n.classList.remove(c),n.removeAttribute("aria-current");let t=a.default.find(x,this._indicatorsElement);for(let n=0;n{o.default.trigger(this._element,j,{relatedTarget:n,direction:f,from:g,to:v})};if(this._element.classList.contains(J)){n.classList.add(l),H(n),s.classList.add(i),n.classList.add(i);let e=()=>{n.classList.remove(i,l),n.classList.add(c),s.classList.remove(c,l,i),this._isSliding=!1,setTimeout(p,0)};this._queueCallback(e,s,!0)}else s.classList.remove(c),n.classList.add(c),this._isSliding=!1,p();d&&this.cycle()}_directionToOrder(e){return[h,l].includes(e)?v()?e===l?d:u:e===l?u:d:e}_orderToDirection(e){return[u,d].includes(e)?v()?e===d?l:h:e===d?h:l:e}static carouselInterface(e,t){let n=r.getOrCreateInstance(e,t),{_config:s}=n;typeof t=="object"&&(s={...s,...t});let o=typeof t=="string"?t:s.slide;if(typeof t=="number")n.to(t);else if(typeof o=="string"){if(typeof n[o]>"u")throw new TypeError(`No method named "${o}"`);n[o]()}else s.interval&&s.ride&&(n.pause(),n.cycle())}static jQueryInterface(e){return this.each(function(){r.carouselInterface(this,e)})}static dataApiClickHandler(e){let t=N(this);if(!t||!t.classList.contains(Q))return;let s={...g.default.getDataAttributes(t),...g.default.getDataAttributes(this)},n=this.getAttribute("data-bs-slide-to");n&&(s.interval=!1),r.carouselInterface(t,s),n&&r.getInstance(t).to(n),e.preventDefault()}}return o.default.on(document,X,he,r.dataApiClickHandler),o.default.on(window,G,()=>{let e=a.default.find(me);for(let t=0,n=e.length;t{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(Ke(),u(),x(),O(),l()):typeof define=="function"&&define.amd?define(["./dom/data","./dom/event-handler","./dom/manipulator","./dom/selector-engine","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Collapse=s(n.Data,n.EventHandler,n.Manipulator,n.SelectorEngine,n.Base))})(e,function(e,t,n,s,o){"use strict";let l=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},W=l(e),d=l(t),k=l(n),i=l(s),L=l(o),E=e=>e==null?`${e}`:{}.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),y=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t},_=e=>{let t=y(e);return t&&document.querySelector(t)?t:null},g=e=>{let t=y(e);return t?document.querySelector(t):null},w=e=>!!e&&typeof e=="object"&&(typeof e.jquery<"u"&&(e=e[0]),typeof e.nodeType<"u"),P=e=>w(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(e):null,R=(e,t,n)=>{Object.keys(n).forEach(s=>{let i=n[s],o=t[s],a=o&&w(o)?"element":E(o);if(!new RegExp(i).test(a))throw new TypeError(`${e.toUpperCase()}: Option "${s}" provided type "${a}" but expected type "${i}".`)})},D=e=>{e.offsetHeight},S=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},f=[],x=e=>{document.readyState==="loading"?(f.length||document.addEventListener("DOMContentLoaded",()=>{f.forEach(e=>e())}),f.push(e)):e()},A=e=>{x(()=>{let t=S();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},O="collapse",p="bs.collapse",c=`.${p}`,C=".data-api",v={toggle:!0,parent:null},M={toggle:"boolean",parent:"(null|element)"},$=`show${c}`,N=`shown${c}`,F=`hide${c}`,T=`hidden${c}`,z=`click${c}${C}`,m="show",r="collapse",u="collapsing",j="collapsed",b=`:scope .${r} .${r}`,H="collapse-horizontal",I="width",B="height",V=".collapse.show, .collapse.collapsing",h='[data-bs-toggle="collapse"]';class a extends L.default{constructor(e,t){super(e),this._isTransitioning=!1,this._config=this._getConfig(t),this._triggerArray=[];let n=i.default.find(h);for(let e=0,o=n.length;ee===this._element);t!==null&&a.length&&(this._selector=t,this._triggerArray.push(s))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return v}static get NAME(){return O}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[],n;if(this._config.parent){let e=i.default.find(b,this._config.parent);t=i.default.find(V,this._config.parent).filter(t=>!e.includes(t))}let s=i.default.findOne(this._selector);if(t.length){let e=t.find(e=>s!==e);if(n=e?a.getInstance(e):null,n&&n._isTransitioning)return}if(d.default.trigger(this._element,$).defaultPrevented)return;t.forEach(e=>{s!==e&&a.getOrCreateInstance(e,{toggle:!1}).hide(),n||W.default.set(e,p,null)});let e=this._getDimension();this._element.classList.remove(r),this._element.classList.add(u),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;let o=()=>{this._isTransitioning=!1,this._element.classList.remove(u),this._element.classList.add(r,m),this._element.style[e]="",d.default.trigger(this._element,N)},c=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback(o,this._element,!0),this._element.style[e]=`${this._element[c]}px`}hide(){if(this._isTransitioning||!this._isShown()||d.default.trigger(this._element,F).defaultPrevented)return;let e=this._getDimension();this._element.style[e]=`${this._element.getBoundingClientRect()[e]}px`,D(this._element),this._element.classList.add(u),this._element.classList.remove(r,m);let t=this._triggerArray.length;for(let e=0;e{this._isTransitioning=!1,this._element.classList.remove(u),this._element.classList.add(r),d.default.trigger(this._element,T)};this._element.style[e]="",this._queueCallback(n,this._element,!0)}_isShown(e=this._element){return e.classList.contains(m)}_getConfig(e){return e={...v,...k.default.getDataAttributes(this._element),...e},e.toggle=!!e.toggle,e.parent=P(e.parent),R(O,e,M),e}_getDimension(){return this._element.classList.contains(H)?I:B}_initializeChildren(){if(!this._config.parent)return;let e=i.default.find(b,this._config.parent);i.default.find(h,this._config.parent).filter(t=>!e.includes(t)).forEach(e=>{let t=g(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))})}_addAriaAndCollapsedClass(e,t){e.length&&e.forEach(e=>{t?e.classList.remove(j):e.classList.add(j),e.setAttribute("aria-expanded",t)})}static jQueryInterface(e){return this.each(function(){let t={};typeof e=="string"&&/show|hide/.test(e)&&(t.toggle=!1);let n=a.getOrCreateInstance(this,t);if(typeof e=="string"){if(typeof n[e]>"u")throw new TypeError(`No method named "${e}"`);n[e]()}})}}return d.default.on(document,z,h,function(e){(e.target.tagName==="A"||e.delegateTarget&&e.delegateTarget.tagName==="A")&&e.preventDefault();let t=_(this);i.default.find(t).forEach(e=>{a.getOrCreateInstance(e,{toggle:!1}).toggle()})}),A(a),a})}),o=e(()=>{n="top",r="bottom",a="right",s="left",B="auto",k=[n,r,a,s],j="start",A="end",Ze="clippingParents",J="viewport",S="popper",pe="reference",ue=k.reduce(function(e,t){return e.concat([t+"-"+j,t+"-"+A])},[]),de=[].concat(k,[B]).reduce(function(e,t){return e.concat([t,t+"-"+j,t+"-"+A])},[]),Je="beforeRead",Qe="read",Xe="afterRead",Ue="beforeMain",We="main",Me="afterMain",Se="beforeWrite",ke="write",Ee="afterWrite",Oe=[Je,Qe,Xe,Ue,We,Me,Se,ke,Ee]});function p(e){return e?(e.nodeName||"").toLowerCase():null}C=e(()=>{});function h(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}m=e(()=>{});function F(e){var t=h(e).Element;return e instanceof t||e instanceof Element}function d(e){var t=h(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function Ut(e){if(typeof ShadowRoot>"u")return!1;var t=h(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}i=e(()=>{m()});function en(e){var t=e.state;Object.keys(t.elements).forEach(function(e){var o=t.styles[e]||{},s=t.attributes[e]||{},n=t.elements[e];!d(n)||!p(n)||(Object.assign(n.style,o),Object.keys(s).forEach(function(e){var t=s[e];t===!1?n.removeAttribute(e):n.setAttribute(e,t===!0?"":t)}))})}function nn(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(e){var s=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]),a=i.reduce(function(e,t){return e[t]="",e},{});!d(s)||!p(s)||(Object.assign(s.style,a),Object.keys(o).forEach(function(e){s.removeAttribute(e)}))})}}q=e(()=>{C(),i(),ne={name:"applyStyles",enabled:!0,phase:"write",fn:en,effect:nn,requires:["computeStyles"]}});function f(e){return e.split("-")[0]}b=e(()=>{o()}),_=e(()=>{y=Math.max,H=Math.min,M=Math.round});function D(e,t){t===void 0&&(t=!1);var i,a,n=e.getBoundingClientRect(),s=1,o=1;return d(e)&&t&&(i=e.offsetHeight,a=e.offsetWidth,a>0&&(s=M(n.width)/a||1),i>0&&(o=M(n.height)/i||1)),{width:n.width/s,height:n.height/o,top:n.top/o,right:n.right/s,bottom:n.bottom/o,left:n.left/s,x:n.left/s,y:n.top/o}}z=e(()=>{i(),_()});function ve(e){var t=D(e),n=e.offsetWidth,s=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-s)<=1&&(s=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:s}}me=e(()=>{z()});function ft(e,t){var n,s=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(s&&Ut(s)){n=t;do{if(n&&e.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}je=e(()=>{i()});function v(e){return h(e).getComputedStyle(e)}E=e(()=>{m()});function On(e){return["table","td","th"].indexOf(p(e))>=0}xt=e(()=>{C()});function w(e){return((F(e)?e.ownerDocument:e.document)||window.document).documentElement}g=e(()=>{i()});function Z(e){return p(e)==="html"?e:e.assignedSlot||e.parentNode||(Ut(e)?e.host:null)||w(e)}W=e(()=>{C(),g(),i()});function Kt(e){return!d(e)||v(e).position==="fixed"?null:e.offsetParent}function on(e){var t,n,o,s=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,i=navigator.userAgent.indexOf("Trident")!==-1;if(i&&d(e)&&(o=v(e),o.position==="fixed"))return null;for(n=Z(e);d(n)&&["html","body"].indexOf(p(n))<0;){if(t=v(n),t.transform!=="none"||t.perspective!=="none"||t.contain==="paint"||["transform","perspective"].indexOf(t.willChange)!==-1||s&&t.willChange==="filter"||s&&t.filter&&t.filter!=="none")return n;n=n.parentNode}return null}function $(e){for(var n=h(e),t=Kt(e);t&&On(t)&&v(t).position==="static";)t=Kt(t);return t&&(p(t)==="html"||p(t)==="body"&&v(t).position==="static")?n:t||on(e)||n}N=e(()=>{m(),C(),E(),i(),xt(),W()});function Ae(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}ee=e(()=>{});function I(e,t,n){return y(e,H(t,n))}function rn(e,t,n){var s=I(e,t,n);return s>n?n:s}Te=e(()=>{_()});function Pt(){return{top:0,right:0,bottom:0,left:0}}De=e(()=>{});function Rt(e){return Object.assign({},Pt(),e)}Le=e(()=>{De()});function Mt(e,t){return t.reduce(function(t,n){return t[n]=e,t},{})}Pe=e(()=>{});function _n(e){var i,t=e.state,A=e.name,k=e.options,d=t.elements.arrow,u=t.modifiersData.popperOffsets,p=f(t.placement),o=Ae(p),O=[s,a].indexOf(p)>=0,c=O?"height":"width";if(!!d&&!!u){var g=_t(k.padding,t),v=ve(d),j=o==="y"?n:s,w=o==="y"?r:a,y=t.rects.reference[c]+t.rects.reference[o]-u[o]-t.rects.popper[c],_=u[o]-t.rects.reference[o],l=$(d),m=l?o==="y"?l.clientHeight||0:l.clientWidth||0:0,x=y/2-_/2,C=g[j],E=m-v[c]-g[w],h=m/2-v[c]/2+x,b=I(C,h,E),S=o;t.modifiersData[A]=(i={},i[S]=b,i.centerOffset=b-h,i)}}function qt(e){var n=e.state,o=e.options,s=o.element,t=s===void 0?"[data-popper-arrow]":s;t!=null&&(typeof t=="string"&&(t=n.elements.popper.querySelector(t),!t)||ft(n.elements.popper,t)&&(n.elements.arrow=t))}$e=e(()=>{b(),me(),je(),N(),ee(),Te(),Le(),Pe(),o(),i(),_t=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,Rt(typeof e!="number"?e:Mt(e,k))},Ve={name:"arrow",enabled:!0,phase:"main",fn:_n,effect:qt,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]}});function L(e){return e.split("-")[1]}P=e(()=>{});function Qt(e){var n=e.x,s=e.y,o=window,t=o.devicePixelRatio||1;return{x:M(n*t)/t||0,y:M(s*t)/t||0}}function gt(e){var l,d,f,g,z,D,j=e.popper,S=e.popperRect,c=e.placement,C=e.variation,m=e.offsets,F=e.position,p=e.gpuAcceleration,O=e.adaptive,b=e.roundOffsets,M=e.isFixed,E=m.x,t=E===void 0?0:E,k=m.y,o=k===void 0?0:k,R=typeof b=="function"?b({x:t,y:o}):{x:t,y:o},t=R.x,o=R.y,T=m.hasOwnProperty("x"),N=m.hasOwnProperty("y"),y=s,_=n,u=window;if(O){var i=$(j),x="clientHeight",L="clientWidth";(i===h(j)&&(i=w(j),v(i).position!=="static"&&F==="absolute"&&(x="scrollHeight",L="scrollWidth")),i=i,c===n||(c===s||c===a)&&C===A)&&(_=r,z=M&&u.visualViewport?u.visualViewport.height:i[x],o-=z-S.height,o*=p?1:-1),(c===s||(c===n||c===r)&&C===A)&&(y=a,D=M&&u.visualViewport?u.visualViewport.width:i[L],t-=D-S.width,t*=p?1:-1)}return g=Object.assign({position:F},O&&ct),f=b===!0?Qt({x:t,y:o}):{x:t,y:o},t=f.x,o=f.y,p?Object.assign({},g,(d={},d[_]=N?"0":"",d[y]=T?"0":"",d.transform=(u.devicePixelRatio||1)<=1?"translate("+t+"px, "+o+"px)":"translate3d("+t+"px, "+o+"px, 0)",d)):Object.assign({},g,(l={},l[_]=N?o+"px":"",l[y]=T?t+"px":"",l.transform="",l))}function Tn(e){var d,t=e.state,n=e.options,s=n.gpuAcceleration,c=s===void 0||s,o=n.adaptive,l=o===void 0||o,i=n.roundOffsets,a=i===void 0||i,r={placement:f(t.placement),variation:L(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:c,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,gt(Object.assign({},r,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:l,roundOffsets:a})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,gt(Object.assign({},r,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:a})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}re=e(()=>{o(),N(),m(),g(),E(),b(),P(),_(),ct={top:"auto",right:"auto",bottom:"auto",left:"auto"},te={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:Tn,data:{}}});function Sn(e){var n=e.state,t=e.instance,s=e.options,o=s.scroll,i=o===void 0||o,a=s.resize,r=a===void 0||a,c=h(n.elements.popper),l=[].concat(n.scrollParents.reference,n.scrollParents.popper);return i&&l.forEach(function(e){e.addEventListener("scroll",t.update,V)}),r&&c.addEventListener("resize",t.update,V),function(){i&&l.forEach(function(e){e.removeEventListener("scroll",t.update,V)}),r&&c.removeEventListener("resize",t.update,V)}}se=e(()=>{m(),V={passive:!0},X={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:Sn,data:{}}});function Y(e){return e.replace(/left|right|bottom|top/g,function(e){return st[e]})}ot=e(()=>{st={left:"right",right:"left",bottom:"top",top:"bottom"}});function it(e){return e.replace(/start|end/g,function(e){return at[e]})}rt=e(()=>{at={start:"end",end:"start"}});function Ge(e){var t=h(e),n=t.pageXOffset,s=t.pageYOffset;return{scrollLeft:n,scrollTop:s}}G=e(()=>{m()});function Ye(e){return D(w(e)).left+Ge(e).scrollLeft}K=e(()=>{z(),g(),G()});function Mn(e){var r=h(e),n=w(e),t=r.visualViewport,s=n.clientWidth,o=n.clientHeight,i=0,a=0;return t&&(s=t.width,o=t.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(i=t.offsetLeft,a=t.offsetTop)),{width:s,height:o,x:i+Ye(e),y:a}}mt=e(()=>{m(),g(),K()});function An(e){var s,n=w(e),o=Ge(e),t=(s=e.ownerDocument)==null?void 0:s.body,i=y(n.scrollWidth,n.clientWidth,t?t.scrollWidth:0,t?t.clientWidth:0),r=y(n.scrollHeight,n.clientHeight,t?t.scrollHeight:0,t?t.clientHeight:0),a=-o.scrollLeft+Ye(e),c=-o.scrollTop;return v(t||n).direction==="rtl"&&(a+=y(n.clientWidth,t?t.clientWidth:0)-i),{width:i,height:r,x:a,y:c}}pt=e(()=>{g(),E(),K(),G(),_()});function qe(e){var t=v(e),n=t.overflow,s=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+s)}Q=e(()=>{E()});function bt(e){return["html","body","#document"].indexOf(p(e))>=0?e.ownerDocument.body:d(e)&&qe(e)?e:bt(Z(e))}jt=e(()=>{W(),Q(),C(),i()});function U(e,t){t===void 0&&(t=[]);var s,n=bt(e),o=n===((s=e.ownerDocument)==null?void 0:s.body),i=h(n),a=o?[i].concat(i.visualViewport||[],qe(n)?n:[]):n,r=t.concat(a);return o?r:r.concat(U(Z(a)))}Be=e(()=>{jt(),W(),m(),Q()});function Ie(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}He=e(()=>{});function yn(e){var t=D(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}function Ct(e,t){return t===J?Ie(Mn(e)):F(t)?yn(t):Ie(An(w(e)))}function bn(e){var n=U(Z(e)),s=["absolute","fixed"].indexOf(v(e).position)>=0,t=s&&d(e)?$(e):e;return F(t)?n.filter(function(e){return F(e)&&ft(e,t)&&p(e)!=="body"}):[]}function vn(e,t,n){var i=t==="clippingParents"?bn(e):[].concat(t),o=[].concat(i,[n]),a=o[0],s=o.reduce(function(t,n){var s=Ct(e,n);return t.top=y(s.top,t.top),t.right=H(s.right,t.right),t.bottom=H(s.bottom,t.bottom),t.left=y(s.left,t.left),t},Ct(e,a));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}At=e(()=>{o(),mt(),pt(),Be(),N(),g(),E(),i(),z(),W(),je(),C(),He(),_()});function St(e){var o,i,l,t=e.reference,c=e.element,d=e.placement,u=d?f(d):null,p=d?L(d):null,h=t.x+t.width/2-c.width/2,m=t.y+t.height/2-c.height/2;switch(u){case n:o={x:h,y:t.y-c.height};break;case r:o={x:h,y:t.y+t.height};break;case a:o={x:t.x+t.width,y:m};break;case s:o={x:t.x-c.width,y:m};break;default:o={x:t.x,y:t.y}}if(i=u?Ae(u):null,i!=null)switch(l=i==="y"?"height":"width",p){case j:o[i]=o[i]-(t[l]/2-c[l]/2);break;case A:o[i]=o[i]+(t[l]/2-c[l]/2);break;default:}return o}Re=e(()=>{b(),P(),ee(),o()});function T(e,t){t===void 0&&(t={});var p,s=t,O=s.placement,f=O===void 0?e.placement:O,x=s.boundary,M=x===void 0?Ze:x,_=s.rootBoundary,C=_===void 0?J:_,v=s.elementContext,o=v===void 0?S:v,b=s.altBoundary,z=b!==void 0&&b,g=s.padding,h=g===void 0?0:g,l=Rt(typeof h!="number"?h:Mt(h,k)),T=o===S?pe:S,y=e.rects.popper,u=e.elements[z?T:o],c=vn(F(u)?u:u.contextElement||w(e.elements.popper),M,C),m=D(e.elements.reference),A=St({reference:m,element:y,strategy:"absolute",placement:f}),E=Ie(Object.assign({},y,A)),i=o===S?E:m,d={top:c.top-i.top+l.top,bottom:i.bottom-c.bottom+l.bottom,left:c.left-i.left+l.left,right:i.right-c.right+l.right},j=e.modifiersData.offset;return o===S&&j&&(p=j[f],Object.keys(d).forEach(function(e){var t=[a,r].indexOf(e)>=0?1:-1,s=[n,r].indexOf(e)>=0?"y":"x";d[e]+=p[s]*t})),d}R=e(()=>{At(),g(),z(),Re(),He(),o(),i(),Le(),Pe()});function gn(e,t){t===void 0&&(t={});var s,n=t,c=n.placement,l=n.boundary,d=n.rootBoundary,u=n.padding,h=n.flipVariations,i=n.allowedAutoPlacements,m=i===void 0?de:i,a=L(c),r=a?h?ue:ue.filter(function(e){return L(e)===a}):k,o=r.filter(function(e){return m.indexOf(e)>=0});return o.length===0&&(o=r),s=o.reduce(function(t,n){return t[n]=T(e,{placement:n,boundary:l,rootBoundary:d,padding:u})[f(n)],t},{}),Object.keys(s).sort(function(e,t){return s[e]-s[t]})}Dt=e(()=>{P(),o(),R(),b()});function pn(e){if(f(e)===B)return[];var t=Y(e);return[it(e),t,it(t)]}function mn(e){var t=e.state,o=e.options,w=e.name;if(!t.modifiersData[w]._skip){for(var i,_,x,O=o.mainAxis,V=O===void 0||O,C=o.altAxis,N=C===void 0||C,R=o.fallbackPlacements,y=o.padding,F=o.boundary,E=o.rootBoundary,q=o.altBoundary,z=o.flipVariations,m=z===void 0||z,G=o.allowedAutoPlacements,l=t.options.placement,W=f(l),$=W===l,I=R||($||!m?[Y(l)]:pn(l)),h=[l].concat(I).reduce(function(e,n){return e.concat(f(n)===B?gn(t,{placement:n,boundary:F,rootBoundary:E,padding:y,flipVariations:m,allowedAutoPlacements:G}):n)},[]),H=t.rects.reference,P=t.rects.popper,S=new Map,M=!0,u=h[0],v=0;v=0,k=A?"width":"height",g=T(t,{placement:c,boundary:F,rootBoundary:E,altBoundary:q,padding:y}),d=A?D?a:s:D?r:n;if(H[k]>P[k]&&(d=Y(d)),x=Y(d),i=[],V&&i.push(g[b]<=0),N&&i.push(g[d]<=0,g[x]<=0),i.every(function(e){return e})){u=c,M=!1;break}S.set(c,i)}if(M)for(var U=m?3:1,K=function(e){var t=h.find(function(t){var n=S.get(t);if(n)return n.slice(0,e).every(function(e){return e})});if(t)return u=t,"break"},p=U;p>0;p--)if(_=K(p),_==="break")break;t.placement!==u&&(t.modifiersData[w]._skip=!0,t.placement=u,t.reset=!0)}}ze=e(()=>{ot(),b(),rt(),R(),Dt(),o(),P(),Ne={name:"flip",enabled:!0,phase:"main",fn:mn,requiresIfExists:["offset"],data:{_skip:!1}}});function Ht(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function It(e){return[n,a,r,s].some(function(t){return e[t]>=0})}function dn(e){var t=e.state,a=e.name,r=t.rects.reference,c=t.rects.popper,l=t.modifiersData.preventOverflow,d=T(t,{elementContext:"reference"}),u=T(t,{altBoundary:!0}),n=Ht(d,r),s=Ht(u,c,l),o=It(n),i=It(s);t.modifiersData[a]={referenceClippingOffsets:n,popperEscapeOffsets:s,isReferenceHidden:o,hasPopperEscaped:i},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":o,"data-popper-escaped":i})}Ce=e(()=>{o(),R(),Fe={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:dn}});function Zt(e,t,o){var c=f(e),d=[s,n].indexOf(c)>=0?-1:1,l=typeof o=="function"?o(Object.assign({},t,{placement:e})):o,i=l[0],r=l[1];return i=i||0,r=(r||0)*d,[s,a].indexOf(c)>=0?{x:r,y:i}:{x:i,y:r}}function Gt(e){var t=e.state,i=e.options,a=e.name,n=i.offset,r=n===void 0?[0,0]:n,s=de.reduce(function(e,n){return e[n]=Zt(n,t.rects,r),e},{}),o=s[t.placement],c=o.x,l=o.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=c,t.modifiersData.popperOffsets.y+=l),t.modifiersData[a]=s}we=e(()=>{b(),o(),xe={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Gt}});function En(e){var t=e.state,n=e.name;t.modifiersData[n]=St({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}ie=e(()=>{Re(),oe={name:"popperOffsets",enabled:!0,phase:"read",fn:En,data:{}}});function Yt(e){return e==="x"?"y":"x"}Wt=e(()=>{});function Jt(e){var t=e.state,c=e.options,pe=e.name,ne=c.mainAxis,fe=ne===void 0||ne,U=c.altAxis,je=U!==void 0&&U,ye=c.boundary,_e=c.rootBoundary,we=c.altBoundary,Oe=c.padding,R=c.tether,l=R===void 0||R,W=c.tetherOffset,k=W===void 0?0:W,O=T(t,{boundary:ye,rootBoundary:_e,padding:Oe,altBoundary:we}),Z=f(t.placement),x=L(t.placement),ie=!x,o=Ae(Z),p=Yt(o),v=t.modifiersData.popperOffsets,u=t.rects.reference,g=t.rects.popper,_=typeof k=="function"?k(Object.assign({},t.rects,{placement:t.placement})):k,m=typeof _=="number"?{mainAxis:_,altAxis:_}:Object.assign({mainAxis:0,altAxis:0},_),N=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,C={x:0,y:0};if(v){if(fe){var P,B=o==="y"?n:s,V=o==="y"?r:a,i=o==="y"?"height":"width",h=v[o],K=h+O[B],M=h-O[V],Y=l?-g[i]/2:0,be=x===j?u[i]:g[i],ge=x===j?-g[i]:-u[i],Q=t.elements.arrow,ae=l&&Q?ve(Q):{width:0,height:0},J=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:Pt(),ee=J[B],te=J[V],b=I(0,u[i],ae[i]),ue=ie?u[i]/2-Y-b-ee-m.mainAxis:be-b-ee-m.mainAxis,de=ie?-u[i]/2+Y+b+te+m.mainAxis:ge+b+te+m.mainAxis,E=t.elements.arrow&&$(t.elements.arrow),re=E?o==="y"?E.clientTop||0:E.clientLeft||0:0,z=(P=N?.[o])!=null?P:0,ce=h+ue-z-re,le=h+de-z,oe=I(l?H(K,ce):K,h,l?y(M,le):M);v[o]=oe,C[o]=oe-h}if(je){var se,he=o==="x"?n:s,me=o==="x"?r:a,d=v[p],w=p==="y"?"height":"width",X=d+O[he],G=d-O[me],A=[n,s].indexOf(Z)!==-1,D=(se=N?.[p])!=null?se:0,S=A?X:d-u[w]-g[w]-D+m.altAxis,F=A?d+u[w]+g[w]-D-m.altAxis:G,q=l&&A?rn(S,d,F):I(l?S:X,d,l?F:G);v[p]=q,C[p]=q-d}t.modifiersData[pe]=C}}fe=e(()=>{o(),b(),ee(),Wt(),Te(),me(),N(),R(),P(),De(),_(),_e={name:"preventOverflow",enabled:!0,phase:"main",fn:Jt,requiresIfExists:["offset"]}}),ye=e(()=>{q(),$e(),re(),se(),ze(),Ce(),we(),ie(),fe()});function sn(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}$t=e(()=>{});function an(e){return e===h(e)||!d(e)?Ge(e):sn(e)}Vt=e(()=>{G(),m(),i(),$t()});function cn(e){var t=e.getBoundingClientRect(),n=M(t.width)/e.offsetWidth||1,s=M(t.height)/e.offsetHeight||1;return n!==1||s!==1}function ln(e,t,n){n===void 0&&(n=!1);var r=d(t),c=d(t)&&cn(t),i=w(t),o=D(e,c),a={scrollLeft:0,scrollTop:0},s={x:0,y:0};return(r||!r&&!n)&&((p(t)!=="body"||qe(i))&&(a=an(t)),d(t)?(s=D(t,!0),s.x+=t.clientLeft,s.y+=t.clientTop):i&&(s.x=Ye(i))),{x:o.left+a.scrollLeft-s.x,y:o.top+a.scrollTop-s.y,width:o.width,height:o.height}}Bt=e(()=>{z(),Vt(),C(),i(),K(),g(),Q(),_()});function un(e){var n=new Map,t=new Set,s=[];e.forEach(function(e){n.set(e.name,e)});function o(e){t.add(e.name);var i=[].concat(e.requires||[],e.requiresIfExists||[]);i.forEach(function(e){if(!t.has(e)){var s=n.get(e);s&&o(s)}}),s.push(e)}return e.forEach(function(e){t.has(e.name)||o(e)}),s}function hn(e){var t=un(e);return Oe.reduce(function(e,n){return e.concat(t.filter(function(e){return e.phase===n}))},[])}Lt=e(()=>{o()});function fn(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}Nt=e(()=>{}),zt=e(()=>{}),kt=e(()=>{zt(),o()}),Et=e(()=>{});function jn(e){var t=e.reduce(function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e},{});return Object.keys(t).map(function(e){return t[e]})}et=e(()=>{});function Ot(){for(var t=arguments.length,n=new Array(t),e=0;e{Bt(),me(),Be(),N(),E(),Lt(),Nt(),kt(),Et(),b(),et(),R(),i(),o(),be={placement:"bottom",modifiers:[],strategy:"absolute"},wt=ae()}),ge=e(()=>{ce(),se(),ie(),re(),q(),yt=[X,oe,te,ne],vt=ae({defaultModifiers:yt})}),ut=e(()=>{ce(),se(),ie(),re(),q(),we(),ze(),fe(),$e(),Ce(),ge(),ye(),tt=[X,oe,te,ne,xe,Ne,_e,Ve,Fe],ht=ae({defaultModifiers:tt})}),dt=e(()=>{o(),ye(),ce(),ut(),ge()}),le={},xn(le,{afterMain:()=>Me,afterRead:()=>Xe,afterWrite:()=>Ee,applyStyles:()=>ne,arrow:()=>Ve,auto:()=>B,basePlacements:()=>k,beforeMain:()=>Ue,beforeRead:()=>Je,beforeWrite:()=>Se,bottom:()=>r,clippingParents:()=>Ze,computeStyles:()=>te,createPopper:()=>ht,createPopperBase:()=>wt,createPopperLite:()=>vt,detectOverflow:()=>T,end:()=>A,eventListeners:()=>X,flip:()=>Ne,hide:()=>Fe,left:()=>s,main:()=>We,modifierPhases:()=>Oe,offset:()=>xe,placements:()=>de,popper:()=>S,popperGenerator:()=>ae,popperOffsets:()=>oe,preventOverflow:()=>_e,read:()=>Qe,reference:()=>pe,right:()=>a,start:()=>j,top:()=>n,variationPlacements:()=>ue,viewport:()=>J,write:()=>ke});var n,s,a,r,j,k,A,B,Ze,S,J,pe,ue,de,Je,Qe,Xe,Ue,We,Me,Se,ke,Ee,Oe,i,m,C,ne,b,y,_,M,z,H,me,je,E,xt,g,N,W,ee,Te,De,Le,Pe,_t,Ve,$e,P,q,ct,te,re,R,V,X,se,st,ot,at,rt,K,G,mt,pt,Q,jt,Be,He,At,Re,Dt,Ne,ze,Fe,Ce,xe,we,oe,ie,Wt,_e,fe,ye,$t,Vt,Bt,Lt,Nt,zt,kt,Et,et,be,wt,ce,yt,vt,ge,tt,ht,ut,dt,le,lt=e(()=>{dt()}),Nn=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s((lt(),Ft(le)),u(),x(),O(),l()):typeof define=="function"&&define.amd?define(["@popperjs/core","./dom/event-handler","./dom/manipulator","./dom/selector-engine","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Dropdown=s(n.Popper,n.EventHandler,n.Manipulator,n.SelectorEngine,n.Base))})(e,function(e,t,n,s,o){"use strict";let g=e=>e&&typeof e=="object"&&"default"in e?e:{default:e};function re(e){if(e&&e.__esModule)return e;let t=Object.create(null);if(e)for(let n in e)if(n!=="default"){let s=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,s.get?s:{enumerable:!0,get:()=>e[n]})}return t.default=e,Object.freeze(t)}let C=re(e),a=g(t),f=g(n),m=g(s),G=g(o),W=e=>e==null?`${e}`:{}.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),D=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t},S=e=>{let t=D(e);return t?document.querySelector(t):null},d=e=>!!e&&typeof e=="object"&&(typeof e.jquery<"u"&&(e=e[0]),typeof e.nodeType<"u"),K=e=>d(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(e):null,F=(e,t,n)=>{Object.keys(n).forEach(s=>{let i=n[s],o=t[s],a=o&&d(o)?"element":W(o);if(!new RegExp(i).test(a))throw new TypeError(`${e.toUpperCase()}: Option "${s}" provided type "${a}" but expected type "${i}".`)})},T=e=>!!d(e)&&e.getClientRects().length!==0&&getComputedStyle(e).getPropertyValue("visibility")==="visible",y=e=>!!(!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains("disabled"))||(typeof e.disabled<"u"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false"),O=()=>{},B=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},w=[],z=e=>{document.readyState==="loading"?(w.length||document.addEventListener("DOMContentLoaded",()=>{w.forEach(e=>e())}),w.push(e)):e()},l=()=>document.documentElement.dir==="rtl",X=e=>{z(()=>{let t=B();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},V=(e,t,n,s)=>{let o=e.indexOf(t);if(o===-1)return e[!n&&s?e.length-1:0];let i=e.length;return o+=n?1:-1,s&&(o=(o+i)%i),e[Math.max(0,Math.min(o,i-1))]},_="dropdown",r=".bs.dropdown",b=".data-api",p="Escape",x="Space",A="Tab",v="ArrowUp",h="ArrowDown",N=2,L=new RegExp(`${v}|${h}|${p}`),R=`hide${r}`,P=`hidden${r}`,H=`show${r}`,I=`shown${r}`,k=`click${r}${b}`,E=`keydown${r}${b}`,$=`keyup${r}${b}`,c="show",U="dropup",M="dropend",q="dropstart",Y="navbar",u='[data-bs-toggle="dropdown"]',j=".dropdown-menu",Q=".navbar-nav",Z=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",J=l()?"top-end":"top-start",ee=l()?"top-start":"top-end",te=l()?"bottom-end":"bottom-start",ne=l()?"bottom-start":"bottom-end",se=l()?"left-start":"right-start",oe=l()?"right-start":"left-start",ie={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},ae={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class i extends G.default{constructor(e,t){super(e),this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar()}static get Default(){return ie}static get DefaultType(){return ae}static get NAME(){return _}toggle(){return this._isShown()?this.hide():this.show()}show(){if(y(this._element)||this._isShown(this._menu))return;let e={relatedTarget:this._element};if(a.default.trigger(this._element,H,e).defaultPrevented)return;let t=i.getParentFromElement(this._element);this._inNavbar?f.default.setDataAttribute(this._menu,"popper","none"):this._createPopper(t),"ontouchstart"in document.documentElement&&!t.closest(Q)&&[].concat(...document.body.children).forEach(e=>a.default.on(e,"mouseover",O)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(c),this._element.classList.add(c),a.default.trigger(this._element,I,e)}hide(){if(y(this._element)||!this._isShown(this._menu))return;let e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(e){a.default.trigger(this._element,R,e).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>a.default.off(e,"mouseover",O)),this._popper&&this._popper.destroy(),this._menu.classList.remove(c),this._element.classList.remove(c),this._element.setAttribute("aria-expanded","false"),f.default.removeDataAttribute(this._menu,"popper"),a.default.trigger(this._element,P,e))}_getConfig(e){if(e={...this.constructor.Default,...f.default.getDataAttributes(this._element),...e},F(_,e,this.constructor.DefaultType),typeof e.reference=="object"&&!d(e.reference)&&typeof e.reference.getBoundingClientRect!="function")throw new TypeError(`${_.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return e}_createPopper(e){if(typeof C>"u")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;this._config.reference==="parent"?t=e:d(this._config.reference)?t=K(this._config.reference):typeof this._config.reference=="object"&&(t=this._config.reference);let n=this._getPopperConfig(),s=n.modifiers.find(e=>e.name==="applyStyles"&&e.enabled===!1);this._popper=C.createPopper(t,this._menu,n),s&&f.default.setDataAttribute(this._menu,"popper","static")}_isShown(e=this._element){return e.classList.contains(c)}_getMenuElement(){return m.default.next(this._element,j)[0]}_getPlacement(){let e=this._element.parentNode;if(e.classList.contains(M))return se;if(e.classList.contains(q))return oe;let t=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return e.classList.contains(U)?t?ee:J:t?ne:te}_detectNavbar(){return this._element.closest(`.${Y}`)!==null}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(e=>Number.parseInt(e,10)):typeof e=="function"?t=>e(t,this._element):e}_getPopperConfig(){let e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return this._config.display==="static"&&(e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,...typeof this._config.popperConfig=="function"?this._config.popperConfig(e):this._config.popperConfig}}_selectMenuItem({key:e,target:t}){let n=m.default.find(Z,this._menu).filter(T);n.length&&V(n,t,e===h,!n.includes(t)).focus()}static jQueryInterface(e){return this.each(function(){let t=i.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}static clearMenus(e){if(e&&(e.button===N||e.type==="keyup"&&e.key!==A))return;let t=m.default.find(u);for(let s=0,a=t.length;s{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(u(),x(),O(),l()):typeof define=="function"&&define.amd?define(["./dom/event-handler","./dom/manipulator","./dom/selector-engine","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Modal=s(n.EventHandler,n.Manipulator,n.SelectorEngine,n.Base))})(e,function(e,t,n,s){"use strict";let d=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},o=d(e),u=d(t),c=d(n),_e=d(s),ge=1e3,f="transitionend",ie=e=>e==null?`${e}`:{}.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),Q=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t},N=e=>{let t=Q(e);return t?document.querySelector(t):null},oe=e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e),s=Number.parseFloat(t),o=Number.parseFloat(n);return!s&&!o?0:(t=t.split(",")[0],n=n.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(n))*ge)},ce=e=>{e.dispatchEvent(new Event(f))},m=e=>!!e&&typeof e=="object"&&(typeof e.jquery<"u"&&(e=e[0]),typeof e.nodeType<"u"),ue=e=>m(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(e):null,g=(e,t,n)=>{Object.keys(n).forEach(s=>{let i=n[s],o=t[s],a=o&&m(o)?"element":ie(o);if(!new RegExp(i).test(a))throw new TypeError(`${e.toUpperCase()}: Option "${s}" provided type "${a}" but expected type "${i}".`)})},X=e=>!!m(e)&&e.getClientRects().length!==0&&getComputedStyle(e).getPropertyValue("visibility")==="visible",pe=e=>!!(!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains("disabled"))||(typeof e.disabled<"u"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false"),_=e=>{e.offsetHeight},me=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},v=[],le=e=>{document.readyState==="loading"?(v.length||document.addEventListener("DOMContentLoaded",()=>{v.forEach(e=>e())}),v.push(e)):e()},h=()=>document.documentElement.dir==="rtl",re=e=>{le(()=>{let t=me();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},a=e=>{typeof e=="function"&&e()},ee=(e,t,n=!0)=>{if(!n){a(e);return}let i=oe(t)+5,s=!1,o=({target:n})=>{n===t&&(s=!0,t.removeEventListener(f,o),a(e))};t.addEventListener(f,o),setTimeout(()=>{s||ce(t)},i)},S=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",M=".sticky-top";class J{constructor(){this._element=document.body}getWidth(){let e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){let e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",t=>t+e),this._setElementAttributes(S,"paddingRight",t=>t+e),this._setElementAttributes(M,"marginRight",t=>t-e)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){let s=this.getWidth(),o=e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+s)return;this._saveInitialAttribute(e,t);let o=window.getComputedStyle(e)[t];e.style[t]=`${n(Number.parseFloat(o))}px`};this._applyManipulationCallback(e,o)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(S,"paddingRight"),this._resetElementAttributes(M,"marginRight")}_saveInitialAttribute(e,t){let n=e.style[t];n&&u.default.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){let n=e=>{let n=u.default.getDataAttribute(e,t);typeof n>"u"?e.style.removeProperty(t):(u.default.removeDataAttribute(e,t),e.style[t]=n)};this._applyManipulationCallback(e,n)}_applyManipulationCallback(e,t){m(e)?t(e):c.default.find(e,this._element).forEach(t)}isOverflowing(){return this.getWidth()>0}}let R={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},q={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},D="backdrop",V="fade",L="show",j=`mousedown.bs.${D}`;class ne{constructor(e){this._config=this._getConfig(e),this._isAppended=!1,this._element=null}show(e){if(!this._config.isVisible){a(e);return}this._append(),this._config.isAnimated&&_(this._getElement()),this._getElement().classList.add(L),this._emulateAnimation(()=>{a(e)})}hide(e){if(!this._config.isVisible){a(e);return}this._getElement().classList.remove(L),this._emulateAnimation(()=>{this.dispose(),a(e)})}_getElement(){if(!this._element){let e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add(V),this._element=e}return this._element}_getConfig(e){return e={...R,...typeof e=="object"?e:{}},e.rootElement=ue(e.rootElement),g(D,e,q),e}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),o.default.on(this._getElement(),j,()=>{a(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(o.default.off(this._element,j),this._element.remove(),this._isAppended=!1)}_emulateAnimation(e){ee(e,this._getElement(),this._config.isAnimated)}}let H={trapElement:null,autofocus:!0},I={trapElement:"element",autofocus:"boolean"},B="focustrap",l=".bs.focustrap",$=`focusin${l}`,W=`keydown.tab${l}`,U="Tab",K="forward",z="backward";class Y{constructor(e){this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}activate(){let{trapElement:e,autofocus:t}=this._config;this._isActive||(t&&e.focus(),o.default.off(document,l),o.default.on(document,$,e=>this._handleFocusin(e)),o.default.on(document,W,e=>this._handleKeydown(e)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,o.default.off(document,l))}_handleFocusin(e){let{target:s}=e,{trapElement:t}=this._config;if(s===document||s===t||t.contains(s))return;let n=c.default.focusableChildren(t);n.length===0?t.focus():this._lastTabNavDirection===z?n[n.length-1].focus():n[0].focus()}_handleKeydown(e){e.key===U&&(this._lastTabNavDirection=e.shiftKey?z:K)}_getConfig(e){return e={...H,...typeof e=="object"?e:{}},g(B,e,I),e}}let G=(e,t="hide")=>{let s=`click.dismiss${e.EVENT_KEY}`,n=e.NAME;o.default.on(document,s,`[data-bs-dismiss="${n}"]`,function(s){if(["A","AREA"].includes(this.tagName)&&s.preventDefault(),pe(this))return;let o=N(this)||this.closest(`.${n}`);e.getOrCreateInstance(o)[t]()})},T="modal",i=".bs.modal",Z=".data-api",F="Escape",A={backdrop:!0,keyboard:!0,focus:!0},te={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},P=`hide${i}`,se=`hidePrevented${i}`,k=`hidden${i}`,b=`show${i}`,ae=`shown${i}`,E=`resize${i}`,C=`click.dismiss${i}`,x=`keydown.dismiss${i}`,de=`mouseup.dismiss${i}`,O=`mousedown.dismiss${i}`,he=`click${i}${Z}`,w="modal-open",fe="fade",y="show",p="modal-static",ve=".modal.show",be=".modal-dialog",je=".modal-body",ye='[data-bs-toggle="modal"]';class r extends _e.default{constructor(e,t){super(e),this._config=this._getConfig(t),this._dialog=c.default.findOne(be,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new J}static get Default(){return A}static get NAME(){return T}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||o.default.trigger(this._element,b,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(w),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),o.default.on(this._dialog,O,()=>{o.default.one(this._element,de,e=>{e.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(e)))}hide(){if(!this._isShown||this._isTransitioning||o.default.trigger(this._element,P).defaultPrevented)return;this._isShown=!1;let e=this._isAnimated();e&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove(y),o.default.off(this._element,C),o.default.off(this._dialog,O),this._queueCallback(()=>this._hideModal(),this._element,e)}dispose(){[window,this._dialog].forEach(e=>o.default.off(e,i)),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new ne({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Y({trapElement:this._element})}_getConfig(e){return e={...A,...u.default.getDataAttributes(this._element),...typeof e=="object"?e:{}},g(T,e,te),e}_showElement(e){let t=this._isAnimated(),n=c.default.findOne(je,this._dialog);(!this._element.parentNode||this._element.parentNode.nodeType!==Node.ELEMENT_NODE)&&document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,n&&(n.scrollTop=0),t&&_(this._element),this._element.classList.add(y);let s=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,o.default.trigger(this._element,ae,{relatedTarget:e})};this._queueCallback(s,this._dialog,t)}_setEscapeEvent(){this._isShown?o.default.on(this._element,x,e=>{this._config.keyboard&&e.key===F?(e.preventDefault(),this.hide()):!this._config.keyboard&&e.key===F&&this._triggerBackdropTransition()}):o.default.off(this._element,x)}_setResizeEvent(){this._isShown?o.default.on(window,E,()=>this._adjustDialog()):o.default.off(window,E)}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(w),this._resetAdjustments(),this._scrollBar.reset(),o.default.trigger(this._element,k)})}_showBackdrop(e){o.default.on(this._element,C,e=>{if(this._ignoreBackdropClick){this._ignoreBackdropClick=!1;return}e.target===e.currentTarget&&(this._config.backdrop===!0?this.hide():this._config.backdrop==="static"&&this._triggerBackdropTransition())}),this._backdrop.show(e)}_isAnimated(){return this._element.classList.contains(fe)}_triggerBackdropTransition(){if(o.default.trigger(this._element,se).defaultPrevented)return;let{classList:e,scrollHeight:s,style:t}=this._element,n=s>document.documentElement.clientHeight;!n&&t.overflowY==="hidden"||e.contains(p)||(n||(t.overflowY="hidden"),e.add(p),this._queueCallback(()=>{e.remove(p),n||this._queueCallback(()=>{t.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let e=this._element.scrollHeight>document.documentElement.clientHeight,n=this._scrollBar.getWidth(),t=n>0;(!t&&e&&!h()||t&&!e&&h())&&(this._element.style.paddingLeft=`${n}px`),(t&&!e&&!h()||!t&&e&&h())&&(this._element.style.paddingRight=`${n}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){let n=r.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof n[e]>"u")throw new TypeError(`No method named "${e}"`);n[e](t)}})}}return o.default.on(document,he,ye,function(e){let t=N(this);["A","AREA"].includes(this.tagName)&&e.preventDefault(),o.default.one(t,b,e=>{e.defaultPrevented||o.default.one(t,k,()=>{X(this)&&this.focus()})});let n=c.default.findOne(ve);n&&r.getInstance(n).hide(),r.getOrCreateInstance(t).toggle(this)}),G(r),re(r),r})}),Rn=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(O(),x(),u(),l()):typeof define=="function"&&define.amd?define(["./dom/selector-engine","./dom/manipulator","./dom/event-handler","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Offcanvas=s(n.SelectorEngine,n.Manipulator,n.EventHandler,n.Base))})(e,function(e,t,n,s){"use strict";let h=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},l=h(e),d=h(t),o=h(n),he=h(s),X=1e3,m="transitionend",F=e=>e==null?`${e}`:{}.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),N=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t},E=e=>{let t=N(e);return t?document.querySelector(t):null},Q=e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e),s=Number.parseFloat(t),o=Number.parseFloat(n);return!s&&!o?0:(t=t.split(",")[0],n=n.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(n))*X)},ce=e=>{e.dispatchEvent(new Event(m))},c=e=>!!e&&typeof e=="object"&&(typeof e.jquery<"u"&&(e=e[0]),typeof e.nodeType<"u"),B=e=>c(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(e):null,p=(e,t,n)=>{Object.keys(n).forEach(s=>{let i=n[s],o=t[s],a=o&&c(o)?"element":F(o);if(!new RegExp(i).test(a))throw new TypeError(`${e.toUpperCase()}: Option "${s}" provided type "${a}" but expected type "${i}".`)})},oe=e=>!!c(e)&&e.getClientRects().length!==0&&getComputedStyle(e).getPropertyValue("visibility")==="visible",y=e=>!!(!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains("disabled"))||(typeof e.disabled<"u"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false"),ne=e=>{e.offsetHeight},ee=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},f=[],G=e=>{document.readyState==="loading"?(f.length||document.addEventListener("DOMContentLoaded",()=>{f.forEach(e=>e())}),f.push(e)):e()},K=e=>{G(()=>{let t=ee();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},r=e=>{typeof e=="function"&&e()},L=(e,t,n=!0)=>{if(!n){r(e);return}let i=Q(t)+5,s=!1,o=({target:n})=>{n===t&&(s=!0,t.removeEventListener(m,o),r(e))};t.addEventListener(m,o),setTimeout(()=>{s||ce(t)},i)},A=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",S=".sticky-top";class M{constructor(){this._element=document.body}getWidth(){let e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){let e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",t=>t+e),this._setElementAttributes(A,"paddingRight",t=>t+e),this._setElementAttributes(S,"marginRight",t=>t-e)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){let s=this.getWidth(),o=e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+s)return;this._saveInitialAttribute(e,t);let o=window.getComputedStyle(e)[t];e.style[t]=`${n(Number.parseFloat(o))}px`};this._applyManipulationCallback(e,o)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(A,"paddingRight"),this._resetElementAttributes(S,"marginRight")}_saveInitialAttribute(e,t){let n=e.style[t];n&&d.default.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){let n=e=>{let n=d.default.getDataAttribute(e,t);typeof n>"u"?e.style.removeProperty(t):(d.default.removeDataAttribute(e,t),e.style[t]=n)};this._applyManipulationCallback(e,n)}_applyManipulationCallback(e,t){c(e)?t(e):l.default.find(e,this._element).forEach(t)}isOverflowing(){return this.getWidth()>0}}let z={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},Y={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},v="backdrop",D="fade",g="show",k=`mousedown.bs.${v}`;class R{constructor(e){this._config=this._getConfig(e),this._isAppended=!1,this._element=null}show(e){if(!this._config.isVisible){r(e);return}this._append(),this._config.isAnimated&&ne(this._getElement()),this._getElement().classList.add(g),this._emulateAnimation(()=>{r(e)})}hide(e){if(!this._config.isVisible){r(e);return}this._getElement().classList.remove(g),this._emulateAnimation(()=>{this.dispose(),r(e)})}_getElement(){if(!this._element){let e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add(D),this._element=e}return this._element}_getConfig(e){return e={...z,...typeof e=="object"?e:{}},e.rootElement=B(e.rootElement),p(v,e,Y),e}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),o.default.on(this._getElement(),k,()=>{r(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(o.default.off(this._element,k),this._element.remove(),this._isAppended=!1)}_emulateAnimation(e){L(e,this._getElement(),this._config.isAnimated)}}let P={trapElement:null,autofocus:!0},H={trapElement:"element",autofocus:"boolean"},I="focustrap",u=".bs.focustrap",V=`focusin${u}`,$=`keydown.tab${u}`,W="Tab",U="forward",C="backward";class q{constructor(e){this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}activate(){let{trapElement:e,autofocus:t}=this._config;this._isActive||(t&&e.focus(),o.default.off(document,u),o.default.on(document,V,e=>this._handleFocusin(e)),o.default.on(document,$,e=>this._handleKeydown(e)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,o.default.off(document,u))}_handleFocusin(e){let{target:s}=e,{trapElement:t}=this._config;if(s===document||s===t||t.contains(s))return;let n=l.default.focusableChildren(t);n.length===0?t.focus():this._lastTabNavDirection===C?n[n.length-1].focus():n[0].focus()}_handleKeydown(e){e.key===W&&(this._lastTabNavDirection=e.shiftKey?C:U)}_getConfig(e){return e={...P,...typeof e=="object"?e:{}},p(I,e,H),e}}let T=(e,t="hide")=>{let s=`click.dismiss${e.EVENT_KEY}`,n=e.NAME;o.default.on(document,s,`[data-bs-dismiss="${n}"]`,function(s){if(["A","AREA"].includes(this.tagName)&&s.preventDefault(),y(this))return;let o=E(this)||this.closest(`.${n}`);e.getOrCreateInstance(o)[t]()})},x="offcanvas",a=".bs.offcanvas",O=".data-api",Z=`load${a}${O}`,J="Escape",w={backdrop:!0,keyboard:!0,scroll:!1},te={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},_="show",se="offcanvas-backdrop",j=".offcanvas.show",ie=`show${a}`,ae=`shown${a}`,re=`hide${a}`,b=`hidden${a}`,le=`click${a}${O}`,de=`keydown.dismiss${a}`,ue='[data-bs-toggle="offcanvas"]';class i extends he.default{constructor(e,t){super(e),this._config=this._getConfig(t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return x}static get Default(){return w}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){if(this._isShown||o.default.trigger(this._element,ie,{relatedTarget:e}).defaultPrevented)return;this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new M).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(_);let t=()=>{this._config.scroll||this._focustrap.activate(),o.default.trigger(this._element,ae,{relatedTarget:e})};this._queueCallback(t,this._element,!0)}hide(){if(!this._isShown||o.default.trigger(this._element,re).defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove(_),this._backdrop.hide();let e=()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new M).reset(),o.default.trigger(this._element,b)};this._queueCallback(e,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(e){return e={...w,...d.default.getDataAttributes(this._element),...typeof e=="object"?e:{}},p(x,e,te),e}_initializeBackDrop(){return new R({className:se,isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new q({trapElement:this._element})}_addEventListeners(){o.default.on(this._element,de,e=>{this._config.keyboard&&e.key===J&&this.hide()})}static jQueryInterface(e){return this.each(function(){let t=i.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}return o.default.on(document,le,ue,function(e){let t=E(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),y(this))return;o.default.one(t,b,()=>{oe(this)&&this.focus()});let n=l.default.findOne(j);n&&n!==t&&i.getInstance(n).hide(),i.getOrCreateInstance(t).toggle(this)}),o.default.on(window,Z,()=>l.default.find(j).forEach(e=>i.getOrCreateInstance(e).show())),T(i),K(i),i})}),nt=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s((lt(),Ft(le)),Ke(),u(),x(),O(),l()):typeof define=="function"&&define.amd?define(["@popperjs/core","./dom/data","./dom/event-handler","./dom/manipulator","./dom/selector-engine","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Tooltip=s(n.Popper,n.Data,n.EventHandler,n.Manipulator,n.SelectorEngine,n.Base))})(e,function(e,t,n,s,o,i){"use strict";let c=e=>e&&typeof e=="object"&&"default"in e?e:{default:e};function ee(e){if(e&&e.__esModule)return e;let t=Object.create(null);if(e)for(let n in e)if(n!=="default"){let s=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,s.get?s:{enumerable:!0,get:()=>e[n]})}return t.default=e,Object.freeze(t)}let w=ee(e),X=c(t),a=c(n),K=c(s),U=c(o),W=c(i),V=1e6,N=e=>e==null?`${e}`:{}.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),G=e=>{do e+=Math.floor(Math.random()*V);while(document.getElementById(e))return e},v=e=>!!e&&typeof e=="object"&&(typeof e.jquery<"u"&&(e=e[0]),typeof e.nodeType<"u"),b=e=>v(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(e):null,R=(e,t,n)=>{Object.keys(n).forEach(s=>{let i=n[s],o=t[s],a=o&&v(o)?"element":N(o);if(!new RegExp(i).test(a))throw new TypeError(`${e.toUpperCase()}: Option "${s}" provided type "${a}" but expected type "${i}".`)})},y=e=>{if(!document.documentElement.attachShadow)return null;if(typeof e.getRootNode=="function"){let t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?y(e.parentNode):null},_=()=>{},Q=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},g=[],Y=e=>{document.readyState==="loading"?(g.length||document.addEventListener("DOMContentLoaded",()=>{g.forEach(e=>e())}),g.push(e)):e()},C=()=>document.documentElement.dir==="rtl",q=e=>{Y(()=>{let t=Q();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},D=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),z=/^aria-[\w-]*$/i,B=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,M=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,F=(e,t)=>{let n=e.nodeName.toLowerCase();if(t.includes(n))return!D.has(n)||!!(B.test(e.nodeValue)||M.test(e.nodeValue));let s=t.filter(e=>e instanceof RegExp);for(let e=0,t=s.length;e{F(t,r)||e.removeAttribute(t.nodeName)})}return s.body.innerHTML}let k="tooltip",r=".bs.tooltip",L="bs-tooltip",A=new Set(["sanitize","allowList","sanitizeFn"]),P={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},H={AUTO:"auto",TOP:"top",RIGHT:C()?"left":"right",BOTTOM:"bottom",LEFT:C()?"right":"left"},I={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:T,popperConfig:null},S={HIDE:`hide${r}`,HIDDEN:`hidden${r}`,SHOW:`show${r}`,SHOWN:`shown${r}`,INSERTED:`inserted${r}`,CLICK:`click${r}`,FOCUSIN:`focusin${r}`,FOCUSOUT:`focusout${r}`,MOUSEENTER:`mouseenter${r}`,MOUSELEAVE:`mouseleave${r}`},h="fade",$="modal",u="show",d="show",p="out",E=".tooltip-inner",x=`.${$}`,O="hide.bs.modal",l="hover",f="focus",Z="click",J="manual";class m extends W.default{constructor(e,t){if(typeof w>"u")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(t),this.tip=null,this._setListeners()}static get Default(){return I}static get NAME(){return k}static get Event(){return S}static get DefaultType(){return P}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(e){if(this._isEnabled)if(e){let t=this._initializeOnDelegatedTarget(e);t._activeTrigger.click=!t._activeTrigger.click,t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)}else{if(this.getTipElement().classList.contains(u)){this._leave(null,this);return}this._enter(null,this)}}dispose(){clearTimeout(this._timeout),a.default.off(this._element.closest(x),O,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;let i=a.default.trigger(this._element,this.constructor.Event.SHOW),t=y(this._element),r=t===null?this._element.ownerDocument.documentElement.contains(this._element):t.contains(this._element);if(i.defaultPrevented||!r)return;this.constructor.NAME==="tooltip"&&this.tip&&this.getTitle()!==this.tip.querySelector(E).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);let e=this.getTipElement(),n=G(this.constructor.NAME);e.setAttribute("id",n),this._element.setAttribute("aria-describedby",n),this._config.animation&&e.classList.add(h);let c=typeof this._config.placement=="function"?this._config.placement.call(this,e,this._element):this._config.placement,s=this._getAttachment(c);this._addAttachmentClass(s);let{container:l}=this._config;X.default.set(e,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(l.append(e),a.default.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=w.createPopper(this._element,e,this._getPopperConfig(s)),e.classList.add(u);let o=this._resolvePossibleFunction(this._config.customClass);o&&e.classList.add(...o.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>{a.default.on(e,"mouseover",_)});let d=()=>{let e=this._hoverState;this._hoverState=null,a.default.trigger(this._element,this.constructor.Event.SHOWN),e===p&&this._leave(null,this)},m=this.tip.classList.contains(h);this._queueCallback(d,this.tip,m)}hide(){if(!this._popper)return;let e=this.getTipElement(),t=()=>{this._isWithActiveTrigger()||(this._hoverState!==d&&e.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),a.default.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())};if(a.default.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;e.classList.remove(u),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>a.default.off(e,"mouseover",_)),this._activeTrigger[Z]=!1,this._activeTrigger[f]=!1,this._activeTrigger[l]=!1;let n=this.tip.classList.contains(h);this._queueCallback(t,this.tip,n),this._hoverState=""}update(){this._popper!==null&&this._popper.update()}isWithContent(){return!!this.getTitle()}getTipElement(){if(this.tip)return this.tip;let t=document.createElement("div");t.innerHTML=this._config.template;let e=t.children[0];return this.setContent(e),e.classList.remove(h,u),this.tip=e,this.tip}setContent(e){this._sanitizeAndSetContent(e,this.getTitle(),E)}_sanitizeAndSetContent(e,t,n){let s=U.default.findOne(n,e);if(!t&&s){s.remove();return}this.setElementContent(s,t)}setElementContent(e,t){if(e!==null){if(v(t)){t=b(t),this._config.html?t.parentNode!==e&&(e.innerHTML="",e.append(t)):e.textContent=t.textContent;return}this._config.html?(this._config.sanitize&&(t=j(t,this._config.allowList,this._config.sanitizeFn)),e.innerHTML=t):e.textContent=t}}getTitle(){let e=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(e)}updateAttachment(e){return e==="right"?"end":e==="left"?"start":e}_initializeOnDelegatedTarget(e,t){return t||this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(e=>Number.parseInt(e,10)):typeof e=="function"?t=>e(t,this._element):e}_resolvePossibleFunction(e){return typeof e=="function"?e.call(this._element):e}_getPopperConfig(e){let t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:e=>this._handlePopperPlacementChange(e)}],onFirstUpdate:e=>{e.options.placement!==e.placement&&this._handlePopperPlacementChange(e)}};return{...t,...typeof this._config.popperConfig=="function"?this._config.popperConfig(t):this._config.popperConfig}}_addAttachmentClass(e){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(e)}`)}_getAttachment(e){return H[e.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(e=>{if(e==="click")a.default.on(this._element,this.constructor.Event.CLICK,this._config.selector,e=>this.toggle(e));else if(e!==J){let t=e===l?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,n=e===l?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;a.default.on(this._element,t,this._config.selector,e=>this._enter(e)),a.default.on(this._element,n,this._config.selector,e=>this._leave(e))}}),this._hideModalHandler=()=>{this._element&&this.hide()},a.default.on(this._element.closest(x),O,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){let e=this._element.getAttribute("title"),t=typeof this._element.getAttribute("data-bs-original-title");(e||t!=="string")&&(this._element.setAttribute("data-bs-original-title",e||""),e&&!this._element.getAttribute("aria-label")&&!this._element.textContent&&this._element.setAttribute("aria-label",e),this._element.setAttribute("title",""))}_enter(e,t){if(t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger[e.type==="focusin"?f:l]=!0),t.getTipElement().classList.contains(u)||t._hoverState===d){t._hoverState=d;return}if(clearTimeout(t._timeout),t._hoverState=d,!t._config.delay||!t._config.delay.show){t.show();return}t._timeout=setTimeout(()=>{t._hoverState===d&&t.show()},t._config.delay.show)}_leave(e,t){if(t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger[e.type==="focusout"?f:l]=t._element.contains(e.relatedTarget)),!t._isWithActiveTrigger()){if(clearTimeout(t._timeout),t._hoverState=p,!t._config.delay||!t._config.delay.hide){t.hide();return}t._timeout=setTimeout(()=>{t._hoverState===p&&t.hide()},t._config.delay.hide)}}_isWithActiveTrigger(){for(let e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1}_getConfig(e){let t=K.default.getDataAttributes(this._element);return Object.keys(t).forEach(e=>{A.has(e)&&delete t[e]}),e={...this.constructor.Default,...t,...typeof e=="object"&&e?e:{}},e.container=e.container===!1?document.body:b(e.container),typeof e.delay=="number"&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title=="number"&&(e.title=e.title.toString()),typeof e.content=="number"&&(e.content=e.content.toString()),R(k,e,this.constructor.DefaultType),e.sanitize&&(e.template=j(e.template,e.allowList,e.sanitizeFn)),e}_getDelegateConfig(){let e={};for(let t in this._config)this.constructor.Default[t]!==this._config[t]&&(e[t]=this._config[t]);return e}_cleanTipClass(){let t=this.getTipElement(),n=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),e=t.getAttribute("class").match(n);e!==null&&e.length>0&&e.map(e=>e.trim()).forEach(e=>t.classList.remove(e))}_getBasicClassPrefix(){return L}_handlePopperPlacementChange(e){let{state:t}=e;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(e){return this.each(function(){let t=m.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}}return q(m),m})}),Hn=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(nt()):typeof define=="function"&&define.amd?define(["./tooltip"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Popover=s(n.Tooltip))})(e,function(e){"use strict";let o=(e=>e&&typeof e=="object"&&"default"in e?e:{default:e})(e),f=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},s=[],i=e=>{document.readyState==="loading"?(s.length||document.addEventListener("DOMContentLoaded",()=>{s.forEach(e=>e())}),s.push(e)):e()},r=e=>{i(()=>{let t=f();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},a="popover",t=".bs.popover",c="bs-popover",l={...o.default.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},d={...o.default.DefaultType,content:"(string|element|function)"},u={HIDE:`hide${t}`,HIDDEN:`hidden${t}`,SHOW:`show${t}`,SHOWN:`shown${t}`,INSERTED:`inserted${t}`,CLICK:`click${t}`,FOCUSIN:`focusin${t}`,FOCUSOUT:`focusout${t}`,MOUSEENTER:`mouseenter${t}`,MOUSELEAVE:`mouseleave${t}`},h=".popover-header",m=".popover-body";class n extends o.default{static get Default(){return l}static get NAME(){return a}static get Event(){return u}static get DefaultType(){return d}isWithContent(){return this.getTitle()||this._getContent()}setContent(e){this._sanitizeAndSetContent(e,this.getTitle(),h),this._sanitizeAndSetContent(e,this._getContent(),m)}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return c}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}}return r(n),n})}),In=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(u(),x(),O(),l()):typeof define=="function"&&define.amd?define(["./dom/event-handler","./dom/manipulator","./dom/selector-engine","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.ScrollSpy=s(n.EventHandler,n.Manipulator,n.SelectorEngine,n.Base))})(e,function(e,t,n,s){"use strict";let c=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},a=c(e),p=c(t),o=c(n),D=c(s),F=e=>e==null?`${e}`:{}.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),A=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t},w=e=>{let t=A(e);return t&&document.querySelector(t)?t:null},f=e=>!!e&&typeof e=="object"&&(typeof e.jquery<"u"&&(e=e[0]),typeof e.nodeType<"u"),P=e=>f(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(e):null,E=(e,t,n)=>{Object.keys(n).forEach(s=>{let i=n[s],o=t[s],a=o&&f(o)?"element":F(o);if(!new RegExp(i).test(a))throw new TypeError(`${e.toUpperCase()}: Option "${s}" provided type "${a}" but expected type "${i}".`)})},H=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},d=[],z=e=>{document.readyState==="loading"?(d.length||document.addEventListener("DOMContentLoaded",()=>{d.forEach(e=>e())}),d.push(e)):e()},k=e=>{z(()=>{let t=H();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},j="scrollspy",l=".bs.scrollspy",S=".data-api",m={offset:10,method:"auto",target:""},O={offset:"number",method:"string",target:"(string|element)"},x=`activate${l}`,C=`scroll${l}`,y=`load${l}${S}`,b="dropdown-item",i="active",_='[data-bs-spy="scroll"]',M=".nav, .list-group",h=".nav-link",T=".nav-item",v=".list-group-item",u=`${h}, ${v}, .${b}`,N=".dropdown",L=".dropdown-toggle",R="offset",g="position";class r extends D.default{constructor(e,t){super(e),this._scrollElement=this._element.tagName==="BODY"?window:this._element,this._config=this._getConfig(t),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,a.default.on(this._scrollElement,C,()=>this._process()),this.refresh(),this._process()}static get Default(){return m}static get NAME(){return j}refresh(){let t=this._scrollElement===this._scrollElement.window?R:g,e=this._config.method==="auto"?t:this._config.method,n=e===g?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),o.default.find(u,this._config.target).map(t=>{let s=w(t),i=s?o.default.findOne(s):null;if(i){let t=i.getBoundingClientRect();if(t.width||t.height)return[p.default[e](i).top+n,s]}return null}).filter(e=>e).sort((e,t)=>e[0]-t[0]).forEach(e=>{this._offsets.push(e[0]),this._targets.push(e[1])})}dispose(){a.default.off(this._scrollElement,l),super.dispose()}_getConfig(e){return e={...m,...p.default.getDataAttributes(this._element),...typeof e=="object"&&e?e:{}},e.target=P(e.target)||document.documentElement,E(j,e,O),e}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){let e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),e>=n){let e=this._targets[this._targets.length-1];this._activeTarget!==e&&this._activate(e);return}if(this._activeTarget&&e0){this._activeTarget=null,this._clear();return}for(let t=this._offsets.length;t--;)this._activeTarget!==this._targets[t]&&e>=this._offsets[t]&&(typeof this._offsets[t+1]>"u"||e`${t}[data-bs-target="${e}"],${t}[href="${e}"]`),t=o.default.findOne(n.join(","),this._config.target);t.classList.add(i),t.classList.contains(b)?o.default.findOne(L,t.closest(N)).classList.add(i):o.default.parents(t,M).forEach(e=>{o.default.prev(e,`${h}, ${v}`).forEach(e=>e.classList.add(i)),o.default.prev(e,T).forEach(e=>{o.default.children(e,h).forEach(e=>e.classList.add(i))})}),a.default.trigger(this._scrollElement,x,{relatedTarget:e})}_clear(){o.default.find(u,this._config.target).filter(e=>e.classList.contains(i)).forEach(e=>e.classList.remove(i))}static jQueryInterface(e){return this.each(function(){let t=r.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}}return a.default.on(window,y,()=>{o.default.find(_).forEach(e=>new r(e))}),k(r),r})}),Bn=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(u(),O(),l()):typeof define=="function"&&define.amd?define(["./dom/event-handler","./dom/selector-engine","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Tab=s(n.EventHandler,n.SelectorEngine,n.Base))})(e,function(e,t,n){"use strict";let l=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},o=l(e),i=l(t),D=l(n),M=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t},S=e=>{let t=M(e);return t?document.querySelector(t):null},E=e=>!!(!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains("disabled"))||(typeof e.disabled<"u"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false"),p=e=>{e.offsetHeight},x=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},c=[],j=e=>{document.readyState==="loading"?(c.length||document.addEventListener("DOMContentLoaded",()=>{c.forEach(e=>e())}),c.push(e)):e()},g=e=>{j(()=>{let t=x();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},C="tab",s=".bs.tab",v=".data-api",b=`hide${s}`,f=`hidden${s}`,y=`show${s}`,_=`shown${s}`,w=`click${s}${v}`,O="dropdown-menu",a="active",m="fade",h="show",k=".dropdown",A=".nav, .list-group",u=".active",d=":scope > li > .active",F='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',T=".dropdown-toggle",z=":scope > .dropdown-menu .active";class r extends D.default{static get NAME(){return C}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(a))return;let e,n=S(this._element),t=this._element.closest(A);if(t){let n=t.nodeName==="UL"||t.nodeName==="OL"?d:u;e=i.default.find(n,t),e=e[e.length-1]}let s=e?o.default.trigger(e,b,{relatedTarget:this._element}):null;if(o.default.trigger(this._element,y,{relatedTarget:e}).defaultPrevented||s!==null&&s.defaultPrevented)return;this._activate(this._element,t);let r=()=>{o.default.trigger(e,f,{relatedTarget:this._element}),o.default.trigger(this._element,_,{relatedTarget:e})};n?this._activate(n,n.parentNode,r):r()}_activate(e,t,n){let s=(t&&(t.nodeName==="UL"||t.nodeName==="OL")?i.default.find(d,t):i.default.children(t,u))[0],a=n&&s&&s.classList.contains(m),o=()=>this._transitionComplete(e,s,n);s&&a?(s.classList.remove(h),this._queueCallback(o,e,!0)):o()}_transitionComplete(e,t,n){if(t){t.classList.remove(a);let e=i.default.findOne(z,t.parentNode);e&&e.classList.remove(a),t.getAttribute("role")==="tab"&&t.setAttribute("aria-selected",!1)}e.classList.add(a),e.getAttribute("role")==="tab"&&e.setAttribute("aria-selected",!0),p(e),e.classList.contains(m)&&e.classList.add(h);let s=e.parentNode;if(s&&s.nodeName==="LI"&&(s=s.parentNode),s&&s.classList.contains(O)){let t=e.closest(k);t&&i.default.find(T,t).forEach(e=>e.classList.add(a)),e.setAttribute("aria-expanded",!0)}n&&n()}static jQueryInterface(e){return this.each(function(){let t=r.getOrCreateInstance(this);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}}return o.default.on(document,w,F,function(e){if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),E(this))return;r.getOrCreateInstance(this).show()}),g(r),r})}),Vn=t((e,t)=>{(function(n,s){typeof e=="object"&&typeof t<"u"?t.exports=s(u(),x(),l()):typeof define=="function"&&define.amd?define(["./dom/event-handler","./dom/manipulator","./base-component"],s):(n=typeof globalThis<"u"?globalThis:n||self,n.Toast=s(n.EventHandler,n.Manipulator,n.Base))})(e,function(e,t,n){"use strict";let l=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},s=l(e),N=l(t),D=l(n),T=e=>e==null?`${e}`:{}.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),F=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t},M=e=>{let t=F(e);return t?document.querySelector(t):null},y=e=>!!e&&typeof e=="object"&&(typeof e.jquery<"u"&&(e=e[0]),typeof e.nodeType<"u"),m=(e,t,n)=>{Object.keys(n).forEach(s=>{let i=n[s],o=t[s],a=o&&y(o)?"element":T(o);if(!new RegExp(i).test(a))throw new TypeError(`${e.toUpperCase()}: Option "${s}" provided type "${a}" but expected type "${i}".`)})},j=e=>!!(!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains("disabled"))||(typeof e.disabled<"u"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false"),p=e=>{e.offsetHeight},x=()=>{let{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},c=[],g=e=>{document.readyState==="loading"?(c.length||document.addEventListener("DOMContentLoaded",()=>{c.forEach(e=>e())}),c.push(e)):e()},v=e=>{g(()=>{let t=x();if(t){let n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},b=(e,t="hide")=>{let o=`click.dismiss${e.EVENT_KEY}`,n=e.NAME;s.default.on(document,o,`[data-bs-dismiss="${n}"]`,function(s){if(["A","AREA"].includes(this.tagName)&&s.preventDefault(),j(this))return;let o=M(this)||this.closest(`.${n}`);e.getOrCreateInstance(o)[t]()})},h="toast",o=".bs.toast",_=`mouseover${o}`,w=`mouseout${o}`,O=`focusin${o}`,f=`focusout${o}`,C=`hide${o}`,E=`hidden${o}`,k=`show${o}`,A=`shown${o}`,S="fade",u="hide",i="show",r="showing",z={animation:"boolean",autohide:"boolean",delay:"number"},d={animation:!0,autohide:!0,delay:5e3};class a extends D.default{constructor(e,t){super(e),this._config=this._getConfig(t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return z}static get Default(){return d}static get NAME(){return h}show(){if(s.default.trigger(this._element,k).defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(S);let e=()=>{this._element.classList.remove(r),s.default.trigger(this._element,A),this._maybeScheduleHide()};this._element.classList.remove(u),p(this._element),this._element.classList.add(i),this._element.classList.add(r),this._queueCallback(e,this._element,this._config.animation)}hide(){if(!this._element.classList.contains(i)||s.default.trigger(this._element,C).defaultPrevented)return;let e=()=>{this._element.classList.add(u),this._element.classList.remove(r),this._element.classList.remove(i),s.default.trigger(this._element,E)};this._element.classList.add(r),this._queueCallback(e,this._element,this._config.animation)}dispose(){this._clearTimeout(),this._element.classList.contains(i)&&this._element.classList.remove(i),super.dispose()}_getConfig(e){return e={...d,...N.default.getDataAttributes(this._element),...typeof e=="object"&&e?e:{}},m(h,e,this.constructor.DefaultType),e}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":this._hasMouseInteraction=t;break;case"focusin":case"focusout":this._hasKeyboardInteraction=t;break}if(t){this._clearTimeout();return}let n=e.relatedTarget;this._element===n||this._element.contains(n)||this._maybeScheduleHide()}_setListeners(){s.default.on(this._element,_,e=>this._onInteraction(e,!0)),s.default.on(this._element,w,e=>this._onInteraction(e,!1)),s.default.on(this._element,O,e=>this._onInteraction(e,!0)),s.default.on(this._element,f,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){let t=a.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}return b(a),v(a),a})}),Yn=c(kn()),Wn=c(l()),Un=c(Fn()),Kn=c(Dn()),qn=c(Pn()),$n=c(Nn()),Gn=c(Ln()),Zn=c(Rn()),Qn=c(Hn()),Xn=c(In()),Jn=c(Bn()),es=c(Vn()),ts=c(nt())})()

Verified ML-KEM (Kyber) in Rust

Karthikeyan Bhargavan, Franziskus Kiefer, Goutam Tamvada
January 16, 2024

ML-KEM, previously known as Kyber, is the first post-quantum secure key-encapsulation mechanism (KEM) to get standardised by NIST in FIPS 203.

Cryspen has built a new high assurance Rust implementation of ML-KEM, using our verification framework hax and F*. Our implementation is among the fastest portable implementations that we know of (see Performance comparison), and helped uncover a timing bug (also called KyberSlash) in various Kyber implementations that would allow an attacker to recover the private key.

Background on Post Quantum Cryptography

The rise of quantum computing poses a significant threat to current cryptographic systems and protocols. +

Verified ML-KEM (Kyber) in Rust

Karthikeyan Bhargavan, Franziskus Kiefer, Goutam Tamvada
January 16, 2024

ML-KEM, previously known as Kyber, is the first post-quantum secure key-encapsulation mechanism (KEM) to get standardised by NIST in FIPS 203.

Cryspen has built a new high assurance Rust implementation of ML-KEM, using our verification framework hax and F*. Our implementation is among the fastest portable implementations that we know of (see Performance comparison), and helped uncover a timing bug (also called KyberSlash) in various Kyber implementations that would allow an attacker to recover the private key.

Background on Post Quantum Cryptography

The rise of quantum computing poses a significant threat to current cryptographic systems and protocols. In particular, encrypted network traffic may be subjected to store-now-decrypt-later attacks, where encrypted data is collected by the adversary now so that it can be decrypted later, maybe in several years, when quantum computers become powerful enough to break the public key cryptographic schemes we currently use to establish encryption keys.

To address this challenge, post-quantum cryptography (PQC) has emerged as an essential field aiming to develop cryptographic algorithms that remain secure against both classical and quantum computers. In 2016, NIST initiated a process to solicit, evaluate, and standardise one or more quantum-resistant public-key cryptographic algorithms, and the first draft standards have started to appear. diff --git a/tags/libcrux/index.xml b/tags/libcrux/index.xml index 75dc997..eaa91de 100644 --- a/tags/libcrux/index.xml +++ b/tags/libcrux/index.xml @@ -13,4 +13,4 @@ implementation of ML-KEM in Rust, and talked about how our high-assurance development methodology helped us find a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">new timing bug</a> in various other Kyber implementations.</p>Verified ML-KEM (Kyber) in Rusthttps://cryspen.com/post/ml-kem-implementation/Tue, 16 Jan 2024 00:00:00 +0000https://cryspen.com/post/ml-kem-implementation/<p>ML-KEM, previously known as <a href="https://pq-crystals.org/kyber/">Kyber</a>, is the first post-quantum secure key-encapsulation mechanism (KEM) to get standardised by NIST in <a href="https://csrc.nist.gov/pubs/fips/203/ipd">FIPS 203</a>.</p> -<p>Cryspen has built <a href="https://github.com/cryspen/libcrux/tree/main/src/kem">a new high assurance Rust implementation of ML-KEM</a>, using our verification framework <a href="https://cryspen.com/hax">hax</a> and <a href="https://fstar-lang.org">F*</a>. Our implementation is among the fastest portable implementations that we know of (see <a href="#performance-comparison">Performance comparison</a>), and helped uncover a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">timing bug</a> (also called <a href="https://kyberslash.cr.yp.to/">KyberSlash</a>) in various Kyber implementations that would allow an attacker to <a href="https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/ldX0ThYJuBo/m/uIOqRF5BAwAJ">recover the private key</a>.</p>Cryspen @ RWC 2023https://cryspen.com/post/rwc-2023/Mon, 12 Jun 2023 00:00:00 +0000https://cryspen.com/post/rwc-2023/<p>At Real World Crypto 2023 in Tokyo, we gave a talk on the hacspec language, the hax tool, and the libcrux crypto library.</p> \ No newline at end of file +<p>Cryspen has built <a href="https://github.com/cryspen/libcrux/tree/main/libcrux-kem">a new high assurance Rust implementation of ML-KEM</a>, using our verification framework <a href="https://cryspen.com/hax">hax</a> and <a href="https://fstar-lang.org">F*</a>. Our implementation is among the fastest portable implementations that we know of (see <a href="#performance-comparison">Performance comparison</a>), and helped uncover a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">timing bug</a> (also called <a href="https://kyberslash.cr.yp.to/">KyberSlash</a>) in various Kyber implementations that would allow an attacker to <a href="https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/ldX0ThYJuBo/m/uIOqRF5BAwAJ">recover the private key</a>.</p>Cryspen @ RWC 2023https://cryspen.com/post/rwc-2023/Mon, 12 Jun 2023 00:00:00 +0000https://cryspen.com/post/rwc-2023/<p>At Real World Crypto 2023 in Tokyo, we gave a talk on the hacspec language, the hax tool, and the libcrux crypto library.</p> \ No newline at end of file diff --git a/tags/pqc/index.xml b/tags/pqc/index.xml index f6a2ed6..6880926 100644 --- a/tags/pqc/index.xml +++ b/tags/pqc/index.xml @@ -3,4 +3,4 @@ implementation of ML-KEM in Rust, and talked about how our high-assurance development methodology helped us find a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">new timing bug</a> in various other Kyber implementations.</p>Verified ML-KEM (Kyber) in Rusthttps://cryspen.com/post/ml-kem-implementation/Tue, 16 Jan 2024 00:00:00 +0000https://cryspen.com/post/ml-kem-implementation/<p>ML-KEM, previously known as <a href="https://pq-crystals.org/kyber/">Kyber</a>, is the first post-quantum secure key-encapsulation mechanism (KEM) to get standardised by NIST in <a href="https://csrc.nist.gov/pubs/fips/203/ipd">FIPS 203</a>.</p> -<p>Cryspen has built <a href="https://github.com/cryspen/libcrux/tree/main/src/kem">a new high assurance Rust implementation of ML-KEM</a>, using our verification framework <a href="https://cryspen.com/hax">hax</a> and <a href="https://fstar-lang.org">F*</a>. Our implementation is among the fastest portable implementations that we know of (see <a href="#performance-comparison">Performance comparison</a>), and helped uncover a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">timing bug</a> (also called <a href="https://kyberslash.cr.yp.to/">KyberSlash</a>) in various Kyber implementations that would allow an attacker to <a href="https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/ldX0ThYJuBo/m/uIOqRF5BAwAJ">recover the private key</a>.</p> \ No newline at end of file +<p>Cryspen has built <a href="https://github.com/cryspen/libcrux/tree/main/libcrux-kem">a new high assurance Rust implementation of ML-KEM</a>, using our verification framework <a href="https://cryspen.com/hax">hax</a> and <a href="https://fstar-lang.org">F*</a>. Our implementation is among the fastest portable implementations that we know of (see <a href="#performance-comparison">Performance comparison</a>), and helped uncover a <a href="https://github.com/pq-crystals/kyber/commit/dda29cc63af721981ee2c831cf00822e69be3220">timing bug</a> (also called <a href="https://kyberslash.cr.yp.to/">KyberSlash</a>) in various Kyber implementations that would allow an attacker to <a href="https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/ldX0ThYJuBo/m/uIOqRF5BAwAJ">recover the private key</a>.</p> \ No newline at end of file